3.1 입출력 제어 환경

  • 파일 관리, 장치관리 → 입출력 제어 시스템
  • 기록 연산
    1. 운영 체제 : 화일 관리자에게 작업 지시
    2. 화일 관리자 : 개방 여부, 접근 허용여부, 물리적 화일 검사
    3. 화일 관리자 : 물리적 위치 탐색 ← FAT 테이블
    4. 화일 관리자 : 메인메모리 버퍼 존재 유무 확인, 레코드 기록
    5. 화일 관리자 : 블록 위치와 디스크 기록 위치 지시
    6. 입출력 채널 : 드라이브 수신가능상태 검사 → 데이터 변환
    7. 입출력 채널 : 디스크 제어기에 데이터 전송
    8. 디스크 제어기 : 한 비트씩 적절한 트랙, 블록에 전송
  • 판독 연산
    1. 화일 관리자에 인터럽트 발생
    2. 화일 관리자 : 메인 메모리에 채널 프로그램 구성 + 입출력채널 지정
    3. 입출력 채널 : 채널 프로그램 실행 + 디스크 제어기에 신호 전달
    4. 디스크 제어기 : 드라이브 제어
    5. 디스크 드라이브 : 데이터 경로 통해 메인메모리 버퍼 전송
    6. 입출력 채널 : 인터럽트 걸어서 연산 완료 보고, 재개 신호
    7. 화일 관리자 : 제어를 원래의 프로그램으로 반환

3.2 화일 디렉터리

  • 화일 디렉터리 구조
    1. symbol table 유지 : 가장 기본이 되는 것
    2. 서브 디렉터리 포함 : 다른 장치에 저장된 화일
    3. 한 레벨이나 여러 레벨의 계층 구조로 구성
  • 계층 디렉터리 구조
    1. 루트 디렉터리
    2. 하위 디렉터리
    3. 파일 : 디렉터리에 저장된 모든 파일
  • 디렉터리를 이용한 연산
    1. 탐색(search)
    2. 화일 생성 : 디렉터리 엔트리에 첨가
    3. 화일 삭제
    4. 리스트 디렉터리 : 디렉터리 엔트리 값, 내용 보여주기
    5. 백업 : 신뢰도

3.3 입출력 장치 제어

  • 데이터의 판독/기록 작업 과정

    1. 원하는 화일의 위치 탐색 ← 디렉터리 이용
    2. 메인 메모리와 입출력 장치 사이에 경로 설정
    3. 경로상의 요소들을 사용할 수 있는지 검사
    4. 입출력 장치에 I/O 연산 신호 전송
  • 입출력 채널

    1. CPU 명령(채널 프로그램) 으로 작동하는 입출력 처리기

    2. 장치 제어기를 통해 입출력 장치 간접적 운영

    3. CPU는 제어 명령어로 입출력 채널과 통신

      : 입출력 검사 / 입출력 개시 / 입출력 중지

    4. 작업 완료 시, 인터럽트(scanf 잠시 기다리는 과정)를 통해 CPU에 통보

3.4 화일의 입출력

  • 화일 기록 연산 : 레코드 → 디스크에 있는 화일에 기록 write : OS를 호출해서 작업 수행 (논리적/물리적 기록)
    1. 화일 관리자
      • 화일 관련 작업 + 입출력 장치 취급
      • 화일 할당 테이블(FAT) 이용
    2. 입출력 버퍼
      • 화일 관리자 : 디스크 블록판독을 위해 확보 (메인메모리의 한 부분)
      • 레코드나 블록 크기로 판독/기록
    3. 입출력 채널
      • 입출력 처리 전담 장치
      • 화일 관리자로부터 채널 프로그램을 통해 작업 지시 받고 운영
    4. 디스크 제어기
      • 입출력 채널의 요청으로 디스크 드라이브 가용 여부 점검
  • 기록 연산 수행 단계
    1. 프로그램의 Write : 운영 체제에 기록연산 요청
    2. 운영 체제 : 화일 관리자에게 작업 지시
    3. 화일 관리자 : 화일 F의 개방 여부, 접근 허용 여부, 화일 F의 물리적 화일 검사
    4. 화일 관리자 : 레코드에 대한 블록의 물리적 위치검색 (FAT 이용)
    5. 화일 관리자 : 버퍼에 존재 유무 확인, 레코드 기록
    6. 화일 관리자 : 입출력 채널에 블록 위치, 디스크 기록 위치 지시
    7. 입출력 채널 :: 수신 가능 상태 검사 후 데이터 변환
    8. 입출력 채널 : 디스크 제어기에 전송
    9. 디스크 제어기 : 적절한 트랙, 블록에 위치하도록 지시 후 한 비트씩 전송

  • 화일 판독 연산 수행 단계

    1. 화일 관리자에 인터럽트 발생
    2. 화일 관리자 : 메인 메모리에 채널 프로그램 구성, 입출력 채널 지정
    3. 입출력 채널 : 채널 프로그램 실행
    4. 입출력 채널 : 디스크 제어기에 신호 전달
    5. 디스크 제어기 : 신호 해석 후 요청한 데이터 판독할 드라이브 제어
    6. 디스크 드라이브 : 데이터 경로를 통해 메인 메모리의 입출력 버퍼로 전송
    7. 입출력 채널 : 인터럽트를 걸어 연산 완료 보고 후 재개 신호
    8. 화일 관리자 : 제어를 원래의 프로그램으로 변환

