최신 I/O 시스템
엄청나게 많은 종류의 I/O 장치

- CPU는 장치 컨트롤러와 상호 작용
- 장치 컨트롤러에는 읽고 쓸 수 있는 일련의 레지스터가 포함
프로그래밍된 I/O
포트 I/O
- 특수 프로세서 명령어는 데이터를 전송하는 데 사용
- 인텔 아키텍처의 인/아웃 명령
- 각 장치는 서로 다른 I/O 포트를 사용(포트 번호)
메모리 매핑 I/O
- 장치 컨트롤러의 레지스터는 물리적 주소 공간에 매핑
- 주소는 하드웨어 점퍼 또는 부팅 시 프로그래밍에 의해 설정
- I/O는 로드 및 저장 명령으로 수행
- I/O 주소 공간은 시스템 메모리 주소 공간의 범위를 차지하므로 프로세스에 사용할 수 없다.
직접 메모리 액세스
직접 메모리 액세스
- 대규모 데이터 이동을 위해 프로그래밍된 I/O를 방지하는 데 사용
- DMA 컨트롤러에 메모리 버스에 대한 액세스 권한을 부여
- I/O 장치와 메모리 간에 데이터를 직접 전송하기 위해 CPU를 우회
- DMA 전송을 수행하기 위한 6단계 프로세스

폴링(Polling) vs 인터럽트(Interrupt)
OS는 I/O 장치가 작업을 완료한 시점을 알아야 한다.
인터럽트(Interrupt)
- I/O 장치는 서비스가 필요할 때마다 인터럽트를 생성
- 예측할 수 없는 이벤트를 잘 처리
- 장치 드라이버에서 처리
폴링(Polling)
- I/O 장치는 완료 정보를 상태 레지스터에 넣는다.
- OS는 장치별 상태 레지스터를 주기적으로 확인
- I/O 작업이 드물거나 예측할 수 없는 경우 많은 주기를 낭비
일부 장치는 폴링과 인터럽트를 모두 결합
- 예) 고대역폭 네트워크 장치
- 처음 들어오는 패킷에 대한 인터럽트
- 다음 패킷에 대한 폴링
장치에 대한 표준 인터페이스
블록 장치(Block Devices)
- 데이터는 블록 단위로 액세스
- 예) 하드 디스크, 테이프, SSD
- 명령 : read(), write(), seek()
- 파일 시스템 또는 원시 I/O 액세스
문자 장치(Character Devices)
- 예) 키보드, 마우스, 프린터
- 한 번에 단일 문자
- 명령 : get(), put()
네트워크 장치(Network Devices)
- 예) 이더넷, 무선, 블루투스
- Unix 및 Windows에는 소켓 인터페이스 포함
- 명령 : create(), connect(), listen(), accept(), send(), receive()
블로킹 및 논블로킹 I/O
블로킹(Blocking) I/O - “Wait”
- I/O가 완료될 때까지 프로세스가 일시 중지
- 데이터를 요청하면(예: read() 시스템 호출) 프로세스는 데이터가 준비될 때까지 휴면 상태
- 데이터를 쓸 때(e.g. write() 시스템 호출) 프로세스는 데이터가 쓰여질 때까지 휴면 상태
논블로킹(Non-blocking) I/O - “Don’t Wait”
- 성공적으로 전송된 바이트 수와 함께 읽기 또는 쓰기 요청에서 신속하게 반환
커널 I/O 서브시스템
I/O 서브시스템
- 장치 출력에 대한 간단한 예
int fd = open("/dev/something");
for (int i=0; i<1; i++) {
fprintf(fd, "Count%d\n", i);
}
close(fd);
- 이 코드는 다양한 장치에서 작동
- I/O 하위 시스템은 다양한 장치에 표준 인터페이스 제공
- create, open, read, write, close 등
- I/O 하위 시스템은 장치 드라이버와 협력하기 위한 프레임워크 제공
장치 드라이버
- 장치 하드웨어와 직접 상호 작용하는 커널의 장치별 코드
커널 I/O 서브시스템

