[운영체제/OS] 운영체제의 이중 동작 모드(Dual Mode Operation)와 인터럽트(Interrupt)
kindof
·2021. 6. 14. 19:37
0. 들어가면서
이번 포스팅은 운영체제를 정리하는 첫 포스팅입니다.
그래서 앞으로 자주 사용할 용어와 개념들을 소개하고, 운영체제의 기본적인 개념에 대해서 짚어보는 내용을 쓰고자 합니다.
특히 이번 포스팅에서는 운영체제의 정의와 운영체제의 동작 방식인 이중 동작 모드(Dual Mode Operation), 그리고 인터럽트(Interrupt) 개념에 대해 다룰 예정인데, 이 세가지 개념들은 꼭 기억하면 좋을 것 같습니다.
1. 컴퓨터의 구조
운영체제란 무엇인가를 정의하기에 앞서 컴퓨터는 어떻게 이루어져 있는지 살펴보면 좋을 것 같습니다. 한 번 가볍게 읽어보고 넘어가주세요.
CPU는 Central Processing Unit의 약자로, 영어 해석을 그대로 따라 중앙처리장치라고 합니다. 컴퓨터 성능을 결정짓는 중요한 요소이고 실제로 컴퓨터 아키텍쳐 수업에서도 CPU의 Execution Time를 Performance의 지표로 삼기도 했습니다. 우리가 사용하고 있는 노트북의 i5, i7 등의 제품들이 CPU죠.
RAM은 CPU의 연산결과를 저장하고 처리할 수 있는 공간입니다. 프로그램이 동작하는 것은 사실 프로그램들이 메모리에 읽혀져 동작하게 되는 것이기 때문에 RAM의 크기 역시 컴퓨터의 처리 속도를 결정짓는데 중요한 영향을 끼칩니다. 메모리 용량이 클수록 여러 프로그램을 실행할 수 있고 높은 성능을 보장할 수 있죠. 하지만 램은 전원이 꺼질 경우 내용이 지워지는 휘발성(Voltale) 메모리이기 때문에 영구적으로 저장해야 하는 데이터는 하드디스크 장치에 저장해야 합니다.
HDD(하드디스크)는 영구적으로 데이터를 저장하기 위한 장치입니다. 우리가 컴퓨터를 껐다가 켜도 남아있는 내용들, 예를 들어 인터넷, 워드, Editor 같은 프로그램들은 하드디스크에 저장되어 있는 것이죠. 최근에는 메모리 기반의 HDD인 SSD(Solid State Disk)의 가격이 저렴해지고 있어 많이 보급되고 있는데, 이를 통해 많은 양의 데이터를 저장해둘 수 있게 되었습니다.
메인보드는 쉽게 생각해서 하드웨어들을 꽂아두는 몸통이라고 생각할 수 있습니다.
GPU는 컴퓨터에서 그래픽 처리를 전문적으로 하는 하드웨어입니다. 최근에는 GPU의 성능이 ML, DL의 학습에 있어 굉장히 중요한 요소가 되었기 때문에 GPU의 중요성이 커지고 있습니다.
2. 운영체제란?
운영체제(Operating System, OS)는 하드웨어 장치를 유저가 사용할 수 있도록 환경을 제공하는 소프트웨어라고 볼 수 있습니다.
우리가 컴퓨터 속의 구조를 하나도 알지 못해도 클릭으로, 또는 커널의 명령으로 컴퓨터와 의사소통 할 수 있는 것이 운영체제가 있기 때문이죠.
우리가 자바로 프로그램 코드 하나를 실행시킨다고 해볼까요? 코드 중에서 컴퓨터 하드디스크 혹은 RAM에 저장되어 있는 데이터를 read()하고 write()하는 작업이 있을 수 있습니다. 그런데 우리가 입력한 코드가 어떻게 그 역할을 수행하는 걸까요? 이 물음에 대한 답이 OS의 역할입니다. 유저 코드에서 Read Call이 발생하면 해당 장치를 핸들링하기 위해 User Mode에서 Kernel Mode로 바뀌게 되고, 그 곳에서 작업을 완료한 뒤 다시 User Mode로 돌아와 프로그램을 수행하는 것이죠.
여기에서 한 가지 중요한 개념인 폴링(Polling)과 인터럽트(Interrupt)에 대해 짚고 넘어가겠습니다.
- 폴링(Polling)은 운영체제가 장치 사용을 감시하기 위해 장치의 동작 여부를 수시로 체크하는 것을 말합니다. 하지만 이러한 방식으로 장치 사용을 매 번 감시하는 것은 비효율적이기 때문에 장치에서 이벤트 발생 시 해당 이벤트를 통지해주는 인터럽트(Interrupt) 개념이 사용되죠.
- 인터럽트(Interrupt)는 프로그램을 실행하는 동안 I/O 장치의 사용이나 예외가 발생하면 이를 CPU에게 알려서 처리하도록 하는 역할을 합니다. 폴링보다 인터럽트가 효율적인 개념이겠죠?
3. 이중 동작 모드(Dual Mode Operation)과 OS의 역할
이중 동작 모드(Dual Mode Operation)은 OS가 이상한(?) 프로그램(Application faults)으로 인해 잘못 동작하거나 망가지지 않게 하는 아주 중요한 핵심 동작 원리입니다.
'듀얼'이라는 말처럼 OS는 User mode와 Kernel mode 두 가지 모드를 두고 동작하는데요. 유저모드에서는 어플리케이션이 동작하고 사용자가 컴퓨터와 상호작용하는 등의 일이 이루어집니다. 반면, 커널모드에서는 드라이버, CPU, 메모리 등에 접근하고 명령을 내리며 이러한 작업들이 이루어지기 위한 근본적인 작업들을 처리하죠.
이 때, 특정한 권한 명령(Privileged Instruction)들은 무조건 커널 모드에서만 수행되어야 합니다. 유저 마음대로 OS의 작동을 좌지우지 할 수 있다면 하드웨어 장치나 메모리가 오동작하거나 심지어는 공격을 받을 수 있기 때문이죠.
그러면 언제/어떻게 유저모드에서 커널모드로 전환될까요? 바로 위에서 살펴본 인터럽트(Interrupt)가 발생할 때입니다. 그리고 인터럽트는 유저가 적절한 시스템 콜을 통해서 OS에게 커널 모드로 가서 요청한 작업을 해달라는 메시지를 보낼 때 발생하게 되죠.
그림을 보면 OS는 빨간색으로 표시된 시스템 콜을 통해 커널 모드에 가서 파일 시스템을 관리, I/O 작업 관리, 메모리 관리 등의 작업을 수행합니다. 또한 초록색 박스로 표현된 Hardware Control을 통해 진짜 하드웨어와 소통하게 하죠.
4-1. Interrupt?
지금까지 말한 인터럽트(Interrupt) 개념에 대해 정확히 짚어 보려고 합니다.
인터럽트(Interrupt)란 CPU가 프로그램을 실행하고 있을 때 입출력 하드웨어 등의 장치 사용이나 프로그램 내 예외상황(Exception) 등이 발생하여 처리가 필요할 때 프로세서에게 이를 알려주는 것을 말합니다.
인터럽트에는 크게 하드웨어(HW)와 소프트웨어(SW) 인터럽트가 있고 시스템 콜 역시 이와 비슷한 역할을 수행하여 프로세스에게 유저 모드에서 커널 모드로 가서 특정 작업을 수행할 것을 요구하게 됩니다.
그렇다면 하드웨어와 소프트웨어 인터럽트란 무엇인지, 시스템 콜은 정확히 무엇을 말하는지 짚어보겠습니다.
- Hardware Interrupt: 하드웨어가 발생시키는 인터럽트로, CPU가 아닌 다른 하드웨어 장치가 CPU에 어떤 사실을 알려주거나, CPU 서비스를 요청해야 할 경우 발생시킵니다. 정전 또는 전원 공급의 이상, CPU 또는 기타 하드웨어의 오류 등도 하드웨어 인터럽트에 포함되죠.
- Software Interrupt(Exception): CPU 내부에서 실행되면서 인터럽트를 발생시키는 경우로써 프로그램 코드를 돌리는 과정에서 Exception이 발생할 때 Kernel Mode로 전환하여 에러를 핸들링하는 경우를 말합니다. 예시로는 Divide by Zero, Overflow, Underflow 등이 있죠.
- System Call: 사용자가 프로그램을 실행시키거나 OS를 호출하는 동작을 수행하는 경우에 일어납니다. 모든 프로그램은 자신의 독자적인 주소 공간을 가지고 있으며, 프로그램이 함수를 호출하는 경우 자신의 주소 공간 내에서 호출이 이루어지게 됩니다. 그러나 System call은 함수임에도 불구하고 자신의 주소 공간이 아닌 Kernel 영역에 존재하는 함수를 호출합니다.
구체적인 시스템 콜의 예시에는 파일 생성, 삭제, 열기, 닫기, 읽고 쓰기부터 장치 관리, 정보 유지(time, date 등)과 통신을 하는 것 등이 있으며, 특정 프로그램이 CPU를 독점하는 것을 방지하기 위해 CPU 할당 시간이 만료되면 인터럽트를 발생시켜 프로세스 처리를 분할하는 것 역시 시스템 콜의 역할입니다. 이 부분에 대해서는 나중에 CPU 스케줄링에서도 다시 살펴볼 예정입니다.
한편 시스템 콜이 존재한다는 것은 우리가 하드웨어에 대한 명령이나 메모리 사용 등에 관한 내용을 전부 알지 못해도 프로그래밍을 하는 데 지장이 없음을 의미합니다. mkdir같은 명령어로 디렉토리를 만들 때 그 안에 일어나는 과정을 모르는 것처럼 말이죠.
또한 권한이 없는 유저나 허용되지 않은 시스템 콜에 대해서는 이를 무시하거나 프로세스를 kill함으로써 커널을 보호하는 역할도 합니다.
4-2. 인터럽트 처리 과정
그렇다면 실제로 CPU에 인터럽트가 발생하면 이를 어떻게 처리할까요? 아래 그림을 보겠습니다.
인터럽트가 발생하면 크게 아래 여섯 단계를 거치게 됩니다.
- 프로그램 실행을 중단한다.
- 현재의 프로그램 상태를 보존한다.
- 인터럽트 처리 루틴을 실행한다.
- 인터럽트 서비스 루틴을 실행한다.
- 인터럽트 요청 신호가 발생했을 때 보관한 PC의 값을 다시 PC에 저장한다.
- PC의 값을 이용하여 인터럽트 발생 이전에 수행 중이던 프로그램을 계속 실행한다.
3번에서 인터럽트 처리 루틴이란 인터럽트의 원인을 파악하는 일련의 과정을 의미합니다. 그리고 4번에서 인터럽트 서비스 루틴(Interrupt service routine)이란, 인터럽트 핸들러라고도 하며 실제 인터럽트를 처리하는 루틴으로 실행 중이던 레지스터와 PC를 저장하여 실행중이던 CPU의 상태를 보존하고 인터럽트 처리가 끝나면 원래 상태로 복귀하는 일련의 과정을 말합니다.
5. 운영체제의 구조
다음으로는 운영체제가 구조적으로는 어떻게 구성되는지 알아보려고 합니다. 운영체제를 구성하는 방법에는 크게 세 가지 있습니다. 하나씩 살펴보도록 하겠습니다.
1) 단일 구조 운영체제(Monolithic)
단일 구조 운영체제는 초기에 생겨난 가장 보편적인 형태로 운영체제의 모든 기능을 커널과 동일한 메모리 공간에 적재한 뒤, 시스템 콜을 통해 사용합니다.
커널에는 파일 시스템, Processor 스케쥴링, 메모리 관리 등이 포함되며 시스템 호출을 하여 또 다른 운영체제 기능을 제공합니다.
단일 구조 운영체제는 대부분의 기능을 커널에 그룹화하여 구현하므로 속도가 빠르고 시스템 자원을 효율적으로 관리할 수 있습니다. 하지만 커널 크기가 상대적으로 커지면서 버그의 원인이나 기타 오류를 구분하기 어렵고, 새 기능을 추가하는 수정과 유지보수가 어렵죠.
2) 계층 구조 운영체제(Layering)
계층 구조에서는 비슷한 기능을 수행하는 요소를 그룹화하여 계층적으로 구성합니다.
실제로 프로세스 요청을 수행할 때 0계층부터 5계층까지 거쳐야 하고, 각 계층은 서로 인접한 계층과 상호작용하며 자신의 하위 계층만 서비스할 수 있습니다.
모듈화가 잘 되어 있어 유지보수가 편하지만, 계층 구조를 정의하기 어렵기 때문에 결론적으로 성공한 모델이 아닙니다.
3) 마이크로커널 구조 운영체제(Microkernel)
위에서 살펴봤듯이 단일 구조 운영체제는 성능은 좋은데 유지보수가 어려웠고, 계층 구조 커널은 모듈화가 잘 되어 있어 유지보수가 편했지만, 계층 구조를 정의하기 어려웠습니다.
마이크로커널 구조 운영체제는 이러한 단점을 보완하기 위해 커널에는 최소 기능만 포함시켜 크기를 줄이고, 기타 기능은 사용자 공간으로 옮겨 사용자 영역에서 수행하도록 했습니다.
커널이 가벼워져 잘못된 수행이 있더라도 커널에 치명적인 영향을 미칠 확률이 줄어들고, 모듈화 개념을 적용했기 때문에 이식성이 좋고 규모 확장성이 뛰어나죠.
하지만 무엇보다 모듈간에 통신(커널-커널)이 빈번하게 발생될 때, 성능이 떨어지는 문제점이 있습니다.
6. 마치면서
이번 글에서는 운영체제에 대해 본격적인 공부를 하기 위해 필요한 개념들에 대해 간단히 짚어봤는데요.
제가 생각했을 때 이번 글에서 가장 중요한 개념은 듀얼 모드 동작과 인터럽트에 관한 내용입니다. 이 부분을 잘 공부해두면 뒤에 이어지는 내용들을 이해하기 좋을 것 같습니다.
감사합니다.
'CS > OS' 카테고리의 다른 글
[운영체제/OS] 멀티쓰레드 구현해보기 (0) | 2021.06.14 |
---|---|
[운영체제/OS] 프로세스 모델의 한계과 멀티쓰레드의 필요성 (0) | 2021.06.14 |
[운영체제/OS] OS 자체는 어떻게 구현할까? (0) | 2021.06.14 |
[운영체제/OS] 프로세스와 컨텍스트 스위칭(Context Switching) (0) | 2021.06.14 |
[운영체제/OS] 가상머신(Virtual Machine)과 Linux OS에 대해 (0) | 2021.06.14 |