3.5 버퍼관리

  • 입출력을 위한 임시 공간
  • 버퍼 관리 목적 : CPU과 보조 저장장치의 성능과 활용 최대화
  • 버퍼 관리자
    1. 할당된 버퍼 중 사용하지 않는 버퍼 공간 관리

    2. 할당 가능 공간 초과 시

      응용프로그램 지연, 우선순위 낮은 프로그램에 할당된 버퍼 공간 회수

  • 메모리 할당으로 일어나는 단편 최소화
  • 단순 버퍼 시스템
    1. 하나의 화일에 하나의 버퍼만 할당
    2. 블록에 하나의 레코드만 저장
  • 예상 버퍼링
    1. 버퍼가 채워질 때까지 유휴 상태에 있어야 하는 문제 제거

    2. Read 명령 → 대기 상태일 필요X 성능 향상


    3. 예측 결정 틀렸다 → 상당한 오버헤드 발생

    4. 필요로 하는 데이터 예측 또한 오버 헤드

  • 생산자 루틴
    while(1) {
    	if (full_flag == 0) wait;
    	디스크 제어기에 입출력 시작 명령;
    	버퍼가 채워지는 동안 대기;
    	full_flag = 1l
    }
  • 소비자 루틴
    while(1) {
    	if (full_flag == 0) wait;
    	버퍼에 있는 레코드 작업구역으로 이동;
    	full_flag = 0;
    }
  • 디블로킹을 위한 포인터 : record_counter
  • 이중 버퍼 시스템
    1. 화일 당 두 개의 버퍼를 할당하여 운영

      • 소비자가 하나의 버퍼 비우는 동안 생산자는 다른 버퍼 채움
      • 생산연산, 소비연산 순환 반복 → 병행적 수행
    2. 두 개의 포인터 사용

      • to_fill : 채워지고 있거나 다음에 채워야 할 버퍼
      • to_empty : 비워지고 있거나 다음에 비워져야 할 버퍼
    3. 화일 : 생산자 / 소비자

      • 입력 화일 : 입출력 채널 / CPU(응용 프로그램)
      • 출력화일 : CPU(응용 프로그램) / 입출력 채널
    4. 생산자

      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;
      }
    5. 소비자

      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;
      	}
      }

3.6 Unix에서의 입출력

  • 화일 : 일련의 바이트 하나의 Unix 화일 = 하나의 정수로 표현되는 화일 기술자로 표현
  • 화일 기술자
    1. 정수로 모든 화일 표현

    2. 화일 세부 정보 저장하고 있는 배열의 인덱스 역할

      키보드 = 0 / 출력화면 = 1 / 표준 에러 화일 = 2 / 사용자 개방 화일 = 3~

  • 프로세스
    1. 실행하고 있는 프로그램
    2. Unix의 최상위 입출력 계층의 구성요소로서 화일을 논리적으로 취급
  • 커널
    1. 프로세스 계층 이하의 모든 하부 계층을 통합
    2. 모든 입출력을 바이트 순열 위에서의 연산으로 취급
    3. System Call Interface : 프로세스가 커널과 직접 통신하도록 해주는 루틴

  • Unix 입출력을 위한 테이블
    1. 화일 기술자 테이블

      프로세스당 하나의 화일 기술자 테이블

    2. 개방 화일 테이블

      현재 시스템이 개방하여 사용중이 모든 화일에 대한 엔트리

      Unix 시스템 전체에 하나

    3. 화일 할당 테이블

      인덱스 노드(inode) 구조의 일부

    4. 인덱스 노드 테이블

      현재 사용하고 있는 화일 당 하나의 엔트리

      화일과 함께 디스크에 저장된 inode의 사본

  • 디렉터리 구조 : 화일 이름 + inode 포인터
profile
숭실대학교 컴퓨터학부 21

0개의 댓글