[2022-2] Introduction_kernel1
Linux
- Unix 운영체제를 기반으로 리누스 토발즈가 작성한 운영체제
Kernel
- main memory에 상주하는 운영체제의 핵심적인 부분
- version numbering : 커널 버전.짝수인 경우 안정적인 버전/홀수인 경우 개발중인 버전.배포 버전 (ex. 2.2.14, 2.3.51) 리눅스 버전이 자꾸 변경되다보니 마지막에 '-rc'(release candidates)를 붙여 배포 후보로 구분
Linux Kernel Characteristics
1) Monolithic 커널
- 모든 커널의 기능을 커널 내부에 시스템 호출과 인터럽트 처리 부분으로 포함하여 제공
- 따라서 복잡한 하나의 시스템이지만 작은 모듈로 구현되어 이들 간의 메시지를 전달할 때 오버헤드가 적어 고성능 커널을 제공하는 특징이 있다.(리눅스가 내장형 컴퓨터와 같은 저사양의 시스템에서도 효율적으로 작동하는 기반이 된다)
2) module 제공
- 모든 시스템이 동일한 환경을 가지지 않으므로 동적으로 필요한 부분은 커널에 포함시키고 필요하지 않은 부분은 포함시키지 않을 수 있다.(동적 모듈을 지원)
이것이 리눅스의 디바이스 드라이버이다.
- 디바이스 드라이버를 추가/삭제하려면 커널을 재빌드 해야하고 하나의 모듈이 죽으면 전체 시스템이 죽는다는 단점이 있다.
- 기존의 전통적인 UNIX에서는 모든 커널이 필요 유무와 무관하게 한번 컴파일되면 정적으로 링크되어 커널에 포함되었다. 이를 리눅스에서 해결했다.
3) kernel thread 사용
- kernel thread는 독립적으로 스케줄되어 실행되는 커널의 컨텍스트이다.
- process에 비해 문맥 교환의 부담이 적은 장점이 있으나 제한적인 메모리 환경 등을 고려해 최소한의 커널 스레드를 지원한다.
4) multithread 응용 지원
5) Preemptive kernel
- preemptive kernel option으로 컴파일하면 실행 중간에 다른 컨텍스트의 실행을 위해 멈출 수 있다. 이러한 커널을 preemptive 커널이라 한다.
- UNIX 기반 커널도 동일한 기능을 제공한다.
6) Multiprocessor 지원
7) 다양한 파일 시스템 지원
- Ext2, Ext3, ReiserFS, JFS, XFS, ...
8) stream 방식 IO 지원 없음
- 커널이 기본적으로 제공하는 입출력은 버퍼를 통한 문자 혹은 블럭 방식의 i/o
- 기존의 UNIX에서 제공하는 스트림 방식의 IO는 성능을 위해 제공하지 않음
Module 사용의 장점
- 플랫폼 독립성 제공
- 필요한 모듈만 실행시 커널에 적재하므로 메인 메모리의 공간을 최소화
- 실행 시 적재되는 모듈은 정적으로 링크된 커널과 동일하므로 성능 저하는 발생하지 않음
Monolithic kernel
- task1과 2가 application 수준에서 read와 fork system call을 호출하면 동일한 커널에서 해당하는 서비스 코드인 sys_read와 sys_fork의 커널 함수를 실행합니다. 이 함수에서 단일 커널에 구현된 함수를 실행하면서 해당 기능을 완수하게 됩니다.
Microkernel
- 커널은 최소한으로 구현되어 외부에서 제공되는 커널 기능으로 필요한 메시지를 전달하는 역할을 수행
- task에서 read system call을 호출하면 마이크로커널은 파일을 읽기 위한 커널 태스크인 파일 시스템 서버로 요청 메시지를 전달합니다. 서버에서는 다시 마이크로커널을 통해 파일 시스템에 속하는 디스크를 접근하는 방식
- 모듈화의 장점이 있으나 메시지 전달의 오버헤드가 존재
Kernel Routines 실행 방법
- 동기화 방식의 커널 실행(실행 시점이 정해져 있음)
1) 프로세스가 시스템 호출을 하는 경우
2) 프로세스 실행 중 예외 신호가 발생하는 경우
ex. 프로그램 실행 중 0으로 나누는 연산을 실행하는 경우 정의되지 않은 연산으로 인해 예외상황이 발생하고 더 이상의 프로세스 코드가 실행되지 않고 커널에서 필요한 조치를 위해 실행. 이러한 경우 프로세스를 종료시키고 적절한 오류 메시지 출력
- 비동기화 방식의 커널 실행
: 외부 디바이스가 CPU에 이벤트의 발생을 알리는 인터럽트 신호를 발생하는 방법
ex. 디바이스에서 요청받은 IO 연산을 완료한 경우 CPU에 알려 후속 작업을 하도록 한다. 이러한 경우에 인터럽트를 받은 커널은 인터럽트 처리기인 핸들러가 해당하는 인터럽트를 처리한다.
- 커널 스레드 실행
: 리눅스에서는 제한적이지만 커널 쓰레드가 실행되어 커널에 진입하는 경우도 있다. 커널 쓰레드는 권한을 가진 프로세스로 커널 모드에서 실행되며 사용자와 직접 상호작용이 없고 시스템의 시작(startup) 시 생성되어 시스템의 셧다운(shutdown)까지 중단없이 실행된다.