리눅스 커널 아키텍처

- 리눅스 커널은 모놀리식 구조로 다양한 기능이 통합되어있다
구성요소
- 시스템 콜 인터페이스
- user space의 프로그램이 kernel space의 기능을 호출할 때 이용되는 API를 제공
- 프로세스 관리
- 프로세스 생성, 관리, 스케줄링, 종료까지 관리
- 각 프로세스에 적절한 CPU 시간 할당
- 프로세스 간 IPC 매커니즘 제공
- 메모리 관리
- 프로세스에 필요한 메모리 할당 및 회수
- 가상 메모리로 물리 메모리를 초과하는 메모리 사용 지원
- 파일 시스템
- VFS(Virtual File System)라는 추상화 계층 제공
- 사용자, 앱이 파일시스템의 종류를 의식하지 않고서 파일 작업을 수행할 수 있도록 지원
- 네트워크 스택
- 디바이스 드라이버
- 다양한 하드웨어 아키텍처 지원
프로세스 관리
프로세스
- 실행중인 프로그램의 인스턴스
- 메모리 공간, 파일 디스크립터, 상태 정보 등 포함
- 각 프로세스는 독립된 주소공간을 가짐
- 생성, 실행 가능, 실행 중, 대기, 종료 등 상태를 가지며 이를 통해 리소스를 할당,해제함
- 부모 프로세스로부터 생성되는 계층적 구조
fork, exec
- 프로세스 생성은 일반적으로 fork -> exec를 사용한다
- fork로 부모 프로세스가 복사되고
- exec로 새로운 프로그램을 실행한다
스레드
- 프로세스 내에서 작동하는 실행 단위
- 각 스레드는 스레드 ID를 갖고 커널에서 개별적으로 관리됨
- 동일 프로세스 내 메모리 공간 공유되므로 스레드 간 자원 공유가 쉽고 동기화 문제에 주의해야 함
- 스레드는 각각 고유한 스택, 레지스터 상태를 가짐
- pthread 라이브러리를 사용해 스레드를 생성
- pthread_create로 생성 후
- pthread_join 함수로 스레드의 종료를 대기
- pthread_exit 함수를 호출해 스레드 종료
- pthread_mutex_lock, pthread_mutex_unlock으로 동기화 관리
프로세스 상태와 생명주기
- 리눅스 커널 헤더 sched.h에는 아래와 같이 정의되어있다
/* Used in tsk->state: */
#define TASK_RUNNING 0x0000
#define TASK_INTERRUPTIBLE 0x0001
#define TASK_UNINTERRUPTIBLE 0x0002
#define __TASK_STOPPED 0x0004
#define __TASK_TRACED 0x0008
- TASK_RUNNING
- TASK_INTERRUPTIBLE
- 특정 이벤트나 자원을 기다리고 있으면서, 시그널을 받는 경우 TASK_RUNNING로 전환
- TASK_UNINTERRUPTIBLE
- 특정 이벤트나 자원을 기다리는 상태, 시그널을 받아도 상태가 바로 변경되지 않음
- 주로 하드웨어 작업 대기하는 경우
- TASK_DEAD
- 프로세스가 모든 작업을 완료
- 모든 자원을 해제
- 부모 프로세스는 wait 시스템콜로 자식 프로세스 종료 상태를 알 수 있음
프로세스 스케줄링
- 리눅스에서는 기본적으로 CFS와 Real-Time 스케줄러를 사용
- CFS (Completely Fair Scheduler)
- 일반 프로세스 대상 스케줄러
- 각 프로세스에 공평한 CPU 시간을 분배
- 런타임 시간, 대기 시간을 기준으로 프로세스 우선순위를 계산
- 실시간 스케줄러
- 고우선순위 실시간 작업 처리에 주로 사용
- SCHED_FIFO, SCHED_RR 두가지 정책이 있음
- SCHED_FIFO의 경우 해당 프로세스가 작업을 완료하거나 더 높은 우선순위의 프로세스가 도착할때까지 CPU를 계속 점유
- SCHED_RR은 각 실시간 프로세스에 동등한 CPU 시간을 보장
메모리관리
페이지
- 페이지는 메모리를 할당하는 기본 단위로 보통 4KB임
- 물리 메모리는
페이지 프레임이라는 블록들로 분할되어, 페이지 테이블을 통해 가상주소와 물리주소가 매핑됨
- 리눅스에서 모든 프로세스는 가상 메모리 주소공간에서 실행됨
- 가상 메모리 시스템 페이지 폴트, 스왑, 공유 메모리, 메모리 매핑 등 기능을 제공
- 메모리가 부족한 경우, 디스크의 스왑 영역으로 메모리를 이동시키는 스왑 동작
파일시스템
- VFS (가상 파일 시스템)
- 다양한 파일 시스템 타입 (EXT4, XFS 등)과 상호작용하는 부분을 추상화하여 일관된 인터페이스 제공
- inode라는 데이터 구조를 통햏 파일과 디렉토리의 메타데이터를 추상화
- inode
- 파일 메타데이터, 데이터 블록의 위치를 담는 데이터 구조
- file descriptor
- 프로세스가 파일을 열 때 사용되는 정수값
- 프로세스가 open, read, write 등 파일 관련 시스템콜을 수행하면 이는 VFS와 상호작용하여 지정된 파일 시스템 드라이버와 함께 실제 작업을 수행
- 파일 I/O 연산의 효율성을 위해 커널은 버퍼 캐시를 사용하여 자주 사용되는 데이터 블록을 메모리에 캐싱함
유저모드, 커널모드
- 커널에서는 레벨(=모드)로 CPU 보호 레벨을 표시함
- 커널모드
- 커널모드 혹은 previleged 모드에서 실행된 코드는 시스템의 모든 자원에 접근할 수 있음
- 이를 통해 하드웨어 인터페이스, 메모리 관리, 프로세스 스케줄링 등 중심적 서비스를 제공
- 유저모드
- 제한된 권한을 가짐
- 주로 앱, 유틸리티가 실행되는 레벨
- 시스템 자원 접근을 위해서는 커널에 시스템콜을 통해 요청 필요
- 유저모드에서 오류가 발생해도, 그 프로그램에만 영향을 미치고 전체 시스템에 영향 없음