개발자가 꼭 알아야 하는 몇몇 개념들을 쉽게 이해하기 위해 운영체제의 큰 그림과 필수적인 개념들을 설명합니다.
운영체제란, Application 계층의 Process들이 잘 작동하도록 도와주고, H/W 계층을 제어 및 관리합니다.
이때, Application 계층을 논리적(Logical), H/W 계층을 물리적 계층이라 불립니다.
논리적이란 단어는 가상화(Virtual)라고 이해하면 됩니다.
- 운영체제란
- 커널
- 커널 구조
- CPU 모드
- 시스템 콜
- 시스템 콜 내부 동작 과정
- 장치 드라이버
- 인터럽트
- 프로세스와의 통신
🗣️ 운영체제는 인터럽트에 의해 구동되는 프로그램입니다.
타이머 인터럽트(CPU 스케쥴링)와 시스템 콜, I/O 인터럽트에 의해 구동되며
특히 운영체제를 통해서만 할 수 있는 일들을 응용 프로그램은 시스템 콜 함수들을 통해 호출하여 운영체제가 수행합니다.
운영체제는 다음과 같은 중요 기능을 수행합니다.
컴퓨터가 부팅되면 항상 메모리에 상주
하고 있는 프로그램으로써,
프로세스들이 잘 작동하도록 도와주고, H/W를 제어하고 관리하는 기능을 수행하는 명령어의 모임입니다.
프로세스들과 하드웨어의 안전한 중개 역할
을 담당합니다.
단일 커널 구조
운영체제의 모든 기능(파일 시스템, CPU 스케쥴링, 메모리 관리 ...)이 한 프로그램으로 구현됩니다.
마이크로 커널 구조
중요 기능만 커널로 구현, 나머지 기능은 User Mode에서 서버들로 구현됩니다.
User mode에서 응용프로그램처럼 실행된다고 보면 됩니다.
기존 단일 커널 구조와 비교했을 때 장점은 다음과 같습니다.
👉 커널모드에서 실행하는 코드가 적어지기 때문에 코드의 수가 적은 만큼 버그의 수도 줄어들어 신뢰성이 좋아집니다.
👉 또한 커널에 프로그램을 추가하면 커널 전체를 컴파일, 디버깅 등을 진행해야 하지만, 사용자 모드에서 응용 프로그램으로 추가하게 된다면, 그 프로그램만 동작하면 되기 때문에 확장성이 좋아집니다.
👉 하드웨어 드라이버 등도 커널 밖 응용 프로그램으로 설계되어 하드웨어를 이식할 때 해당 프로그램만 수정하면 되므로 이식이 쉬워집니다.
⚠️ 하지만 User mode와 Kernel mode간의 통신 비용이 상대적으로 더 많이 들기 때문에 성능이 떨어질 수 있습니다.
모듈 구조
모듈과 커널로 분리되는 구조입니다.
마이크로 커널의 분리 구조와 단일 커널의 속도감을 합쳐놓았습니다.
모듈이 응용프로그램처럼 진행되는것이 아닌, 커널안에 포함이 되는 것 처럼 수행됩니다.
해당 모듈을 커널에 링크했다가 제거할 수도 있어 동적으로 커널 기능을 사용할 수 있습니다.
마이크로 커널에서는 메세지로 통신을 해야하지만, 모듈에서는 함수 호출로만 이루어지기 때문에 속도가 훨씬 빨라지게 됩니다.
최근 대부분의 운영체제는 해당 구조를 지원합니다.
Linux module
모듈 안의 init_module()을 사용하면, kernel의 register_capability()에 의해 함수들의 주소를 등록합니다.
등록된 함수 배열은 Module에서 바로 쓸 수 있으며 모듈에서 함수 주소를 바로 호출하면 됩니다.
이후 cleanup_module()을 통해서 함수 배열을 삭제합니다.
해당 모듈의 init, cleanup 인터페이스를 어떻게 구현하느냐에 따라
kernel로부터 불러오는 함수들이 달라지게 됩니다.
운영체제는 user mode, kernel mode 2가지 모드를 제공합니다.
특정 명령어는 커널 모드에서만 실행될 수 있도록 privileged
(특권) 명령어로 지정되어 있습니다.
이 둘 mode간의 통신은 System Call
을 호출함으로써 이루어집니다.
OS가 지원하는 여러 기능들은 메모리 한켠에 따로 저장되어 응용 프로그램 코드들과 구역이 나누어져 있습니다.
만일 Kernel이 없다면,
process가 직접 하드웨어에 접근하게 되는데 각 하드웨어마다 적용되는 driver가 달라 접근이 용이하지 못하고, 다른 process의 자원에 접근해야 할 경우에 동기화 문제 등 여러 문제가 발생하여 자원이 무질서하게 관리될 것입니다.
kernel mode를 두어 2중으로 관리 될 경우
kernel에서 프로세스 제어 및 관리, 하드웨어 접근을 훨씬 안전하게 관리할 수 있습니다.
🗣️ 운영체제가 응용 프로그램에게 시스템 함수를 제공하여 운영체제만이 할 수 있는 일들을 응용 프로그램이 수행할 수 있도록 해줍니다.
인터럽트에 의해서 동작하며, 일반적으로 다음과 같은 호출을 제공합니다.
예시로 응용 프로그램이 시스템 콜을 통해 운영체제에게 하고싶은 것
C언어의 출력 함수인 printf("Hello World!");를 실행시킬 때
Console에 출력되기 까지의 내부 흐름입니다.
User Interface(System Call), Kernel, Device과의 통신이 중요하다는 점을 알 수 있습니다.
🗣️ CPU 동작을 방해하는 신호입니다.
인터럽트에 대한 자세한 정보는 해당 포스팅을 참조해주세요.
[CS] Interrupt의 처리 과정과 분류 기준, 그리고 Exception과의 오해
Operating System Concepts, 10/E - Avraham Silberschatz
대학교 운영체제 강의
운영체제와 시스템 프로그래밍