박성범 Simon Park

공룡책으로 정리하는 운영체제 Ch.2

System Structures

챕터1에서 다룬 시스템에 대해 보다 자세히 다루는 챕터인데, 그렇게 어렵지는 않다. 복잡한 내용이 별로 없어서 쉽게 읽을 수 있다.

Operating-System Services

운영체제는 사용자와 시스템에게 다양한 서비스를 제공한다.

+-----------------------------------------------------------------------------------------------------------------------+
| user and other system programs                                                                                        |
+-----------------------------------------------------------------------------------------------------------------------+
| +-----+-------+-------------+                                                                                         |
| | GUI | batch | commandline |                                                                                         |
| +-----+-------+-------------+                                                                                         |
| | user interfaces           |                                                                                         |
| +---------------------------+                                                                                         |
+-----------------------------------------------------------------------------------------------------------------------+
| system calls                                                                                                          |
+-----------------------------------------------------------------------------------------------------------------------+
| +-------------------------------------------------------------------------------------------------------------------+ |
| | +-------------------+ +----------------+ +-------------+ +---------------+ +---------------------+ +------------+ | |
| | | program execution | | I/O operations | | file systems| | communication | | resource allocation | | accounting | | |
| | +-------------------+ +----------------+ +-------------+ +---------------+ +---------------------+ +------------+ | |
| | +-----------------+                                                                   +-------------------------+ | |
| | | error detection |                                                                   | protection and security | | |
| | +-----------------+                                                                   +-------------------------+ | |
| +------------------------------------------------------services-----------------------------------------------------+ |
+----------------------------------------------------operating system---------------------------------------------------+
| hardware                                                                                                              |
+-----------------------------------------------------------------------------------------------------------------------+

운영체제는 사용자에게 직접적인 도움은 안 되지만, 시스템을 위한 작업도 수행한다.

System Calls

시스템 콜은 커널과 사용자 프로그램을 이어주는 인터페이스 역할을 한다. 좀 생소하게 느껴질 수도 있겠지만, 그냥 로우 레벨 작업을 하는 코드라고 생각하면 된다.

                           +------------------+
                      +----+ user application |<----+
               open() |    +------------------+     |
user                  v                             |
mode    +-------------------------------------------+--------------+
--------+ system call interface                                    |
kernel  +---+------------------------------------------------------+
mode        |     +-----+                                      ^
            +---->| ... |                  open()              |
                  +-----+                    implementation    |
                i |     +------------------> of open()         |
                  +-----+                    system call       |
                  | ... |                    ...               |
                  +-----+                    return -----------+

사용자 프로그램이 디스크에 있는 파일을 연다는 것은 파일 시스템에 접근한다는 의미다. 시스템에 접근하기 위해서는 커널 모드로 전환되어야 하는데, 이때 시스템 콜을 사용한다. 메모리의 특정 주소 범위에는 어떤 동작들이 할당되어 있다. 이것을 시스템 콜 테이블(System call table)이라고 부르며, 인터럽트 벡터(Interrupt vector)라고도 부른다. 예를 들어 fopen() 함수를 호출한다면, 운영체제는 파일을 여는 함수를 찾기 위해 시스템 콜 테이블을 참조한다. 시스템 콜 테이블은 메모리 주소의 모음인데, 해당 메모리 주소는 인터럽트 서비스 루틴(Interrupt service routine)을 가리키고 있다. 인터럽트 서비스 루틴은 일반적으로 C로 짜여진 코드이며, 시스템 콜 테이블이 가리키는 특정 메모리 주소가 구체적으로 어떤 동작을할지 정의해놓은 것이다.

시스템 콜에는 fork(), exit(), read(), write()와 같은 함수들이 있다. 하지만 개발자가 이것을 직접 조작하는 것은 불편하고 위험한 일이므로, 표준 라이브러리(Standard library)를 사용한다. stdio.h가 그 일종이다.

사용자 프로그램이 운영체제에게 매개변수를 넘기는 방법은 3가지가 있다.

  1. Call by value: 매개변수의 값 자체를 복사해서 CPU 레지스터에 전달한다.
  2. Call by reference: 값의 메모리 주소를 전달한다. 많은 값을 전달한다면 이렇게 하는 것이 효율적이다.
  3. 프로그램에을 통해 스택(Stack)에 매개변수를 추가하고, 운영체제를 통해 값을 뺀다.

Types of System Calls

시스템 콜은 크게 6가지로 분류할 수 있다.

Operating System Structure

현대 운영체제는 계층을 나눠서 시스템을 관리한다.

