본문 바로가기

Computer Sci./Operating System

OS #2. 운영체제 디자인, 커널 관점 설계 (OS Design, Kernel Arch.)

오늘도 운영체제 구조, 특히 그 중에서도 디자인 관점에서 공부를 해 보려고 한다.

 

프로세스 관리(Process Management)

프로세스는 실행중인 프로그램을 의미한다. 프로그램은 파일 형태로 존재하는 수동적 상태(Passive Entity)이며, 프로세스는 프로그램 카운터를 가지는 능동적 상태(Active Entity)이다. 싱글 스레드 프로세스는 1개의 프로그램 카운터를, 멀티 스레드 프로세스는 스레드당 1개의 카운터를 가진다.

 

※프로그램 카운터(Program Counter)란?

프로그램 카운터(Program counter, PC)는 마이크로프로세서(CPU) 내부에 있는 레지스터 중의 하나로서, 다음에 실행될 명령어의 주소를 가지고 있어 실행할 기계어 코드의 위치를 지정한다. 때문에 명령어 포인터라고도 한다. 인텔의 x86계열의 CPU에서는 IP(Instruction Pointer)라고 한다.

프로그램 계수기는 각 명령 주기에 따라 자동으로 증가하여, 메모리에 있는 명령어들이 순차적으로 실행될 수 있도록 한다. 단, 분기 또는 서브루틴 호출/복귀 등의 특정 명령어는 프로그램 카운터에 실행해야 위치가 바로 다음 코드가 아니라 새로운 기계어 코드의 위치 값이 들어간다.

대부분의 프로세서에서는 명령어를 반입하고 난 직후에 명령어 포인터를 증가시킨다. 경우에 따라 분기 명령어의 목표가 되는 주소를, 그 분기 명령어의 인수(operand)에서 지정하는 경우도 있다. 명령어의 인수값이 절대 주소값인 경우는 인수값을 프로그램 카운터 값에 설정하면 그 주소를 점프한다. 명령어의 종류에 따라 인수가 현재 위치에서의 상대적으로 지정하는 경우도 있는데 이런 경우 현재 프로그램 카운터 값에 인수값을 더하는 방식을 사용한다. 즉, 다음에 실행될 명령어의 주소는 명령어에 따라 명령어의 인수에 지정되는 경우도 있다.

출처 : 위키백과

 

운영체제의 프로세스 관리 활동에는 다음과 같은 것들이 있다.

  • 유저/시스템 프로세서의 생성 및 삭제
  • 프로세스의 일시중지와 재실행
  • 프로세스 동기화 방법 제공
  • 프로세스 통신 방법 제공
  • 교착상태(Deadlock)에서의 처리 방법 제공

 


 

메모리 관리(Memory Management)

메모리 관리는 추후 포스팅에서 깊게 다루도록 하고 오늘은 간단하게 메모리 관리가 어떤 것인지만 알아보고 넘어간다.

메모리 관리에 들어가기 전에 알아야 할 것들이 2가지 있다.

첫 번째로, 운영체제는 각 프로세스들이 메모리에 올라왔을 때 다른 프로세스의 메모리 공간을 접근하는 것을 막아야 한다. 이를 위해서 메모리에서 프로세스의 시작 위치를 저장하는 Base Register와 프로세스에 할당된 메모리의 크기인 Limit Register 값을 이용해 프로세스의 메모리 공간의 경계를 나눈다. 즉 아래의 그림에서는 300040(BR) <= 프로세스가 접근할 수 있는 공간 <= 420940(BR+LR) 의 범위를 가짐을 알 수가 있다.

두 번째로는 주소 바인딩 시점이다. 주소 바인딩은 프로세스가 접근해야 하는 값과 함수에 대한 주소가 정해지는 것을 의미한다. 우리가 작성한 프로그램에서 변수나 함수들은 각자 실제 메모리 주소를 통해 접근을 하고, 프로그램은 컴파일되어 메모리에 올라간 후에 CPU에 의해 명령어가 한 문장씩 실행이 되게 된다. 이 때 CPU가 명령문을 실행함으로써 발생하는 메모리 주소를 논리주소(Logical Address) 또는 가상주소(Virtual Address)라고 부른다. 그리고 실제 접근해야 하는 메모리 주소는 물리주소(Physical Address)라고 하는데 논리주소와 실제주소는 서로 다를 수 있다.

이 두가지를 기억하고 바라보면 메모리 관리는 다음과 같은 역할들을 한다.

  • 어떤 부분의 메모리들이 현재 사용되고 있는지 파악
  • 어떤 프로세스와 데이터들이 메모리에 들어가고 나갈지를 정함
  • 메모리 공간이 필요할 때 어떻게 메모리 공간을 배분하고, 공간을 제거할 지 결정

 


 

저장소 관리(Storage Management)

저장소에는 다양한 종류가 있다. 다만, 데이터를 보내줄 때는 데이터가 동일해야 한다. 따라서 논리적 저장 단위인 파일을 정의하고, 파일을 물리적인 매체로 매핑해서 접근하도록 한다. 파일 시스템 관리에 대해서도 추후 포스팅에서 깊이 있게 살펴보도록 하겠다.

저장장치에는 다음과 같은 것들이 있다.

  1. 메인 메모리
    • 빠르다, 그리고 비싸다.
    • 휘발성이 있다.
    • ex. RAM
  2. 보조기억장치(Secondary Storage)
    • 메인 메모리를 보조하는 장치이다.
    • 비 휘발성이고 대용량이다.
  3. 자기 디스크(Magnetic Disk)
    • 마그네틱을 활용한 저장장치이다.
    • ex. 하드디스크
  4. Solid State Disk(SSD)
    • 플래시 메모리 기반이기 때문에 빠르다.
    • 미래의 각광받는 저장장치이다.

 


 

