1. 운영체제를 알아야 하는 이유
운영체제란
- 운영체제 (operation system)
- 실행할 프로그램에 필요한 자원을 할당 + 프로그램이 올바로 실행되도록 도움
- 자원: 컴퓨터 부품 (CPU, 메모리, 보조기억장치, 입출력장치 등)
- 항상 컴퓨터가 부팅될 때 메모리 내 커널 영역(kernel space)에 따로 적재되어 실행된다.
운영체제를 알아야 하는 이유
- 운영체제가 없다면 하드웨어를 조작하는 코드를 모두 개발자가 직접 작성해야 한다.
- 개발자가 만든 프로그램은 결국 하드웨어가 실행하고, 그 하드웨어를 조작하는 프로그램이 운영체제이다.
- 따라서, 운영체제를 통해 문제 해결의 실마리를 찾을 수 있다.
2. 운영체제의 큰 그림
운영체제의 심장, 커널
- 커널
- 운영체제가 응용 프로그램에게 제공하는 서비스 중, 핵심적인 서비스를 담당하는 부분
- 운영체제가 설치된 모든 기기에는 커널이 있다.
- 사용자 인터페이스
- 운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스 중 하나
- ex) 윈도우 바탕화면
- 그래픽 유저 인터페이스(GUI: Graphical User Interface): 윈도우 바탕화면, 스마트폰 화면
- 커맨드 라인 인터페이스(CLI: Command Line Interface): 명령어 기반 컴퓨터와 상호작용
이중 모드와 시스템 호출
- 운영체제는 응용 프로그램의 자원 접근을 대행하는 일종의 문지기 역할을 수행한다.
- 운영체제는 사용자가 실행하는 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여, 자원을 보호한다.
- 응용 프로그램이 자원에 접근하기 위해서는 운영체제에 도움을 요청해야 한다.
- 운영체제에 도움을 요청한다 = 운영체제 코드를 실행하려고 한다.
- 이와 같은 운영체제의 문지기 역할은 이중 모드(dual mode)를 통해 구현된다.
이중 모드: dual mode
- CPU가 명령어를 실행하는 방식을 사용자 모드와 커널 모드로 구분하는 방식
- CPU는 명령어를 사용자 모드로써 실행할 수 있고, 커널 모드로써 사용할 수 있다.
- 사용자 모드(user mode)
- 운영체제 서비스를 제공받을 수 없는 실행 모드
- 일반적인 응용 프로그램은 기본적으로 사용자 모드로 실행된다.
- 사용자 모드로 실행 중인 CPU는 하드웨어 자원에 접근하는 명령어를 실행할 수 없다.
- 따라서, 사용자 모드로 실행되는 일반적인 응용 프로그램은 자원에 접근할 수 없다.
- 커널 모드(kernel mode)
- 운영체제 서비스를 제공받을 수 있는 실행 모드 = 커널 영역의 코드를 실행할 수 있는 모드.
- CPU가 커널 모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다.
- 운영체제는 커널 모드로 실행되기 때문에 자원에 접근할 수 있다.
시스템 호출(시스템 콜): System call
- 사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 한다.
- 이때, 운영체제 서비스를 제공받기 위한 요청을시스템 호출(system call)이라고 한다.
- 사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있다.
- 운영체제에게 "나 소프트웨어 프로그램 사용하고 싶어!"하고 부탁을 하는 것.

- 시스템 호출은 일종의 인터럽트이다. (정확히는 소프트웨어적인 인터럽트)
- 인터럽트는 입출력 장치에 의해 발생하기도 하지만 인터렙트를 발생시키는 특정 명령어에 의해 발생하기도 하는데, 이를 소프트웨어 인터럽트라고 한다.

- 시스템 호출이 실행되는 방식은 하드웨어 인터럽트 처리 방식과 유사하다.
- 하드 디스크에 데이터를 저장하는 시스템 호출 발생시켜 커널모드로 전환
- 운영체제 내의 하드 디스크에 데이터를 저장하는 코드 실행
- 하드디스크에 접근이 끝났다면 다시 사용자 모드로 복귀하여 실행 재개
- 일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 사용한다.
- 그 과정에서 빈번하게 시스템 호출을 발생시키고, 사용자 모드와 커널 모드를 오가며 실행된다.

운영체제의 핵심 서비스
이 책에서 다루는 운영체제의 핵심 서비스는 아래의 3개이다.
1. 프로세스 관리
- 프로세스(process): 실행중인 프로그램
- 윈도우의 [작업관리자]를 열어 [프로세스] 항목을 통해 실행중인 프로세스를 확인 가능

- 수많은 프로세스들이 동시에 실행되고 있다.
- CPU는 한 번에 하나의 프로세스만 실행 가능하므로, CPU는 이 프로세스들을 조금씩 번갈아가며 실행한다.
- 즉, CPU가 프로세스들의 실행을 전환하는 것을 반복한다.
- 운영체제는 이처럼 동시다발적으로 생성/실행/삭제되는 각기다른 다양한 프로세스를 일목요연하게 관리해야 한다.
- 어떻게 일목요연하게 다룰 수 있을까? : 프로세스와 스레드, 프로세스 동기화, 교착상태 해결

2. 자원 접근 및 할당
모든 프로세스는 실행을 위해 자원을 필요로 한다. 크게 3가지의 자원에 대한 접근 및 할당을 배울 수 있다.
- CPU (CPU 스케쥴링)
- 어떤 프로세스를 먼저, 얼마나 오래 실행할까?
- 메모리 (페이징, 스와핑, ...)
- 메모리의 비어있는 공간을 어떻게 찾을지, 프로세스를 메모리에 다 적재하는 것이 효율적인지...
- 입출력장치 (인터럽트 서비스 루틴)
- 응용프로그램이 입출력 장치를 할당바당 실행되고자 할때 이를 돕는 문제
3. 파일 시스템 관리
- 파일 시스템(file system)
- 관련된 정보를 파일이라는 단위로 저장 장치에 보관 & 파일들을 묶어 폴더(디렉터리) 단위로 저장 장치에 보관
- 이런 파일 시스템 역시 운영체제가 지원하는 핵심 서비스 중 하나
가상 머신과 이중 모드의 발전
가상 머신을 통한 가상화를 지원하는 현대 CPU는 두 가지 모드 이상을 지원한다. ( 이중 모드인 커널 모드와 사용자 모드, 2가지 모드 이상을 지원)
- 가상 머신(Virtual Machine)
- 소프트웨어 적으로 만들어낸 가상 컴퓨터.
- 가상 머신을 설치하면 새로운 운영체제와 응용 프로그램을 설치하고 실행할 수 있다.
- 윈도우 os에 가상 머신을 설치하면 가상 머신상 리눅스 os와 리눅스 응용프로그램을 설치하고 실행할 수 있다.
- 이때, 컴퓨터에 설치된 운영체제에서 가상 머신을 설치 및 실행한다면, 그 가상 머신 또한 응용 프로그램이다. 따라서, 사용자 모드로 실행된다.
- 가상 머신에 설치된 운영체제 역시 사용자 모드로 작동하므로 운영체제 서비스를 제공받기 어렵다.
- 그래서, 가상화를 지원하는 CPU는 커널 모드와 사용자 모드 이외에 가상 머신을 위한 하이퍼바이저 모드를 따로 둔다.
- 이로써 가상 머신 상 작동하는 응용프로그램은 하이퍼바이저 모드로써 가상 머신에 설치된 운영체제로부터 운영체제 서비스를 받을 수 있다.
시스템 호출의 종류

Reference