데이터의 판독/기록 작업 과정
입출력 채널
CPU 명령(채널 프로그램) 으로 작동하는 입출력 처리기
장치 제어기를 통해 입출력 장치 간접적 운영
CPU는 제어 명령어로 입출력 채널과 통신
: 입출력 검사 / 입출력 개시 / 입출력 중지
작업 완료 시, 인터럽트(scanf 잠시 기다리는 과정)를 통해 CPU에 통보
화일 판독 연산 수행 단계
할당된 버퍼 중 사용하지 않는 버퍼 공간 관리
할당 가능 공간 초과 시
응용프로그램 지연, 우선순위 낮은 프로그램에 할당된 버퍼 공간 회수
버퍼가 채워질 때까지 유휴 상태에 있어야 하는 문제 제거
Read 명령 → 대기 상태일 필요X 성능 향상
예측 결정 틀렸다 → 상당한 오버헤드 발생
필요로 하는 데이터 예측 또한 오버 헤드
while(1) {
if (full_flag == 0) wait;
디스크 제어기에 입출력 시작 명령;
버퍼가 채워지는 동안 대기;
full_flag = 1l
}
while(1) {
if (full_flag == 0) wait;
버퍼에 있는 레코드 작업구역으로 이동;
full_flag = 0;
}
화일 당 두 개의 버퍼를 할당하여 운영
두 개의 포인터 사용
화일 : 생산자 / 소비자
생산자
while(1) {
if (to_fill.full_flag == 0) wait;
디스크 제어기에 입출력 시작 명령;
to_fill.buffer가 채워질 때까지 대기;
to_fill.rec_ctr = 1;
to_fill.full_flag = 1;
to_fill = to_fill.next_buffer;
}
소비자
while(1) {
if (to_empty.full_flag == 0) wait;
작업 구역 <- record[to_empty.rec_ctr];
to_empty.rec_ctr += 1;
if (to_empty.rec_ctr > n) {
to_empty.full_flag = 0;
to_empty = to_empty.next_buffer;
}
}
정수로 모든 화일 표현
화일 세부 정보 저장하고 있는 배열의 인덱스 역할
키보드 = 0 / 출력화면 = 1 / 표준 에러 화일 = 2 / 사용자 개방 화일 = 3~
화일 기술자 테이블
프로세스당 하나의 화일 기술자 테이블
개방 화일 테이블
현재 시스템이 개방하여 사용중이 모든 화일에 대한 엔트리
Unix 시스템 전체에 하나
화일 할당 테이블
인덱스 노드(inode) 구조의 일부
인덱스 노드 테이블
현재 사용하고 있는 화일 당 하나의 엔트리
화일과 함께 디스크에 저장된 inode의 사본