I/O System에서 디바이스(키보드, 디스크)는 파일
처럼 간주되어 관리된다. 사용자가 API(open/close, read/write)를 call하면, I/O request queue
에 이 작업들이 쌓인다. 그러나 완전히 순서대로 쌓이는 것은 아니고, 빨리 끝날 수 있는 작업을 queue의 앞 순서로 배치해주는 스케줄링 작업을 거친다.
I/O request queue에 있는 작업들은 Device Driver에 의해 맨 앞에서부터 골라져서 CPU에 전달되고, Device Controller가 I/O가 끝났다는 Interrupt를 보내면 CPU가 I/O의 결과를 Device Driver(=Interrupt Handler)
에 가져다준다. 그러면 Device Driver는 CPU에게 queue에 쌓여있는 작업을 또 하나 전달해준다.
Device Controller
Device를 실제로 제어하는 하드웨어. 각 Device마다 존재. (cf. 인터럽트 핸들러도 디바이스마다 따로 존재함)
퍼포먼스는 interface < controller < I/O Processor 순으로 좋음
Device Controller의 레지스터
- Command Register: read, write 등 명령어를 저장
- Data Buffer Register: I/O 작업을 통해 가져와야할 데이터를 한 단위씩 데이터 버퍼에 저장해두고 버퍼로부터 읽어옴
- Status Register: 데이터 버퍼에 있는 글자를 유저에게 전달하기 전에 다음 글자를 다시 받아오는 것을 막기 위해 status(busy/done)를 저장
Programmed I/O(과거)
I/O 작업이 끝날 때까지 CPU가 다른 작업을 수행하지 않으면서 무한루프(이때 이 루프를 busy-waiting loop
라고 함)를 돌고 있는 형태 => cpu-time 낭비
Interrupt-Driven I/O
1) CPU가 I/O 명령을 디바이스 컨트롤러에 보냄
2) CPU는 I/O 작업이 이루어지는 동안 다른 프로세스를 수행
3) I/O가 끝나면 디바이스 컨트롤러가 interrupt
를 보냄
4) interrupt handler는 블락돼있던 프로세스를 깨워서 ready 상태로 바꿔줌
5) CPU는 현재 실행 중이 프로세스를 중단하고 context save를 한 후 interrupt handler(커널 안에 존재)로 감
6) I/O의 결과를 주고 interrrupt handler로부터 다음 I/O 작업을 받음
7) I/O를 디바이스 컨트롤러에게 명령하고 CPU는 인터럽트 핸들러로 가서 급한 작업이 있는지 확인 후 이전에 수행하던 프로세스로 감
DMA + Interrupt-Driven I/O
글자 단위로 인터럽트가 일어나는 것은 character oriented I/O
(키보드, 마우스..), 4KB의 피지컬 블록 단위로 인터럽트가 일어나는 것을 block oriented I/O
(디스크, 네트워크..)라고 한다.
그런데 block oriented I/O의 경우에도 디스크 컨트롤러가 실제로 디스크에서 데이터를 읽어오는 것은 1byte 단위이기 때문에, CPU가 디스크 컨트롤러에게 자신을 거치지 않고도 메모리에 접근하여 쓸 수 있는 권한을 준 것을 Direct Memory Access(DMA)
라고 한다.
그리고 메모리에 CPU, Disk Controller가 동시에 접근했을 때 CPU가 한 사이클 쉬는 것을 Cycle stealing이라고 한다.