File System
File
정보를 저장하기 위해 명명된 디스크에 저장하는 단위
- 이름을 통해 접근
- 비휘발성인 보조기억장치에 저장
- 장치를 관리하기 위해 file이라는 논리적 단위를 사용
- 연산: create, read, write, reposition(lseek), delete, open, close 등
File attriute
파일의 내용이 아닌 파일을 관리하기 위한 정보들 = metadata
- 파일 이름, 유형, 저장 위치, 파일 사이즈, 읽기 권한 등
File System
- 운영체제에서 파일을 관리하는 부분
- 파일 및 파일의 메타데이터, 디렉터리 정보 등을 관리
- 파일의 저장 방법 결정
Directory
파일의 메타데이터 중 일부를 보관하고 있는 특별한 파일
- 해당 디렉토리에 속한 파일 이름 및 파일 메타데이타들
- 연산: (search, create, delte, rename) + file
Partition
- = Logical Disk
- 운영체제가 보는 디스크
- 하나의 (물리) 디스크 안에 여러 파티션을 둠
- 여러 개의 물리 디스크를 하나의 파티션으로 구성하기도 함
- 각 파티션 별로 file system을 사용하거나 다른 용도로 사용할 수 있음
Open()
- 파일의 메타데이터를 메모리에 올리는 것
- 프로세스마다 해당 프로세스에서 오픈한 메타데이터의 포인터를 가짐 = open의 리턴값
File Protection
- 하나의 파일을 여러 프로그램이 같이 사용할 수 있음
- read/write 권한 + 어느 프로그램에 권한이 있나
1) Access control Matrix
- 행렬에 사용자와 파일을 나열해서 각 권한을 기록하는 방법
- 행렬이 sparse matrix가 될 텐데 낭비
- Access control list: 각 파일 별로 누구에게 어떤 권한이 있는지 나열
- Capability: 사용자 별로 권한을 가진 파일 및 권한을 표시
3) Grouping
- Access control Matrix은 오버헤드가 커서 이 방식을 이용
- 각 파일에 대해 세 그룹으로 구분 -
owner, group, public
- 세 그룹의 접근 권한(rwx)을 3비트씩 표시 ex) rwx r-- r--
4) Password
- 파일마다 password를 두는 방법
- 접근 권한 별로 password를 두는 방법 -> 암기와 관리가 어렵
접근 방법
순차 접근
- 카세트 테이프 방식
- 읽거나 쓰면 offset이 증가
- A 이후에 있는 B를 읽으려면 반드시 A를 지나가야 함
직접 접근
- LP 레코드 판 방식
- 파일을 구성하는 레코드의 임의의 순서로 접근 가능
- 직접 접근이 가능한 디스크라도 저장 방식에 따라 불가능할 수도 있음
Allocation of File Data
❗️파일은 block
단위로 저장
1) Contiguous Allocation
하나의 파일을 연속해서 저장
✅ 장점
- 파일을 통째로 읽을 때 빠른 I/O 가능
- 직접 접근(임의 접근) 가능
- swaping area로 사용됨
❎ 단점
- 외부조각이 발생할 수 있음 (비어있지만 파일을 넣을 수 없는 블록)
- 파일이 수정되면서 크기가 변경(grow)될 수 있는데 제약이 존재
- 커짐을 예상해 미리 할당해두면 내부 조각이 됨
2) Linked Allocation
하나의 파일을 여러 위치의 블록으로 저장
각 블록을 찾아가면 다음 블록의 번호를 가짐
✅ 장점
❎ 단점
- 직접 접근 불가 (처음 블록부터 읽어야 다음 블록의 위치를 알 수 있음)
- 순차 접근도 시간이 오래 걸림
- 중간의 pointer가 잘못되면 뒷 부분은 유실됨
- pointer를 저장할 공간이 필요 (4byte 정도)
변형 방법 ➡️ FAT(File Allocaion Table)
3) Indexed Allocation
파일이 가진 블록을 index block에 기록
✅ 장점
❎ 단점
- index block이 따로 필요 (작은 파일의 경우 공간 낭비)
- 큰 파일인 경우 linked index block 또는 multi level index 사용
실제 사용 예시
UNIX 파일 시스템의 구조
- 역사가 오래되었고, 가장 기본적인 파일 시스템 구조
구조
Boot block : 부팅에 필요한 정보 (어떤 파일 시스템이든 부트 블럭이 가장 먼저 나옴)
Super block : 파일 시스템에 관한 총체적인 정보
Inode List : 파일 이름을 제외한 파일의 모든 메타데이터 (디렉터리에 모든 메타데이터가 있진 않음)
Data block : 파일의 실제 내용을 보관 (파일의 이름은 디렉터리가 직접 가지고 있음)
FAT 파일 시스템
Boot block
FAT : 파일의 메타데이터 중 일부를 보관 = 파일의 위치
Root directory
Data block
FAT
- Linked Allocation
- 직접 접근이 가능함
- 파일의 다음 위치를 FAT 테이블에 적어둠 (마지막 파일이면 EOF을 기록)
- 포인터를 별도의 위치에 보관하여 reliability와 공간효율성 문제 해결
Free Space Management
비어있는 블록을 관리하는 방법
1) Bit map or Bit vector
- 블록 별로 사용중인지 bit로 표현
- bit map은 부가적인 공간을 필요로 함
- 연속적인 n개의 빈 블록을 찾는 데 효과적
2) Linked list
- 비어있는 블록을 포인터로 연결
- 다음 비어있는 블록의 포인터를 가짐
- 추가적인 공간 낭비가 없음
- 연속적인 빈 블록을 찾기에 어려움
3) Grouping
- Linked list의 변형
- 첫 번째 빈 블록에 n개의 포인터를 가짐
- 포인터로 연결된 마지막 블럭에는 다시 비어 있는 n개의 포인터를 가짐
4) Counting
- 빈 블록의 첫 번째 위치와 연속적으로 몇 개가 비어있는지 쌍으로 가짐
- 연속적인 빈 블록을 찾기 유용
Directory Implementation
디렉터리 내부에 있는 파일의 메타데이터를 관리
일부는 디렉터리 내부에 직접 가지고 일부는 다른 곳에 보관 ex) inode, FAT 등
1) Linear list
- 파일을 나열해 순차적으로 정보를 저장
- 정보를 저장하는 리스트의 크기를 고정
- 디렉터리 내부 파일을 찾기 위해서는 순차 탐색이 필요
3) Hash Table
- 파일 이름을 해쉬 함수로 저장
- 해쉬 함수를 통해 파일 이름을 특정 범위의 위치로 변경해줌
- 특정 파일을 찾을 때 해쉬 함수로 한 번에 찾을 수 있음
- 서로 다른 파일의 이름이 동일한 인덱스로 반환되는 Collsion이 발생할 수 있음
이름이 긴 파일의 보관 방법
- list에서 각 entry는 일반적으로 고정
- 고정 크기보다 길어지는 경우 entry 마지막에 이름 뒷부분이 위치하는 포인터를 둠
VFS and NFS
❗️ 사용자가 파일에 접근할 때는 시스템 콜을 이용
VFS
Virtual File System
서로 다른 다양한 파일 시스템에 대해 동일한 시스템 콜 인터페이스를 통해 접근할 수 있게 해주는 OS 층
NFS
Network File System
분산 시스템 환경에서 파일을 공유할 수 있는 인터페이스
Page Cache and Buffer Cache
Page Cache
- 페이징 시스템에서 사용하는 page frame을 caching 관점에서 설명
Buffer Cache
- 파일 데이터를 사용자가 요구했을 때 버퍼 캐시에 저장한 후 다음 요청 시 제공하는 방법
- 이미 파일 요구 자체가 시스템 콜을 이용했으므로 운영체제에게 권한이 있어 LRU, LFU 등의 Replacement 알고리즘 사용 가능
Unified Buffer Cache
- 버퍼 캐시와 페이지 캐시를 통합해서 관리하는 방법
- 버퍼 캐시도 페이지 단위로 관리
- 최근 OS에서 사용
Memory-Mapped I/O
- 파일의 일정 부분을 가상 메모리에 맵핑한 후 해당 영역에 대한 메모리 접근 연산은 파일 입출력을 수행