I/O 스케줄링
- I/O 성능 향상을 위해 I/O 요청을 재정렬
- 예) 디스크 I/O 스케줄링 – SSTF, SCAN, C-SCAN 등
버퍼링
- 장치 간 전송 중에 데이터를 메모리에 저장
- 장치 속도 불일치에 대처하기 위해
- 장치 전송 크기 불일치에 대처하기 위해
캐싱
- I/O 성능 향상을 위해 빠른 메모리에 데이터 복사본을 보관
스풀링
- 인터리브된 데이터 스트림을 허용할 수 없는 장치에 대한 출력을 보유
- 예) 인쇄기
커널 I/O 서브시스템
블로킹 읽기 요청 예시

요약
- 장치와 메모리 간의 데이터 이동
- 프로그래밍된 I/O로 CPU에 의해 수행되거나 DMA 컨트롤러로 오프로드
- OS
- 인터럽트 및 폴링을 통해 I/O 장치가 작업을 완료한 시점을 알고 있다.
- 응용 프로그램 인터페이스 : I/O 장치
- 블록 장치
- 문자 장치
- 네트워크 장치
- I/O 하위 시스템
- 장치 드라이버와 협력하기 위한 프레임워크뿐만 아니라 다른 장치에 대한 표준 인터페이스 제공
- I/O 스케줄링, 버퍼링, 캐싱 및 스풀링과 같은 다양한 서비스 제공
'운영체제' 카테고리의 다른 글
[OS] 파일 시스템 구현(File System Implementation) (0) | 2023.05.15 |
---|---|
[OS] 파일 시스템 인터페이스(File System Interface) (0) | 2023.05.15 |
[OS] 대량 저장 구조(Mass-Storage Structure) (0) | 2023.05.08 |
[OS] 가상메모리(Virtual Memory) (0) | 2023.05.01 |
[OS] 메인메모리(Main Memory) (0) | 2023.04.24 |
최신 I/O 시스템
엄청나게 많은 종류의 I/O 장치

- CPU는 장치 컨트롤러와 상호 작용
- 장치 컨트롤러에는 읽고 쓸 수 있는 일련의 레지스터가 포함
프로그래밍된 I/O
포트 I/O
- 특수 프로세서 명령어는 데이터를 전송하는 데 사용
- 인텔 아키텍처의 인/아웃 명령
- 각 장치는 서로 다른 I/O 포트를 사용(포트 번호)
메모리 매핑 I/O
- 장치 컨트롤러의 레지스터는 물리적 주소 공간에 매핑
- 주소는 하드웨어 점퍼 또는 부팅 시 프로그래밍에 의해 설정
- I/O는 로드 및 저장 명령으로 수행
- I/O 주소 공간은 시스템 메모리 주소 공간의 범위를 차지하므로 프로세스에 사용할 수 없다.
직접 메모리 액세스
직접 메모리 액세스
- 대규모 데이터 이동을 위해 프로그래밍된 I/O를 방지하는 데 사용
- DMA 컨트롤러에 메모리 버스에 대한 액세스 권한을 부여
- I/O 장치와 메모리 간에 데이터를 직접 전송하기 위해 CPU를 우회
- DMA 전송을 수행하기 위한 6단계 프로세스

