| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 프로그래밍
- list
- 7월4일
- 푸드트럭
- Process
- 코딩
- control flow
- scheduling policy
- Jupyter Notebook
- insertion Sort
- xv6
- Snap!
- Deep Learning
- 독립기념일
- Scratch
- Operating System
- 버클리
- concurrency
- 운영체제 강의
- CLRS
- 균형의 정치
- 맛집
- The beauty and Joy of computing
- 여행
- 미국
- 잘 짜인 코드
- 스크래치
- 직업으로서의 정치 서평
- 영어논문
- Lock
- Today
- Total
여행다니는 펭귄
I/O Devices 본문
I/O system은 컴퓨터 시스템에 매우 중요합니다. 입력을 받아야 출력도 하고, 프로그램도 실행할 수 있겠죠?
이 I/O system의 주요 세가지 이슈에 대해서 오늘 알아보도록 하겠습니다.
- I/O system이 어떻게 system에 integrate될 것인지
- general mechanism이 무엇인지
- 우리가 이것을 어떻게 더 효율적으로 만들지
알아보기 전 간단하게 I/O device와 System에 대해 소개하도록 하겠습니다.
I/O System Architectures은 다음과 같이 생겼습니다.

각 장치는 Bus를 통해서 통신합니다.
- 1번 Bus 는 Memory Bus 이며 예시는 AIX가 있습니다
- 2번 Bus는 General I/O Bus로 예시는 PCIe가 있습니다
- 3번 Bus는 Peripheral I/O Bus로 예시는 SCSI SATA USB가 있습니다
이 구조는 메모리 구조와 비슷하게 hierarchical structure를 사용합니다. Physics와 Cost때문이죠.
Physic의 예시를 하나 들자면 버스의 길이가 되는데, 버스가 빠를수록 물리적으로 버스의 길이는 더 짧아야합니다. 그런데 가까이에 배치 할 수 있는 I/O 장치는 한정되어 있겠죠?
그리고 Cost의 예시를 들자면 Bus를 AIX와 같이 high performance를 가지는 것을 쓰기에는 너무 비쌉니다.
그래서 I/O중에 성능이 뛰어나야 하는것(GPU 등)은 CPU와 가까이에 배치하고, 더 좋은 Bus를 사용해 주고, HDD는 멀리 배치하고 값이 싼 Bus를 사용함으로써 hierarchical structure를 구현합니다.
그렇다면 Device는 뭘까요?
컴퓨터에서 I/O로 다루는 정규 Device는 Canonical Device라고 하며 이는 두개의 중요한 요소가 존재합니다.
일단 Hardware Interface가 시스템에게 software를 컨트롤 하도록 해 주어야 합니다.
그리고 Internal structure가 존재하는데 이는 implementation-specific 합니다. 즉 구현에 따라서 방식이 전부 갈린다는 뜻입니다.

이걸로 첫번째 이슈에 대한 정답을 알아낼 수 있습니다.
I/O system이 어떻게 system에 integrate될 것인지에 대해서 말이죠.
Hardware Interface에는 최소 세가지의 레지스터가 있습니다.
- Status register : 디바이스의 현 상태를 저장합니다
- Command register : 디바이스에게 명령하는 것을 저장합니다
- Data register : 컴퓨터와 디바이스 사이에서 주고받는 데이터를 저장합니다
이 세가지 레지스터를 읽고 씀으로써, 컴퓨터의 OS가 Device를 컨트롤 하는 것입니다.
그런데 OS가 어떻게 이 레지스터가 이 디바이스의 것인지 알까요?
- Special I/O instructions (고전 방식)
- Memory mapped I/O
Special I/O Instruction 은 Port mapped I/O라고도 불립니다. 이 방식은 Special 한 CPU instruction을 사용하는 것인데
x86에서는 in 과 out이라는 instruction을 쓰고, 이런 instruction은 privileged된 경우가 많습니다
in(port, reg)와 같이 함수를 씁니다. 그런데 이 port name이 겹치는 device가 있기 때문에 이제는 이 방식을 사용하지 않습니다.
Memory-mapped I/O는 Hardware register가 memory space에 있는것처럼 관리하는 방법입니다. 그냥 movl과 같은 function을 사용하는 것이죠. 이 방식을 사용할경우 저희가 movl이라는 instruction을 device의 memory space를 타겟으로 썼을때 CPU가 내부적으로 알아서 memory 대신 device에 load/store를 하도록 경로를 설정해줍니다.
이 과정까지 마치면 System 이 Integrate 되었다고 할 수 있죠.
이제 두번째 이슈인 I/O를 OS에서 어떻게 관리하는지 그 General mechanism에 대해서 알아볼까요?
I/O에는 오버헤드가 있다는것을 알고 계시죠?
이 Interrupt 사이에 CPU가 어떻게 동작할지를 정해야 합니다.
제일 간단한 방법인 Polling은 OS가 계속 Status register를 읽으며 대기하는 것입니다.
- 장점: 간단하고, 잘 동작합니다
- 단점: CPU를 계속해서 낭비하게 됩니다. CPU Utilization이 매우 안 좋습니다.

그럼 이 문제를 해결하기 위해선 어떻게 해야 할까요? 바로 Interrupt를 활용하는 것입니다.
I/O작업이 시작할때 원래의 task를 sleep 시키고 Context Switch를 합니다.
종료되었을때 인터럽트를 보내면 원래의 task로 돌아오면 CPU가 Utilize되겠죠?

하지만 이것도 Best Solution은 아닙니다. 만약 I/O작업이 매우 짧은 작업이었다면 Context Switch의 오버헤드가 단순히 기다리는 것보다 높기 때문입니다. 고로 General mechanism은
- I/O작업이 빠르면 Poll을 사용한다.
- I/O작업이 느리면 Interrupt를 사용한다.
입니다.
이제 General mechanism에 대해 알아보았으니, 좀 더 Complex한 것들을 알아보고 좀 더 효율적으로 만들어 볼까요?
CPU는 만약 I/O작업을 해야하는 데이터가 매우 크다면, memory에서 device로 데이터를 옮기는 과정에서 많은 시간을 낭비하게 됩니다. 이렇게 데이터를 옮기는데 CPU가 관여하게 된다면 이를 Programmed I/O즉 PIO라고 부릅니다.
만약 뭔가를 쓰는 작업을 하고 있다면 다음 그림과 같이 동작하는데
데이터를 copy하는데 필요한 Overhead가 눈에 띄죠?

이를 해결하려면 MMU와 같은 특정 작업만을 처리하기 위한 별도의 Unit이 필요합니다.
이를 바로 DMA(Direct Memory Access) Controller 라고 부릅니다.
이것이 포함된다면 CPU가 memory에서 Copy할 데이터가 어디에 있는지, 얼마나 Copy할지만 DMA에게 명령해주면 DMA가 이 일을 처리하고 interrupt를 보냅니다.

DMA를 사용할 경우 어떻게 동작하는지 한번 볼까요?

'컴퓨터 > 운영체제' 카테고리의 다른 글
| Flash-based SSD (0) | 2021.12.10 |
|---|---|
| HDD란? (0) | 2021.12.09 |
| Free Space Management (0) | 2021.12.08 |
| Virtual Memory and Adress Translation (0) | 2021.11.29 |
| Multi-CPU Scheduling (0) | 2021.10.18 |