OS 커널 구조와 시스템 콜, 자원 관리의 원리
OS 커널이 하드웨어를 추상화하고 프로세스·메모리·파일 시스템·네트워크 자원을 관리하는 구조를 정리한다.
2026-08-14 · 최초 발행 2026-01-02
응용 프로그램과 하드웨어 사이를 맡는 커널
운영체제 커널은 하드웨어 자원을 직접 제어하면서 응용 프로그램에 시스템 서비스를 제공하는 핵심 계층이다. 프로세스와 메모리, 파일 시스템, 장치 드라이버, 네트워크 스택 같은 저수준 기능이 이 계층에 모인다. 사용자 공간의 프로그램은 시스템 콜 인터페이스를 거쳐 커널에 요청을 전달한다.
커널이 제공하는 추상화 덕분에 응용 프로그램은 CPU, 메모리, 디스크, 네트워크 카드의 세부 제어 방식을 직접 알 필요가 없다. 장치별 드라이버를 로드하고 초기화하며, 장치를 제어하고 인터럽트를 처리하는 일도 커널의 책임이다. 플러그 앤 플레이 지원 역시 이 관리 범위에 포함된다.
프로세스 측면에서는 생성·종료·스케줄링, 컨텍스트 스위칭, 프로세스 간 통신(IPC), 세마포어와 뮤텍스를 통한 동기화를 맡는다. 메모리는 물리 메모리의 할당과 회수, 가상 메모리, 페이징과 세그멘테이션, 보호와 공유를 다룬다. 파일 생성·삭제·읽기·쓰기, 디렉터리 구조와 디스크 공간, 캐싱 및 버퍼링도 커널이 관리한다. 입출력 경로에서는 장치 드라이버 인터페이스, 인터럽트와 DMA, 버퍼링·스풀링, 입출력 스케줄링이 연결된다.
권한 경계를 만드는 사용자 모드와 커널 모드
커널 모드는 특권 모드(Privileged Mode)로 동작한다. 모든 CPU 명령어를 실행할 수 있고 모든 메모리 영역에 접근하며, 하드웨어 직접 제어와 인터럽트 처리를 수행한다.
반면 사용자 모드에서는 제한된 명령어와 메모리 영역만 사용할 수 있다. 하드웨어에 직접 접근할 수 없으므로, 프로그램은 시스템 콜로 커널 서비스 사용을 요청해야 한다. 이 분리는 시스템의 안정성과 보안을 위한 경계다.
사용자 모드에서 커널 모드로 들어가는 계기는 시스템 콜, 하드웨어·타이머 인터럽트, 페이지 폴트나 나눗셈 오류 같은 예외다. 시스템 콜이 끝나면 사용자 모드로 복귀하고, 스케줄링 결과에 따라 사용자 프로세스 실행이 이어진다. 이 과정에는 컨텍스트 저장과 복원, 캐시 무효화 가능성 같은 오버헤드가 따르지만 보안을 위해 필요한 비용이다.
시스템 콜이 커널 서비스를 요청하는 방식
파일을 열고 읽거나 쓰는 일, 프로세스 생성과 종료, 메모리 할당, 네트워크 통신은 사용자 프로그램이 시스템 콜로 요청하는 대표적인 서비스다.
요청은 사용자 프로그램이 read() 같은 라이브러리 함수를 호출하는 데서 시작한다. 라이브러리는 시스템 콜 번호와 인자를 설정하고, int 0x80 또는 syscall 명령어를 통해 소프트웨어 인터럽트를 발생시킨다. CPU는 커널 모드로 전환하며, 커널이 요청을 처리한 뒤 사용자 모드로 돌아와 결과를 반환한다.
프로세스 제어에는 fork()의 자식 프로세스 생성, exec()의 새 프로그램 실행, exit()의 종료, wait()의 자식 프로세스 대기가 있다. 파일 조작에는 open(), close(), read(), write(), lseek()가 사용된다. 메모리 관련 호출은 mmap(), brk(), sbrk(), mprotect()가 대표적이며, 네트워크에서는 socket(), bind(), listen(), accept(), connect(), send(), recv()가 소켓 생성과 연결, 송수신을 담당한다.
커널 내부에서 자원을 배분하는 서브시스템
프로세스 스케줄러는 Ready Queue에서 다음에 실행할 프로세스를 고르고 CPU 시간을 배정한다. CFS(Completely Fair Scheduler), O(1) Scheduler 같은 스케줄링 알고리즘과 우선순위 기반 스케줄링, 실시간 프로세스 지원이 이 영역에 속한다. 실행 대상을 바꿀 때는 현재 프로세스의 PCB를 저장하고 새 프로세스 상태와 페이지 테이블을 복원하며 TLB를 플러시한다.
메모리 관리 유닛(MMU)은 논리 주소를 물리 주소로 변환한다. 페이지 테이블과 TLB(Translation Lookaside Buffer) 캐싱, 페이지 폴트 처리를 관리하며, 페이지 교체에는 LRU, NUR, FIFO 알고리즘이 쓰인다. 스왑 공간과 메모리 압축도 관련 기능이다. 커널 객체는 Slab Allocator가, 물리 메모리는 Buddy System이 할당하며, vmalloc은 가상 메모리 할당에 사용된다.
가상 파일 시스템(VFS)은 ext4, XFS, Btrfs, NTFS, FAT처럼 서로 다른 파일 시스템에 통일된 인터페이스를 제공한다. 내부적으로 inode, dentry, file 구조체를 사용하며, Page Cache는 파일 데이터를, Dentry Cache는 디렉터리 엔트리를, Inode Cache는 inode 메타데이터를 캐싱해 디스크 I/O를 줄인다.
네트워크 스택은 TCP/IP 구현과 소켓 인터페이스, 패킷 라우팅 및 필터링을 제공하고 네트워크 드라이버와 연동한다. 데이터 복사를 최소화하는 Zero-Copy, TCP Offload Engine(TOE), Receive Side Scaling(RSS)도 네트워크 최적화 방식이다.
동기화와 인터럽트 처리의 경계
멀티코어 환경에서는 데이터 일관성을 지키기 위한 동기화가 필요하다. 스핀락은 락을 얻을 때까지 바쁜 대기(Busy Waiting)를 하므로 짧은 임계 구역에 적합하며, 멀티코어 환경에서 효율적이다. 세마포어는 카운터 기반으로 동기화하고 프로세스를 대기 큐에서 슬립시키므로 긴 임계 구역에 맞는다.
뮤텍스는 이진 세마포어로, 락을 얻은 프로세스만 해제할 수 있는 소유자 개념을 가진다. 우선순위 역전 방지도 다룬다. RCU(Read-Copy-Update)는 읽기 동작에 락이 필요하지 않고, 쓰기 시 복사본을 만든 뒤 갱신하는 방식으로 고성능 읽기 작업에 사용된다.
인터럽트 핸들러는 즉시 처리해야 하는 짧은 작업을 Top Half에서 처리하고, 지연할 수 있는 작업을 Softirq, Tasklet, Workqueue 같은 Bottom Half로 넘긴다. 임계 구역을 보호하기 위해 인터럽트를 비활성화할 수 있지만, 시스템 응답성을 유지하려면 그 시간은 짧아야 한다.
커널 주소 공간과 스택
직접 매핑 영역은 물리 메모리를 커널 가상 주소에 직접 매핑해 빠르게 접근할 수 있게 한다. Linux에서는 0xC0000000 ~가 32비트 주소의 예이며, 0xFFFF880000000000 ~는 64비트 주소의 예다.
vmalloc 영역은 연속되지 않은 물리 메모리를 매핑하는 커널 동적 메모리 영역이다. 모듈 로드나 큰 버퍼 할당에 쓰인다. 고정 매핑 영역은 APIC, PCI 장치 메모리처럼 특정 물리 주소를 특정 가상 주소에 매핑한다.
프로세스는 사용자 스택과 커널 스택을 모두 가진다. 시스템 콜 실행 중에는 커널 스택을 사용하며, 그 크기는 일반적으로 8KB 또는 16KB로 제한된다. 인터럽트 핸들러 전용 스택은 프로세스 커널 스택의 오버플로우를 막는다.
런타임에 확장하는 커널 모듈
Loadable Kernel Module(LKM)은 재부팅 없이 커널 기능을 추가하거나 제거하는 방식이다. 드라이버를 런타임에 로드할 수 있고 필요한 기능만 메모리에 올릴 수 있다.
Linux에서는 insmod로 모듈을 삽입하고, rmmod로 제거한다. modprobe는 의존성을 해결하면서 모듈을 로드하며, lsmod는 현재 로드된 모듈 목록을 보여 준다.
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void) {
printk(KERN_INFO "Module loaded\n");
return 0;
}
void cleanup_module(void) {
printk(KERN_INFO "Module unloaded\n");
}
MODULE_LICENSE("GPL");
모듈은 디지털 서명으로 검증할 수 있으며, 신뢰할 수 있는 모듈만 로드하도록 구성할 수 있다. Secure Boot 환경에서는 서명된 모듈이 필수다.
로그와 추적으로 커널 문제를 분석하는 방법
dmesg와 printk()는 커널 로그를 확인하고 출력하는 수단이다. 부팅 메시지와 드라이버 정보는 /var/log/kern.log에서도 확인할 수 있다.
KGDB는 원격 커널 디버깅을, KDB는 로컬 커널 디버깅을 지원한다. 중단점 설정과 변수 검사가 가능하다. 커널 패닉이 발생한 경우에는 메모리 덤프를 남기고 kdump, crash 도구로 사후 분석(Post-Mortem)할 수 있다.
성능 분석에서는 perf가 CPU 성능 카운터를 이용해 함수별 실행 시간을 분석하고 핫스팟(Hot Spot)을 식별한다. ftrace는 함수 호출과 이벤트를 추적해 실시간 성능 분석을 돕는다. eBPF(Extended Berkeley Packet Filter)는 커널 내부에서 사용자 정의 프로그램을 실행할 수 있게 하며, bpftrace, bcc는 안전한 커널 모니터링과 추적에 사용된다.
업데이트 정책과 실시간 응답 요구
커널 버전 번호는 메이저.마이너.패치 형식을 사용하며 5.15.10이 예다. LTS(Long-Term Support)는 장기 지원 버전이고, Mainline은 최신 개발 버전, Stable은 안정화 버전이다. 커널 패치는 보안 취약점과 버그를 수정하고 새 하드웨어 지원 및 성능 개선을 제공한다.
Real-Time Preemption Patch를 적용한 실시간 커널(RT Kernel)은 결정적 응답 시간을 보장하고 우선순위 역전을 방지한다. 인터럽트 핸들러를 스레드화하며, 임베디드와 산업용 시스템에서 사용된다.