폴링(Polling) vs 인터럽트(Interrupt)
OS는 I/O 장치가 작업을 완료한 시점을 알아야 한다.
인터럽트(Interrupt)
- I/O 장치는 서비스가 필요할 때마다 인터럽트를 생성
- 예측할 수 없는 이벤트를 잘 처리
- 장치 드라이버에서 처리
폴링(Polling)
- I/O 장치는 완료 정보를 상태 레지스터에 넣는다.
- OS는 장치별 상태 레지스터를 주기적으로 확인
- I/O 작업이 드물거나 예측할 수 없는 경우 많은 주기를 낭비
일부 장치는 폴링과 인터럽트를 모두 결합
- 예) 고대역폭 네트워크 장치
- 처음 들어오는 패킷에 대한 인터럽트
- 다음 패킷에 대한 폴링
장치에 대한 표준 인터페이스
블록 장치(Block Devices)
- 데이터는 블록 단위로 액세스
- 예) 하드 디스크, 테이프, SSD
- 명령 : read(), write(), seek()
- 파일 시스템 또는 원시 I/O 액세스
문자 장치(Character Devices)
- 예) 키보드, 마우스, 프린터
- 한 번에 단일 문자
- 명령 : get(), put()
네트워크 장치(Network Devices)
- 예) 이더넷, 무선, 블루투스
- Unix 및 Windows에는 소켓 인터페이스 포함
- 명령 : create(), connect(), listen(), accept(), send(), receive()
블로킹 및 논블로킹 I/O
블로킹(Blocking) I/O - “Wait”
- I/O가 완료될 때까지 프로세스가 일시 중지
- 데이터를 요청하면(예: read() 시스템 호출) 프로세스는 데이터가 준비될 때까지 휴면 상태
- 데이터를 쓸 때(e.g. write() 시스템 호출) 프로세스는 데이터가 쓰여질 때까지 휴면 상태
논블로킹(Non-blocking) I/O - “Don’t Wait”
- 성공적으로 전송된 바이트 수와 함께 읽기 또는 쓰기 요청에서 신속하게 반환
커널 I/O 서브시스템
I/O 서브시스템
- 장치 출력에 대한 간단한 예
int fd = open("/dev/something");
for (int i=0; i<1; i++) {
fprintf(fd, "Count%d\n", i);
}
close(fd);
- 이 코드는 다양한 장치에서 작동
- I/O 하위 시스템은 다양한 장치에 표준 인터페이스 제공
- create, open, read, write, close 등
- I/O 하위 시스템은 장치 드라이버와 협력하기 위한 프레임워크 제공
장치 드라이버
- 장치 하드웨어와 직접 상호 작용하는 커널의 장치별 코드
커널 I/O 서브시스템

I/O 스케줄링
- I/O 성능 향상을 위해 I/O 요청을 재정렬
- 예) 디스크 I/O 스케줄링 – SSTF, SCAN, C-SCAN 등
버퍼링
- 장치 간 전송 중에 데이터를 메모리에 저장
- 장치 속도 불일치에 대처하기 위해
- 장치 전송 크기 불일치에 대처하기 위해
캐싱
- I/O 성능 향상을 위해 빠른 메모리에 데이터 복사본을 보관
스풀링
- 인터리브된 데이터 스트림을 허용할 수 없는 장치에 대한 출력을 보유
- 예) 인쇄기
커널 I/O 서브시스템
블로킹 읽기 요청 예시

요약
- 장치와 메모리 간의 데이터 이동
- 프로그래밍된 I/O로 CPU에 의해 수행되거나 DMA 컨트롤러로 오프로드
- OS
- 인터럽트 및 폴링을 통해 I/O 장치가 작업을 완료한 시점을 알고 있다.
- 응용 프로그램 인터페이스 : I/O 장치
- 블록 장치
- 문자 장치
- 네트워크 장치
- I/O 하위 시스템
- 장치 드라이버와 협력하기 위한 프레임워크뿐만 아니라 다른 장치에 대한 표준 인터페이스 제공
- I/O 스케줄링, 버퍼링, 캐싱 및 스풀링과 같은 다양한 서비스 제공
'운영체제' 카테고리의 다른 글
[OS] 파일 시스템 구현(File System Implementation) (0) | 2023.05.15 |
---|---|
[OS] 파일 시스템 인터페이스(File System Interface) (0) | 2023.05.15 |
[OS] 대량 저장 구조(Mass-Storage Structure) (0) | 2023.05.08 |
[OS] 가상메모리(Virtual Memory) (0) | 2023.05.01 |
[OS] 메인메모리(Main Memory) (0) | 2023.04.24 |