CPU는 직장인, 프로세스들은 업무, 운영체제는 관리자
일하는 사람은 직장인 한 명 뿐이고, 해야할 일은 산더미이기 때문에, 운영체제가 직장인의 스케줄을 효율적으로 짜서 부려먹습니다. 이렇게 부려먹기 위한 구조 및 구성 요소들을 정리해보겠습니다.
CPU
cpu는 매 클럭마다 메모리에서 Instruction이라 불리는 기계어로 이뤄진 최소 작업단위를 가지고와서 실행합니다. 이때 CPU 안의 PC(ProgramCounter)라고 불리는 레지스트리에 어느 인스트럭션까지 읽었는지를 기록하고 있습니다.
Mode bit
CPU에는 현재 실행 중인 작업이 사용자 프로그램(프로세스)인지, 운영체제 코드인지를 나타내는 Mode bit이 있습니다. 이것이 0이면 모니터모드(= 커널 모드, 시스템 모드)이고, 1이면 사용자 모드입니다. 이것의 존재의 이유는 사용자 프로그램이 잘못된 수행하는 것을 방지하기 위해서, 1(사용자 모드)이면 여러 기능을 제한하고 있습니다. I/O 장치에 접근하는 것도 커널모드에서만 수행할 수 있습니다.
Interrupt
그럼 어떤 프로세스가 IO 장치에 접근하고 싶을 때 어떻게 할까? 프로세스가 운영체제에게 부탁하는 방식으로 이뤄지며 이를 '시스템 콜'이라고 부릅니다. 이때 부탁하는 방식은 CPU의 Interrupt Line을 설정합니다. 사실, CPU는 매 클럭 한 인스트럭션을 실행 한 후 인터럽트 라인을 확인하여, 인터럽트가 걸려왔음을 확인하면 그 시점의 레지스터와 PC를 save한 후 곧장 CPU 제어권을 운영체제에게 넘겨줍니다. 이 이때 Mode bit이 다시 0으로 바뀌고, IO 장치에 접근할 수 있습니다.
인터럽트와 관련해서는 인터럽트 백터가 해당 인터럽트의 처리 루틴 주소를 가지고 있고, 인터럽트 처리 루틴은 해당 인터럽트를 처리하는 커널 함수입니다.
또한 이렇게 소프트웨어(프로그램)이 인터럽트를 발생시키는 Trap(Software Interrupt)와 하드웨어가 발생시킨 인터럽트인 Hardware Interrupt가 있습니다.
Timer
운영체제가 직장인의 스케줄링을 한다고 했는데, 어떻게 이뤄질까요? 일정 시간이 흐른 뒤 인터럽트를 발생시키는 Timer가 있고, OS는 프로세스마다 적당히 Timer를 설정해서 CPU권한을 줍니다.
Device Controller
키보드나 모니터 같은 주변 기기들은 Device Controller를 가지고 있습니다. 해당 IO 장치를 관리하는 일종의 CPU이며, 제어 정보를 관리하는 control register, status register가 있고, I/O를 처리한 결과값을 저장하는 local buffer를 가집니다. Device controller는 I/O가 끝난 후 인터럽트를 통해 CPU에게 완료 사실을 알립니다.
DMA (Direct Memory Access) controller)
그런데, IO 장치들이 아주 조금 IO를 할 때마다 인터럽트를 걸면 어떻게 될까요? 아마 자원 낭비가 심할 것입니다. 이를 관리하기 위한 DMA가 있습니다. 시스템 콜을 통해서 인터럽트 처리 루틴을 실행하면, CPU가 DeviceController에게 가서 IO 요청을 합니다. IO는 처리 속도가 상당히 느리기 때문에, CPU는 앉아서 기다리지 않고 일만 맡겨놓고 다른 일을 하러가고, DeviceController가 일을 위임받습니다. 그리고 device controller의 인터럽트들은 CPU를 귀찮게 하지 않고, DMA가 데이터를 어느 정도 쌓아뒀다가 block 단위로 local buffer에서 데이터를 읽어와서 memory에 복사합니다.
'Computer Science > Operating System' 카테고리의 다른 글
[운영체제] CPU Scheduling (0) | 2023.02.11 |
---|---|
[운영체제] 프로세스 관리 (0) | 2023.02.11 |
[운영체제] 프로세스와 스레드 (0) | 2023.02.10 |
[운영체제] 프로그램 실행 원리 (0) | 2023.02.02 |
[운영체제] 컴퓨터 세계의 리더, OS (1) | 2023.01.28 |