입출력 제어 환경
운영체제 : 다수 사용자를 위해 컴퓨터의 자원을 관리하는 S/W
운영체제의 기능
- 자원관리
- 프로세스 관리
- 메모리 관리
- 입출력 관리
- 보안 관리
화일 관리 : 화일 조직 방법을 제공 / 사용자의 I/O 명령문을 지정된 저급 I/O 명령어로 변환
장치 관리 : 물리적 저장장치에 대한 접근을 제공
화일 관리 + 장치 관리 : 입출력 제어 환경 제공 / 사용자와 보조 저장장치 간의 I/O를 제어하여 인터페이스 제공
=> 입출력 제어 시스템 사용자의 논리적 관점에서의 I/O를 물리적 관점으로 사상하여 입출력 투명성 제공
입출력 제어 시스템의 기능
- 화일 디렉터리(화일 식별, 위치 정보)를 유지
- 메인 메모리와 보조 저장장치 사이의 데이터 이동 통로를 확립
- CPU와 보조 저장장치 사이의 통신을 조정 (속도 차이 조정 & 송신자와 수신자 사이의 데이터 전송을 제어)
- 입/출력으로 사용될 화일을 준비
- 입/출력 완료 후에 화일 관리
화일 디렉터리
화일 관리 시스템은 화일 디렉터리를 이용하여 시스템의 모든 화일을 관리
화일의 이름, 저장 위치, 화일 크기, 화일 타입 등 정보를 화일 디렉터리에 저장 관리
화일 저장장치를 연결시켜줌
화일 디렉터리의 구조
- 심볼 테이블 유지 : 모든 화일에 지정된 심볼 이름 탐색 지원
- 서브 디렉터리도 포함 : 다른 장치에 저장된 화일
- 한 레벨이나 여러 레벨의 계층 구조로 구성 : (Ex. UNIX 계층 디렉터리) 화일 식별을 위해 경로 이름을 사용 (/mydir/addr)
계층 구조
- 루트 디렉터리 : 파일 디렉터리 구조의 최상위 디렉터리 (‘/’로 표현)
- 하위 디렉터리 : 루트 디렉터리 아래에 있는 디렉터리, 또 다른 하위 디렉터리를 가질 수 있음
- 파일 : 디렉터리에 저장된 모든 파일
디렉터리를 이용한 기본적인 연산
- 탐색 : 특정 이름의 화일을 찾기 위해 디렉터리 탐색
- 화일 생성 : 화일을 디렉터리에 첨가, 디렉터리 엔트리에 첨가
- 화일 삭제 : 디렉터리로부터 화일 삭제
- 리스트 디렉터리 : 디렉터리 내용과 화일에 대한 디렉터리 엔트리의 값을 표시
- 백업 : 신뢰도를 위해서 백업 화일을 생성
입출력 장치 제어
입출력 작업
메인 메모리와 보조 저장장치 또는 라인 프린터와 같은 입출력 장치 사이의 데이터를 물리적으로 전송하는 것
데이터의 판독/기록 작업 과정
- 원하는 화일의 위치를 탐색 (화일 디렉터리를 이용)
- 메인 메모리와 입출력 장치 사이의 경로 설정
- 경로 상의 요소들을 사용할 수 있는지 검사
- 입출력 장치에 I/O 연산 신호를 보낸다.
신호를 받은 장치
- 장치를 준비
- I/O 작업 중 발생하는 오류에 대처
- I/O 연산 뒤에 I/O 요청 장치에 작업 성공 여부 보고
입출력 채널(I/O Channel)
CPU 명령(채널 프로그램)으로 작동하는 입출력 처리기 (I/O Processor)
채널 프로그램을 실행함으로써 I/O 장치를 제어하는 일종의 컴퓨터
장치 제어기를 통해 I/O 장치를 간접적으로 운영
CPU는 제어 명령어로 I/O 채널과 통신
- 입출력 검사(test I/O) : 지정된 경로까지 사용 가능을 검사
- 입출력 개시(start I/O) : 입출력을 시작
- 입출력 중지(halt I/O) : 입출력을 중지
작업이 완료되면 인터럽트(interrupt)를 통해 CPU에 통보
인터럽트는 불법적인 CPU 명령과 같은 오류 검출 시 or I/O 작업 완료시 발생
인터럽트가 발생하면 OS는 인터럽트 처리 루틴으로 제어를 전달
-> 인터럽트 발생 원인을 찾고 조치 후 원래의 루틴으로 제어 반환
화일의 입출력
화일 기록 연산
프로그램의 write 연산은 운영체제를 호출해서 수행 (프로그램은 논리적 기록 / OS는 물리적 기록)
화일 관리자
OS 중, 화일과 관련된 작업 + 입출력 장치를 취급하는 프로그램
프로그램의 데이터 레코드를 디스크 화일에 전송해서 저장하는데 필요한 모든 프로시저(Procedure)로 구성
- 프로그램이 화일 F에 레코드 r을 기록하도록 운영체제에 요구 (프로그램의 write)
- 운영체제는 이 작업을 화일 관리자에게 지시
- 화일 관리자는 F의 개방 여부, 접근 허용 여부, 논리 화일 이름 F에 해당하는 물리적 화일은 무엇인지 검사
- 화일 관리자는 r을 기록할 블록의 물리적 위치를 탐색 (화일 할당 테이블(file allocation table) 이용)
- 화일 관리자는 이 블록이 메인 메모리 I/O 버퍼에 있는지 확인 후 r을 버퍼에 기록
- 화일 관리자는 I/O 채널에 메인 메모리 어디에 이 블록이 저장되어 있고 디스크 어디에 전송/기록되어야 하는지 지시
- I/O 채널은 디스크 드라이브의 수신 가능 상태를 검사, 그리고 데이터를 적절한 형식으로 변환
- I/O 채널은 데이터를 디스크 제어기에 전송
- 디스크 제어기는 판독/기록 헤드를 적절한 트랙으로 이동하게 지시, 블록을 디스크 섹터에 기록하게 한 비트씩 전송
화일 할당 테이블(화일의 디스크 할당 정보를 가짐)을 이용하여 화일의 어디에 레코드를 기록할 것인지 결정
I/O 버퍼
화일 관리자는 메인 메모리에 디스크의 블록 판독을 위해 시스템 I/O 버퍼를 확보 (레코드나 블록의 크기로 판독/기록 가능)
I/O 채널
I/O 처리 전담 장치. 화일 관리자로부터 채널 프로그램을 전달 받아 작업 / CPU와 독립적으로 운영
디스크 제어기
디스크를 실제로 운영하며 I/O 채널의 요청으로 디스크 드라이브에 기록이 가능한지 점검
디스크 드라이브를 배정하고 한 비트씩 전송, 기록 연산이 끝나면 I/O 채널을 통해 CPU에 제어를 반환
-> 원래 프로그램 실행
화일 판독 연산
- 프로그램이 read 명령을 만나면 화일 관리자에게 인터럽트를 발생
- 화일 관리자는 메인 메모리에 채널 프로그램을 구성하고 I/O 채널을 지정
- I/O 채널이 지정되면 해당 채널은 채널 프로그램을 실행
- I/O 채널은 디스크 제어기에 적절한 신호 전달
- 디스크 제어기는 신호를 해석 후 요청한 데이터를 판독할 디스크 드라이브를 제어
- 디스크 드라이브는 요구한 데이터를 경로를 통해 메인 메모리의 I/O 버퍼로 전송
- I/O 채널은 인터럽트를 걸어 입출력 연산 완료를 알리고, 다시 원래 프로그램을 실행하도록 OS에 신호를 보냄
- 화일 관리자는 제어를 원래 프로그램으로 반환하여 실행을 계속 시킨다.
채널 명령어
I/O 채널은 프로그램을 실행함으로써 데이터의 교류를 지시
데이터를 전송할 때, CPU는 채널 프로그램의 실행을 I/O 채널에 지시
비정상적인 상황이 발생하면 I/O 채널은 인터럽트를 발생시켜서 CPU에 도움을 요청
채널 프로그램은 느린 I/O 장치의 처리 속도와 채널 수행 속도를 맞추기 위해 wait loop을 포함한다.
디스크에 대한 채널 프로그램 구성 명령어
- Search : 요청한 데이터를 디스크에서 탐색
- Read : 레코드를 판독해서 메인 메모리 버퍼로 전송
- Write : 메인 메모리 버퍼에서 디스크의 지정된 위치로 데이터를 전송
- Wait : 앞의 연산이 끝날 때까지 다음 Read/Write 명령어 실행을 지연
출력 연산 수행 단계
- 데이터 전송을 위한 장치, I/O 채널, 디스크 제어기를 선정
- CPU가 채널 프로그램을 시작
- I/O 채널은 메모리에 있는 데이터를 요청하고 디스크 제어기로 데이터가 전송되도록 제어
- 디스크 제어기는 디스크 드라이브에 적합한 형식으로 데이터를 코딩하여 전송
- 디스크 드라이브는 디스크 제어기의 지시에 따라 데이터를 기록
장치 제어기의 기능
채널 명령어를 그 장치에 적합한 연산으로 번역해서 실행을 지시
I/O 채널이나 화일 관리자에게 상태 정보를 제공 (장치 준비 여부, 데이터 전송 완료 등)
호스트 컴퓨터와 장치 사이의 데이터를 변환 (호스트 : 비트들의 병렬 전송 / I/O 장치 : 비트들을 직렬 전송)
데이터 전송을 할 때, 에러 검사와 교정 : Parity bit의 제거와 복원 / 에러 교정을 위한 코드 추가, 제거 (CC, CRC, ECC)
화일의 개방
open문 또는 첫 번째 read/write문과 연계하여 수행
- 오퍼레이터에게 테이프 릴이나 디스크 등의 준비를 요구
- 필요한 채널 프로그램의 골격을 구성
- 레이블을 검사하여 화일이 입력을 위한 것인지, 출력을 위한 것인지 확인
- 화일을 접근하려는 사용자의 권한 검사
- 화일을 위한 버퍼 구역 구성
- 입력 화일에 대해 예상 버퍼링이 효과적이면, 첫 번째 버퍼를 채움
- 시스템의 화일 디렉터리에 화일 제어 정보를 기록
화일의 폐쇄
close문 또는 프로그램 종료 시 자동으로 수행
종료뿐 아니라 다음에 다른 프로그램이 이 화일을 사용할 수 있게 준비
- 출력 버퍼 구역을 비움
- 버퍼와 채널 프로그램이 차지했던 메모리 구역을 반환
- 출력 화일의 화일 끝 표시(end-of-file mark)와 꼬리(tailer) 레이블을 기록
- 저장 매체를 정리 (rewind, dismount 등)
버퍼 관리
버퍼
디스크 화일에서 데이터를 읽어 들이는 메인 메모리의 일정 구역
버퍼 관리의 목적
CPU와 보조 저장장치의 성능과 활용을 최대화
버퍼 관리자
- 제한된 메인 메모리의 버퍼 공간을 최적으로 분배
- 응용 프로그램의 요구에 따라 버퍼 공간 할당
- 할당된 버퍼 중 사용하지 않는 버퍼 공간을 관리
- 버퍼 요구량이 할당 공간을 초과 시, 응용 프로그램 지연, 우선순위(or 사용도)가 낮은 프로그램에 할당된 버퍼 공간 회수
메인 메모리를 할당할 때 일어나는 단편(fragment)를 최소화 하기 위해서는 화일 관리 시스템이 사용하는 버퍼의 크기와 OS가 버퍼에 사용하는 페이지의 크기를 동일하게 함
단순 버퍼 시스템
단순 버퍼 : 하나의 화일에 하나의 버퍼만 할당
응용 프로그램의 데이터 요구 시 버퍼로 데이터 블록을 읽어 들임
블록에 하나의 레코드만 저장된다고 가정
버퍼를 채우는 채널 프로그램 구조
- 프로그램의 read 명령이 있을 때까지 대기
- read 명령이 내려지면 디스크 제어기에 I/O 시작 명령을 내림
- 응용 프로그램은 버퍼가 채워질 때까지 대기
- 버퍼가 채워지면 인터럽트를 걸어 프로그램이 버퍼로부터 데이터를 읽게 함
예상 버퍼링
버퍼가 채워질 때까지 CPU가 유휴 상태가 되는 문제 발생
화일 관리자가 프로그램이 필요로 할 것으로 예상되는 데이터로 미리 버퍼를 가득 채워 놓음
그러면 CPU는 버퍼가 채워질 때까지 기다릴 필요 없음 / 버퍼가 채워졌는지 표시하는 플래그(full-flag) 사용
- 버퍼를 채우고 비우는 채널 프로그램은 생산자 - 소비자 루틴 쌍으로 구성됨
- 입력 화일 (생산자 I/O 채널 / 소비자 CPU(응용 프로그램)) , 출력 화일 (생산자 CPU / 소비자 I/O 채널)
초기에 full_flag=0으로 하고 I/O 채널이 버퍼를 채우기 시작
n개의 레코드가 하나의 블록인 경우, 매 n번째 read 명령에만 디스크를 접근하여 물리적 판독/기록을 하면 된다.
디블로킹 : n개의 레코드는 다시 한 레코드씩 응용 프로그램의 작업 구역으로 이동해서 처리되는 것
초기에 full_flag=0으로 하고 I/O 채널이 버퍼를 채우기 시작
이중 버퍼 시스템
화일당 두 개의 버퍼를 할당하여 운영
소비자가 하나의 버퍼를 비우는 동안 생산자는 다른 버퍼를 채움
생산 연산과 소비 연산이 순환, 반복되면서 병행적으로 수행
Unix 에서의 입출력
Unix에서는 화일을 단순히 일련의 바이트로 가정
디스크 화일, 키보드 등 물리적 장치도 모두 화일로 취급
하나의 Unix 화일은 하나의 정수(integer)로 표현되는 화일 기술자로 표현
화일 기술자 (file descriptor)
정수로 모든 화일을 표현. 화일 세부 정보를 저장하고 있는 배열의 인덱스 역할
- 키보드(표준 입력 화일, stdin) : 0
- 출력 화면(표준 출력 화일, stdout) : 1
- 에러를 출력하는 표준 에러 화일(stderr) : 2
- 사용자가 개방한 화일 : 3부터 부여
프로세스
실행하고 있는 프로그램
Unix의 최상위 I/O 계층의 구성요소로써 화일을 논리적으로 취급
Shell 루틴, 라이브러리 루틴, 사용자 프로그램 등이 포함된다.
-> Shell은 사용자와 Unix 사이의 인터페이스를 제공하는 command interpreter
커널(kernel)
프로세스 계층 이하의 모든 하부 계층을 통합
모든 I/O를 바이트 순열 위에서의 연산으로 취급 (즉, 최상위 계층의 논리적 관점과 무관하다.)
Unix 화일 I/O
응용 프로그램이 화일에 하나의 문자를 기록하라는 명령문 write(fd, &ch, 1)를 실행하면 커널이 바로 기동된다.
프로세스가 커널과 직접 통신하도록 하는 루틴이 시스템 호출 인터페이스(system call interface)이다.
커널 I/O 시스템은 화일 기술자(이름)를 화일 시스템에 있는 화일이나 장치에 연결하는 것으로 시작한다.
이때 4개의 테이블을 이용한다.
예시 : 화일 기술자 값이 3인 화일 레코드 판독 명령
- 프로그램의 화일 기술자 테이블에서 개방 화일 테이블을 이용, 개방 화일 테이블의 해당 엔트리를 검색
- 개방 화일 테이블에서 inode 테이블 포인터를 이용, inode 테이블의 해당 엔트리(inode)를 검색
- inode 테이블에서 해당 화일의 데이터가 저장된 디스크 블록의 주소를 얻어 디스크에서 데이터 블록을 판독
화일 이름과 디스크 화일의 연결
디렉터리 구조
- 화일 이름과 디스크에 저장되어 있는 그 화일의 inode에 대한 포인터로 구성
- inode에 대한 포인터는 그 화일 이름으로부터 그 화일에 대한 모든 정보에 대한 직접 참조를 제공
- 화일이 개방되면 그의 inode를 메모리(inode 테이블)로 가져오고 개방 화일 테이블에 해당 엔트리를 추가
'File Processing [FP]' 카테고리의 다른 글
[FP] 06. 인덱스 구조 (2) | 2024.01.23 |
---|---|
[FP] 05. 화일의 정렬/합병 (0) | 2024.01.22 |
[FP] 04. 순차 화일 (1) | 2024.01.22 |
[FP] 02. 화일 저장장치 (0) | 2024.01.19 |
[FP] 01. 화일의 기본 개념 (0) | 2024.01.19 |