-
File System Structure
파일 시스템은 크게 File Descriptor, Open file table, system file table, inode Table, Device Switch Table로 이루어진다.
1) File Descriptor는 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값을 의미한다. 예를 들어 File Descriptor의 값이 N이면 descript table의 N번째에 사용자의 파일이 있다.
2) Open File Table은 현재 오픈된 파일의 list형태로 표현된 테이블이다. 즉 이 테이블에는 open 된 파일이 모두 들어와 있다. 또한 여기에는 file descriptor가 저장되어있다. (descript table)
3) System File Table에서 파일에 대해 저장하는 정보는 파일에 대한 metadata이다. 이 meta data에는 Offset 정보도 포함되어있고 이 정보들을 통해 Inode Table에 접근한다.
4) Inode Table은 inode를 저장하는 테이블이다. Inode 파일의 유니크한 번호이다. 수많은 파일에 대해 inode를 저장하려면 table이 매우 커지게 되는데 이를 방지하기 위해 inode는 direct방식과 indirect방식을 가진다. Inderct는 중간 entry를 거쳐서 파일을 가리키게 된다. Indirect의 레벨이 깊어질수록 복잡해지기 때문에 중요한 정보는 direct로 가리키게 된다.
5) inode테이블을 통해 devie switch table에 접근할 수 있고 디바이스에 접근하여 IO를 통해 디바이스에서 정보를 받아올 수 있게 된다.
direct inode 및 inderect inode 의 자료구조 관련 System call
A) Open
Open을 파일을 Open하는 시스템 콜이다. Open을 수행하기 위해 내부에서 몇가지 시스템 콜이 더 실행 되는데 이는 namei와 free이다.
Input: file name, Type, File permission
Output: file descriptor
Open의 알고리즘 순서는 다음과 같다.
1) Namei 를 이용하여 파일 이름을 inode로 convert 한다.
2) 그 후 파일이 존재하는지, 혹은 접근 가능한지 검사한다.
3) 다음, inode를 위한 file table entry를 할당하게 된다.
4) 그리고 User file descriptor entry를 할당후, File Table Entry로 포인터를 세팅한다.
5) 모든 작업이 끝나면 File Descriptor를 리턴하게 된다.
B) Create : 파일을 create하는 시스템콜, creat를 수행하기위해 namei, ialloc, free등의 시스템콜이 더 필요하다.
Input : file name, permission settings
Output : file descriptor
Open의 알고리즘 순서는 다음과 같다.
1) namei를 통해 inode를 Get 하게 된다.
2) 만약 해당 하는 파일이 이미 존재한다면 에러를 발생시킨다.
3) 그렇지 않다면 파일 시스템으로부터 ialloc시스템콜을 통해 free inode를 할당 받게 된다. 부모의 디렉토리에 new directory entry를 생성하게 된다.
4) indoe를 위한 file table entry를 할당 하고, 초기화 한다.
5) 만약 작업중에 다른 프로세스가 파일을 만들어 이미 파일을 존재 하게 된다면, free 시스템콜을 통해 모든 block을 free시킨다.
6) 끝으로 inode를 unlock하고 File dscripytor를 반환한다.
C) Read : 파일을 Read하는 시스템콜,
Input : user file descriptor, address of buffer in user process, number of bytes to read
Output : count of bytes copied into user spae
Read의 알고리즘 순서는 다음과 같다.
1) 유저 파일 descriptor로부터 파일 테이블의 entry를 가져온다. 2) 접근 가능한지 체크하고 3) u area에 user address, byte count등의 파라미터를 세팅한다. 4) file table에서 inode를 가져온후 5) 다른 프로세스가 파일에 접근 못하도록 inode를 lock한다. 6) 파일테이블의 포스셋 정보를 바탕으로 byte offset을 설정한다 7) 읽은 count의 숫자가 충족 되지 않았다면 디스크에서 블록단위로 정보를 읽고 시스템 버퍼에 해당 내용을 복사한다. 8) 그리고 버퍼의 내용을 u 영역에 업데이트 하고, 9) read cout를 증가시키게된다. 10) Buffer를 release한다. 읽기 작업이 끝났다면 inode를 unlock하고 11) 파일테이블의 offset을 업데이트한다. 12) 끝으로 읽어들인 바이트의 수를 반환한다.
'Note > 운영체제' 카테고리의 다른 글
리얼타임 스케줄링 (0) 2020.11.27 프로세스 Subsystem (0) 2020.11.27 C 메모리 레이아웃 (0) 2020.11.27 Boot up : 디바이스의 첫 동작 (0) 2020.11.27 운영체제 학습 목차 (0) 2020.11.27