Modern I/O Systems
다양한 종류의 I/O 장치가 있습니다
- CPU는 디바이스 컨트롤러(device controller)와 상호작용합니다.
- 디바이스 컨트롤러는 읽고 쓸 수 있는 레지스터 세트를 포함합니다.
Programmed I/O
Port I/O
- 특수 프로세서 명령어를 사용하여 데이터를 전송합니다.
- 예: 인텔 아키텍처의 in/out 명령어
- 각 장치는 다른 I/O 포트를 사용합니다. (포트 번호)
Memory-mapped I/O
- 디바이스 컨트롤러의 레지스터는 물리 주소 공간에 매핑됩니다.
- 주소는 하드웨어 점퍼(hardware jumper) 또는 부팅 시 프로그래밍으로 설정됩니다.
- I/O는 로드 및 저장 명령어(load and store instructions)를 통해 수행됩니다.
- I/O 주소 공간이 시스템 메모리 주소 공간의 범위를 차지하기 때문에 프로세스에서 사용할 수 없습니다.
Direct Memory Access (DMA)
Direct Memory Access
- 대량의 데이터 이동을 위해 프로그래밍된 I/O를 피하기 위해 사용됩니다.
- DMA 컨트롤러에게 메모리 버스에 대한 접근 권한을 부여합니다.
- CPU를 우회하여 I/O 장치와 메모리 간에 직접 데이터를 전송합니다.
- DMA 전송을 수행하는 6단계 프로세스
- 디바이스 드라이버는 버퍼 주소 X로 디스크 데이터를 전송하라는 명령을 받음
- 디바이스 드라이버는 디스크 컨트롤러에게 디스크에서 버퍼 주소 X로 C 바이트를 전송하라고 명령함
- 디스크 컨트롤러는 DMA 전송을 시작함
- 디스크 컨트롤러는 각 바이트를 DMA 컨트롤러로 보냄
- DMA 컨트롤러는 주소 X의 버퍼로 바이트를 전송하면서 메모리 주소를 증가시키고 C를 0이 될 때까지 감소시킴
- C가 0이 되면 DMA는 전송 완료를 신호하기 위해 CPU를 인터럽트함
Polling vs. Interrupt
- OS는 I/O 장치가 작업을 완료했을 때를 알아야 하기 때문에 Polling과 Interrupt를 사용한다.
Interrupt
- I/O 장치가 서비스가 필요할 때마다 인터럽트를 생성합니다.
- 예측할 수 없는 이벤트를 잘 처리합니다.
- 디바이스 드라이버에서 처리됩니다.
Polling
- I/O 장치는 상태 레지스터(status register)에 완료 정보를 입력합니다.
- OS는 주기적으로 디바이스 전용 상태 레지스터를 확인합니다.
- 드문 또는 예측할 수 없는 I/O 작업의 경우 많은 사이클을 낭비할 수 있습니다.
일부 장치는 Polling과 Interrupt를 결합하여 사용합니다
- 예: 고대역폭 네트워크 장치
- 첫 번째 패킷 수신에 대해 인터럽트 발생
- 이후 패킷에 대해 Polling
Standard Interfaces to Devices(표준 인터페이스 장치)
Block Devices(블록 장치)
- 데이터는 블록 단위로 접근됩니다.
- 예: 하드 디스크, 테이프, SSD
- 명령어: read(), write(), seek()
- 파일 시스템 또는 원시 I/O 접근
Character Devices(문자 장치)
- 예: 키보드, 마우스, 프린터
- 한 번에 한 문자씩 처리
- 명령어: get(), put()
Network Devices(네트워크 장치)
- 예: 이더넷, 무선, 블루투스
- 유닉스와 윈도우는 소켓 인터페이스 포함
- 명령어: create(), connect(), listen(), accept(), send(), receive()
Blocking and Non-blocking I/O
Blocking I/O(봉쇄형 I/O) - "Wait"
- I/O가 완료될 때까지 프로세스가 중단됩니다.
- 데이터 요청 시 프로세스가 데이터 준비될 때까지 대기
- 데이터 작성 시 프로세스가 데이터가 작성될 때까지 대기
Non-blocking I/O(비봉쇄형 I/O) - "Don't Wait"
- 요청된 데이터의 바이트 수를 반환하며 빠르게 종료
Kernel I/O Subsystem
I/O subsystem
- 디바이스에 출력을 위한 간단한 예제
- 이 코드는 많은 다른 디바이스에서 작동합니다.
- I/O 서브시스템은 다양한 디바이스에 대한 표준 인터페이스를 제공합니다.
- create, open, read, write, close, etc.
- I/O 서브시스템은 디바이스 드라이버와 협력할 프레임워크를 제공합니다.
Device Driver
- 디바이스와 직접 상호작용하는 커널의 디바이스 전용 코드
Kernel I/O Subsystem
A kernel I/O structure
- (애플리케이션 레벨에서 커널 레벨로의 I/O 요청 흐름)
- (하드웨어 장치 드라이버와의 상호작용)
Kernel I/O Subsystem
I/O Scheduling
- I/O 성능 향상을 위해 I/O 요청을 재정렬합니다.
- 예: 디스크 I/O 스케줄링 - SSTF, SCAN, C-SCAN 등
Buffering
- 장치 간 데이터 전송 시 메모리에 데이터를 저장
- 장치 속도 불일치 문제를 해결
- 장치 전송 크기 불일치 문제를 해결
Caching
- I/O 성능 향상을 위해 빠른 메모리(fast memory)에 데이터 복사본을 저장
Spooling(Simultaneous Peripheral Operations On-Line)
- 인터리브된 데이터 스트림을 수용할 수 없는 장치를 위해 출력을 보관합니다.
- 데이터를 병렬적으로 처리할 수 없는 장치를 위해 출력을 보류하는 기능을 말함
- 예: 프린터
Kernel I/O Subsystem
A blocking read request example
(1) 사용자 프로세스: 시스템 호출로 I/O 요청
(2) 커널 I/O 서브시스템:
- (2-1) 요청을 이미 충족할 수 있는지 확인, 충족할 수 있으면 데이터 전송 후 완료 상태 또는 오류 코드를 반환하고 (9)으로 이동
- (2-2) 충족할 수 없으면 디바이스 드라이버에게 요청을 전송하고, 적절한 경우 프로세스를 블록 (3)
(3) 커널 I/O 서브시스템: 디바이스 드라이버에게 요청을 전송하고, 적절한 경우 프로세스를 블록
(4) 디바이스 드라이버: 요청을 처리하고, 컨트롤러에게 명령을 전송, 인터럽트가 발생할 때까지 블록하도록 컨트롤러를 구성
(5) 디바이스 컨트롤러: 장치를 모니터링하고, I/O가 완료되면 인터럽트 발생
(6) 디바이스 컨트롤러: I/O 완료 시 인터럽트 생성
(7) 인터럽트 핸들러: 인터럽트를 수신하고, 데이터가 입력된 경우 디바이스 드라이버 버퍼에 데이터를 저장, 디바이스 드라이버를 언블록하도록 신호
(8) 디바이스 드라이버: 완료된 I/O를 확인하고, 상태 변경을 I/O 서브시스템에 표시
(9) 커널 I/O 서브시스템: (적절한 경우) 데이터를 프로세스에 전송하고, 완료 상태 또는 오류 코드를 반환
(10) 사용자 프로세스: 시스템 호출로부터 반환, I/O 완료, 입력 데이터 이용 가능 또는 출력 완료
'Computer Science > 운영체제' 카테고리의 다른 글
[운영체제] 14. File System Implementation (0) | 2024.06.19 |
---|---|
[운영체제] 13. File System Interface (0) | 2024.06.19 |
[운영체제] 11. Mass-Storage Structure (0) | 2024.06.19 |
[운영체제] 10. Virtual Memory (0) | 2024.06.19 |
[운영체제] 09. Main Memory (0) | 2024.06.19 |