Direct I/O
운영체제의 버퍼로 접근하지 않고 직접적으로 I/O와 소통하는 방식
Memory-mapped I/O
메모리의 일부 버퍼에 I/O와 매핑된 공간을 참조해서 I/O와 소통하는 방식
I/O Controller로 CPU 대신 I/O 장치를 제어
Programmed I/O
Interrupt
I/O 작업이 끝났음을 CPU에게 알림
DMA(Direct Memory Access)
대량의 데이터를 전송할 때 계속 Interrupt거는 것이 아니라, DMA Controller가 이를 대신 수행하고 마지막에 Interrupt를 걸어주는 방식
I/O 작업이 끝났음을 아는 방법
1. I/O 작업이 끝난 후 Interrupt를 걸어 운영체제에게 알림
2. CPU가 I/O에게 일정시간마다 "다했어?"라고 Polling으로 물어보는 방식
Kernel: 운영체제
Kernel I/O subsystem: 운영체제 기능 중 I/O를 관리하는 커널들
Device Driver: 회사별로 다른 device의 상세사항을 기술한 소프트웨어
ex) intel, amd cpu 드라이버
Device Controller: CPU 대신 Device를 관리 및 수행하는 하드웨어
I/O Device: 키보드, 마우스, usb 등 다양한 I/O device
I/O 요청 후 system call 발생으로 kernel모드로 진입
kernel I/O subsystem: I/O 드라이버 및 컨트롤러가 정의되어 있는지 판단있다면 I/O로 바로접근하고 없다면 하위단계인 device driver에게 요청
device driver: controller에게 요청한 I/O명령을 수행시킴
device controller: I/O에서 명령을 수행시키고 결과가 나왔다면 interrupt발생
interrupt handler: 프로세스 상태를 저장하고 driver에게 전달
device driver: I/O 요청과정을 다했는지 판단하고 다했다면 I/O subsystem에게 결과값을 전달
kernel I/O subsystem: I/O 요청에 대한 결과 값을 system call로 return 하고 user mode로 돌아옴
키보드로 채팅해서 다른 컴퓨터로 전송하는 과정
키보드로 문자열 입력 → interrupt occured
interrupt handler: 프로세스 상태를 저장 후 채팅을 보내는 process로 context swtich
network adapter로 키보드로 받은 문자열을 전송 하고 system call로 다보냈다고 return
받을 컴퓨터는 보낸 컴퓨터의 network adapter에서 온 문자열을 수신 → interrupt occured
interrupt handler: 프로세스 ᄉᆞᆼ태를 저장 후 채팅을 보여주도록 출력 process로 context swtich
I/O 장치의 기능구현을 어디에 구현할지에 따라 특징이 달라짐
application code → kernel code → device-driver code → device-controller code → device code
왼쪽일수록 high level로 속도와 추상화 ↓, 유연성(수정하거나 개발자가 관리하는 난이도) ↑
오른쪽일수록 low level로 속도와 추상화가 ↑, 유연성(수정하거나 개발자가 관리하는 난이도) ↓
Device independence
기능을 충실히 구현해서 I/O Device 끼리 독립적이어야함
Uniform naming
코드 재사용성을 고려하는 등 통합을 잘해야함
Error handling
Hardware에 에러난 경우에 대한 처리를 잘해줘야함
Buffering
버퍼에 저장을 효율적으로 해야함
Sharable vs. dedicated devices
나만 쓰게 할 건지, 공유해서 쓸 건지 등의 기능을 구현해야함
(a) Unbufferd
Device의 정보가 User process로 바로 전송
(b) Bufferd in user space
Device의 정보가 프로세스의 버퍼에 저장됨
(c) Bufferd in the kernel space
Device의 정보가 커널에 저장. user process가 이를 한 번 더 가져옴.
(d) Double buffering in the kernel
기존의 커널 버퍼에 있던 값을 쓰다가 다 땡겨와지면 보여줌
(a), (d)방식은 거의 안쓰고, (c)방식을 자주 씀
interrupt controller가 따로 존재해서 interrupt 발생시 그 순간의 프로세스 상태나 에러코드를 저장
에러나서 취소된 행동을 성공할때까지 몇 번 더 반복
에러 무시
에러를 발새생시킨 process kill
아예 시스템을 종료시켜버림
I/O Device, 시스템의 경우에 따라 잘 선택해 운용
프린터에 많이 쓰는 방법
데이터는 크고 I/O 처리가 느린 상황에서 사용
→ 데이터가 크므로 기존의 buffering방식에서 커널의 버퍼를 사용하게 되면 버퍼가 낭비임
커널의 버퍼가 아닌 secondary storage(HDD, SSD)에 파일형태로 버퍼링