[운영체제/OS] OS 자체는 어떻게 구현할까?

kindof

·

2021. 6. 14. 19:49

1. 생각

이전 포스팅까지 우리는 운영체제란 무엇이며 구조는 어떻게 생겼는지, 그리고 Dual Mode Operation과 Interrupt에 대한 개념을 살펴봤습니다. 이후에는 프로세스란 무엇이며 Mode Switching과 Context Switching을 비교해보았습니다.

 

그렇다면, 정작 지금까지 공부한 운영체제는 이 자체로 어떻게 동작할까요? 흥미롭게도, 운영체제 역시 프로세서에 의해 실행되는 하나의 프로그램입니다. Linux OS에 대한 코드가 C로 짜여졌다는 것을 생각해보면 운영체제가 하나의 소프트웨어 프로그램이라는 말이 이해되시시지 않나요?

 

자, 그렇다면 최초에 누군가 운영체제를 만들려고 했을 때 과연 어떤 방식으로 운영체제를 디자인했을까요?

 

참고로 아래 포스팅에서 살펴봤던 단일 구조, 계층 구조, 마이크로커널 구조 운영체제에 대한 설명은 '하나의 운영체제가 어떤 구조로 짜여져 있는가'에 대한 내용이었다면, 지금 살펴볼 운영체제의 구현은 전체적인 프로그램 관점에서 운영체제가 어떻게 위치할 것인지에 대한 이야기입니다.

 

[이중 동작 모드(Dual Mode Operation)와 인터럽트(Interrupt), 그리고 운영체제의 구조]

 

[운영체제/OS] 이중 동작 모드(Dual Mode Operation)와 인터럽트(Interrupt), 그리고 운영체제의 구조

1. 컴퓨터의 구조 운영체제란 무엇인가를 정의하기에 앞서 컴퓨터는 어떻게 이루어져 있는지 살펴보면 좋을 것 같습니다. 한 번 가볍게 읽어보고 넘어가주세요. CPU는 Central Processing Unit의 약자로

studyandwrite.tistory.com

 

다시 돌아와서, 위 질문에 대한 답은 크게 두 가지였습니다. 

  • Execution within User process
  • Process-based Operating System(Execution outside user process)

지금부터 이 방법들에 대해 알아보며 각 방법으로 OS를 디자인했을 때의 장단점에 대해 알아보겠습니다.

 


2. 운영체제의 구현

1) Execution within User Process

첫 번째 방법은 User Process 안에서 OS가 동작하는 방식입니다.

Execution within User Process

위 그림처럼 커널(운영체제)은 User process의 일부분처럼 나타납니다. OS 코드가 프로그램 이미지(Image)와 연결되어 있는 것이죠.

 

그리고 이전 시간에 말씀드렸던 것처럼 Interrupt가 일어나게 되면 CPU는 User mode에서 Kernel mode로 Mode-Switching을 하게 됩니다. 이 때, OS가 각 User process 위에 있기 때문에 Process간의 Switching이 일어날 필요가 없게 되고, 이는 곧 같은 프로세스 안에서의 Mode switching만 필요하게 되므로 오버헤드가 크지 않습니다. 참고로 프로그램이 돌아갈 때 매우 빈번한 Mode Swtiching이 일어난다는 것을 감안하면, 이때마다 Process Switching이 안 일어나도 된다는 것은 매우 큰 장점입니다.

 

우리가 잘 알고 있는 Linux 운영체제가 Execution within User process 모델을 가지고 있습니다. 구체적인 Linux Process Image를 보면 아래와 같은데요. 형광색과 빨간색으로 써 넣은 글씨도 한 번 읽어봐주세요.

Linux Process Image

위의 그림에서 커널의 주소 공간은 유저 프로세스 이미지의 주소 공간 바로 위에 1GB 크기로 자리 잡고 있습니다. 그리고 이 윗부분의 주소 공간을 모든 Process에서 공유(dead copy)하고 있죠.

 

따라서 앞서 말씀드렸던 것처럼, 커널이 별도의 PCB로 존재하지 않기 때문에 Mode Switching만 필요하게 되고, 오버헤드가 크지 않은 장점이 생기게 됩니다.


2) Process-based Operating System

두 번째 방식은 각 유저 프로세스와는 독립적으로 OS 프로세스가가 PCB(Process Control Block)로 존재합니다.

Process-based OS

여기에서는 각 커널을 독립된 프로세스로 구성하게 되고, OS를 이러한 Process들의 집합으로 보게 됩니다.


앞선 방식에서는 커널이 각 유저 프로세스마다 존재했고, 그 공간이 1GB정도였는데 여기서는 각 커널이 하나의 프로세스 전체를 차지하게 되므로 4GB 전체를 쓸 수 있게 되었죠.


또한 OS를 모듈로 나눠서 구현이 가능하게 됐고, 이에 따라 병렬 컴퓨터라면 높은 스피드를 낼 수 있게 되었습니다.


하지만 무엇보다 큰 단점은 각 OS가 독립적인 프로세스로 존재하기 때문에 Mode Switching이 일어나면 필연적으로 Process Switching이 필요하게 되고, 이에 따라 오버헤드가 매우 커질 수밖에 없는 단점이 있죠.

 


이렇게 이번 시간에는 운영체제를 어떻게 구현할 것인가에 대한 두 가지 방법에 대해 살펴봤습니다.

 

특히 Within User Process 방식으로 운영체제를 구현하는 것이 모드 스위칭에 따른 오버헤드가 적다는 점을 강조드렸습니다. 물론 Process-based 운영체제 구현도 그만의 장점이 존재하긴 하죠.

 

두 가지 방법의 장단점과 그 장단점이 생길 수밖에 없는 이유를 한 번 생각해보시면 좋겠습니다.

 

감사합니다.