Chapter 2. Implementation

 

OS는 구현 방법이 다양합니다. (1) 초기 OS는 어셈블리어로 구성되었으며, (2) system programming language로는 Algol이나 PL/1과 같은 언어를 사용했었습니다. (3) 현재는 대부분 C, C++로 이루어져있습니다.

 

사실 OS는 기능이 다양하기 때문에 다양한 언어들로 구현됩니다. 가장 낮은 수준은 어셈블리로, 주로 C언어로 구성되며, PERL, Python, shell script같은 scripting language들을 사용하기도 합니다. 높은 수준의 언어를 사용할 수록 다른 하드웨어와의 이식성이 올라가지만 속도가 느려지는 단점이 있습니다.

 

또한 Emulation을 이용해서 OS가 그에 맞지 않는 하드웨어 위에서도 동작하도록 도와줄 수 있습니다.

http://www.smallpc.co.kr/ab-5940-12

 

가상화 vs 에뮬레이션, 차이점은 대체 무엇일까? - 퓨쳐인포텍 > 고객지원 > IT NEWS

에뮬레이션(Emulation)과 가상화(Virtualization)는 비슷한 점이 많지만 운영상 차이점도 많습니다. 새로운 아키텍처에서 기존의 운영체제에 접근하려 한다면 에뮬레이션을 선호할 테지만, 반대로 가

www.smallpc.co.kr

 

Operating System Structure

 

범용 OS의 구조는 다양합니다. 대표적인 예시로는 다음이 있습니다:

  • Simple structure - MS-DOS
  • More complex - UNIX
  • Layered - an abstraction: 좀 더 복잡한 기능을 제공
  • Microkernel - Mach

https://ko.wikipedia.org/wiki/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%BB%A4%EB%84%90

 

마이크로커널 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 모놀리딕과 마이크로커널 기반 운영 체제의 구조 마이크로커널(microkernel)은 컴퓨터 과학에서 운영 체제에 추가되어야 하는 메커니즘을 최소한으로 제공하는

ko.wikipedia.org

 

Simple Structure - MS-DOS

 

MS-DOS는 가장 작은 공간을 통해 많은 기능들을 제공합니다 (OS의 초창기 모델로 OS가 차지하는 크기를 줄여야했습니다). 모듈들이 구분되지 않으며 MS-DOS는 많은 변형들이 있지만, 인터페이스와 각 기능들의 수준이 잘 구분되지 않는다는 특징을 갖습니다:

MS-DOS

 

*위 그림을 보면 application program이나 resident system program들이 MS-DOS를 거치지 않고 바로 device drivers로 이동할 수 있습니다. 이는 각 층들의 기능이 구분되지 않는다는 것을 의미합니다.

 

Non Simple Structure - UNIX

 

UNIX는 하드웨어 기능에 제약이 있는 환경에서 개발되었으며, 원본 UNIX OS는 제한된 구조를 갖고 있습니다. UNIX OS는 두 개의 분리되는 부분을 갖습니다:

  • System programs: OS위에 있는 프로그램
  • The kernel: system-call interface 아래에 있으며, 하드웨어 위에 존재합니다. 또한 file system, CPU scheduling 등 OS의 기능들을 하나의 level에서 제공합니다 (layered architecture와는 다른 점).

Traditional UNIX System Structure

 

Layered Approach

 

해당 OS는 많은 수의 layer들로 구성되어있습니다. 잘 구성된 layered approch의 경우 가장 아래 층 (layer 0)은 하드웨어이며 가장 위층 (layer N)은 user interface로 구성됩니다. 또한 각 층은 바로 아래층에 해당하는 모듈의 기능만을 사용할 수 있습니다. 또한 kernel의 각 기능들은 각 layer에 분포되어있어, 모든 kernel의 기능을 한 모듈이 갖고 있는 UNIX와는 차이점을 보입니다.

Layered approach

 

 

Chapter 3: Processes

 

Process Concept

 

프로세스는 batch system에서는 jobs으로, time-shared system에서는 user programs또는 tasks도 불립니다. 프로세스는 실행중인 프로그램을 말하며 (process is a program in execution), 이 프로세스는 순차적인 방법으로 실행됩니다. 이는 프로그램이 하나의 쓰레드를 갖는 경우를 말하며, 이 경우 프로그램에 저장되어있는 각 명령들을 순차적으로 CPU가 실행합니다.

 

메모리에 있는 program에는 다양한 부분들이 존재합니다:

  • text section; The program code. 프로그램의 코드가 들어있는 부분
  • program counter; 다음 실행해야하는 명령의 주소를 담는 부분, processor register; CPU에서 사용하는 register의 값
  • stack; 임시 데이터를 저장하는 부분
    • function parameter, return addresses, local variables와 같은 activation recorde를 담는 부분입니다. 함수가 끝나면 이는 사라집니다.
  • data section; grobal, static variable들을 저장하는 부분
  • heap; 프로그램 실행동안 동적으로 할당되는 데이터를 저장하는 부분
    • free()를 통해 deallocation을 하지 않는다면 프로그램이 끝나고 나서도 남아있을 수 있는 데이터, 이 점에서 stack과는 차이점을 보입니다.

 

