리눅스 커널 아키텍처

  • 리눅스 커널은 모놀리식 구조로 다양한 기능이 통합되어있다

구성요소

  • 시스템 콜 인터페이스
    • user space의 프로그램이 kernel space의 기능을 호출할 때 이용되는 API를 제공
  • 프로세스 관리
    • 프로세스 생성, 관리, 스케줄링, 종료까지 관리
    • 각 프로세스에 적절한 CPU 시간 할당
    • 프로세스 간 IPC 매커니즘 제공
  • 메모리 관리
    • 프로세스에 필요한 메모리 할당 및 회수
    • 가상 메모리로 물리 메모리를 초과하는 메모리 사용 지원
  • 파일 시스템
    • VFS(Virtual File System)라는 추상화 계층 제공
    • 사용자, 앱이 파일시스템의 종류를 의식하지 않고서 파일 작업을 수행할 수 있도록 지원
  • 네트워크 스택
    • TCP/IP, UDP 등 프로토콜 포함
  • 디바이스 드라이버
    • 커널과 하드웨어 사이 인터페이스 역할
  • 다양한 하드웨어 아키텍처 지원
    • 특정 하드웨어 아키텍처에 의존하는 코드 분리

프로세스 관리

프로세스

  • 실행중인 프로그램의 인스턴스
  • 메모리 공간, 파일 디스크립터, 상태 정보 등 포함
  • 각 프로세스는 독립된 주소공간을 가짐
  • 생성, 실행 가능, 실행 중, 대기, 종료 등 상태를 가지며 이를 통해 리소스를 할당,해제함
  • 부모 프로세스로부터 생성되는 계층적 구조

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 모드에서 실행된 코드는 시스템의 모든 자원에 접근할 수 있음
    • 이를 통해 하드웨어 인터페이스, 메모리 관리, 프로세스 스케줄링 등 중심적 서비스를 제공
  • 유저모드
    • 제한된 권한을 가짐
    • 주로 앱, 유틸리티가 실행되는 레벨
    • 시스템 자원 접근을 위해서는 커널에 시스템콜을 통해 요청 필요
    • 유저모드에서 오류가 발생해도, 그 프로그램에만 영향을 미치고 전체 시스템에 영향 없음

0개의 댓글