Simple Structure

+-------------------------------------+
| application program                 |
+--+-------------------------------+--+
   |                               |
   v                               |
+------------------------------+   |
| resident system program      |   |
+--+------------------------+--+   |
   |                        |      |
   v                        |      |
+-----------------------+   |      |
| MS-DOS device drivers |   |      |
+--+--------------------+   |      |
   |                        |      |
   v                        v      v
+-------------------------------------+
| ROM BIOS device drivers             |
+-------------------------------------+

과거에는 사실상 계층이 구분되어 있지 않았다. MS-DOS에서는 사용자 프로그램이 입출력 루틴에 접근해 디스플레이와 디스크 드라이브에 직접 쓰기를 할 수 있었다. 따라서 만약 사용자 프로그램에 문제가 생기면 전체 시스템에 문제가 생겼다. UNIX 시스템은 이것을 개선했다.

+------------------------------------------------------------------+
| (the users)                                                      |
+------------------------------------------------------------------+
| shells and commands                                              |
| compilers and interpreters                                       |
| system libraries                                                 |
+------------------------------------------------------------------+ -+
| system-call interface to the kernel                              |  |
+------------------------------------------------------------------+  |
| signals terminal       file system              CPU scheduling   |  |
| handling               swapping block I/O      page replacement  |  | kernel
| character I/O system   system                  demand paging     |  |
| terminal drivers       disk and tape drivers   virtual memory    |  |
+------------------------------------------------------------------+  |
| kernel interface to the hardware                                 |  |
+----------------------+--------------------+----------------------+ -+
| terminal controllers | device controllers | memory controllers   |
| terminals            | disks and tapes    | physical memory      |
+----------------------+--------------------+----------------------+

전통적인 UNIX 시스템 구조는 MS-DOS에 비해 기능이 분리되었지만, 여전히 하나의 계층이 너무 많은 일을 했다. 하드웨어 계층 위, 사용자 계층 아래에 있는 커널이 모든 기능을 제공했다. 이러한 모놀리딕(Monolithic) 구조는 구현과 유지보수가 쉽지 않았다.

Layered Approach

+-------------------------------+
| layer N: user interface       |
| +---------------------------+ |
| | ...                       | |
| | +-----------------------+ | |
| | | layer 1               | | |
| | | +-------------------+ | | |
| | | | layer 0: hardware | | | |
| | | +-------------------+ | | |
| | +-----------------------+ | |
| +---------------------------+ |
+-------------------------------+

운영체제를 더 세분화해 계층을 분리한 것이 계층적 접근(Layered approach) 방식이다. 가장 아래에 있는 계층(레이어 0)은 하드웨어고, 가장 높은 계층(레이어 N)은 사용자 인터페이스다. 이 방식은 유지보수가 아주 편한데, 하나의 계층에만 신경쓰면 다른 계층에는 아무런 신경을 쓰지 않아도 되기 때문이다.

Microkernels

마이크로커널(Microkernel)은 커널에서 핵심적인 요소만 남긴 가벼운 커널을 말한다. 커널이 커질수록 문제가 생길 가능성이 높아지고, 유지보수가 힘들어지기 때문에 커널을 더 가볍게 만들 필요가 있었다. 마이크로커널은 코드 양이 훨씬 적어 컴파일, 테스트 시간이 비교적 짧고, 다른 시스템에 이식(Porting)하기도 쉽다. 다만 시스템 프로그램을 추가해 기능을 늘리려하면 속도가 느려진다.

OS X의 커널(Darwin)의 일부가 마이크로커널 Mach를 기반으로 만들어졌으며, IoT에도 마이크로커널이 사용된다.

Modules

모듈은 커널을 확장하기 위한 기술로, OOP에서 말하는 그 모듈화와 같은 개념이다. 프로세스에 실시간으로 모듈을 붙여 작동시킬 수 있고, 각 기능들을 독립적으로 관리할 수 있어 효과적으로 시스템을 유지할 수 있다. 장치 드라이버는 모두 모듈로 구현되어 있으며, 윈도우에서 .dll파일이 바로 모듈이다.

Hybrid Systems

스마트폰은 OS 구조의 최신판이라고 할 수 있다. 하이브리드 시스템은 커널의 핵심만 남기고 나머지는 따로 구현한 시스템이다. OS X의 경우 BSD가 핵심이지만 나머지는 모두 애플이 자체 구현했다. 안드로이드는 리눅스 커널위에 자체 구현한 라이브러리를 올린 시스템이다.