[ File System ]
파일은 하드 디스크에 이름을 가지고 저장한다. 메모리는 주소를 통해서 접근하는 장치인 반면 파일은 이름을 통해서 접근한다.
리눅스 같은 운영체제에서는 장치들을 관리하기 위해서 파일이라는 이름을 사용해서 관리하기도 한다.
다양한 저장 장치들을 서로 다른 파일로 관리하고 있으며 이러한 파일을 Device Special File이라고 한다.
일반적으로 우리가 접근하는 파일과는 약간 다른 개념이다.
'이름'을 입력으로 받아 해당 데이터를 리턴해주는 소프트웨어가 바로 파일 시스템이다.
파일 시스템이 하드 디스크에 저장하는 정보는 크게 메타 데이터와 사용자 데이터로 나뉜다.
- 메타 데이터 : 파일의 속성 정보나 데이터 블록 인덱스 정보
- 사용자 데이터 : 사용자가 실제 기록하려고 했던 내용
음악 파일이 있을 때 파일 시스템은 디스크 블록을 할당받아서 기록한다. 나중에 사용자가 해당 음악 파일을 사용하려면 어떻게 해야 할까?
파일 시스템이 데이터를 저장해 둔 디스크 블록 번호를 사용자가 외우고 있다가,
나중에 파일 시스템에게 이 번호의 데이터 블록을 읽어 달라고 요청하는 것은 번거로울 것이다.
사용자는 이름을 통해 추상적인 자원인 '파일'에 접근하고 싶을 것이다.
따라서 파일 시스템은 실제 데이터와 함께 이 데이터를 추상적 자원인 '파일'로 제공해 주기 위한
부가적인 정보(파일 이름, 생성 시간, 실제 데이터 블록을 인덱싱 하기 위한 정보 등)를 기록해 두어야 한다.
이러한 부가적인 정보를 메타 데이터라고 한다.
파일 시스템은 운영체제에서 파일들을 관리하는 것이다. 파일 자체에 대한 관리를 해야 하지만 파일들의 메타데이터도 같이 관리해야 한다.
파일 생성, 삭제, 읽기, 쓰기 등등 파일에 대한 연산들이 있으며, 파일을 읽거나 쓸 때 어느 위치를 가리키는 포인터가 있다.
대게는 파일을 읽으면 파일의 시작 부분부터 읽는데 한 번 읽고 나면 그 파일의 위치를 가리키는 포인터가 그다음 부분을 가리킨다.
우리가 필요에 따라서 현재 포인터가 가리키고 있는 위치가 아니라 다른 부분을 읽거나 쓰고 싶을 경우가 있다.
현재 접근하는 위치를 수정하는 Reposition (lseek)라는 연산이 있다.
✓ File : A named collection of related information
- 일반적으로 비휘발성의 보조기억장치에 저장
- 운영체제는 다양한 저장 장치를 file이라는 동일한 논리적 단위로 볼 수 있게 해 줌
- Operation (Create, read, write, reposition (lseek), delete open close 등
✓ File attribute (혹은 파일의 metadata)
- 파일 자체의 내용이 아니라 파일을 관리하기 위한 각종 정보들
- 파일 이름, 유형, 저장된 위치, 파일 사이즈
- 접근 권한 (읽기/쓰기/실행), 시간 ( 생성/변경/사용), 소유자 등
✓ File system
- 운영체제에서 파일을 관리하는 부분
- 파일 및 파일의 메타데이터, 디렉터리 정보 등을 관리
- 파일의 저장 방법 결정
- 파일 보호 등
[ 디렉터리와 논리 디스크 ]
Directory 파일은 그 Directory 밑에 존재하는 파일과 그 Directory 밑에 있는 파일의 메타데이터를 내용으로 한다.
Directory 밑에 있는 파일에 일부 메타데이터는 Directory에 직접 저장하고 일부 메타데이터는 다른 곳에다가 저장하기도 한다.
파일 시스템은 하드 디스크에 저장이 된다. 운영체제가 보는 디스크는 논리적 디스크이며 다른 말로 파티션이라고도 부른다.
우리가 하드 디스크를 하나 사서 C 드라이브와 D 드라이브로 나누면 이 각각이 논리적 디스크가 된다.
이러한 파티션에다 File System을 설치할 수도 있고 Swap area 용도로 사용할 수 있다.
✓ Directory
- 파일의 메타 데이터 중 일부를 보관하고 있는 일종의 특별한 파일
- 그 디렉터리에 속한 파일 이름 및 파일 attribute 들
✓ Operation
- search for a file, create a file, delete a file
- list a directory, rename a file, traverse the file system
✓ Partition (=Logical Disk)
- 하나의 (물리적) 디스크 안에 여러 파티션을 두는 게 일반적
- 여러 개의 물리적인 디스크를 하나의 파티션으로 구성하기도 함
● open
파일 open과 close는 왜 하는 걸까?
정의는 open 후 read, write를 하고 더 이상 할 일이 없으면 close를 하라고 인터페이스에 정의가 되어 있다.
여기에서 open과 close는 왜 따로 정의가 되어있는지에 대해 의문을 가질 수 있다.
파일을 open 하는 것은 파일의 메타 데이터를 메모리로 올려놓는 것이다.
논리적 디스크 안의 파일 시스템에는 특정 파일의 메타데이터도 저장되어 있고, 그 파일의 내용도 저장되어 있을 것이다.
어쨌거나 파일을 open 하게 되면 그 파일에 대한 메타데이터가 메모리로 올라오게 된다.
예를 들어 /a/b/c라는 파일의 메타 데이터가 메모리로 올라온다고 하자.
이런 식으로 Directory 경로가 계층적으로 구성되어 있을 때, open을 하라고 하면,
c라는 파일의 메타 데이터가 어디에 저장되어 있는지 찾아봐야 한다.
보통 root Directory의 위치는 미리 알려져 있으므로 root Directory부터 경로를 따라 내려가면서 c 파일의 위치를 찾아야 한다.
✓ open("/a/b/c")
디스크로부터 파일 c의 메타 데이터를 메모리로 가지고 오기 위하여 Directory Path를 Search 해야 한다.
- root Directory "/"를 open 하고 그 안에서 파일 "a"의 위치 획득
- 파일 "a"를 open 한 후 read 하여 그 안에서 파일 "b"의 위치 획득
- 파일 "b"를 open 한 후 read 하여 그 안에서 파일 "c"의 위치 획득
- 파일 "c"를 open 한다.
✓ Directory Path의 Search에 너무 많은 시간 소요
- open을 read/ write와 별도로 두는 이유
- 한 번 open 한 파일은 read/write 시 Directory Search 불필요
왼쪽이 물리적 메모리이고 오른쪽이 논리적 디스크이다.
사용자 프로그램이 System Call을 하여 /a/b라는 파일을 open 하려고 하면, CPU 제어권이 커널로 넘어간다.
운영체제 안에는 각 프로세스별로 관리하기 위한 자료구조가 있고,
전체 프로그램들이 open 한 파일들이 어떤 것인지 관리하는 Global 한 테이블이 유지가 되고 있다.
open을 하면 root Directory의 메타데이터를 메모리에 올린다.
root Directory를 먼저 오픈한 후 메타데이터를 열어보면 root content가 있는데, 거기에 a라는 파일의 메타데이터가 있을 것이다.
그럼 그걸 메모리에 올려놓으면(a open), a의 메타데이터의 내용에는 b라는 파일의 메타데이터가 있을 것이다.
그럼 그걸 또 메모리에 올려놓는다.
결론적으로 open이라는 건 그 파일의 메타데이터를 메모리에 올려놓는 작업이다.
System call을 통해서 open을 했고, open이 끝나면 결괏값을 리턴한다.
각 프로세스마다 그 프로세스가 오픈한 파일들에 대한 메타데이터 포인터를 갖고 있는 일종의 배열이 정의되어 있다.
b의 메타데이터의 위치를 가리키는 포인터가 배열 어딘가에 만들어지고 그 배열의 인덱스 값을 사용자에게 Return을 해준다.
b라는 파일에 대해서 read/write를 하면 디스크 어디에 있는지 root Directory에서부터 찾아 않아도 된다.
b의 메타데이터는 이미 메모리에 올라와 있고, 거기에 대한 위치는 File Descriptor (fd)가 갖고 있다.
그렇기 때문에 사용자 프로세스는 File Descriptor 숫자(인덱스)를 가지고 read/write 요청을 할 수 있다.
실제로 프로그래밍을 할 때, 파일 이름을 read 하면 argument로 적는 게 아니라 오픈한 다음에 File Descriptor를 적어준다.
File Descriptor를 적고 거기서 얼마큼 읽어올 것인지를 argument로 적어준다.
b의 내용을 읽어 사용자 프로그램에 주는 게 아니라,
운영체제가 자신의 메모리 공간 일부에다 읽어 놓고 사용자 프로그램에게는 그 내용을 copy 해서 전달해 준다.
그래서 다른 프로그램이 동일한 파일의 동일한 위치를 요청할 때, 운영체제는 이미 한 번 읽어놓은 것을 전달해 주면 된다.
이게 Buffer Caching이다.
Virtual Memory System의 Paging 기법에서는 이미 메모리에 올라와 있는 페이지들은 운영체제가 간섭하지 못하고 하드웨어가 주소변환을 한다.
그리고 Page Fault가 나야지만 CPU 제어권이 운영체제에게 넘어와 운영체제가 Swap Area에서 Page를 읽어오는 작업을 한다.
반면에 파일 시스템의 Buffer Cache는 요청한 내용이 Buffer Cache 안에 있든 없든 간에 CPU 제어권이 운영체제로 넘어간다.
그래서 Buffer Caching 환경에서는 운영체제가 모든 정보를 다 알기 때문에 LRU나 LFU 같은 알고리즘을 사용할 수 있다.
Paging 시스템에서 LRU를 사용하지 못하고 Clock 알고리즘을 썼던 것과는 대조가 된다.
파일 Descriptor 테이블은 프로세스마다 갖고 있어서 Per-process File Descriptor Table이라고 부르며,
open File Talble은 시스템 전체에 하나 존재하는 System-Wide Open File Table이라고 한다.
✓ Open File Table
- 현재 open 된 파일들의 메타 데이터 보관소 (in memory)
- 디스크의 메타 데이터보다 몇 가지 정보가 추가 : open 한 프로세스의 수, File Offset (파일 어느 위치에 접근 중인지 표시)
✓ File Descriptor (file handle, file control block)
- Open File Table에 대한 위치 정보 (프로세스 별)
● File Protection
메모리는 프로세스마다 별도로 가지고 있어서 결국에는 자기 혼자만 볼 수 있기 때문에 read/write만 Protection 해주면 된다.
반면에 File에 대한 Protection은 접근 권한이 누구한테 있냐는 것과 어떤 연산이 가능한지에 대한 정보를 갖고 있어야 한다.
- Access Control Matrix
- Grouping
- Password
- Access Control Matrix
- 행과 열에 user와 파일을 나열해 놓고 표시를 해 놓으며, 특정 사용자가 특정 파일에 접근했을 때 권한이 있을 때에만 접근을 허용해 준다.
- 나만 보려고 만든 파일인데 사용자별로 행을 전부 다 만들어야 하므로, 파일마다 행렬의 칸을 다 만들면 메모리 낭비가 될 수 있다.
- 그래서 이런 식으로 하지 않고, Linked List로 구현하는 방식이 있으며 주체를 누구로 할 것인가에 따라 두 가지로 나눌 수 있다.
- Access Control List
- 파일을 주체로 해서 그 파일에 대한 접근 권한이 있는 사용자들을 묶어 놓는다.
- 접근 권한이 없는 사용자에 대해서는 List에 연결하지 않는다. 이런 방식으로 행렬에 대한 공간 낭비를 막는다.
- Capability
- 사용자를 중심으로 접근 권한이 있는 파일들을 Link 해주는 방식이다.
- Access Control List
- Grouping
- 일반적인 운영체제에서 사용하는 방법이다. 각각의 파일에 대해서 사용자 그룹을 세 가지로 나눈다.
- 파일 하나에 대해서 접근 권한을 나타내기 위해서 총 아홉 개의 Bit만 필요로 한다.
- Password
- 보통 비밀번호는 로그인할 때 사용하는데, 여기서는 모든 파일이나 Directory에 대해서 Password를 통해서 관리를 한다.
- 그렇게 되면 접근 권한별로도 Password를 따로 두어야 한다. 별로다..
● File System의 Mounting
하나의 물리적인 디스크를 여러 개의 논리적 디스크로 나눌 수 있으며, 각각의 논리적인 디스크에서 파일 시스템을 설치해 사용할 수 있다.
어떤 특정 운영체제에 대해서 파일 시스템 하나가 접근 가능한데,
만약 다른 파티션에 설치되어 있는 파일 시스템에 접근하려고 하면 Mounting을 해야 한다.
Root File System의 특정 Directory 이름에다가 또 다른 파티션에 있는 파일 시스템을 Mount 해준다.
그러면 그 Mount 된 Directory에 접근하는 것은 또 다른 파일 시스템의 Root Directory에 접근하는 것이 된다.
✓ 시스템이 제공하는 파일 정보의 접근 방식
- 순차 접근 (Sequential Access) : 카세트테이프를 사용하는 방식처럼 접근, 읽거나 쓰면 offset은 자동으로 증가
- 직접 접근 (Direct Access, Random Access) : LP 레코드판과 같이 접근하도록 함. 파일을 구성하는 레코드를 임의의 순서로 접근할 수 있음