프로그램은 정적인 개체이며, disk에 저장됩니다. 반면 프로세스는 동적인 개체입니다.

 

프로그램의 실행은 CLI의 경우 이름을 통해, GUI의 경우 마우스 클릭 등을 통해 실행할 수 있습니다. 또한 하나의 프로그램을 여러번 실행할 수도 있습니다 (One program can be several processes). 여러 사용자들이 하나의 프로그램을 사용하는 장면을 생각하면 됩니다.

Process in Memory

 

Process State

 

프로세스가 동작하는 동안 해당 프로세스의 상태는 변할 수 있습니다:

  • new: the process is being created
  • running: instructions are being executed; 프로세스가 CPU에 의해 동작하고 있는 상태입니다.
  • waiting: the processs is waiting for some event to occur; 어떤 이벤트가 일어나길 기다리고 있는 상태입니다. 이 경우는 일반적으로 I/O에 의해 발생하며, 해당 I/O device가 갖고 있는 waiting queue에서 기다립니다.
  • ready: the process is waiting to be assigned to a processor; CPU에 의해 할당받길 기다리고 있는 상태입니다. 이 경우 memory의 ready queue에서 이를 기다립니다.
  • terminated: the process has finished execution

Diagram of Process State

 

각 상태는 화살표를 따라서만 이동가능합니다. 즉, ready에서 terminatied로 바로 이동할 수 없다는 것입니다.

 

running에서 ready로 이동하는 경우 발생할 수 있는 interrupt의 예시는 RR이 있습니다. 만약 RR = 10ms라면 한 프로세스가 할당받을 수 있는 CPU자원의 시간은 10ms로, timer에 의해 10ms가 지나면 interrupt가 발생, 해당 process는 ready queue에서 다음 할당을 기다려야합니다.

 

Process Control Block (PCB)

 

task control block이라고도 불리는 이것은 kernel안에 위치하며 각 프로그램, 프로세스의 정보를 관리하는 구조체입니다. 이는 다음에 오는 것들로 구성됩니다:

  • Process state - running, waiting, etc.
  • Program counter
  • CPU registers
  • CPU scheduling information - priorities, scheduling queue pointers
  • Memory-management information - memory allocated to the process
  • Accounting information - CPU used, clock time elapsed since start, time limits
  • I/O status information - I/O devices allocated to process, list of open files

CPU Switch (Context Switch) From Process to Process

 

Threads

 

지금까지 하나의 프로세스에 하나의 쓰레드만 있는 경우를 살펴봤습니다. 이제는 하나의 프로세스에서 여러개의 쓰레드가 있는 경우를 살펴보겠습니다. 쓰레드는 프로세스의 실행 흐름을 말합니다. 만약 하나의 프로세스에서 여러개의 실행 흐름을 만들고 싶은 경우 쓰레드를 만들 수 있습니다.

 

아래의 그림은 PCB와 context switch를 나타내는 그림입니다:

Process Representation in Linux

 

Process Scheduling

 

CPU자원을 최대한 사용하기 위해서는 빠르고 효율적인 context switch가 중요합니다. 이때 process scheduler는 사용 가능한 프로세스들 (in Ready Queue)중에서 다음에 CPU가 실행할 프로세스를 선택하는 역할을 수행합니다. scheduling queue에는 다음 종류들이 존재합니다:

  • Job queue - set of all processes in the system; 시스템 내에 존재하는 모든 프로세스들을 담는 queue입니다.
  • Ready queue - set of all processes residing in main memory, ready and waiting to execute; 실행하길 기다리고 있는 모든 프로세스들을 담는 queue입니다.
  • Device queue - set of processes waiting for an I/O device; I/O 디바이스를 기다리고 있는 프로세스들이 있는 queue입니다. waiting queue라고도 불리기도 하며, 디바이스별로 존재합니다.

 

아래의 그림은 ready queue와 다양한 종류의 device queue들을 나타내고 있습니다. 이때 프로세스의 단위는 PCB입니다:

Ready queue and Various I/O device queue

 

아래의 그림은 임의의 프로세스가 CPU에 의해 동작한 후 어떤 명령들에 의해 다시 ready queue로 돌아가는 과정을 그림으로 나타낸 것입니다:

Representation of Process scheduling - queueing diagram

 

Schedulers

 

