입출력 버퍼링
문제를 위한 가정
- 사용자 프로세스가 디스크로부터 데이터 블록을 한 번에 하나씩 읽어들이고 싶음
- 데이터 블록 길이 512바이트
- 데이터 블록은 사용자 프로세스 주소 공간의 가상 위치 1000~1511에 존재하는 영역으로 읽혀짐
-> 가장 간단한 방법: Read_Block[1000,disk]
해당 접근의 문제점
- 입출력은 느리게 수행되는데 입출력 종료까지 멈춰야 함
- 운영체제가 스와핑 결정에 방해됨
- 1000~1511 가상위치 블록을 유지해야 함
- 교착 상태 가능성
- 오버헤드와 비효율 -> 버퍼링으로 해결
입출력 장치의 유형
- 블록형(Block-oriented) 장치
- 정보를 고정 크기를 가지는 블록 형태로 저장
- USB, 디스크 등
- 스트림형(stream-oriented) 장치
- 데이터를 별도의 블록 구조 없이 바이트 스트림으로 저장
- 마우스, 키보드 등
단일 버퍼
사용자 프로세스가 입출력 명령을 내리면 운영체제는 주기억장치의 시스템이 사용하는 영역에 있는 버퍼 하나를 할당
- 시스템 버퍼로 입력 데이터 전송
- 전송이 완료되면 프로세스는 그 블록을 사용자 공간으로 이동시키고 즉시 다음 블록 요청
- 사용자 프로세스는 그 다음 블록을 읽어오는 동안 이미 읽혀진 데이터 블록을 처리
- 시스템 버퍼링이 없는 경우에 비해 입출력 속도 향상
- 하지만 운영 시스템의 논리를 복잡하게 만듦(운영체제 + 스와핑 논리)
- 스트림형 입출력의 경우
- 라인형 단일 버퍼링 기법
- 바이트형 단일 버퍼링 기법
이중 버퍼
버퍼를 두 개를 두어 프로세스가 데이터를 버퍼로 전송하거나 전송받는 동안 운영체제는 또 다른 버퍼를 비우거나 채움
- 단일 버퍼링보다 성능 향상
- 스트림형 입력의 경우
- 라인형 입출력 -> 프로세스가 이중 버퍼 연산보다 앞서서 수행되지 않는다면 입력이나 출력이 완료될 때까지 보류될 필요가 없음
- 바이트형 -> 별 차이 없음
환형 버퍼
- 입출력 장치와 프로세스 간의 데이터 흐름을 평탄하게 조절
- 두 개 이상의 버퍼
- 각 버퍼는 환형 버퍼 할당의 단위