File
file이란 이름을 가지고 저장하는 정보이다.
일반적으로 비휘발성의 보조기억장치에 저장한다.
운영체제는 다양한 저장 장치를 file이라는 동일한 논리적 단위로 볼 수 있게 해준다.
연산의 종류: create, read, write, reposition, delete, open, close 등이 있다.
File attribute(파일의 metadata)
파일 자체의 내용이 아니라 파일을 관리하기 위한 각종 정보들을 의미한다.
파일 이름, 유형, 저장된 위치, 파일 사이즈, 접근 권한, 시간, 소유자 등이 포함될 수 있다.
File system
운영체제에서 파일을 관리하는 부분이다.
파일 및 파일의 메타데이터, 디렉토리 정보 등을 관리한다.
파일의 저장 방법을 결정하고, 파일을 보호한다.
Directory
파일의 메타데이터 중 일부를 보관하고 있는 일종의 특별한 파일이다.
그 디렉토리에 속한 파일 이름 및 파일 attribute등이 있다.
Partition(= Logical Disk)
하나의 물리적인 디스크 안에 여러 파티션을 두는게 일반적이다.
여러 개의 물리적인 디스크를 하나의 파티션으로 구성하기도 한다.
물리적인 디스크를 파티션으로 구성한 뒤 각각의 파티션에 file system을 깔거나 swapping 등 다른 용도로 사용할 수 있다.
open()
open()은 디스크로부터 파일 c의 메타데이터를 메모리로 가지고 온다.
예를들어 open('/a/b/c')를 실행하면 아래와 같은 절차로 디렉토리 경로를 검색한다.
- 루트 디렉토리 '/'를 open하고 그 안에서 파일 'a'의 위치를 획득한다.
- 파일 'a'를 open하고 read해서 그 안에서 파일 'b'의 위치를 획득한다.
- 파일 'b'를 open하고 read해서 그 안에서 파일 'c'의 위치를 획득한다.
- 파일 'c'를 open한다.
디렉토리 경로의 검색에 너무 많은 시간이 소요된다. 그래서 Open을 read/ write와 별도로 둔다. 한번 open한 파일은 read/write시 디렉토리 검색이 필요가 없어진다.
File protection
각 파일에 대해 누구에게 어떤 유형의 접근(read/write/execution)을 허락할 것인지를 정해둔다.
Access control의 방법
Access control Matrix
- Access control list는 파일별로 누구에게 어떤 접근 권한이 있는지 표시한다.
- Capability는 사용자 별로 자신이 접근 권한을 가진 파일 및 해당 권한을 표시한다.
- 오버헤드가 너무 크다
Grouping
- 일반적인 운영체제에서 사용되는 방법이다.
- 전체 user를 owner, group, public 세 그룹으로 구분한다.
- 각 파일에 대해 세 그룹의 접근 권한(rwx)를 3비트씩으로 표시한다.
- 대표적인 예로 UNIX가 있다.
Password
- 파일마다 password를 두는 방법이다. (디렉토리 파일에 두는 방법도 가능하다)
- 모든 접근 권한에 대해서 하나의 password를 둔다.
- 암기해야하는 문제와 관리해야하는 문제가 생길수 있다.
Access 방식
시스템이 제공하는 파일 정보의 접근 방식이다.
순차 접근
- 카세트 테이프를 사용하는 방식처럼 접근한다.
- 읽거나 쓰면 offset은 자동적으로 증가한다.
직접 접근
- LP 레코드 판과 같이 접근하도록 한다.
- 파일을 구성하는 레코드를 임의의 순서로 접근할 수 있다.
Disk에서 파일 데이터를 할당하는 방법
연속할당(Contiguous Allocation)
하나의 파일이 디스크 상에 연속해서 저장되는 방법이다.
장점은 다음과 같다.
- 빠른 I/O가 가능하다.
- 한번의 seek만으로 많은 양의 데이터를 받아올 수 있다.
- 직접 접근이 가능하다.
단점은 다음과 같다.
- 외부 조각이 생길 수 있다. -> 각각의 파일의 크기가 균일하지 않기 때문이다.
- 파일의 크기가 커질수 있는것에 제약이 걸린다.
Linked Allocation
파일의 데이터를 연속적으로 배치하지 않고 메모리의 빈 공간에 아무곳에 linkedList 식으로 넣어놓는 방식이다.
장점은 외부 조각이 발생하지 않는다.
단점은 다음과 같다.
- 직접 접근이 되지 않는다.
- Reliability 문제가 있다. 한 섹터가 배드섹터가되거나 고장나서 pointer가 유실되면 많은 부분을 잃을 수 있다.
- Pointer를 위한 공간이 block의 일부가 되어 효율성을 떨어뜨린다.
Indexed Allocation
실제 파일의 위치를 Index 블럭 안에 적어놓는 방식이다.
장점은 외부 조각이 발생하지 않으며 직접 접근이 가능하다.
단점은 작은 파일의 경우에도 공간이 낭비되며, 너무 큰 파일인 경우는 하나의 블록으로 index를 저장하기에 부족하다는 점이 있다.
UNIX의 파일시스템 구조
여기서 설명하는 파일시스템이 구조는 가장 기본적인 구조이다. 많은 파일시스템들이 이런 기본적인 구조를 효율적으로 발전시킨 방식이다.
Linked Allocation방식을 거의 그대로 사용하고 있다.
Boot block: 부팅에 필요한 정보(bootstrap loader)를 가지고 있다. 어떤 파일 시스템이던 가장 먼저 나온다.
Super block: 파일 시스템에 관한 총체적인 정보를 담고 있다.
Inode: 파일 이름을 제외한 파일의 모든 메타 데이터를 저장한다. 파일 하나당 Inode 하나가 할당된다. 소유주, 접근권한등을 가지고 있다.
Data block: 파일의 실제 내용을 보관한다.
FAT 파일시스템
위치정보만 FAT이 가지고 있고 나머지 메타데이터는 디렉토리가 가지고 있다.
Linked Allocation의 단점을 거의 해결한다.
Free-space management
비어있는 블럭들에 대한 관리 방법이다.
Bit map or bit vector
- 각각의 블록에 bit를 두어서 0과 1로 비어있는지를 확인한다. (0이면 비어있고, 1이면 비어있지 않은 상태)
- bit map은 부가적인 공간을 필요로하며(블록당 1bit씩 필요하기 떄문), 연속적인 n개의 비어있는 블록을 찾는데 효과적이다.
Linked list
- 모든 비어있는 블록들을 링크로 연결한다.
- 공간의 낭비가 없다. 하지만 연속적인 가용공간을 찾는게 쉽지 않다.
Grouping
- linked list의 방법을 변형한 방법이다.
- 첫번째 비어있는 블록이 n개의 포인터를 가진다. n-1 포인터는 비어있는 블록을 가리킨다. 마지막 포인터가 가리키는 블록은 또 다시 n 포인터를 가진다.
Counting
- 프로그램들이 종종 여러개의 연속적인 블록을 할당하고 반납하는 성질에서 착안했다.
- 첫 빈블록에서 몇개가 연속적으로 비어있다는 정보를 나타낸다.
Directory Implementation
Linear list
- <파일 이름, 파일의 메타데이터>의 리스트이다.
- 구현이 간단하다. 디렉토리 내에 파일이 있는지 찾기 위해서는 linear search가 필요하다.
Hash Table
- linear list와 더불어 해싱을 한다.
- hash table은 파일 이름을 이 파일의 linear list의 위치로 바꾸어 준다.
- search time을 없앤다.
- 충돌이 날 수 있다.
file의 메타데이터의 보관 위치
- 디렉토리 내에 직접 보관하는 방법
- 디렉토리에는 포인터를 두고 다른곳에 보관하는 방법 (inode, FAT 등)
긴 파일 이름의 지원
- linear list의 list에서 각 entry는 일반적으로 고정 크기이다.
- 파일이름이 고정 크기의 entry 길이보다 길어지는 경우 entry의 마지막 부분에 이름이 뒷부분이 위치한 곳의 포인터를 두는 방법
- 이름의 나머지 부분은 동일한 디렉토리 파일에 일부의 존재하는 방법
VFS, NFS
VFS(Virtual File System): 서로 다른 파일 시스템에 대해서 동일한 시스템 콜 인터페이스를 통해 접근할 수 있게 해주는 OS의 레이어이다.
NFS(Network File System): 분산 시스템에서는 네트워크를 통해 파일이 공유될 수 있다. NFS는 분산 환경에서의 대표적인 파일 공유 방법이다.
Page Cache, Buffer Cache
Page Cache
- 가상 메모리의 paging 시스템에서 사용하는 page frame을 캐싱의 관점에서 설명하는 용어이다.
- memory-mapped I/O를 쓰는 경우 file의 I/O에서도 page 캐시를 사용한다.
memory-mapped I/O
- 파일의 일부를 가상 메모리에 매핑시킨다.
- 매핑시킨 영역에 대한 메모리 접근 연산은 파일 입출력을 수행하게 한다.
Buffer cache
- 파일시스템을 통한 I/O연산은 메모리의 특정 영역인 buffer cache를 사용한다.
- 파일 사용의 locality를 활용한다. 한번 읽어온 block에 대한 후속 요청시 버퍼 캐시에서 즉시 전당한다.
- 모든 프로세스가 공용으로 사용하며 Replacement 알고리즘이 필요하다. (LRU, LFU등)
Unified Buffer cache
- page cache와 buffer cache를 합친방식이다.
'Computer Science > Operating System' 카테고리의 다른 글
[OS] 가상 메모리(swap) 사용 시 CPU 점유율이 폭증하는 이유 (0) | 2023.09.14 |
---|---|
[CS] 운영체제 - 디스크 관리와 스케줄링 (0) | 2022.09.07 |
[CS] 운영체제 - 가상 메모리 (0) | 2022.09.06 |
[CS] 운영체제 - 메모리 관리 (0) | 2022.09.06 |
[CS] 운영체제 - Deadlock (0) | 2022.09.01 |