3. 화일입출력제어 DBLAB, SNU v 입출력제어환경 운영체제 (operating system) 다수사용자를위해컴퓨터의자원을관리하는 S/W 사용자프로그램 논리적관점 운영체제 보조기억장치 물리적관점 DBLAB, SNU 2
운영체제의기능 main memory management process management Job schedle file management 화일조직방법을제공 사용자의 I/O 명령문 ( 예, READ/WRITE) 을지정된저급 I/O 명령어 ( 예, GET/PUT) 로변환 device management 물리적저장장치에대한접근을제공 입출력제어시스템 (I/O control system) 입출력수퍼바이저 (I/O spervisor) 입출력제어환경을제공 사용자와보조저장장치간의 I/O 를제어하여인터페이스를제공 사용자의논리적관점에서의 I/O 를물리적관점으로사상하여입출력투명성 (transparency) 을제공 DBLAB, SNU 3 입출력 (I/O) 제어시스템의기능 1) 화일디렉터리 ( 화일식별, 위치정보 ) 를유지 메인메모리와보조저장장치사이의데이타이동통로 (pathway) 를확립 2) 메인 3) CPU와보조저장장치사이의통신을조정 i) CPU와보조저장장치사이의속도차이를조정 ii) 송신자와수신자사이의데이타전송을제어 4) 입 / 출력으로사용될화일을준비 5) 입 / 출력완료후에화일관리 DBLAB, SNU 4
v 화일디렉터리 화일관리시스템은화일디렉터리를이용하여시스템의모든화일을관리 화일의이름, 저장위치, 화일크기, 화일타입등의정보를화일디렉터리 (file directory) 에저장관리 화일저장장치를연결시켜줌 화일디렉터리의구조 (directory strctre) 심벌테이블 (symbol table) 유지 모든화일에지정된심벌이름탐색지원 서브디렉터리 (sbdirectory) 도포함 다른장치 ( 디스크, 테이프 ) 에저장된화일 한레벨이나여러레벨의계층구조로구성 예 : UNIX의계층디렉터리 (hierarchical directory) 화일식별을위해경로이름 (pathname) 을사용루트에서부터원하는화일에이르는디렉터리를명세 /mydir/addr DBLAB, SNU 5 디렉터리구조의예 계층구조 DBLAB, SNU 6
디렉터리를이용한연산 1) 탐색 (search) 특정이름 (symbolic name) 의화일을찾기위해디렉터리탐색 2) 화일생성 (create file) 화일을디렉터리의엔트리에첨가 3) 화일삭제 (delete file) 디렉터리로부터화일삭제 4) 리스트디렉터리 (list directory) 디렉터리내용과화일에대한디렉터리엔트리의값을표시 5) 백업 (backp) 신뢰도를위해서백업화일을생성 테이프에예비사본 (backp copy) 유지 DBLAB, SNU 7 v 입출력장치제어 입출력작업 메인메모리와보조저장장치또는라인프린터와같은입출력장치사이의데이타를물리적으로전송하는것 데이타의판독 / 기록작업과정 i) 원하는화일의위치탐색 ( 디렉터리 ) ii) 메인메모리와입출력장치사이에경로설정 iii) 경로상의요소들을사용할수있는지검사 iv) 입출력장치에 I/O 연산신호를보냄 신호를받은장치 장치를준비 I/O 작업도중에발생하는오류에대처 I/O 연산뒤에 I/O 요청장치에작업의성공여부를보고 DBLAB, SNU 8
입출력채널 (I/O channel) CPU 명령 ( 채널프로그램 ) 으로작동하는입출력처리기 (I/O processor) 채널프로그램 (channel program) 을실행함으로써 I/O 장치를제어하는일종의컴퓨터 채널프로그램 채널이수행하는프로그램 장치의접근이나데이타경로제어에필요한연산들을명세 OS에는 I/O채널을가동시키는표준루틴이포함되어있음 장치제어기 (device controller) 를통해 I/O 장치를간접적으로운영 입출력연산을위한시스템요소 CPU 메인메모리 채널 장치제어기 장치 1 채널 장치제어기 장치 2 장치 3 장치 n DBLAB, SNU 9 입출력채널 (I/O channel) CPU 는제어명령어로 I/O 채널과통신 i) 입출력검사 (test I/O) : 지정된경로까지사용가능검사 ii) 입출력개시 (start I/O): 입출력을시작 iii) 입출력중지 (halt I/O) : 입출력을중지 작업이완료되면인터럽트 (interrpt) 를통해 CPU에통보 인터럽트는불법적인 CPU 명령과같은오류검출시나 I/O 작업완료시에발생 인터럽트가발생하면 OS는인터럽트처리루틴으로제어를전달, 인터럽트발생원인을규명하고, 적절한조치후원래의루틴으로제어를반환함 DBLAB, SNU 10
v 화일의입출력 (1) 화일기록 (write) 연산 프로그램에서의 write는 OS를호출해서작업을수행함 논리적기록 ( 프로그램 ), 물리적기록 (OS) 가담당 화일관리자 화일에관련된작업과입출력장치를취급하는프로그램 프로그램의데이타레코드를디스크화일에전송해서저장하는데필요한모든프로시저로구성 화일의디스크할당정보를가지고있는화일할당테이블 (FAT: File Allocation Table) 을이용하여화일의어디에레코드를기록할것인가를결정 I/O 버퍼 화일관리자는메인메모리에디스크의블록판독을위해시스템 I/O 버퍼를확보 이 I/O 버퍼에서는레코드나블록크기로판독 / 기록이가능 DBLAB, SNU 11 v 화일의입출력 (2) I/O 채널 I/O 처리전담장치 (I/O 를위한작은 CPU) 화일관리자로부터채널프로그램 (channel program) 을통해작업지시를받고독립적으로운영 Channel program: 데이타버퍼, 데이타양, 저장위치등을지시하기위한 I/O 프로그램 디스크제어기 디스크를실제로운영 I/O 채널의요청으로디스크드라이브가용여부를점검 디스크드라이브를배정하게되면데이타를한비트씩디스크드라이브에전송 기록연산이완료되면 I/O 채널을통해 CPU 에제어를반환하여프로그램의실행이계속되도록함 DBLAB, SNU 12
프로그램의 WRITE 연산수행단계 1) 프로그램의 Write : 운영체제에기록연산 ( 화일 F 에레코드 r) 을요청 2) 운영체제 : 화일관리자에게작업지시 3) 화일관리자 : 화일 F 의개방여부, 접근허용여부, 화일 F 의물리적화일검사 4) 화일관리자 : r 에대한블록의물리적위치탐색 ( 화일할당테이블 (FAT) 을이용 ) 5) 화일관리자 : 블록이메인메모리 I/O 버퍼에존재유무확인, 레코드 r 을기록 6) 화일관리자 : I/O 채널에블록위치와디스크기록위치를지시 7) I/O 채널 : 디스크드라이브의수신가능상태를검사하고데이타를변환 8) I/O 채널 : 데이타를디스크제어기에전송 9) 디스크제어기 : 디스크드라이브에헤드를적절한트랙, 블록에위치하도록지시하고한비트씩전송 DBLAB, SNU 13 v 화일입출력 (Read) 프로그램의 READ 연산수행단계 프로그램 버퍼 화일관리자 채널프로그램 채널 디스크제어기 디스크드라이브 DBLAB, SNU 14
프로그램의 READ 연산수행단계 1) 프로그램에서 READ는화일관리자에인터럽트를발생 2) 화일관리자는메인메모리에채널프로그램구성하고 I/O 채널을지정 3) 지정된채널이이채널프로그램을실행 4) I/O 채널은디스크제어기에적절한신호전달 5) 디스크제어기는이신호를해석해서요청한데이타를판독할디스크드라이브를제어 6) 디스크드라이브는데이타를경로를통해메인메모리의 I/O 버퍼로전송 7) I/O 채널은인터럽트를걸어연산완료를보고하고 OS에프로그램실행을재개토록신호 8) 화일관리자는제어를원래의프로그램으로반환하여실행을계속시킴 DBLAB, SNU 15 v 화일의입출력 (3) 채널명령어 I/O 채널은프로그램으로데이타교류를지시 CPU는데이타전송을위해 I/O 채널에채널프로그램실행을지시 I/O 채널은비정상적인상황을처리하기위하여인터럽트발생 채널프로그램과디스크의속도조절을위해 wait loop를활용 디스크에대한채널프로그램구성명령어 Search : 요구하는데이타를디스크에서탐색 Read : 레코드를판독해서메인메모리버퍼로전송 Write : 메인메모리버퍼로부터데이타를디스크로전송 Wait : 앞의연산이끝날때까지다음 read/write 명령어의실행을지연 출력 ( 기록 ) 연산수행단계 1) 데이타전송을위한장치, I/O채널, 디스크제어기를선정 2) CPU가채널프로그램을기동 3) I/O 채널은메모리의데이타를요청하고디스크제어기로데이타가전송되도록제어 4) 디스크제어기는디스크드라이브에적합한형식으로데이타를코딩하여전송 5) 디스크드라이브는데이타기록 DBLAB, SNU 16
장치제어기 (device controller) 의기능 채널명령어 (search, read, write 등 ) 를그장치에적합한연산으로번역해서실행을지시 I/O 채널이나화일관리자에게상태정보를제공 장치준비여부, 데이타전송완료등 호스트컴퓨터와장치사이의데이타변환 호스트컴퓨터 : 비트들의병렬전송 I/O 장치 : 비트들을직렬전송 데이타전송시에러검사와교정 패리티체크 (parity check) 의제거와복원 에러교정을위한코드 CC(cyclic check characters), CRC(cyclic redndancy check charaters), ECC(error correction code) 등의검사, 제거, 복원 DBLAB, SNU 17 화일의개방 (open) OPEN 문이나첫번째 READ 혹은 WRITE 문과연계하여수행 i) 오퍼레이터에게테이프릴이나디스크등의준비를요구 ii) iii) iv) 필요한채널프로그램의골격을구성 레이블을검사하여화일이입력을위한것인지출력을위한것인지확인 화일을접근하는사용자의권한검사 v) 화일을위한버퍼구역을구성 vi) 입력화일에대해예상버퍼링을하는경우라면첫번째버퍼를채움 v) 화일디렉터리에화일제어정보를기록 DBLAB, SNU 18
화일의폐쇄 (close) CLOSE 문이나프로그램종료시자동으로수행 나중에다른프로그램이이화일을다시사용할수있도록준비 i) 출력을위한버퍼구역을비움 ii) 할당된버퍼와채널프로그램이차지했던메모리구역을반환 iii) 출력화일에화일끝표시 (end-of-file mark) 와꼬리 (tailer) 레이블을기록 iv) 저장매체를정리 (rewind, dismont 등 ) DBLAB, SNU 19 v 버퍼관리 버퍼 (bffer) : 디스크화일에서데이타를읽어들이는메인메모리의일정구역 버퍼관리의목적 CPU와보조저장장치의성능과활용을최대화 버퍼관리자 제한된메인메모리의버퍼공간을최적으로분배 응용프로그램의요구에따라버퍼공간할당 할당된버퍼중에서사용하지않는버퍼공간을관리 버퍼요구량이할당가능공간을초과시 응용프로그램을지연 우선순위가낮은 ( 또는사용도가낮은 ) 프로그램에할당된버퍼공간을회수 메모리할당으로일어나는단편 (fragmentation) 의최소화 화일관리시스템이사용하는블록의크기와 OS가버퍼에사용하는페이지의크기를동일하게함 DBLAB, SNU 20
[1] 단순버퍼시스템 단순버퍼 하나의화일에하나의버퍼만할당 응용프로그램의데이타요구시 (on demand) 버퍼로데이타블록을읽어들임 블록에하나의레코드가저장된다고가정 버퍼의논리적구조 버퍼 데이타구역 채널프로그램의시작 ( 주소 ) DBLAB, SNU 21 버퍼를채우는채널프로그램구조 i) 프로그램의 READ 명령이있을때까지대기 ii) READ 명령이내려지면디스크제어기에 I/O 시작명령을지시 iii) 응용프로그램은버퍼가채워질때까지대기 iv) 버퍼가채워지면인터럽트를걸어응용프로그램이버퍼로부터데이타를읽도록함 DBLAB, SNU 22
예상버퍼링 (anticipatory bffering) 버퍼가채워질때까지 CPU( 사용자프로그램 ) 가유휴상태 (idle) 로되는문제가발생 è 대기상태가능성을최소화 화일관리자가프로그램이필요로할것으로예측되는데이타로미리버퍼를가득채워놓음 (prefetching) CPU 는버퍼가채워질때까지기다릴필요가없음 버퍼가채워졌는지를표시하는플래그 (fll-flag) 를사용 예상버퍼링을위한버퍼구조 버퍼 fll_flag 데이타구역 채널프로그램의시작 단, 버퍼가공백이면 fll_flag=0 버퍼가채워있으면 fll_flag=1 <Procedre rotine> loop: if(fll_flag == 1) goto loop; isse start-i/o command to diskcontroller; wait while bffer is being filled; fll_flag = 1; goto loop; DBLAB, SNU 23 버퍼링을위한채널프로그램 버퍼를채우고비우는채널프로그램은생산자 (prodcer) 와소비자 (consmer) 루틴쌍으로구성됨 입력화일에대해 생산자는 I/O 채널 소비자는 CPU( 응용프로그램 ) 출력화일에대해 생산자는 CPU( 응용프로그램 ) 소비자는 I/O 채널 DBLAB, SNU 24
생산자 / 소비자프로그램구조 생산자 (Prodcer) 루틴 loop : if (fll_flag = 1) goto loop; // 버퍼가공백이될때까지대기 isse start-i/o command to disk-controller; // 디스크제어기에 I/O 시작명령을내린다. wait while bffer is being filled; // 버퍼가채워지는동안대기 fll_flag = 1; goto loop; 소비자 (Consmer) 루틴 wait : if (fll_flag = 0) goto wait; // 버퍼가공백이면대기 read bffer into work area; // 버퍼에있는레코드를작업구역으로이동 fll_flag = 0; goto wait; 초기에 fll_flag=0 으로하고 I/O 채널이버퍼를채우기시작 DBLAB, SNU 25 하나의블록에 n 개의레코드 (Bf = n) 디블로킹 (deblocking) n개의레코드는다시한레코드씩응용프로그램의작업구역으로이동해서처리됨 디블로킹을위한포인터로 record_conter를사용 버퍼구조 버퍼 fll_flag 채널프로그램의시작 record_conter 데이타구역 n 개의레코드로된블록 단, 버퍼가공백이면 fll_flag = 0 그렇지않으면 fll_flag = 1 record_conter = 1,, n DBLAB, SNU 26
디블로킹을위한생산자 / 소비자 생산자루틴 loop : if (fll_flag = 1) goto loop; // 버퍼가공백이될때까지대기 isse start-i/o command to disk-controller; // 디스크제어기에 I/O 시작명령을내린다. wait while bffer is being filled; // 버퍼가채워질때까지대기 record_conter = 1; fll_flag = 1; goto loop; 소비자루틴 wait : if (fll_flag = 0) goto wait; read record(record_conter) into work area; // record_conter가지시하는레코드를작업구역으로이동 record_conter = record_conter + 1; if (record_conter > n) fll_flag = 0; //n개의레코드를모두처리해서버퍼가공백이된경우 goto wait; 초기에 fll_flag는 0 으로설정되고 I/O 채널이버퍼를채우기시작 DBLAB, SNU 27 [2] 이중버퍼시스템 (doble bffer system) 화일당두개의버퍼를할당하여운영 소비자가하나의버퍼를비우는동안생산자는다른버퍼를채움 생산연산과소비연산이순환, 반복되면서병행적으로수행 이중버퍼시스템구조 버퍼1 버퍼2 next_bffer) next_bffer next_bffer) next_bffer channel-program channel-program fll_flag record_conter) fll_flag record_conter) 블록데이타구역블록데이타구역 channel_program channel_program fll_flag record_conter) fll_flag record_conter) 블록데이타구역블록데이타구역 채널프로그램의채널시작프로그램의시작 단, 버퍼가비워있거나채워지고있는중이면 fll_flag=0 단, 버퍼가버퍼가비워채워졌거나있거나채워지고비워지고있는있는중이면중이면 fll_flag=0 fll_flag=1 버퍼가 record_conter=1,, 채워졌거나비워지고 n 있는중이면 fll_flag=1 record_conter=1,, n DBLAB, SNU 28
이중버퍼시스템에서의소비자 / 생산자 2 개의포인터를추가로사용 to_fill : 현재채워지고있거나다음에채워야할버퍼에대한포인터 to_pempty : 현재비워지고있거나다음에비워져야할버퍼에대한포인터 생산자는항상 to_fill 이가리키는버퍼를채움 ( 초기에는버퍼 1 을지시 ) 초기에는두버퍼가모두공백 (fll_flag 는모두 0) 생산자 입력화일에대하여채널은생산자가되어다음과같은생산자루틴을실행 항상 to_fill이가리키는버퍼를채움 loop : if (to_fill.fll_flag = 1) goto loop; //to_fill.bffer 가공백이될때까지대기 isse start-i/o command to disk-controller; // 디스크제어기에 I/O 시작명령을내린다. wait while to_fill.bffer is being filled; // to_fill.bffer 가채워질때까지대기 to_fill.rec_ctr = 1; to_fill.fll_flag = 1; to_fill = to_fill.next_bffer; // to _fill 은다음에채워져야할버퍼를지시 goto loop; DBLAB, SNU 29 이중버퍼시스템에서의소비자 / 생산자 소비자 입력화일에대해 CPU( 사용자프로그램 ) 는소비자가되어다음과같은소비자루틴을실행 소비자는항상 to_empty가가리키는버퍼를비움 wait : if (to_empty.fll_flag = 0) goto wait; //to_empty.bffer가채워질때까지대기 read record[to_empty.record_conter] into work area; //to_empty.record_conter가지시하는레코드를 // 작업구역으로이동 to_empty.record_conter = to_empty.record_conter + 1; if (to_empty.record_conter > n) { //n개의레코드를모두처리해서공백이된경우 to_empty.fll_flag = 0; to_empty = to_empty.next; //to_empty는다음에비워야할버퍼를지시 } goto wait. DBLAB, SNU 30
v Unix 에서의입출력 UNIX 에서는화일을단순히일련의바이트 (seqence of bytes) 로가정 디스크화일, 키보드, 콘솔등물리적장치도모두화일로취급 하나의 UNIX 화일은하나의정수 (integer) 로표현되는화일기술자로표현 화일기술자 (file descriptor) 정수로모든화일을표현 (0, 1, 2 등 ) 화일세부정보를저장하고있는배열의인덱스역할 키보드 ( 표준입력화일, stdin) : 0 출력화면 ( 표준출력화일, stdot) : 1 에러를출력하는표준에러화일 (stderr) : 2 사용자가개방한화일 : 정수 3 부터부여 DBLAB, SNU 31 Unix 프로세스와커널 프로세스 (processes) 실행하고있는프로그램 Unix의최상위 I/O계층의구성요소로서화일을논리적으로취급 Shell 루틴, 라이브러리루틴, 사용자프로그램 Shell은사용자와 nix 사이의인터페이스를제공하는 command interpreter 커널 (kernel) 프로세스계층이하의모든하부계층을통합 모든 I/O를바이트순열위에서의연산으로취급 DBLAB, SNU 32
Unix 화일 I/O 디스크화일에하나의문자를기록한다고가정 응용프로그램이화일에하나의문자를기록하라는명령문 write (fd, &ch, 1) 을실행하면시스템호출인터페이스 (system call interface) 를통해커널이즉시기동됨. System call interface: 프로세스가커널과직접통신하도록해주는루틴 커널 I/O 시스템은화일이름을화일시스템의화일과연결시키는것으로작업을시작. 이때 4 개의테이블을이용. DBLAB, SNU 33 Unix I/O를위한테이블 1. 화일기술자테이블 (file descriptor table) 각프로세스가사용하는화일기록테이블 프로세스당하나의화일기술자테이블 2. 개방화일테이블 (open file table) 현재시스템이개방하여사용중인모든화일에대한엔트리로구성 엔트리 : 판독 / 기록형식, 사용프로세스수, 다음판도 / 기록연산을위한화일오프셋, 이화일작업에사용할수있는일반함수들의포인터 Unix 시스템전체에하나 3. 화일할당테이블 (file allocation table) 실제로는인덱스노드 (index node) 구조의일부 화일에할당된디스크블록리스트를포함 4. 인덱스노드테이블 (index node table) 현재사용되고있는화일당하나의엔트리 (inode) 로구성 각엔트리는화일과함께디스크에저장되어있는 inode( index node) 의사본 inode에는화일의저장위치, 크기, 소유자등화일접근에필요한정보가저장 DBLAB, SNU 34
화일기술자테이블과개방화일테이블 화일기술자테이블 ( 프로세스당하나 ) 개방화일테이블 (UNIX 전체에하나 ) 화일기술자 0( 키보드 ) 1( 화면 ) 2( 에러 ) 3( 일반화일 ) 4( 일반화일 ) 개방화일테이블엔트리 R/W 모드 write 화일사용프로세스수 1 다음접근오프셋 100 Write 루틴포인터 inode 테이블엔트리 DBLAB, SNU 35 Inode 테이블구조 inode 테이블 화일할당테이블 소유자 ID 장치그룹이름화일유형접근권한화일접근시간화일참조포인터수화일크기 ( 블록수 ) 블록카운트화일할당테이블 데이타블록번호 0 데이타블록번호 1 데이타블록번호 9 DBLAB, SNU 36
Unix 에서의화일입출력 예 ) 화일기술자값이 3 인화일의레코드판독명령 1) 프로그램의화일기술자테이블에서개방화일테이블을이용, 개방화일테이블의해당엔트리를검색 2) 개방화일테이블에서 inode 테이블포인터를이용, inode 테이블의해당엔트리 (inode) 를검색 3) inode 테이블에서해당화일의데이타가저장된디스크블록의주소를얻어디스크에서데이타블록을판독 DBLAB, SNU 37 화일이름과디스크화일의연결 디렉터리구조 화일이름과디스크에저장되어있는그화일의 inode에대한포인터로구성 Inode에대한포인터는그화일이름으로부터그화일에대한모든정보에대한직접참조를제공 화일이개방되면그의 inode를메모리 (inode 테이블 ) 로가져오고개방화일테이블에해당엔트리를추가 화일이름 inode 포인터 Unix 디렉터리화일 DBLAB, SNU 38