본문으로 바로가기

2021.03.24 - [전체글] - 화일 처리및 응용 공부#8 (화일 입출력 제어)

이전 내용이다.

버퍼 관리

버퍼(Buffer):

 - 디스크 화일에서 데이터를 읽어 들이는 메인 메모리의 일정 구역

 - 버퍼 관리의 목적 (CPU와 보조 저장장치의 성능과 활용을 최대화)

(데이터를 사용하는 동안 일시적으로 데이터를 보관하는 메인메모리에 일정구역이다.)

 

버퍼 관리자

  • 제한된 메인 메모리의 버퍼공간을 최적으로 분배
  • 응용 프로그램의 요구에 따라 버퍼공간 할당
  • 할당된 버퍼 중에서 사용하지 않는 버퍼 공간을 관리
  • 버퍼 요구량이 할당가능치를 초과 할 경우
    • 응용프로그램을 지연
    • 우선순위가 낮은 프로그램에 할당된 버퍼공간을 회수

 

단순 버퍼 시스템(가정)

단순 버퍼

 - 하나의 화일에 하나의 버퍼만 할당

 - 응용 프로그램의 데이터 요구 시 버퍼로 데이터 블록을 읽어들인다

 - 블록에 하나의 레코드가 저장된다고 가정

 

버퍼의 논리적 구조

 

버퍼를 채우는 I/O 채널 명령문(채널프로그램) 구조

 

  1. 프로그램의 READ 명령이 있을때 대기
  2. READ 명령이 내려지면 디스크 제어기에 I/O 시작 명령 지시
  3. 응용 프로그램은 버퍼가 채워질때까지 대기
  4. 버퍼가 채워지면 인터럽트를 걸어 응용프로그램이 버퍼로 부터 데이터를 읽도록 한다.

예상버퍼링

 - 단순버퍼 시스템은 버퍼가 채워질 때까지 CPU가 유휴 상태로 되는 문제가 발생함

 - 화일 관리자가 프로그램이 필요로 할것으로 예상 되는 데이터로 버퍼를 미리 채워 놓는것

 - 버퍼가 채워졌는지를 표시하는 플래그(full_flag)를 사용

 - 예상 버퍼링을 위한 버퍼구조

 

버퍼가 채워져 있는지 여부 판단

버퍼링을 위한 채널프로그램

버퍼를 채우고 비우는 채널 프로그램은 생산자와 소비자 루틴 쌍으로 구성됨

 

입력파일(보조기억창지 -> 버퍼) 에 대해

 - 생산자는 I/O채널

 - 소비자는 CPU

 

출력파일(버퍼 -> 보조기억장치) 에 대해

 - 생산자는 CPU

 - 소비자는 I/O 채널

 

 

생산자 루틴(유사코드)

loop: if(to_fill.full_flag = 1) goto loop;
	issue start –I/O command to disk-controller;
	wait while to_fill.buffer is being filled;
	full_flag = 1;
	goto_loop;

 

소비자 루틴(유사코드)

wait: if(to_empty.full_flag = 0) goto wait; //버퍼가 공백이면 대기
	read record into work area; 
	// 버퍼에 있는 레코드 작업구역으로 이동
	full_flag=0;
	goto wait;

 

 

 


느낀점 : 버퍼(Buffer)의 관련된 내용을 세심히 보아야 겠다.
예상버퍼, 루틴, 이중버퍼, 버퍼 소비자,생산자 뭐 그런 내용등등을 알아보자