OS에 들어가기 전, 컴퓨터의 전반적인 동작과 구성요소를 알아보면서 이해를 높이도록 하겠다. 이 글에서 Processor와 CPU는 같은 말로 사용되었음을 적어놓는다.
컴퓨터의 기본요소
우선 컴퓨터의 기본적인 요소는 4가지가 있으며 우리가 컴퓨터라고 부르는 것은 다음과 같은 요소를 꼭 포함하고 있어야한다.
- Processor
- Main Meory
- System bus
- I/O modules
Processor
Processor 내부에 register가 존재하는데 I/O data를 위한 register와 다른 register 들에 대한 설명이다.
I/O Data를 위한 Register
- Memory Address Register(MAR)
Processor가 다음 번에 수행할 명령어의 주소를 저장하는 register이다.
- Memory Buffer Register(MBR)
Memory에 쓸 data와 Memory에서 읽어온 data를 적어놓는다.
예시)
Load 명령 주소를 Memory Address Register에 저장하고 CPU가 이것을 실행하면 MBR에 값이 존재하게 됩니다.
- I/O address register
- I/O buffer register
User-visible registers
레지스터 사용을 최적화하면서 프로그래머가 메인 메모리 참조를 최소화하도록 수정할 수 있는 register이다. ex) rdx, rax, rsi 등의 register.
Control and status register
프로세서의 연산을 control하기 위해서 프로세서가 사용한다. 또한 프로그램의 실행을 control하기 위해 OS에 의해 사용된다.
- Program Counter (PC)
다음에 수행할 명령어의 주소를 가지고 있는 register.
- Instruction Register (IR)
fetch된 instruction을 가지고 있는 register. fetch란 메모리에서 processor로 가져온다는 뜻.
- Program Status Word (PSW) : 여기서는 Condition codes, Interrupt enable/disable Supervisor/user mode 세가지를 설명하고 있다.
- Condition codes
연산들의 결과로서 프로세서에 의해 설정되는 bit이다. 문제가 발생했을 때 대처하기 위해 저장하는 값들이다.
- Positive result
- Negative result
- Zero
- Overflow
- Interrupt enable / disable
- Supervisor / user mode -> 어느 코드에서 수행(kernel code 혹은 user code)하고 있는가를 알려주는 것이다.
Instruction은 어떻게 실행되는지 알아보도록 하겠다.
Instruction Execution
여기서는 두가지 과정으로 이루어진다.
- Processor가 메모리에서 Instruction을 읽어온다. 이 과정을 Fetch라고 한다.
- Processor가 Instruction을 실행한다.
PC 레지스터는 다음에 가져올 instruction 주소를 가지고 있고 Fetch 후에 PC 레지스터 값을 증가시킨다.
Instruction Register (IR)
Fetch 된 instruction은 IR 안에 놓여지며 Instruction은 다음과 같은 종류가 있다.
- Processor - memory
프로세서와 메모리 사이에 데이터를 주고받는 명령어 ex) load store 명령
- Processor-I/O
주변기기들 사이에서 데이터들을 주고 받는 명령어
- Data processing
데이터를 이용한 산수와 논리 연산 명령어
- Control
실행 순서를 바꾸는 명령어 ex) Jump instruction
Interrupt와 Interrupt handler
Interrupt
Interrupt를 발생시키면 다음 실행할 명령어를 실행하지 않고 지금 발생한 Interrupt를 처리함.
대부분의 I/O 장치들은 processor보다 느린데 Interrupt도 마찬가지로 I/O 처럼 느리다. Interrupt 가 발생하면 processor는 멈추고 interrupt가 끝날 때 까지 기달려야 한다.
Interrupt handler
I/O 장치들을 서비스하기 위한 프로그램으로 OS의 코드의 일부분이다.
Interrupt는 다음과 같이 실행한다. 우리가 프로그램을 차례로 실행하다가 interrupt가 i번째 줄에서 발생한다면, 지금 실행중인 Program을 멈추고 Interrupt handler로 이동해서 handler 코드를 실행한다. handler 코드가 끝나면 i + 1 번째 줄로 돌아와 다음 코드를 실행한다.
다음은 그림은 Program을 실행하면서 Interrupt가 언제 실행되는지를 알려주는 cycle이다.
- 다음 Instruction을 memory에서 fetch해온다.
- fetch 해온 instruction을 실행한다.
- Interrupt가 disable 되어있으면 다시 1번으로 돌아가 실행한다.
- Interrupt가 enable 되어있다면 Interrupt가 발생했는지 체크한다.
- Interrupt가 도착했다면 interrupt handler를 실행시키고(현재 프로그램은 중지) 아니라면 1번으로 돌아가 실행한다.
아래는 Interrupt 처리과정을 보여주는 그림이고 순서대로 번호를 매겨 적어놓았다.
- Device controller나 다른 시스템 hardware가 interrupt를 발생시킨다.
- Processor는 현재 instruction의 실행을 멈춘다.
- Processor는 interrupt를 잘받았다고 signal을 보낸다.
- 현재 실행중이 프로그램의 PSW와 PC를 control stack에 넣어둔다.
- 프로세서는 interrupt handler의 새로운 PC 값을 넣는다.
- 나머지 프로세스 상태 정보를 저장한다.
- interrupt를 처리한다.
- 프로세스의 상태정보를 복구한다.
- 이전 PSW와 PC값을 복구한다.
다음은 interrupt가 발생했을 때 레지스터와 메모리가 어떻게 변화하는지에 대한 그림이다. 위의 설명을 따라가면 충분히 이해할 수 있는 그림이므로 글을 읽는 분들에게 남겨놓도록 하겠다.
Interrupt 없는 Program 실행흐름
Processor가 하나의 User Program만 수행한다는 가정하에 설명하도록 하겠다. 그 이유는 마지막 부분의 Multiprogramming 을 설명하기 위해서이다.
User Program을 실행하다 WRITE I/O가 발생(system call)하면 현재 Program을 중지시키고 I/O 프로그램으로 이동하여 Program을 수행한다. 이때 I/O command를 수행할 때 cpu는 아무 일도 하고 있지 않은 상태이다(비효율적).
- 실행순서 : 1 - 4 - Processor Wait - 5 - 2 - 4 - Processor Wait - 5 - 3
Interrupt 가 존재하는 Program 실행흐름(짧은 I/O 발생)
아까와 다른점은 I/O가 끝나면 Interrupt를 이용해 현재 진행중인 cpu에게 알려줄 수 있기 때문에 다른 일을 수행 할 수 있다. I/O 수행 중일때 CPU는 2a부분을 수행하고 중간에 interrupt가 발생하면 interrupt handler로 돌아와 남은 I/O 프로그램을 처리한 후 User Program을 다시 실행한다.
- 실행 순서 : 1 - 4 - 2a - 5 - 2b - 4 - 3a - 5 -3b
Interrupt 가 존재하는 Program 실행흐름(긴 I/O 발생)
만약 긴 I/O가 발생한다면 어쩔 수 없이 CPU는 기다려야 한다. 1번과 4번을 거쳐 I/O를 수행중일때, CPU는 2를 수행할 수 있다. 아직 I/O가 끝나지 않은 상태에서 다음 WRITE가 들어온다면, CPU는 기다렸다 Interrupt handler를 수행하고 WRITE를 수행해 줄 수 밖에 없다.
- 실행 순서 : 1 - 4 - 2 - Processor Wait - 5 - 4 - 3 - Processor Wait - 5
Multiprogramming
앞서 살펴보았던것 처럼 CPU가 놀고 있는것은 컴퓨터의 측면에서 보았을 때 굉장히 비효율적이기 때문에 여러개의 Program을 동시에 수행하는 Multiprogramming 개념이 등장하게 되었다.
우리가 쓰는 컴퓨터에서 Processor는 하나 이상의 프로그램을 수행중에 있으며 Interrupt handler가 끝난 후에 원래 Program의 코드(Interrupt 발생 전 실행하던 프로그램)로 돌아오는것이 아니라 실행중인 다른 프로그램으로 돌아갈수도 있다.
모르는 부분이 있다면 댓글을 적어서 남겨주시고 틀린 부분이나 수정해야할 부분이 있다면 말씀 부탁드리겠습니다!
'운영체제' 카테고리의 다른 글
[운영체제(OS)] 6-2. CPU 스케줄링 (CPU scheduling) (0) | 2021.08.10 |
---|---|
[운영체제(OS)] 6-1. CPU 스케줄링 (CPU scheduling) (0) | 2021.08.06 |
[운영체제(OS)] 5. 프로세스와 스레드 (Processes And Threads) (0) | 2021.07.27 |
[운영체제(OS)] 4. 운영체제 개요 (Operating System Overview) (0) | 2021.07.25 |
[운영체제(OS)] 3. 컴퓨터 시스템 (Computer System Overview 2) (0) | 2021.07.23 |