해당 포스팅에서는 운영체제가 사용자 소프트웨어와 하드웨어 사이에서 어떻게 중간 다리 역할을 하는지 알아볼 예정입니다.
운영체제(OS)는 사용자 소프트웨어 <-> 하드웨어
사이에서 안전하고 효율적으로 하드웨어를 사용할 수 있도록 도와주는 역할을 합니다.
그렇기 때문에 운영체제를 본격적으로 공부하기에 앞서 컴퓨터 시스템 구조에 대한 이해가 필요합니다.
Computer
: CPU, Memory 등으로 이루어져 명령을 수행하는 역할을 합니다.
I/O Device
: 키보드, 모니터, 프린터기 등 컴퓨터를 사용하기 위한 부수적인 하드웨어입니다. (단적인 예로, 프런터기나 키보드가 없어서 컴퓨터가 실행은 됩니다.)
컴퓨터에는 크게 CPU
와 Memory
가 존재합니다.
그리고 그 외에 Timer, DMA Controller, Mode bit 등 부수적인 장치들이 존재합니다.
RAM이라고 불리는 Memory
에는 실시간으로 각종 사용자 소프트웨어
와 커널(Kernel)
이 적재됩니다.
커널(Kernel) : 운영체제 중에서도 메모리에 상주하며 역할을 수행하는 OS의 핵심적인 부분
커널 또한 소프트웨어이다.
CPU
는 메모리로부터 소프트웨어의 명령을 불러와서 실행시키는 역할을 합니다.
CPU 1개당 최대 하나의 프로세스를 실행시킬 수 있는 것이 원칙 입니다.
따라서, 이미지에는 생략되어 있지만 CPU 내부에는 현재 실행하고 있는 프로세스 정보가 담겨 있는 각종 레지스터
와 일종의 버퍼 역할을 하는 캐시
가 존재합니다.
프로그램 : 디스크 저장 장치에서 존재하며, 아직 실행되지 않은 소프트웨어
프로세스 : 메모리에 적재되어, 현재 실행 중인 소프트웨어
저장 장치 피라미드
가 보여주듯이, 위로 올라갈 수록 저장할 수 있는 용량이 줄어들고, 가격이 비싸집니다. 하지만 CPU가 빠르게 접근할 수 있다는 장점이 있습니다.
그 중에서도 레지스터와 캐시는 CPU 내부에 존재하기 때문에 매우 빠른 속도를 자랑합니다.
레지스터 : 프로세스에 대한 각종 CPU 제어 정보와 다음 실행할 명령어 주소가 담긴 PC(Program Counter)로 이루어져 있다.
CPU와 가장 밀접한 하드웨어
캐시 : 메모리에서 매번 정보를 가져오는 것이 비용이 크기 때문에, 최근 사용한 정보들을 CPU 내부에 일부 기록하여 빠르게 접근하기 위한 용도이다.
원칙적으로는 메모리에 접근할 수 있는 하드웨어는 CPU뿐입니다.
따라서 입출력시에도 CPU가 직접 I/O Device에 접근하여 데이터를 가져와 메모리에 적재시키곤 했습니다.
하지만, I/O Device에서 이루어지는 입출력을 Word 단위로 매번 가져오기 위해 접근하는 과정에서 CPU는 Interrupt
, Interrupt Service Routine
등을 매번 처리해야 하는 부수적인 동작이 필요합니다.
이러한 과정에서 CPU가 사용자 프로그램을 실행시키기도 바쁜데 다른 부수적인 작업까지 하다보니 효율이 떨어지는 문제가 발생합니다.
이를 해결하기 위해, CPU 대신 메모리에 다이렉트로 접근할 수 있는 DMA(Direct Memory Access) Controller
가 등장합니다.
출력(Output)
을 할 때에는 메모리에 접근하여 필요한 데이터를 가져와 I/O Device의 Buffer에 가져다 놓습니다.
입력(Input)
을 할 때에는 I/O Device의 Buffer로부터 입력받은 데이터를 가져와 메모리에 적재시킵니다.
그 결과, DMA Controller는 Word 단위가 아니라 더 큰 Block 단위로 I/O Device buffer에서 데이터를 메모리로 가져옵니다.
그리고 CPU에게 인터럽트를 한 번만 걸어 메모리에서 데이터를 가져오면 된다고 알려줍니다.
이를 통해 CPU Utilization을 높일 수가 있습니다.
DMA Controller가 없으면 Device Controller가 이를 수행합니다.
Block 단위는 Word 단위의 묶음입니다.
Timer는 Time Sharing을 통한 멀티 프로세싱을 위해 필요한 하드웨어 입니다.
매 클럭마다 1씩 줄어들며, 0이 되면 Interrupt를 발생시켜 CPU에게 현재 프로세스의 CPU 사용 시간이 끝났음을 알려줍니다.
CPU에서 명령을 실행할 때 보안을 위해 OS에 의한 명령인지, 일반 사용자 프로그램에 의한 명령인지 구분하기 위한 비트입니다.
만약, 악의적인 개발자가 일반 사용자 프로그램만으로 입출력 장치를 함부로 다룰 수 있는 명령어를 실행시킬 수 있다면 매우 위험할 것입니다.
따라서 이런 하드웨어와 관련된 명령어는 오직 커널(운영체제)만이 실행시킬 수 있어야 합니다.
이를 위해 CPU는 Mode bit를 두고, 현재 명령어를 실행시킬 권한이 있는 모드인지를 매번 확인합니다.
1 (사용자 모드) : 일부 제한된 명령어만 수행할 수 있다.
0 (커널 모드) : Privileged(특권) 명령어를 수행할 수 있다.
이후에 설명할 Interrupt에 의해 Mode bit의 값이 전환됩니다.
I/O Device(입출력 장치)
는 모니터, 프린터기, 마우스, 스피커 등 매우 다양합니다.
사용자가 컴퓨터를 사용하기 위며 입출력(I/O)을 하기 위한 장치 입니다.
I/O Device는 데이터를 입력 받고 바로 메모리로 가지고 오는 것이 아니라, Buffer
에 우선 기록합니다.
그 이유는 입출력에 해당하는 Byte들을 매번 하나 하나씩 가져오는 것이 비효율적이기 때문입니다.
그렇기 때문에, 특정 시간동안 한 번에 모아서 메모리로 가져옵니다.
이렇게 메모리로 가져오는 역할은 이후에 다룰 DMA Controller
가 수행합니다.
반대로, 메모리에서 입출력 장치로 데이터를 불러 올 때에도 Buffer에 우선 기록합니다.
Device Controller는 I/O Device를 관리하기 위한 또 다른 하드웨어입니다.
제어 정보를 위한 레지스터로 status register, control register를 가지고 있으며, 위에서 설명한 데이터를 저장하기 위한 local buffer를 가지고 있기 때문에, I/O Device의 CPU라고도 불립니다.
Device Controller는 I/O가 끝났을 경우 Interrupt
로 CPU에 그 사실을 알리는 역할도 하기도 합니다.
단, DMA controller가 있다면, DMA controller가 CPU에 interrupt를 보냅니다.