<운영체제> File System 3
본 게시물은 영남대학교 곽종욱 교수님의 강의를 기반으로 작성되었습니다.
Another Per-process File Table : File Descriptor Table(Open File Table)
- 지금까지 process가 어떻게 File의 FCB에 접근하는 방식을 알아보았다. 그러면 이제는 process와 FCB가 어떤 방식으로 연결되어서 process가 file을 사용하는지에 대한 설명이다.
- 파일은 Open하는 두가지 방식 :
- Use a System call : after open(), fd is returned.
- inf fd(file discriptor) : just ordinary number
- 0,1,2 is reserved(표준 입력,표준 출력, 표준 에러)-> 보통 3번부터 리턴
- Use a Library Function Call(각종 Language가 지원하는 함수들)
- After fopen(), file pointer is returned.
- pointer fp is evenetually transferred into fd
- Use a System call : after open(), fd is returned.
- Open File Table :
- An array which resides in struct user in PCB -> PCB의 user-struct에 존재하는 배열이다.
- per process open file info -> process마다 open file table을 개별적으로 가지고 잇다.
- 해당 array에는 open() 시 반환되는 file-discriptor가 저장되어 파일 접근에 대한 시발점이다.
- open() 시스템 콜의 과정 : Pathname을 input으로 받고 나서 kernel이 file을 pathname을 통해서 open하고 file-discriptor가 반환된다.
최종적으로 정리하면 process에서 파일로 접근할때는 1) FileTable 2) InodeTable 3) OpenFileTable 이 사용된다!
<More details about open()- Kernel이 파일을 여는 모든 과정!>
- Kernel system call open() scans pathname(경로명 분석) "/a/b"
- 1st -> root directory file:
- get inode 0 in disk inode space : 0번인 지점 찾아감(루트 디렉토리)
- read data blocks of root directory space
- search for file name "a"
- get corresponding i-number for file "a" -> "a"의 i-number 얻는다
- 2nd -> "a" directory file:
- get inode of "a" from disk -> 7번 찾아감
- get data blocks of directory file "a"
- search for file name "b"
- get corresponding i-number for file "b" -> "b"의 i-number 얻는다
- file "b" :
- read inode of "b" from disk(일반 파일)
- set up kernel data structures for file "b"
a) insert inode into in-core inode table
b) new entry in system file table
c) new entry in u_ofile[] in user
d) return file descriptor
e) open() is done!!
- 1st -> root directory file:
- open("/a/b").. is very slow operation due to several disk accesses(open()은 디스크 상에서 너무 많이 i-node와 datablock사이를 많이 왔다갔다함)
- Pathname이 길수록 더욱 비효율적인 disk내의 접근이 overhead된다
- open() system call은 pathname을 fd로 변환하는 작업이다
- 추가적인 질문 : 왜 파일을 write할때도 open해야하는거야??
-> disk상의 비효율적인 접근연산을 줄이고, file-table을 사용하면 훨씬 효율적인 메모리상의 연산이 가능해서 open()한 상태에서 파일에 대한 동작을 수행한다! - This is the reason why we use open first to use(read or write) file!