Chapter 5. Input / Output System
- I/O System은 OS Code의 대부분을 차지하고, 복잡한 System 중 하나이다.
- User의 체감 성능에 가장 중요한 영향을 미치는 것이 I/O System의 Performance이다.
- Test하기가 힘든 영역이다.
Typical I/O Devices
- OS에는 위와 같은 다양한 종류의 I/O Device들에 대한 Driver가 전부 구현되어 있어야 한다.
- 그렇기 때문에, OS Code의 대부분은 I/O와 관련된 내용들인 것이다.
Principles of I/O Hardware
Types of I/O Devices
1) Block Device
- Data가 Fixed-Size Block에 저장되고, Block은 저마다의 Address를 갖는다.
- 이러한 Block들에 Address를 통해 Independently하게 Access하여 Read/Write할 수 있다.
ex) Disk
2) Character Device
- Data가 Stream형태로 존재하여, 이미 처리한 데이터를 다시 처리할 수 없다.
(즉, 흘러가면 그만이다.)
- Address를 갖지 않고, Seek Operation(Addressing)이 구현되어 있지 않다.
ex) Printer, Network Interface, Mice 등
3) Other Device
- Block Device나 Character Device에 속하지 않는 I/O Device들이 이에 해당된다.
ex) Clocks, Memory-Mapped Screen
Device Controller
- I/O Device는 Mechanical Component와 Eletronic Component(= Device Controller*)로 구성된다.
* Device Controller
- Device Controller는 경우에 따라, 여러 Device를 제어할 수 있으며, 아래와 같은 역할을 한다.
1) 외부에서 들어온 Data를 변환하여 Disk에 저장한다.
2) H/W적인 Error Correction을 수행한다.
3) DMA Operation (DMA: Direct Memory Access)
- Device가 직접 Memory에 Access하는 기능을 의미한다.
- DMA Operation이 지원되지 않으면, I/O Device에서 Data를 Read/Write하는데 항상 CPU의 개입이 필요하게 된다.
- I/O Device에 Access할 때,
I/O Device의 Controller에 있는 Data Register에 I/O Device가 읽거나 쓸 데이터를 저장하고,
I/O Device가 수행할 명령을 Control Register에 저장하여 작업을 수행하게 된다.
- 이 Register에 어떻게 Addressing할 것인가가 Main Issue이며,
이를 처리하는 방식에는 Separate I/O and Memory Space, Memory Mapped I/O, Hybrid가 있다.
(a) Separate I/O and Memory Space
- I/O Device와 Main Memory의 Address 체계를 달리하는 방법이다.
- Control Register와 Data Register에 할당되는 Address는
Main Memory에서 사용하는 Address 체계에 속하지 않는, 독립적인 Address인 I/O Port Number가 할당된다.
- Intel에서 지원하는 방식이다.
- I/O Port Number로 Access하기 위해서는 Memory Access때와는 다른 특별한 Instruction이 필요하다.
ex) \(\texttt{IN}\) Instruction, \(\texttt{OUT}\) Instruction
in Reg, PORT
! PORT에 해당되는 I/O Device측 레지스터에 저장된 값을 Reg 레지스터에 저장한다.
OUT PORT, Reg
! Reg 레지스터에 저장된 값을 I/O Device측 레지스터에 저장한다.
(b) Memory Mapped I/O
- Main Memory의 Address 체계와 I/O Device측 레지스터의 Address 체계를 같이하는 방법이다.
- I/O Device의 Address는 Physical Memory의 Address 최댓값 위에서 시작된다.
(즉, 주솟값 자체로 Main Memory의 주소인지, I/O Device의 주소인지를 구분할 수 있다.)
ex) 2GB의 Physical Memory를 가진 System에서 I/O Device의 Address는
- 일반적인 Load, Store 명령을 통해 I/O Device에 Access할 수 있고,
이외에도 다른 일반적인 명령어를 I/O Device에 사용할 수 있다.
즉, I/O Device Access를 High Level Programming이 가능하다.
- I/O Device Address Space에 Page를 할당하고, Read/Write/Execution 연산에 제한을 걸어 Protection할 수도 있다.
(즉, Page의 Protection Mechanism을 재활용하기 때문에 I/O Device에 대한 특별한 Protection Mechanism이 필요없다.)
- 단, H/W적인 지원이 필요하다.
- I/O Device에 Access하는 것이기 때문에, I/O Address는 Caching이 이루어지면 안된다.
(I/O Device에 대한 Address는 Cache Disable되어져야 한다.)
- Memory와 I/O Device가 각각 자신의 Address Space에 해당되는 Address인지를 판별하는 능력이 있어야한다.
- 일반적으로, CPU는 Memory와 I/O Device간의 속도차이로 인해 Interface를 달리 한다.*
* (a) Single Bus Architecture
- CPU가 Main Memory와 I/O Device로의 Interface를 하나의 Bus로 해결하는 형태이다.
* (b) Dual Bus Architecture
- CPU가 Main Memory와의 Interface는 High-Bandwidth Bus를 이용하여 고속으로 처리하는 형태이다.
(c) Hybrid
- Separate I/O and Memory Space와 Memory Mapped I/O을 혼합한 형태이다.
- 잘 사용되지는 않는다.
DMA (Direct Memory Access)
- Device가 직접 Memory에 Access하는 기능을 의미한다.
- DMA Operation이 지원되지 않으면, I/O Device에서 Data를 Read/Write하는데 항상 CPU의 개입이 필요하게 된다.
- DMA Controller는 Physical Address를 바로 사용한다.
(DMA Controller가 Virtual Address를 사용할 경우, MMU에 접근할 수 있어야 한다.)
DMA Transfer Mode
1) Cycle Stealing
- CPU가 Memory에 Access하지 않는 타이밍(CPU의 Memory Bus가 Idle한 타이밍)에만
I/O Device와 Memory 사이로 Data를 옮기는 작업을 수행하는 방식이다.
2) Burst Mode
- CPU가 한동안 Bus를 사용하지 못하게 제한한 다음, I/O Device가 Bus를 독점하여
I/O Device와 Memory 사이로 Data를 옮기는 작업을 수행하는 방식이다.
- 이 시간동안, CPU는 Load/Store 명령어와 같이 Memory에 Access하는 명령어들은 Stall된다.
(Cache Hit의 경우, 원래 Memory에 접근하지 않지만, Cache Miss의 경우에 해당 명령어들은 Stall된다.)
- 대량의 Data를 전송할 때 적합하다.
DMA Operation Process
- 아래에는 CPU가 DMA Controller에게 I/O Request를 수행하게 명령했을 때 벌어지는 과정을 기술되어 있다.
1) CPU의 명령에 의해, DMA Controller의 Address, Count, Control가 Setting된다.
- Address: 명령을 이행할 Main Memory의 Physical Address
- Count: 실행할 명령의 개수
- Control: 실행할 명령의 종류
2) DMA Controller가 I/O Device Controller에 명령을 내린다.
- I/O Device를 통해 받은 Data를 Main Memory에 Write하는 명령이라 가정하자.
3) 명령을 받은 I/O Device Controller는 명령을 이행한다.
- 즉, I/O Device를 통해 받은 Data를 Main Memory에 Write한다.
4) 명령이 완료되면, I/O Device Controller는 DMA Controller에게 ACK(Acknowledgement)한다.
5) DMA Controller는 CPU로부터 다음 명령을 전달받는다.
- 이 과정에서 Address와 Control이 변경될 수 있다.
- Count값은 1만큼 차감된다.
6) 1~5번 과정이 반복되어 I/O Request가 모두 완료되면 DMA Controller는 CPU에 Interrupt Signal을 전송한다.
※ 위 과정이 수행되는 동안, CPU는 Shceduling을 통해 다른 Job을 수행하고 있을 것이다.
Principles of I/O Software
- I/O를 Software로 구현하는 방법에는 Programmed I/O, Interrupt-Driven I/O, I/O Using DMA가 있다.
- 각각의 방법을 위 그림의 예시를 통해 설명한다.
- 위 그림은 User의 Buffer에 있는 String ABCDEFGH를 I/O Device를 통해 출력하고자 하는 상황을 그린 그림이다.
Programmed I/O
copy_from_user(buffer, p, count);
// I/O Device Controller에 I/O 명령을 내린다.
// p : Kerenl Buffer
for (i = 0; i < count; i++) {
while (*printer_status_reg != READY);
// I/O Device(printer)가 READY 상태가 될 때 까지 무한정 대기한다. = Busy Waiting
*printer_data_register = p[i];
}
return_to_user();
- User Application이 Kernel에 System Call등을 통해 출력을 요청한다.
- Kernel이 해당 Data를 가져와서 모두 처리할 때 까지, CPU는 계속해서 구동된다.
Interrupt-Driven I/O
// I/O 요청을 받았을 때 실행되는 Code
copy_from_user(buffer, p, count);
enable_interrupts();
while (*printer_status_reg != READY);
// I/O 요청을 받은 처음에만 Busy Waiting을 수행한다.
*printer_data_register = p[0];
scheduler();
// I/O Device가 작업을 수행하는 동안, CPU는 다른 Job을 처리한다.
// Interrupt Service Routine
if (count == 0) {
// I/O 작업이 끝나면 I/O를 요청한 프로세스는 Unblock된다.
unblock_user();
} else {
// I/O 작업이 끝날 때까지 I/O를 요청한 프로세스는 Block된다.
*printer_data_register = p[i];
count = count - 1;
i++;
}
acknowledge_interrupt();
return_from_interrupt();
- Data가 출력되는 동안(I/O Operation이 진행되는 동안) CPU는 다른 Job을 처리한다.
- 단, CPU가 Interrupt를 처리하는데에서 발생되는 Overhead가 존재한다.
I/O Using DMA
// I/O 요청을 받았을 때 실행되는 Code
copy_from_user(buffer, p, count);
set_up_DMA_controller();
scheduler();
// Interrupt Service Routine
acknowledge_interrupt();
unblock_user();
return_from_interrupt();
- Data가 출력되는데에 CPU의 개입없이 DMA Controller가 처리하는 형태이다.
- CPU가 Interrupt를 처리하는데 드는 Overhead가 적다.
Device Driver
- Device Driver에는 해당 I/O Device에 Specific한 Code가 삽입되어 있는, OS의 일부이다.
- Device Driver는 OS System에 Dynamic하게 Load될 수 있다.
- Device Driver는 OS에 Read, Write Operation을 수행하는 Function을 제공한다.
- 또한, Device Driver는 Power Managemenr를 수행한다.
※ Device Driver는 Reentrant 해야한다.
- 어떤 연산이 중단되었다가, 처음부터 다시 실행되도 문제가 없어야 한다.
Physical Disk Structure
- Disk에 Access하는데 소요되는 시간은 여러 Component에 의해 결정된다.
1) Seek Time
- Disk에서 해당 Data가 위치한 Track을 찾기까지 소요되는 시간을 의미한다.
- Arm이 Platter의 위치를 오가며 찾는다.
2) Rotation Time
- Data가 위치한 Track에서 Head 위치에 정확히 Data가 위치하기까지 걸린 시간을 의미한다.
3) Transfer Time
- 요청한 Data가 Head에 정확히 위치한 이후부터, 요청한 양만큼의 Data가 읽어들여지는 시간을 의미한다.
Reference: Modern Operating Systems 4E
(Andrew S. Tanenbaum, Herbert Bos 저, PEARSON, 2015)