• toc {:toc}

Operation System(운영체제) 구조

OS는 무엇을 하는가? OS가 왜 필요한가? 왜 OS를 전공 필수 과목으로 선정할 만큼 중요하게 다루는가? 이것이 OS를 처음 접할 때 드는 생각이다.

우리가 컴퓨터를 사용하는 경우를 생각해보자.

  • 컴퓨터를 사용한다는 것은 무엇을 의미하는 것일까? - 컴퓨터와 상호작용하는 것
  • 어떻게 상호작용하는가? - 마우스 클릭, 키보드를 입력하고 모니터, 스피커를 통한 출력을 듣는다.
  • 입력을 통해 어떤 출력을 받는가? - 프로그램에 따라 다르다.
  • 프로그램은 무엇인가? - 소프트웨어(하드웨어를 운용해 특정 작업을 수행하는 명령어 집합)
  • 하드웨어는 무엇인가? - 컴퓨터를 이루는 물리적 부품을 의미한다.

정리하면, 컴퓨터는 여러 물리적 부품, 하드웨어로 구성되어 있고, 컴퓨터와 상호작용하는 것은 하드웨어를 소프트웨어를 통해 원하는 작업을 설정해 입력을 전달하고 출력을 받는 일련의 과정을 말한다.

이 때, 소프트웨어를 통해 하드웨어가 원하는 작업을 하도록 설정하는 부분을 운영체제라 한다.

image


운영체제는 어떻게 작동하나

Device Controller / Driver

마우스 클릭, 키보드 타자와 같은 입력을 넣는다. 마우스, 키보드와 같은 경우도 하드웨어에 속한다. 컴퓨터는 세세한 부분도 체계화 되어 있어 각 장치들을 다루는 Controller와 Driver가 존재한다.

  • Controller - 하드웨어에서 물리적 입력을 했을 때 그 신호를 스캔 코드로 변환한다.
  • Driver - 스캔 코드를 운영 체제가 이해할 수 있는 코드로 변환하는 역할을 한다. Controller는 Interrupt라는 것을 발생시켜 CPU에게 ‘나 이렇게 행동하고 싶은데 실행해줘’라는 뜻을 전달한다.

각 Driver들은 서로가 함께 어우러져 유기적으로 작동하기 때문에 서로의 정보를 알 수 있는 방식이 필요한데, 이 것이 common bus이다.

Interrupt

  • Interrupt - 프로그램을 실행하고 있을 때 하드웨어 장치에 의해 예외상황이 발생해 처리가 필요한 경우 보내는 신호를 의미한다.

키보드 입력에 따른 Device Driver, Interrupt의 처리 과정을 살펴보자.

  1. 입력이 발생하면 Device Driver는 입력을 버퍼에 저장한다.
  2. Interrupt Controller는 Interrupt를 다루는 회로인데 각 장치에 따른 번호가 mapping되어 있고 Interrupt를 발생시킨다.
  3. Interrupt Controller는 Interrupt Request Line에 따라 CPU에 Interrupt를 전달한다.
  4. CPU는 Interrupt에 따라 적절한 Interrupt Service Routine을 실행하기 위해 Interrupt Vector Table을 확인한다.
  5. 선택된 Interrupt Service Routine을 따라 Interrupt를 처리한다. image

Interrupt 종류

  • Hardware Interrupt - 위의 예시와 같이 하드웨어 장치의 Interrupt를 처리하는 것이다.
  • Software Interrupt - 소프트웨어적 예외를 처리하는 것

System Call

Interrupt를 통해 전달된 입력은 컴퓨터적으로 어떻게 인식될 수 있을까?

키보드로 입력을 하면 Device Driver에 의해 입력값을 버퍼에 저장하고 Interrupt를 통해 CPU가 입력을 받을 준비를 마친다. 이 후 System Call을 통해 입력값을 처리한다.

Transclude of System-Call

System Call Parameter Passing

  • 의문 : System Call을 사용하기 위해서는 어떤 점을 고려해야 하는가?

System Call을 사용하려면 System Call이 필요로 하는 값을 전달해줘야 한다. 이 전달 값을 파라미터(Parameter)라고 한다. 이 파라미터를 전달해주는 방식은 3가지 방식이 있다.

  1. Simplest - 값을 그대로 레지스터로 전달한다.
    • 가장 간편한 방식이다. 하지만 레지스터의 용량보다 더 많은 정보가 전달되는 경우 다른 방식의 처리가 필요하다.
  2. Block - 파라미터의 값을 Block 형태로 쌓아 메모리에 저장하고 메모리의 주소를 레지스터에 저장해 전달한다.
    • 파라미터의 크기가 크더라도 레지스터가 아닌 메모리에 저장하는 것이기 때문에 여유가 있다.
  3. Stack - 스택 메모리를 사용하여 쌓았다가 내보내는 방식을 사용해 파라미터를 전달한다.

운영체제 구조

Monolithic Structure

  • 커널 공간에서 하나의 큰 프로그램으로 운영체제가 구현된 구조
  • 리눅스, 유닉스, Windows 등의 구조이다.
  • 더 빠르고 낮은 Overhead(필요한 추가 리소스)를 요구한다.
  • 서로 얽혀있거나 뭉쳐 있기 때문에 유지 보수하기 힘들다.

Layered Approach

  • 복잡한 운영체제를 더 작고 관리하기 쉽도록 분할한 방식
  • 각 layer는 level을 갖는데, 자신보다 낮은 level의 layer의 기능을 사용할 수 있다.
  • 이로써 high level이 될수록 사용자에게 더 정교하고 복잡한 기능을 제공한다.
  • low level 일수록 더 근본적인 기능을 제공한다.
  • 유지, 관리는 더 쉽지만 속도나 수행적인 측면에서 떨어진다.

Microkernels

  • 유저 모드에서 담당할 수 있는 부분들은 유저 모드로 넘겨 커널을 가능한 한 작고 가볍게 만드는 방식
  • 보다 더 모듈화되어 유연할 수 있다.
  • 확장하거나, 추가를 하기 편리하다.
  • 버그나 보안 결함이 발생했을 때 모듈화되어 있어 시스템 전체에 영향을 가하지 않기 때문에 더 안정적이고 안전하다.
  • 파일 처리, 장치 드라이버 등의 서비스들이 유저 모듈의 message passing을 통해 전달된다.
  • 커널 모드에서 처리해야하는 부분이 유저 모드에서 실행되기 때문에 속도가 느리고 병목현상이 발생할 수 있다.

image (출처: https://techdifferences.com/difference-between-microkernel-and-monolithic-kernel.html)