본문 바로가기

프로그래밍/JUNGLE

PintOS Project 4. File System

Project4. File System

1.Indexed and Extensible Files

1번과제는 2가지 목표가 있다. 하나는 FAT을 이용해 File system을 구현하는 것이다.

또, 현재는 파일의 크기가 limit이 있는데 얼마든지 확장할 수 있는 구조를 만들어야 한다.

파일은 의미 있는 정보를 담는 논리적인 단위이다. 이 파일은 메타데이터 (파일의 진짜 정보!)를 가지고, 이름 길이 등등을 가진다. 원하는 파일을 열고 닫고 쓰고 읽기 위해서는 파일에 접근해야한다. 이 방법론에 관한 내용이 핵심이다.

한 섹터는 512 bytes이고 어떤 파일이 총 10개의 섹터가 필요하다고 하자. 10개의 연결된 섹터로 파일을 저장하면 좋겠지만 이럴 경우 외부단편화가 발생하기 쉬워진다. 때문에 우리는 10개의 섹터를 연결되지 않고, (대신 연결 구조는 표시를 해주고!) 섹터 여기저기에 저장을 하기로 하자.

File의 메타데이터를 가지는 정보들이 총 80개가 있다고하자. 이 80개를 모두 연결리스트로 묶어두면, 우리는 79번째 데이터를 읽기위해 비효율적으로 연결리스트를 이동해야한다. 때문에 파일의 위치 (sector 번호)만을 표시해두면 접근하기가 용이하다.
이 위치, 즉 sector 번호를 모아둔것이 FAT이다.

https://www.youtube.com/watch?v=V2Gxqv3bJCk

이렇게, 현재 섹터와 연결된 다음 섹터를 적어둔 table이다!! 이렇게 하면 접근 속도가 훨씬 개선되지만 FAT을 저장하기 위한 공간을 소모한다. (물론 전체 data보다 훨씬 작은 크기이다. 80개의 섹터라면 한개 섹터당 4byte의 크기로 저장할 수 있다)

FAT은 table을 이용해 파일의 sector를 찾아가는 방식이다!
그래서 Fat_chian을 생성/제거하고 fat을 이용해 해당 sector값을 삽입 / 탐색 하는 함수를 구현하면 된다.

 

이제 파일의 크기를 확장하자.
이는 기존 filesys.c와 inode.c에서 이미 구현된 File System을 수정해야한다. file을 write / read  할 때 fat의 chain을 따라가며 file을 탐색할 수 있게한다. 또 File을 확장한다면, 새로운 chain을 추가하고 연장한다.

2. Subdirectories and Soft Links

파일은 폴더(directory)에 담겨있다. 우리도 익숙한 /home/folder/file.abc 의 형태 또한 file system의 일부이다.
운영체제에게 각 directory의 계층 구조를 알려주고 (home 안에 folder 안에 file.abc 파일이야!) 기존에 구현한 syscall (open 등)을 수정하고 새로운 syscall을 구현한다. (구현해야할게 굉장히 많다..)

각 syscall 함수 + inode.c 함수들을 구현할 때 유의할 점은 다음과 같다!
1. parsing하여 인자들을 전달해줘야 한다. (directory 구조가 복잡하므로!!) 파일이 이미 존재하거나, 폴더가 없거나 등등의 예외처리를 해줘야한다.
2. file_open 이후 close를 잘 해줘야한다. (마치 malloc - free 처럼) file_open -> inode_open으로 따라가면 결국 inode의 open_count가 증가하는데, 이 count의 증감을 고려해줘야한다.
3. directory와 file을 구분해서 예외처리를 해줘야한다.


'프로그래밍 > JUNGLE' 카테고리의 다른 글

Project3. Virtual Memory (PintOS)  (0) 2021.10.28
PintOS project2. User Program  (0) 2021.10.14
PintOS project1. Threads  (0) 2021.10.04
[C] 재귀함수를 만드는 Global 변수 vs argument  (0) 2021.09.08
RB Tree 삽입  (0) 2021.09.08