Reference: Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau의 『Operating Systems: Three Easy Pieces』
- I/O는 컴퓨터 시스템에서 매우 중요한 부분이다.
- 당연히 모든 프로그램에서 입력과 출력이 필요하기 마련이기 때문이다.
시스템 구조
컴퓨터 시스템에서 I/O 계층구조를 간단하게 표시하면, 다음과 같이 나타낼 수 있다.
1. Memory Bus
- 그림의 가장 상위계층에 해당하며, CPU가 메모리 버스를 통해 메인 메모리와 연결되어 있음을 보인다
2. General I/O Bus
- 어떤 장치들은 I/O 버스를 통해 연결된다.
- 최신 시스템에서는 PCI가 된다.
- 그래픽과 같은 높은 성능을 보이는 I/O 장치들이 여기 해당된다
3. Peripheral I/O Bus
- SCSI, SATA, USB등이다.
- 이들은 느린 장치들을 시스템과 연결시키는데, 이에는 디스크, 마우스, 키보드등이 포함된다.
또다른 그림:
- PCIe(Peripheral Component Interconnect Express)를 통해서는 네트워크 인터페이스나, 높은 성능의 스토리지 장치들(NVMe같은거)가 붙을 수 있다.
기본 장치
Interface:
하드웨어 인터페이스로 시스템 소프트웨어가 해당 하드웨어의 기능들을 수행할 수 있도록 도와준다.
3가지 레지스터가 존재한다. (status, command, data)
Internals:
구체적인 구현부이다.
기본 프로토콜 (Polling)
While (STATUS == BUSY) ----- 1
; //wait until device is not busy
Write data to DATA register ------ 2
Write command to COMMAND register ------- 3
(starts the device and executes the command)
While (STATUS == BUSY) -------- 4
; //wait until device is done with your request
기본적인 I/O 프로토콜은 4단계로 이루어진다.
1. OS는 장치가 command를 받을 상태가 될때까지 기다린다. (이를 Polling이라고 함) 실질적으로는 status register를 읽는 작업을 반복한다.
2. data register로 데이터를 전송한다. (만약 데이터 전송에 CPU가 사용된다면 이를 programmed I/O, PIO라고 한다)
3. OS는 command register에 command를 적는다.
4. 작업이 끝났는지 확인하기 위해 또 polling을 수행한다.
Interrupt
앞서 나온 프로토콜은 장치가 실행가능한 상태가 될때까지 polling을 수행하며 기다리기만 한다.
이는 CPU 사용량 최적화에 전혀 도움이 되지않는다. (기다리는 동안 아무 작업도 수행하지 않기 때문)
따라서 나온 대안이 바로 인터럽트(interrupt)이다.
인터럽트를 사용하면 polling 시간동안 CPU가 놀지않고 다른 프로세스를 실행할 수 있다.
디스크에서 프로세스1에 대한 실행이 끝났다고 인터럽트를 걸면, CPU가 프로세스1을 다시 수행하는 방식이다.
+) 그러나 인터럽트도 최선의 방법은 아니다. 만약 장치가 태스크들을 매우 빠르게 처리하면, 폴링을 사용하면 첫번째 폴에서 바로 태스크가 끝났음을 알 수 있지만, 인터럽트는 인터럽트를 발생시키고 하는 과정에서 오히려 시간이 오래걸릴 수 있다. 따라서 두개를 섞어서 쓰는 게 가장 좋다. (먼저 폴링을 일정 시간동안 한 뒤, 그 다음 시간부터는 인터럽트 사용 하는 등)
또한, 네트워크에서 만약 huge stream of incoming packets가 각각 인터럽트를 발생시키면, OS가 무한반복에 빠질수가 있다.
DMA
DMA는 데이터 이동 관점에서 봤을 때의 문제점을 해결하는 방안이다.
앞에서 프로토콜 설명시 데이터 전송에 CPU가 사용된다면 이를 programmed I/O, PIO라고 한다고 했는데 CPU가 계속 사용되는 것은 좋은 현상이 아니다.
예를 들어 크기가 큰 데이터를 장치에 이동시켜야할 때, 이를 CPU를 사용하면 CPU한테 너무 무거운 작업이 될 수도 있고, 다른 프로세스를 실행해야하는데 이를 못하기 때문에 시간 낭비를 초래한다.
따라서 Direct Memory Access(DMA)라는 엔진을 둬서 메인메모리와 장치 사이 이동을 관리하도록 한다.(CPU 개입 없이!)
DMA 동작 과정
1. OS가 DMA 엔진에게 데이터가 메모리의 어느 부분에 있는지, 얼마큼 복사하면되는지, 어떤 장치로 복사하면되는지 알림
2. DMA는 정보를 가지고 복사를 수행하고, CPU는 다른 프로세스 수행
3. 복사가 다 끝나면 DMA는 인터럽트 발생시킴, CPU는 이전 프로세스 진행
'전공 서적 읽기 > Operating Systems: Three Easy Pieces' 카테고리의 다른 글
37. Hard Disk Drives (0) | 2022.02.07 |
---|
전공 공부 기록 📘
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!