카테고리 없음
12. File Systems
YJH3968
2021. 10. 14. 23:49
728x90
1. File and File System
- File
- A named collection of related information
- 일반적으로 비휘발성의 보조기억장치에 저장
- 운영체제는 다양한 저장 장치를 file이라는 동일한 논리적 단위로 볼 수 있게 해준다.
- Operation : create, delete, read, write, reposition(lseek), open, close
- File attribute(파일의 metadata)
- 파일 자체의 내용이 아니라 파일을 관리하기 위한 각종 정보들
- 파일 이름, 유형, 저장된 위치, 파일 크기, 접근 권한, (생성/변경/사용) 시간, 소유자 등이 있다.
- File system
- 운영체제에서 파일을 관리하는 부분
- 파일 및 파일의 메타데이터, 디렉토리 정보 등을 관리한다.
- 파일의 저장 방법을 결정한다.
- 파일 보호 등
2. Directory
- 파일의 메타데이터 중 일부를 보관하고 있는 일종의 특별한 파일
- 그 디렉토리에 속한 파일 이름 및 파일 attribute들
- operation : 파일 검색, 생성, 삭제, 디렉토리 내 파일 열거, 파일 이름 변경, 파일 시스템 전체 탐색
3. Partition(Logical Disk)
- 하나의 (물리적) 디스크 안에 있는 여러 파티션을 두거나, 여러 개의 물리적인 디스크를 하나의 파티션으로 구성한다.
- (물리적) 디스크를 파티션으로 구성한 뒤 각각의 파티션에 file system을 깔거나 swapping 등 다른 용도로 사용할 수 있다.
4. Open
- 파일의 메타데이터를 메모리로 올리는 연산
- 이를 위해 directory path를 조사한다.
- 예를 들어 "/a/b"를 통해 파일 b의 메타데이터를 가져오고자 하면 루트 디렉토리 "/"를 open해 그 안에서 파일 "a"의 위치를 획득하고, 파일 "a"를 open한 후 read해 그 안에서 파일 "b"의 위치를 획득한다. 그리고 파일 "b"를 open한다.
- directory path 탐색에 너무 많은 시간이 소요되기 때문에 open을 한 번 실행한 파일의 메타데이터는 메인 메모리 내 커널 주소 공간의 open file table에 보관해 그 파일에 대한 read/write 연산 시 directory search를 하지 않아도 되게 한다.
- open file table에는 file의 메타데이터 외에도 open한 프로세스 수와 file offset(파일에 접근 중인 각 프로세스마다 파일의 어느 위치에 접근 중인지를 표시하는 지표로, 별도 테이블이 필요하다)을 추가한다.
- file descriptor : 프로세스 별로 가지고 있는 open file table에 대한 위치 정보로 해당 프로세스의 PCB에 저장한다.
- file 내 데이터를 read하는 경우 메모리에 file 내 데이터가 있는지와는 상관없이 항상 운영체제에게 CPU를 넘겨 운영체제 내 buffer cache에 해당 데이터가 있는지를 확인하고 그 데이터가 있으면 해당 데이터의 복사본을 요청한 프로세스에게 넘겨주고, 그렇지 않으면 디스크에서 데이터를 읽어온다.
- 따라서 운영체제는 모든 file의 데이터의 접근 정보를 알고 있기 때문에 LRU, LFU 알고리즘을 적용할 수 있다.
5. File Protection
- 접근 제어 방법에 따라 Access Control Matrix, Grouping, Password 방식으로 나눌 수 있다.
- Access Control Matrix
- 모든 파일과 모든 사용자에 대한 표를 만들어 각 사용자가 각 파일에 대해 어떠한 접근 권한을 가지고 있는지를 나타내는 행렬
- 모든 사용자가 항상 모든 파일을 접근하는 것은 아니기에 공간 낭비가 심하다는 단점이 있다.
- 이를 보완하기 위해 access control list(각 파일별로 누구에게 어떤 접근 권한이 있는지 표시)나 capability(사용자별로 자신이 접근 권한을 가진 파일 및 해당 권한 표시)를 이용한다.
- Grouping
- 전체 사용자를 owner, group, public의 세 그룹으로 구분한다.
- 각 파일에 대해 세 그룹의 접근 권한(rwx)(read, write, execute)을 3비트씩 표시한다.
- UNIX에서 사용하는 방식이다.
- Password
- 파일(디렉토리)마다 password를 두는 방법
- 모든 접근 권한에 대해 하나의 password : all-or-nothing
- 접근 권한별 password : 암기 문제, 관리 문제가 있다.
6. Mounting
- 한 파일 시스템과 다른 파일 시스템을 연결하기 위해 사용하는 방식
- 루트 디렉토리의 하위 파일에 다른 파일 시스템의 루트 디렉토리를 연결한다.
7. Access Methods
- 시스템이 제공하는 파일 정보의 접근 방식
- 순차 접근
- 어떤 파일을 접근하다가 다른 파일을 접근하고자 하면 목적 파일까지 순차적으로 이동해 접근한다. 카세트 테이프를 사용하는 방식처럼 접근한다고 생각하면 된다.
- 읽거나 쓰면 offset은 자동적으로 증가한다.
- 직접 접근
- 어떤 파일을 접근하다가 다른 파일을 접근하고자 하면 바로 해당 파일로 접근한다. LP 레코드 판과 같이 접근한다고 생각하면 된다.
- 파일을 구성하는 레코드를 임의의 순서로 접근할 수 있다.
8. Contiguous Allocation
- 하나의 file을 연속하는 block의 배열에 할당하는 방식
- 단점
- 메인 메모리처럼 external fragmentation이 발생할 수 있다.
- file의 크기가 커지는 경우 문제가 생길 수 있다. 이를 위해 file의 크기가 커질 것을 대비해 빈 block(hole)을 미리 할당을 해야한다. 이로 인해 internal fragmentation이 발생한다.
- 장점
- 빠른 I/O가 가능하다. 이는 seek time이 rotation latency보다 훨씬 크기 때문이다. 이 때문에 realtime file 용이나 swap area로 사용한다.
- direct access(직접 접근)가 가능하다.
9. Linked Allocation
- 하나의 file을 여러 개의 block들로 나누고 이들을 디스크 내 임의의 공간에 넣는 방식
- 디스크 내 각 block의 pointer는 file 내 다음 block을 가리킨다.
- 장점 : external fragmentation이 발생하지 않는다.
- 단점
- 직접 접근이 불가능하다.
- reliability 문제가 발생할 수 있다. 하나의 sector가 고장나면 pointer가 유실되어 많은 부분을 잃어버린다.
- pointer를 위한 공간이 block의 일부가 되어 공간 효율성을 떨어뜨린다.
10. Indexed Allocation
- file마다 별도의 index block을 추가해 해당 block에는 file 내 각 block이 디스크 내 어느 공간에 있는지를 알려준다.
- 장점
- external fragmentation이 발생하지 않는다.
- 직접 접근이 가능하다.
- 단점
- 작은 file의 경우 공간 낭비가 심하다.
- 너무 큰 file의 경우 하나의 block으로 index를 저장하기에는 부족할 수 있다.
- 해결 방안 : linked scheme(index block 내 마지막 index는 다음 index block의 index를 가리키도록 한다.), multi-level index
11. UNIX 파일 시스템의 구조
- boot block : 부팅에 필요한 정보를 저장하고 있다.
- super block : 파일 시스템에 관한 총체적인 정보를 담고 있다.
- Inode : 파일 이름을 제외한 파일의 모든 메타 데이터를 저장하고 있다.
- data block : 파일의 실제 내용을 보관하고 있다.
12. FAT File System
- Linked Allocation의 reliability 문제를 해결하기 위해 FAT이라는 별도의 공간을 만들었다.
- FAT는 일종의 list로 어떤 block의 index에 대응하는 위치에 다음 block의 index를 저장하고 있다.
13. Free-Space Management
- bit map or bit vector : 각 블록이 사용 중인지 비어 있는지를 bit로 저장한다. 연속적인 가용 공간을 찾기 쉽다.
- linked list : 비어있는 블록을 linked list 형태로 연결해둔다. 연속적인 가용 공간을 찾기 어렵다.
- grouping : 첫 번째 free block이 n-1개의 pointer를 가지는데, n-1개의 pointer는 free data block을, 마지막 pointer는 다시 n개의 pointer를 가진 block을 가리킨다.
- counting : 첫 번째 free block의 index와 연속적인 free block의 개수를 쌍으로 저장한다.
14. Directory Implementation
- linear list
- <file 이름, file의 메타데이터>의 list
- 구현이 간단하지만, 연산을 위해서는 시간이 오래 걸린다.
- hash table
- hashing을 틍해 file 이름을 이 파일의 linear list의 위치로 바꾸어준다.
- 연산 시간을 줄일 수 있다.
- collision이 발생할 수 있다.
- file의 메타데이터의 보관 위치 : 디렉토리 내에 직접 보관, 디렉토리에는 포인터를 두고 다른 곳에 보관
- long file name의 지원
- list에서 각 entry는 일반적으로 고정된 크기를 가진다.
- file name이 고정 크기의 entry 길이보다 길어지는 경우 entry의 마지막 부분에 이름의 뒷부분이 위치한 곳의 포인터를 두는 방법
- 이름의 나머지 부분은 동일한 directory file의 일부에 존재한다.
15. VFS and NFS
- VFS(Virtual File System) : 서로 다른 다양한 file system에 대해 동일한 시스템 콜 인터페이스를 통해 접근할 수 있게 해주는 OS의 layer
- NFS(Network File System) : 분산 시스템에서는 네트워크를 통해 파일이 공유될 수 있는데, NFS는 분산 환경에서의 대표적인 파일 공유 방법이다.
16. Page Cache and Buffer Cache
- page cache : 가상 메모리의 paging system에서 사용하는 page frame을 caching의 관점에서 설명하는 용어
- buffer cache
- 파일 시스템을 통한 I/O 연산은 메모리의 특정 영역인 buffer cache를 사용한다.
- file 사용의 locality를 활용한다. 즉, 한 번 읽어온 block에 대한 후속 요청 시 buffer cache에서 즉시 전달한다.
- 모든 프로세스가 공용으로 사용한다.
- replacement algorithm(LRU, LFU 등)이 필요하다.
- unified buffer cache : 최근의 OS에서는 기존의 buffer cache가 page cache에 통합되었다.
- memory-mapped I/O : file의 일부를 가상 메모리에 mapping시킨다. 매핑시킨 영역에 대한 메모리 접근 연산은 파일의 입출력을 수행하게 한다.
출처 : 운영체제 강의
728x90