운영체제는 저장장치의 물리적 특성을 추상화하여 논리적 저장 단위, 즉 파일 을 정의한다
사용자의 편의를 위해 파일에 이름을 부여하고, 하나의 문자열로 나타낸다. 시스템에 따라 대소문자를 구분하기도, 안하기도 한다.
운영체제가 파일을 관리하기 위해 사용하는 시스템 콜과 그것들의 조합.
운영체제는 모든 열린 파일에 대한 정보를 갖는 열린 파일 테이블(open file table) 을 유지한다.
시스템 콜 open()은 전형적으로 열린 파일 테이블의 항목에 대한 포인터를 리턴한다.
열린 파일들을 관리하기 위해 필요한 몇 가지 정보들
Boot block
부팅에 필요한 정보 (bootstrap loader)
UNIX 시스템뿐 아니라, 어떤 파일 시스템이라도 가장 먼저 나온다.
Volume control block
파일 시스템에 관한 총체적인 정보를 담고 있다.
어디까지 빈 블록이고 어디부터 실제 사용 중인 블록인지, 혹은 어디까지 inode list가 있고 어디부터 data block이 있는지 등을 관리한다.
Directory structure for a file system
디렉토리 구조를 이용하여 inode를 가져온다.
파일 하나당 inode가 하나씩 할당된다. 이 inode에 파일 이름을 제외한 파일의 모든 메타 데이터가 저장된다.
Per-file FCB
파일의 실제 내용을 보관한다.
UNIX 파일 시스템에서 data block 내의 디렉토리는 메타 데이터 중 하나인 파일의 이름, 그리고 inode 번호만을 가지고 있다.
In-memory mount table
파일 시스템을 사용하려면 무조건 mount를 해줘야 한다.
각 볼륨의 마운트 된 파일시스템의 정보를 가지고 있다.
In-memory directory structure
최근에 접근한 디렉토리 구조를 가지고 있다.
System-wide open-file table
open file table은 시스템 전체에 하나만 있으므로 system-wide open file table이라고 한다.
Per-process open-file table
각 프로세스마다 그 프로세스가 open한 파일들의 메타 데이터 포인터를 가지고 있는 배열이다.
서로 다른 다양한 파일 시스템에 대해 동일한 시스템 콜 인터페이스(API)를 통해 접근할 수 있게 해주는 OS의 계층
하나의 파일이 디스크 상에 연속해서 저장되는 방식
단점
1) 파일들의 길이가 균일하지 않기 때문에 중간의 free block으로 인한 외부 조각 발생
2) 파일 생성 이후에 연속 할당이 가능하지 않은 크기로의 확장 제약 -> 이를 위해 미리 메모리상에서 빈 공간을 확보하는 방법 -> 당장 사용하지 않는 공간으로 인한 공간 낭비(중간에 홀이 생김)
장점
1) 빠른 I/O 가능. 하드 디스크의 파일 I/O => 헤드의 이동. 어떤 파일을 전부 읽고 싶다면 한 번의 seek으로 시작 주소까지 찾아가면 더 이상 seek가 필요 없이 전부 읽어올 수 있다.
2) 파일이 시작 위치로부터 연속적으로 위치하기 때문에, 파일의 특정 위치만 궁금하다면 굳이 시작위치부터 볼 필요 없이 시작 위치 + 해당 위치로 접근해서 데이터 확인 가능(직접 접근 가능)
파일의 데이터를 디스크에 연속적으로 배치하는 대신, 빈 위치 아무데나 들어갈 수 있게 배치하는 방식
단점
1) 해당 주소에 가야만 다음 주소를 알 수 있기 때문에 파일에서 특정 위치(중간에 위치한)의 데이터가 궁금하다면 그 시작 주소부터 하나하나 순차적으로 확인해야 함. 즉, 데이터에 직접 접근 불가능. 건너뛰는 게 불가능. 다음 위치로 이동하는 데 발생하는 헤드의 seek가 많이 발생
2) 하나의 섹터에서 고장이 발생해 pointer가 유실되면 다음 데이터들의 주소 역시 망가지기 때문에 파일의 많은 부분을 유실할 수 있음
3) 크기가 512Byte인 하나의 섹터에서 다음 주소의 포인터를 위해 할당해주는 크기가 4Byte. 여기서 메모리 낭비가 발생할 수 있음.
장점
메모리 공간에서 external fragmentation이 발생하지 않음. 즉, 각기 다른 크기의 파일로 인한 메모리 낭비가 없음
File-allocation table (FAT) 파일 시스템
포인터를 별도의 위치에 보관하여 reliability와 공간 효율성의 문제를 해결한다.
블록 하나에 위치 정보를 저장하는데, 이 블록을 인덱스 블록이라고 한다. 디렉토리는 파일의 위치 정보 대신 인덱스 블록 값을 저장한다.
단점
1) 아무리 작은 크기의 파일이라도 최소 두 개의 블록 필요(실제 메모리상의 블록과, 블록에서 index block).
2) 굉장히 큰 파일의 경우 하나의 index block으로 모든 주소를 표시하기 어려움.
해결방안 1) linked scheme
하나의 index block으로 파일의 모든 주소를 표시할 수 없을 때, index block의 마지막 주소는 메모리상 파일의 데이터 주소가 아니라 또 다른 index block의 주소로 연결.
해결방안 2) multi level index: 하나의 index block의 주소들이 메모리상 파일의 데이터 주소를 나타내는 게 아니라, 또 다른 index block을 가리키게 함.
3) 모두 index block을 위한 공간 낭비가 존재함.
장점
1) 외부 조각이 발생하지 않는다.
2) 직접 접근(임의 접근)이 가능하다.
transaction을 이용하여 atomic하게 처리한다.
원격에 저장된 파일 시스템을 불러올 때 사용. 클라이언트와 서버가 네트워크로 연결되어 있을 때, 클라이언트가 자신의 로컬에 저장된 파일 시스템과 원격에 저장된 파일 시스템에도 접근이 가능하게 만들어준다.
NFS를 통해 RPC(Remote PC)에 연결한 뒤 역시 VFS를 통해서 syscall 사용한다.
클라이언트와 서버 모두 NFS 모듈을 설치해야 한다.