이제 운영체제 디자인 관점으로 본격적으로 들어가서 살펴보도록 하자. 디자인을 할 때에는 두 가지 원칙을 가지고 해야 하는데 그것은 바로 Mechanism과 Policy이다. 이 두가지를 분리함으로써 운영체제 설계를 모듈화 할 수 있다.

  • Mechanism
    • 무엇을 어떻게 할 것인가?
    • 알고리즘, 자료구조 등
  • Policy
    • 무엇이 되게 할 것인가?
    • 높은 레벨로 가기 위해서 메커니즘을 사용해야 한다.
    • ex. 공평성을 추구할 것인가? CPU를 적게 쓰는 것을 추구할 것인가?

 

설계 원칙 : Layering vs Modularity

  • Layering
    • OS의 복잡도를 낮추기 위한 방안
    • Layer는 정의가 명확한 함수들로 이루어짐
    • 하나의 Layer는 인전한 Layer와만 통신이 가능
    • 설계의 복잡도를 낮출 수는 있으나, 그로 인해서 Overhead가 발생함
    • Layer의 수정이 다른 Layer와 독립적임
    • 올바르게 역할이 분리되지 않으면 굉장히 위험할 수 있다.
    • TCP/IP 네트워크 쪽에서 많이 쓰인다. ex. OSI 7 layers

  • Modularity
    • 커널은 일부 layer로 되어 있지만, 주는 모듈로 되어 있음
    • 성능 면에서 layering보다 낫다.
    • 디버깅 차원에서는 layering보다 불편하다.

 


 

Kernel Architecture

Monolithic Kernel

  • 커널이 사용자와 같은 주소 공간(Address Space)에 위치
  • 주소 공간을 커널 코드와 사용자가 나누어서 사용
  • 커널 코드는 한 '덩어리'로 구성됨 -> 커널은 시스템 콜을 통하여 접근
  • 장점 : 어플리케이션과 모든 커널 서비스가 같은 주소 공간에 위치하기 때문에, 시스템 콜 및 커널 서비스 간의 데이터 전달 시 오버헤드가 적음
  • 단점
    • 모든 서비스 모듈이 하나의 바이너리로 이루어져 있기 때문에 일부분의 수정이 전체에 영향을 미침
    • 각 모듈이 유기적으로 연결되어 있기 때문에 커널 크기가 커질수록 유지보수가 어려움
    • 한 모듈의 버그가 시스템 전체에 영향을 끼침

Microkernel

  • 커널 서비스를 기능에 따라 모듈화 하여 각각 독립된 주소 공간에서 실행
  • 이러한 모듈을 서버라 하며, 서버들은 독립된 프로세스로 구현
  • 마이크로 커널은 서버들 간의 통신(IPC), 어플리케이션의 서비스 콜 전달과 같은 단순한 기능만 제공
  • 장점
    • 각 커널 서비스 서버가 따로 구현되어 있기 때문에 서로 간의 의존성이 낮음 -> 보다 독립적인 개발이 가능
    • 커널 서비스 서버의 간단한 시작/종료 가능 -> 많은 메모리 및 CPU utilization 확보 가능
    • 이론적으로 monolithic보다 더 안정적
  • 단점
    • Monolithic 커널보다 낮은 성능을 보임
      • 독립된 서버들 간의 통신 및 Context Switching

블록 I/O 처리 비교

Hypervisor

  • 하드웨어와 OS가 1:1로 존재하는 구조를 바꿈
  • 가상화된 컴퓨터 H/W자원을 제공하기 위한 관리 계층, 게스트 OS와 H/W 사이에 위치
  • 각 게스트 OS들은 각각 서로 다른 가상머신(Virtual Machine)에서 수행되며 서로의 존재를 알지 못함
  • 하이퍼바이저는 각 게스트 OS간의 CPU, 메모리 등 시스템 자원을 분배하는 등 최소한의 역할을 수행
  • 가상화의 이점
    • Consolidation : Allow easier provisioning 
    • Decoupling : Eliminate dependency between S/W and H/W 
    • Isolation : Guest OS are isolated from each other

Consolidation
Decoupling
Isolation

  • 장점
    • 하나의 물리 컴퓨터에서 여러 종류의 게스트 OS 운용이 가능 -> 한 서버에서 다양한 서비스를 동시에 제공
    • 실제의 컴퓨터가 제공하는 것과 다른 형태의 명령어 집합 구조를 제공
  • 단점
    • H/W를 직접적으로 사용하는 다른 운영체제에 비해 성능이 떨어짐 -> 반가상화(Para-virtualization)로 성능 저하 문제를 해결하려고 함

좌 : KVM / 우 : 컨테이너

  • 경량화된 hypervisor
    • KVM
      • 리눅스에 포함된 hypervisor
      • Xen의 반가상화를 없앰
    • 컨테이너
      • Share root file system and libraries
      • lighter than KVM
      • Package all the dependencies into "image"

 

참고 자료

  1. 고려대학교 유혁 교수님 운영체제(COSE341) 수업 자료
  2. <Operating System Concepts> 9th ed. by A. Silberschatz
  3. http://blog.naver.com/PostList.nhn?blogId=503109
  4. https://baked-corn.tistory.com/15