12. 입출력 시스템(I/O Systems)
12. 입출력 시스템(I/O Systems)
12.1 개요(Overview)
▶ 입출력 부시스템(I/O subsystem): 다양한 입출력 장치들의 다양한 제어를 위한 시스템
ex) 하드디스크, 마우스, CD-ROM 쥬크 박스 등
▶ 입출력 장치 기술의 경향
- 입출력 장치의 다양화
- 소프트웨어와 하드웨어간 인터페이스의 표준화
→ 장치 구동기(device driver): 일관된 장치 접근 인터페이스를 제공
12.2 입출력 하드웨어(I/O Hardware)
▶ 장치의 종류
- 저장장치: 디스크, 테이프
- 전송장치: 네트워크 카드, 모뎀
- 사용자 인터페이스 장치: 스크린, 키보드, 마우스
▶ 장치와 컴퓨터 시스템간의 통신
- 포트(port): 연결점
- 버스(bus): 여러 장치들이 공용하는 와이어 집합
ex) 데이지 체인(daisy chain): 장치 A - 장치 B - 장치 C
▶ 버스: [그림 12.1] 전형적인 PC 버스 구조
- PCI 버스: 프로세서-메모리 부시스템과 고속 장치의 연결
- 확장 버스: 저속 장치의 연결 ex) 키보드, 병렬포트, 직렬포트
- SCSI 버스: 고속 디스크들의 연결
▶ 제어기(controller): 포트, 버스, 장치의 작동
- 단일 칩(chip)으로 구현: ex) 직렬 포트 제어기
- 회로 기판으로 구현: ex) SCSI 제어기
- 장치에 내장된 제어기: ex) 디스크 구동기에 부착된 기판
▶ 프로세서와 제어기의 통신
- 제어기마다 레지스터 집합을 사용
- 입출력 명령어에 의한 수행
① 버스 선의 트리거링에 의한 통신 장치 선택
② 메모리 대응 입출력(memory-mapped I/O)에 의한 통신
→ 장치 제어 레지스터들이 프로세서의 주소 공간으로 대응
ex) 그래픽 제어기: 스크린의 내용을 저장하기 위한 그래픽 메모리 사용
(장점) 신속한 입출력
(단점) 프로그래밍 오류에 의한 훼손 가능 - 보호된 메모리 방식으로 해결
- 입출력 포트: [그림 12.2] 호환성 PC에서 장치 입출력 포트의 위치
→ 4개의 레지스터로 구성
① status 레지스터: 장치의 상태
ex) 판독 가능 여부, 에러 유발 여부 등
② control 레지스터: 장치 모드의 변경
ex) 전이중(full-duplex) 혹은 반이중(half-duplex) 통신의 선택, 패리티 검사, 워드 길이 선택,
전송 속도 선택 등
③ data-in 레지스터: 입력용 자료 레지스터
④ data-out 레지스터: 출력용 자료 레지스터
12.2.1 폴링(Polling)
▶ 핸드셰이킹(handshaking): 호스트와 제어기 사이의 교류를 위한 프로토콜
- 제어기는 status 레지스터의 busy 비트를 통해 상태를 지정함
① 명령을 수행중인 상태: busy=1
② 명령 수행을 완료하고 다음 명령을 기다리는 상태: busy=0
- 호스트는 command 레지스터의 command-ready 비트를 사용
① 제어기에게 명령을 한 상태: command-ready=1
② 제어기가 명령 수행을 완료한 상태: command-ready=0
(예) 출력:
① 호스트는 클리어 될 때까지 busy 비트를 반복적으로 판독
② 호스트는 command 레지스터의 write 비트를 설정하고 data-out 레지스터에 한 바이트를 씀
③ 호스트는 command-ready 비트를 설정
④ 제어기가 command-ready 비트가 설정되었음을 알아차리면 busy 비트를 설정
⑤ 제어기는 command 레지스터를 판독하여 명령이 write임을 파악하고, data-out 레지스터를 판독하여 해당 바이트를 가져와 장치에 출력함
⑥ 제어기는 command-ready 비트를 클리어하고, 입출력 성공을 알리기 위해서는 status 레지스터의 error 비트를 클리어하며, busy 비트를 클리어함
▶ 폴링(polling)/사용중 대기(busy-waiting): 위 과정 ①에서 발생
→ 중앙처리장치의 비효율성 초래: 제어기가 중앙처리장치에 통보하는 인터럽트 방식이 효과적
12.2.2 인터럽트(Interrupts)
▶ 인터럽트 방식의 입출력: [그림 12.3] 인터럽트 구동 입출력 사이클
- 중앙처리장치는 매 명령어 수행 직후에 인터럽트 요청 라인(interrupt request line)을 검사하여 제어기에 의해 보내져온 인터럽트가 있는지 검사
- 중앙처리장치가 인터럽트 신호를 감지하면 현재 상태를 저장하고 인터럽트 핸들러 루틴(interrupt handler routine)으로 이동
- 인터럽트 핸들러는 인터럽트를 분석하고 해당 처리를 수행한 후, return from interrupt 명령을 수행하여 인터럽트 전의 상태로 복귀
▶ 세련된 인터럽트 핸들링 방법
- 중요한 처리 중에는 인터럽트 처리를 미룰 수 있는 방법 필요
- 모든 장치를 폴링하지 않고 인터럽트를 일으킨 장치를 인터럽트 핸들러에게 통지하는 방법 필요
- 인터럽트의 우선 순위에 따라 긴급성을 조절하는 다계층 인터럽트 필요
▶ 두 인터럽트 라인의 경우
- 마스크 불가 인터럽트 라인(nonmaskable interrupt line): 긴급한 에러 발생시
- 마스크 가능 인터럽트 라인(maskable interrupt line): 일반적인 인터럽트 발생시
→ 단, 인터럽트 걸려서는 안 되는 명령어 수행 시, 중앙처리장치에 의해 해제될 수 있음
▶ 특정 인터럽트 핸들러의 선택
- 인터럽트 번호: 인터럽트 벡터(interrupt vector)의 변위로 사용
→ 인터럽트 핸들러 주소를 파악
- 인터럽트 체이닝(chaining): 인터럽트 벡터의 용량보다 장치 수가 많은 경우에 사용하는 기법
→ 인터럽트 벡터의 각 원소들이 인터럽트 핸들러 리스트의 헤드를 가리키게 하고, 해당 리스트를 탐색하게 하는 방법
▶ (예) [그림 12.4] 인텔 펜티엄 프로세서의 인터럽트 벡터 테이블
- 0-31: 마스크 불가 → 다양한 에러용
- 32-255: 마스크 가능 → 장치 생성 인터럽트용
▶ 인터럽트 우선 순위 단계(interrupt priority levels)
→ 높은 우선 순위의 인터럽트가 낮은 우선 순위의 인터럽트 수행을 선점
▶ 다양한 인터럽트 메커니즘
- 일반적인 용도
① 부팅 시: 하드웨어 버스를 조사하여 존재하는 장치를 파악하고 인터럽트 벡터 내에 적절한 인터럽트 핸들러를 설치함
② 입출력 시: 출력 완료, 입력 자료의 유효 또는 오류
③ 예외 발생 시: ex) 0으로 나누기, 부적절한 주소 접근, 사용자 모드에서의 부적절한 명령 시도
- 하드웨어 메커니즘의 적절한 사용: ex) 페이지 부재 인터럽트
- 시스템 호출의 수행: 응용 프로그램이 커널 서비스를 호출하기 위한 함수 호출
- 커널 안에서의 제어 흐름 관리: ex) 디스크 판독
- 스레드 커널 구조: 백그라운드 처리에 대한 인터럽트 핸들링
12.2.3 직접 메모리 접근(Direct Memory Access)
▶ 프로그램된 입출력(Programmed I/O; PIO): 상태 비트를 감시하고 한번에 1 워드(바이트)씩 제어기 레지스터에 옮기는 것
→ 디스크와 같이 많은 전송을 하는 경우, 범용의 중앙처리장치가 담당하는 것은 비효율적이고, 직접 메모리 접근 제어기라 불리는 별도의 처리기가 담당하는 것이 바람직
▶ 직접 메모리 접근(Direct Memory Access; DMA)
- DMA 전송을 초기화하기 위해, 호스트는 DMA 명령 블록을 기억장치에 씀
(전송 소스의 포인터, 전송 목적지의 포인터, 전송 바이트 수의 카운터를 포함)
- CPU는 이 명령 블록의 주소를 DMA 제어기에 기록하고 다른 작업을 계속함
- DMA 제어기는 직접 메모리 버스를 운영하여 한 워드씩 전송함
▶ DMA 제어기와 장치 제어기간의 핸드셰이킹
→ DMA-request와 DMA-acknowledge의 두 와이어를 통해 수행
- 장치 제어기는 한 워드의 자료가 메모리로 전송 가능할 때 DMA-request에 신호를 보냄
- DMA 제어기는 이 신호를 받으면, 메모리 버스를 점유하고 메모리 주소 와이어에 원하는 주소를 위치시키며 DMA-acknowledge에 신호를 보냄
- 이 신호를 받은 장치 제어기는 한 워드 자료를 메모리로 전송하고 DMA-request 신호를 해제함
- 전송이 완료되면, DMA 제어기는 CPU에 인터럽트를 검
[그림 12.5] 직접 메모리 접근 전송의 단계
▶ 직접 가상 메모리 접근(Direct Virtual Memory Access; DVMA)
→ 중앙처리장치의 간섭과 주기억장치 사용 없이 두개의 메모리 대응 장치(memory-mapped device) 사이에서의 전송이 가능
12.3 응용 입출력 인터페이스(Application I/O Interface)
▶ 개념: 다양한 입출력 장치를 규격화되고 일관된 방식으로 취급하기 위한 기법과 인터페이스를 구성하는 방법
▶ 접근 방법: 추상화, 캡슐화, 계층화
- 입출력 장치들을 일반적인 종류로 추상화
- 일반적인 종류 각각은 인터페이스라는 규격화된 함수 집합으로 접근
→ 차이점은 장치 구동기로 캡슐화됨
- 소프트웨어 계층화: [그림 12.6] 커널의 입출력 구조
→ 입출력 부시스템을 하드웨어와 독립적으로 만들 수 있음
(장점)
① 운영체제 개발자: 개발 작업이 단순화 됨
② 하드웨어 제조업자: 범용 운영체제 맞는 장치 제어기를 만듦으로써 즉시 사용가능 함
▶ 장치의 다양성: [그림 12.7] 입출력 장치의 특성
→ p.444-445 참조
▶ escape 또는 back-door 시스템 호출: 임의의 명령어를 응용에서 장치 구동기로 투명하게 전달하는 방법
ex) UNIX의 ioctl 시스템 호출: 3 인수
- 파일 디스크립터(descriptor)
- 명령어 선택을 위한 정수
- 임의의 자료구조를 가리키는 포인터
12.3.1 블록과 문자 장치(Block and Character Device)
▶ 블록 장치 인터페이스를 통한 장치 접근: ex) 디스크 구동기
→ read, write, seek 명령
▶ 메모리 대응(memory mapped) 파일 접근: 블록 장치 구동기의 최상위 계층에 해당
→ 주기억장치 상의 바이트 배열을 통해 저장장소로의 접근을 제공
▶ 문자 스트림 인터페이스를 통한 장치 접근: ex) 키보드, 마우스, 모뎀
- 한 문자의 입출력 가능
- 버퍼링과 편집 서비스에 의한 동시의 라인 접근(line-at-a-time access) 제공 가능
12.3.2 네트워크 장치(Network Devices)
▶ 네트워크 입출력 인터페이스: ‘네트워크 소켓(socket) 인터페이스’
ex) UNIX 또는 Windows NT
→ 소켓 인터페이스에서의 시스템 호출은,
- 응용이 소켓을 생성하게 하고,
- 지역 소켓을 원격 주소에 연결하고,
- 어떤 원격 응용이 지역 소켓으로 플러그되는지 알아보고,
- 연결을 통해 패킷을 주고받도록 함
* select 호출: 어느 소켓이 수신될 패킷을 기다리고 있는지, 어느 소켓이 전송될 패킷을 저장할 공간을 가지고 있는지를 리턴 받음
12.3.3 클록과 타이머(Clocks and Timers)
▶ 세 가지 함수 제공
- 현재 시간 제공
- 경과 시간 제공
- T시간에 X 트리거 동작을 발생하는 타이머 지정
→ 시스템 호출이 표준화되어 있지 않음
12.3.4 블로킹과 논블로킹 입출력(Blocking and Nonblocking I/O)
▶ 블로킹 시스템 호출: 응용의 실행이 지연됨
- 시스템 호출 시, 응용은 실행(준비) 큐에서 대기 큐로 이동
- 시스템 호출의 수행 후 응용은 다시 실행 큐로 이동
▶ 논블로킹 시스템 호출: 응용의 실행이 계속됨
ex) 처리중이거나 스크린에 자료를 표시하는 중에 키보드나 마우스의 입력을 받는 인터페이스
디스크를 판독하면서 동시에 압축을 풀고 디스플레이하는 비디오 응용
→ 구현: 1) 다중 스레드 응용, 2) 비동기적 시스템 호출
12.4 커널 입출력 부시스템(Kernel I/O Subsystem)
12.4.1 스케줄링(Scheduling)
▶ 입출력 스케줄링: 장치 큐의 스케줄링에 의한 요청 재배치 → 13.2절 참조
(목적)
- 전반적인 시스템 성능 향상
- 프로세스간의 장비 접근을 공평하게 공유
- 입출력 완료까지의 평균 대기 시간 감소
ex) 디스크 헤드가 시작부분에 위치하는 경우,
(장치 큐) 응용 1-끝 부분 블록 요청, 응용 2-시작 부분 블록 요청, 응용 3-중간 부분 블록 요청
→ 재배치: 응용 2, 응용 3, 응용 1
12.4.2 버퍼링(Buffering)
▶ 버퍼: 두 장치 사이 혹은 응용과 장치 사이에 자료 전송을 위한 임시 저장 공간
▶ 버퍼링의 필요성
- 생산자와 소비자 사이의 자료 흐름 속도의 불일치에 대처하기 위함
ex) 파일 전송: 하드디스크 ↔ 모뎀
→ 이중 버퍼링(double buffering)에 의한 비간섭화(decoupling):
모뎀이 한 버퍼를 채우는 동안 이미 채워진 버퍼를 디스크에 기록하는 방법
[그림 12.8] Sun Enterprise 6000 장치 전송률
- 서로 다른 자료 전송 크기를 가지고 있는 장치들을 적응시키기 위함
ex) 메시지의 분할(fragmentation)과 재결합(reassembly)에 의한 네트워크 전송
→ 송신측에서 메시지를 패킷(packet) 단위로 분할하여 전송하고 수신측에서 재결합 함
- 응용의 입출력을 위한 “복사 의미론(copy semantics)”을 지원하기 위함
ex) 응용이 버퍼에 대한 포인터와 출력할 바이트 수를 가지고 write 시스템 호출을 한 시점과 동일한 버전의 자료를 디스크에서 보장하는 것
→ write 시스템 호출 시, 응용 버퍼에서 커널 버퍼로 자료를 복사하고 실제 출력은 커널 버퍼로부터 이루어짐
12.4.3 캐싱(Caching)
▶ 캐시(cache): 자료의 복사본을 가지고 있는 빠른 메모리 영역 → 접근 속도가 효율적
▶ 버퍼와 캐시의 차이점
- 버퍼: 현재 복사본을 저장
- 캐시: 다른 곳에 저장된 자료의 복사본을 보다 빠른 기억장소에 저장
→ 동일한 기억장치 영역이 버퍼와 캐시 모두를 위해 사용 가능
12.4.4 스풀링(Spooling) 및 장치 예약(Device Reservation)
▶ 스풀(spool): 중첩되는 자료 스트림을 수용할 수 없는 장치를 위한 출력 버퍼 ex) 프린터
→ 스풀링 시스템이 프린터로 가는 모든 출력을 가로채어 디스크에 파일로 보관하고 하나씩 출력
▶ 배타적인 장치 접근으로 스풀링을 대신할 수 있음
→ 유휴 장치의 할당(allocate) 및 사용 후 해제(deallocate)
12.4.5 에러 처리(Error Handling)
▶ 보호 메모리(protected memory): 하드웨어 및 응용의 에러에 의한 접근에 대처 가능
→ 미미한 에러에 의해 전반적인 시스템 고장이 유발되는 것을 방지
▶ 일시적인 고장에 대한 대처 방안:
ex) 디스크 read 실패시 read를 재시도, 망의 send 에러시 resend 시도
12.4.6 커널 자료 구조(Kernel Data Structure)
▶ 커널은 입출력 구성 요소의 사용에 대한 상태 정보를 유지해야 함: ex) 개방 파일 테이블
- UNIX: 사용자 파일, 장치 자체, 프로세스의 주소 공간 등의 다양한 객체에 대한 파일 시스템 접근을 제공 → 단일 구조체 내에 은닉함: [그림 12.9] UNIX 입출력 커널 구조
- Windows NT: 입출력을 위한 메시지 전달 방법을 사용
→ 메시지의 출력이나 입력을 위한 버퍼를 가짐
▶ 입출력 부시스템의 서비스: p.455-456의 내용
12.5 입출력 요청의 하드웨어 작업 변환(Transforming I/O Requests to Hardware Operations)
▶ 블록킹 판독 요청의 일반적인 모습: [그림 12.10] 입출력 요청의 전 사이클 → p.458-459의 1-10
12.6 성능(Performance)
▶ 원거리에 있는 컴퓨터간의 로그인의 예: [그림 12.11] 컴퓨터간 통신과 비용
▶ 입출력의 효율성 증대를 위한 원칙: p.461-462의 내용
▶ 입출력 기능 구현의 위치: p.462-463의 내용 → 응용, 커널, 하드웨어
'시리즈 > OS' 카테고리의 다른 글
제3의 저장장치 구조(Tertiary Storage Structure) (0) | 2014.08.20 |
---|---|
13.1 디스크 구조(Disk Structure) - 보조저장장치 구조(Secondary Storage Structures) (0) | 2014.08.15 |
11.1 파일 시스템 구조(File-System Structure) (0) | 2014.08.08 |
10. 파일 시스템 인터페이스(File System Interface) (0) | 2014.08.07 |
가상 기억장치(Virtual Memory) (0) | 2014.07.27 |