- toc {:toc}
Operation System(운영체제) 구조
OS는 무엇을 하는가? OS가 왜 필요한가? 왜 OS를 전공 필수 과목으로 선정할 만큼 중요하게 다루는가? 이것이 OS를 처음 접할 때 드는 생각이다.
우리가 컴퓨터를 사용하는 경우를 생각해보자.
- 컴퓨터를 사용한다는 것은 무엇을 의미하는 것일까? - 컴퓨터와 상호작용하는 것
- 어떻게 상호작용하는가? - 마우스 클릭, 키보드를 입력하고 모니터, 스피커를 통한 출력을 듣는다.
- 입력을 통해 어떤 출력을 받는가? - 프로그램에 따라 다르다.
- 프로그램은 무엇인가? - 소프트웨어(하드웨어를 운용해 특정 작업을 수행하는 명령어 집합)
- 하드웨어는 무엇인가? - 컴퓨터를 이루는 물리적 부품을 의미한다.
정리하면, 컴퓨터는 여러 물리적 부품, 하드웨어로 구성되어 있고, 컴퓨터와 상호작용하는 것은 하드웨어를 소프트웨어를 통해 원하는 작업을 설정해 입력을 전달하고 출력을 받는 일련의 과정을 말한다.
이 때, 소프트웨어를 통해 하드웨어가 원하는 작업을 하도록 설정하는 부분을 운영체제라 한다.
운영체제는 어떻게 작동하나
Device Controller / Driver
마우스 클릭, 키보드 타자와 같은 입력을 넣는다. 마우스, 키보드와 같은 경우도 하드웨어에 속한다. 컴퓨터는 세세한 부분도 체계화 되어 있어 각 장치들을 다루는 Controller와 Driver가 존재한다.
- Controller - 하드웨어에서 물리적 입력을 했을 때 그 신호를 스캔 코드로 변환한다.
- Driver - 스캔 코드를 운영 체제가 이해할 수 있는 코드로 변환하는 역할을 한다. Controller는 Interrupt라는 것을 발생시켜 CPU에게 ‘나 이렇게 행동하고 싶은데 실행해줘’라는 뜻을 전달한다.
각 Driver들은 서로가 함께 어우러져 유기적으로 작동하기 때문에 서로의 정보를 알 수 있는 방식이 필요한데, 이 것이 common bus이다.
Interrupt
- Interrupt - 프로그램을 실행하고 있을 때 하드웨어 장치에 의해 예외상황이 발생해 처리가 필요한 경우 보내는 신호를 의미한다.
키보드 입력에 따른 Device Driver, Interrupt의 처리 과정을 살펴보자.
- 입력이 발생하면 Device Driver는 입력을 버퍼에 저장한다.
- Interrupt Controller는 Interrupt를 다루는 회로인데 각 장치에 따른 번호가 mapping되어 있고 Interrupt를 발생시킨다.
- Interrupt Controller는 Interrupt Request Line에 따라 CPU에 Interrupt를 전달한다.
- CPU는 Interrupt에 따라 적절한 Interrupt Service Routine을 실행하기 위해 Interrupt Vector Table을 확인한다.
- 선택된 Interrupt Service Routine을 따라 Interrupt를 처리한다.
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가지 방식이 있다.
- Simplest - 값을 그대로 레지스터로 전달한다.
- 가장 간편한 방식이다. 하지만 레지스터의 용량보다 더 많은 정보가 전달되는 경우 다른 방식의 처리가 필요하다.
- Block - 파라미터의 값을 Block 형태로 쌓아 메모리에 저장하고 메모리의 주소를 레지스터에 저장해 전달한다.
- 파라미터의 크기가 크더라도 레지스터가 아닌 메모리에 저장하는 것이기 때문에 여유가 있다.
- Stack - 스택 메모리를 사용하여 쌓았다가 내보내는 방식을 사용해 파라미터를 전달한다.
운영체제 구조
Monolithic Structure
- 커널 공간에서 하나의 큰 프로그램으로 운영체제가 구현된 구조
- 리눅스, 유닉스, Windows 등의 구조이다.
- 더 빠르고 낮은 Overhead(필요한 추가 리소스)를 요구한다.
- 서로 얽혀있거나 뭉쳐 있기 때문에 유지 보수하기 힘들다.
Layered Approach
- 복잡한 운영체제를 더 작고 관리하기 쉽도록 분할한 방식
- 각 layer는 level을 갖는데, 자신보다 낮은 level의 layer의 기능을 사용할 수 있다.
- 이로써 high level이 될수록 사용자에게 더 정교하고 복잡한 기능을 제공한다.
- low level 일수록 더 근본적인 기능을 제공한다.
- 유지, 관리는 더 쉽지만 속도나 수행적인 측면에서 떨어진다.
Microkernels
- 유저 모드에서 담당할 수 있는 부분들은 유저 모드로 넘겨 커널을 가능한 한 작고 가볍게 만드는 방식
- 보다 더 모듈화되어 유연할 수 있다.
- 확장하거나, 추가를 하기 편리하다.
- 버그나 보안 결함이 발생했을 때 모듈화되어 있어 시스템 전체에 영향을 가하지 않기 때문에 더 안정적이고 안전하다.
- 파일 처리, 장치 드라이버 등의 서비스들이 유저 모듈의 message passing을 통해 전달된다.
- 커널 모드에서 처리해야하는 부분이 유저 모드에서 실행되기 때문에 속도가 느리고 병목현상이 발생할 수 있다.
(출처: https://techdifferences.com/difference-between-microkernel-and-monolithic-kernel.html)