
- 현재 OS는 Time sharing, Multi Programming
I/O
I/O Operation
- I/O 디바이스와 CPU는 병행적으로 작동 가능
- 물리적 디바이스와 컨트롤러 버퍼 사이 데이터 전달
- 각 디바이스는 로컬 버퍼와 레지스터를 가지고 잇음
- 디바이스 컨트롤러를 위한 디바이스 드라이버가 필요 → 컨트롤러에게 필요한 명령어를 제공해주는 모듈
Accessing I/O Devices
- Memory Mapped I/O → 더 자주 쓰임
- 주소를 이용해 접근
- I/O 디바이스가 CPU 메모리와 똑같이 동작
- 일반적인 load, store 동작 → 사용하는 명령어 인터페이스가 같음
- Special(isolated) I/O
- Channel I/O라고도 부름 → 특수한 명령어가 필요하다
- CPU가 I/O 디바이스를 위한 별도의 버스를 가지고 있음
Polling I/O
- Programmed I/O라고도 불림
- CPU가 I/O 디바이스를 지속적으로 확인 → 시간 낭비 ⇒ 이를 해결하기 위해 interrupt가 등장
- 각 디바이스는
- Data-in, Data-out 레지스터
- Status 레지스터
- Control, Command 레지스터 존재
- 디바이스에 데이터 write 과정
- CPU가 Status 레지스터의 busy bit가 빌때까지 확인
- CPU는 Command 레지스터에 write하겠다는 bit를 쓰고 Data-out 레지스터에 output 값을 write
- CPU가 Control 레지스터에 command-ready bit를 씀
- 디바이스 컨트롤러는 이 bit를 보고 Status 레지스터에 busy bit를 씀
- 디바이스 컨트롤러가 command 레지스터를 읽고 write bit를 보고 Data-out 레지스터를 읽고 I/O 수행
- 디바이스 컨트롤러는 command-ready bit와 error bit, bust bit를 지움
- 문제점
- CPU가 polling에 너무 많은 시간을 할애 → 프로세스 대기 버퍼 메모리 오버플로우 위험
- 이를 해결하기 위해 interrupt를 사용
Interrupt