이런 스케쥴러에는 다음과 같은 종류들이 있습니다:

  • Short-term scheduler (or CPU scheduler) - 다음 실행할 프로세스로 CPU에 할당할 프로세스를 Ready queue에서 선택하는 역할입니다.
    • 어떤 시스템에서는 해당 스케쥴러만 있는 경우도 있습니다. *그만큼 중요하다는 얘기
    • short-term scheduler는 매우 자주 (milliseconds)호출됩니다. 이를 통해 time-sharing을 효율적으로 달성할 수 있습니다.
  • Long-term scheduler (or job scheduler) - job queue에 있는 프로세스들 중 ready queue로 옮길 프로세스를 선택하는 역할입니다.
    • long-term scheduler는 short-term scheduler보다는 덜 (seconds, minutes)호출됩니다.
    • 또한 이는 multiprogramming의 정도를 조절합니다. 예를 들어 long-term scheduler가 ready queue로 프로세스를 많이 옮겨놓는다면 multiprogramming을 강하게 하는 것이 됩니다.
    • 이런 프로세스는 두 가지 종류의 프로세스가 존재하며, job scheduler는 이 둘을 적절하게 배합하여 ready queue로 옮기는 것이 중요합니다:
      • I/O-bound process - I/O작업에 대부분의 시간을 소모하는 프로세스입니다. 만약 해당 프로세스가 너무 많다면 CPU는 너무 자주 interrupt가 발생해 효율적인 CPU운영이 불가능할 것입니다.
      • CPU-bound process - 대부분의 시간을 CPU계산에 소모하는 프로세스입니다.
  • Medium-term scheduler - 메모리 공간 부족 등의 이유 등으로 메모리에 있는 프로세스를 디스크로 옮기고, 옮겨진 프로세스를 다시 메모리로 옮기는 역할입니다; swapping
    • 이 스케쥴러는 multiprogramming의 수요가 줄어드는 경우 호출될 수 있습니다.

Addition of Medium term scheduling

 

위 그림은 medium scheduler에 의해 프로세스가 swap out/in 되는 과정을 그림으로 나타낸 것입니다.

 

Multitasking in Mobile Systems

 

초창기 iOS와 같은 몇몇 모바일 시스템에서는 오직 하나의 프로세스만을 실행할 수 있고, 나머지는 정지되는 시스템을 가졌습니다. 모바일 화면이 한정되어있기 때문에 iOS가 제공하는 인터페이스에도 한계가 있습니다. (1) iOS에서는 하나의 foreground process만을 가질 수 있습니다. 이는 사용자 인터페이스에 의해 컨트롤 되는 프로세스입니다. (2) 나머지는 많은 수의 background processes로, 이는 메모리에 있거나, 실행중이지만 디스플레이에 보이지 않는 프로세스입니다. 이런 background process로는 작은 태스크나, 이벤트의 알림, audio playback과 같은 프로세스들이 있습니다.

 

안드로이드 또한 foreground와 background가 동작하며, 몇몇 제약이 있습니다.(1) backgound process는 어떤 태스크를 수행하기 위해 service를 사용합니다. 이 service는 background process가 정지되더라도 계속 실행됩니다. 이런 서비스는 인터페이스가 없으며 적은 양의 메모리를 사용한다는 특징이 있습니다.

 

Context Switch

 

CPU가 다른 프로세스로 스위치할 때는 반드시 (1) 이전 프로세스의 상태를 저장해야하며, (2) 새로운 프로세스의 상태를 load해야합니다. 이런 context switch는 OS에 있어서 오버헤드로 context switch에 드는 비용을 최대한 줄여야합니다. 예를 들어 복잡한 OS와 PCB구조를 갖는다면 context switch에 드는 시간이 늘어날 것입니다.

 

context switch에 드는 비용은 하드웨어와 관련되어있습니다. 예를 들어 CPU에 들어있는 레지스터의 양을 늘려준다면, context switch시 load하는 것 대신 register에 이전 프로세스의 정보를 저장해둘 수도 있습니다.

 

Operations on Processes

 

시스템은 프로세스 생성 (process creation), 프로세스 종료 (process termination)등의 프로세스와 관련된 동작들을 포함해야합니다.

 

Process Creation

 

부모 (parent)프로세스는 자식 (children) 프로세스들을 생성할 수 있으며, 이는 트리의 구조를 띕니다. 일반적으로 프로세스들은 process identifier (pid)를 통해 구분됩니다.

 

한편, 프로세스를 생성할 때는 자원 공유와 관련하여 다음과 같은 사항들을 고려해야합니다:

  • Parent and children share al resources
  • Children share subset of parent's resources
  • Parent and child share no resources (Linux)

 

실행과 관련해서도 다음과 같은 사항들이 고려대상입니다:

  • Parent and children execute concurrently (Linux)
  • Parent waits until children terminate

 

주소 공간과 관련되서는 다음과 같은 사항들이 존재합니다:

  • Child duplicate of parent (Linux)
  • Child has a program loaded into it

A Tree of Processes in Linux
C Program Forking Separate Process
Creating a Separate Process via Windows API