4 min read

<운영체제> File System 3

<운영체제> 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
파일 기술자가 file-discriptor
  • 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가 반환된다.
Overall kernel data structure for file1
Overall kernel data structure for file2

최종적으로 정리하면 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!!
kernel tables after open(/a/b)
  • 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!