I/O System

June Lee·2021년 2월 12일
0

운영체제

목록 보기
6/25
post-custom-banner

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)를 저장

I/O System의 형태

  1. Programmed I/O(과거)
    I/O 작업이 끝날 때까지 CPU가 다른 작업을 수행하지 않으면서 무한루프(이때 이 루프를 busy-waiting loop라고 함)를 돌고 있는 형태 => cpu-time 낭비

  2. 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는 인터럽트 핸들러로 가서 급한 작업이 있는지 확인 후 이전에 수행하던 프로세스로 감

  3. 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이라고 한다.

profile
📝 dev wiki
post-custom-banner

0개의 댓글