Search

File Systems

File System Interface

파일

1.
정의: 파일은 관련된 정보들의 집합. 세컨더리 스토리지에 저장하는 단위이다. 파일에는 아무것도 작성하지 않아도 EOF라는 특수문자가 들어있고 파일에 텍스트를 넣고 저장하면 마지막 위치로 EOF를 시프팅해서 옮 긴다. 오픈할때는 EOF의 바로 앞이 파일 포인터가 된다. 파일 포인터를 특정 위치로 이동시키는것이 seek이 다.
2.
파일 시스템: 파일 시스템은 데이터를 long term으로 저장하기 위해서 존재하는 운영체제의 서브시스템. 윈도우는 파일시스템으로 NTFS를 사용하고 리눅스는 ext를 사용한다. USB는 FAT을 사용한다. FAT과 NTFS의 가장 큰 차이는 안정성으로 NTFS가 안정성이 더 좋다. 파일 시스템콜로 create, open, close, read, write, chmod, chown 등이 있다. 하지만 c등의 언어 내부에서 사용되고 인터페이스를 제공하므로 직접 사용하는 경우는 거의 없다. 파일시스템은 permission, 파일 저장, 디렉토리로 logical 구조를 만들고 권한설정 및 protection등의 작업을 한다.

File Type

1.
파일 시스템의 분류: device, directory, symbolic link 등
2.
OS의 특정파트 혹은 런타임 라이브러리: executable, dll, object code, text 등. 커널이 몰라도 특정 시스템 프로그램이 인식해야한다.
3.
Application program이 구분: jpg, mpg, avi,mp3 등.
4.
윈도우는 확장자로 인코딩을 한다. 정확한 확장자가 필수이다. 하지만 리눅스는 확장자 개념이 없고 컴파일러와 소스코드의 약속이다.

Directory

1.
여러 형태의 파일들의 리스트 정보를 저장할 수 있는 특수한 파일. hierarchical한 구조를 가지고 경로를 가진다. 어떤 파일들이 어느 위치에 저장되어있는지를 보여줄 수 있다. 경로의 개념이 생기고 효과적인 임의접근이 가능하다. 현재위치를 기준으로 하면 상대경로, 루트부터 시작하면 절대경로이다. 디렉토리는 filename과 attribute의 리스트이다. attribute는 리스팅하고 있는 파일의 크기, protection정보, 생성일, 수정일, 디스크에서의 위치 등을 포함한다. 리스팅되어있는 파일들은 랜덤 엑세스되기 때문에 정렬되어있지 않고 임의의 순서대로 들어간다.

File System Mounting

1.
새로 디스크를 연결할때 유닉스 계열에서는 비어있는 디렉토리에 끼운다. 루트 밑에 설치된다. ./usr/dev에 마운팅 된 디바이스들을 접근할 수 있다. 윈도우는 물리적인 디스크들이 다른 레터링을 가지고 독립적으로 존재함. C드라이브, D드라이브 등 디바이스마다 루트가 따로 존재한다.

Remote File System

1.
다른 컴퓨터의 파일 시스템을 원격으로 접근하는 방식. 유닉스는 NFS, 윈도우는 CIFS를 사용.

Protection

1.
윈도우에서는 개인 PC로 많이 사용하기때문에 중요하지 않지만 유닉스 시스템은 다수의 유저들이 접근해서 사용하기 때문에 보안과 권한이 중요하다. ACL Access Control List방식과 Capability방식이 존재한다. ACL은 파일당 권한설정이고 Capability는 사용자당 파일 권한 설정하는 방식이다. 파일수가 많기 때문에 리눅스에서는 ACL을 사용한다. Owner Access, Group Access, Public Access로 구분되며 각각이 RWX(Read, Write, Execute)권한이 8진수로 지정되어있고 chmod를 통해서 권한을 변경할 수 있다. ls -l명령어를 통해서 권한을 확인할 수 있다. 유저아이디, 그룹 용량 변경시간 파일이름을 확인할 수 있다. d는 directory임을 가리킨다.

Memory mapped File

1.
파일에 있는 데이터 읽으려면 c++의 경우 fstream 객체 만들고 open r/w 후 close인데, 이런식으로 사용하지 않고 file데이터를 address space에 매핑시키는 방법이다. write을 하면 disk에 write을 수행하도록 한다. mmap 시스템콜을 사용한다.

File System Implementation and Internals

In-memory 구조

1.
특정 프로세스가 파일에 접근하기 위해서 open을 수행하면 file descriptor가 반환된다. 이걸 가지고 read write을 수행한다. 여러개의 프로세스들이 파일을 접근할때 운영체제는 system-wide open file table을 운영한 다. 전체 프로세스들의 open file들을 관리하는 테이블이다. 각 프로세스들은 각각 자신의 open file에 대해 per-process file descriptor table을 PCB에서 관리하고 중복되지 않도록 운영체제의 system wide open file table의 요소를 가리키고 있다. 유닉스 계열은 파일뿐만 아니라 io디바이스들도 descriptor로 관리한다. 프로그램 실행되면 기본적으로 3개의 파일 stdin, stdout, stderr을 오픈한다. 디스크를 매번 접근하면 성능이 떨어지므로 자주 사용하는 파일들은 캐시에 올려놓는다. in-memory partition table은 superblock, 비트맵, i-node 등의 정보를 저장하고 directory cache는 디렉토리 정보, 실제 파일 내용은 buffer cache에 담는다. 보통 이 3가지를 통칭해서 buffer cache라고 부른다.
2.
VFS: Virtual File System: 파일 시스템의 공통적인 부분을 묶은것. 구체적인 파일 시스템은 아래에 더 붙여서 사용한다. CD-ROM은 ISO9660을 사용하고, 유닉스는 UFS, 윈도우는 FAT,NTFS, 리눅스는 ext2/3/4를 사용. buffer cache는 공유해서 사용한다.

On-Disk구조

1.
MBR: 부트로더가 저장됨. 운영체제를 메모리로 올려주는 코드가 들어있는 펌웨어이다. 파티션별로 다른 운영체제를 설치할 수 있다. 부트로더는 어떤 운영체제로 부팅할것인지 선택할 수 있다.
2.
boot block:부팅에 필요한 것들을 저장하는 블록. 해당 파티션에 운영체제가 저장되지 않으면 존재하지 않는다. 윈도우에서는 boot sector라고 부름.
3.
super block:파일시스템 전체에 대한 정보를 가지고 있다. 블록의 개수, 파일시스템 타입, 얼마만큼 사용되고 있는지 등. 윈도우에서는 master file tabled이라고 부름. 섹터의 크기는 512바이트이지만 섹터크기로 관리하려면 운영체제의 오버헤드가 너무 크기 때문에 4kbyte인 블록 단위로 관리한다. 디스크 블록 0번은 가장 위의 플래터의 가장 바깥 트랙의 섹터부터 사용한다. 하나의 블럭이 4kbyte이므로 8개의 섹터를 사용한다. 다음 블록은 같은 실린더 상의 트랙에 쓴다.
4.
bitmaps: 존재하는 디스크 블록들이 사용중인지 정보를 저장해놓는 블록이다. 0,1 값으로 관리한다. 5. i-nodes: 각 파일에 대한 메타데이터. FCB(File Control Block)이다. 이름, permission, owner, access정보 등을 관리한다. 유닉스 시스템에서는 i-node라고 부르는것이다. 파일별로 i-node는 하나씩 존재한다. FCB는 보통 4kbyte이다.
5.
root dir: 루트 디렉토리 주소. hierarchical한 디렉토리 구조 만드는 기준.
6.
file & directories: 실제 데이터 저장되는 부분. 연속적으로 저장하면 hole이 생긴다. fragmentation이 발생한다. 데이터가 바뀌지 않는 CD,DVD,블루레이의 경우는 연속적으로 데이터를 기입해도 문제가 없지만 하드디스크는 안된다.

FCB:

1.
File Control Block은 유닉스에서는 i-node라고 하고 윈도우에서는 master file table이라고 부른다. file permission, dates(create, access, write), owner, group, ACL, size 등의 정보가 들어간다. 파일을 만들때 생성되며 파일의 최소단위는 1블록으로 4kbyte, FCB도 4kbyte이므로 최소 총 8kbyte를 차지한다.

Directory Implementation

1.
디렉토리 안에 존재하는 모든 파일들의 FCB를 다 넣는 방법.
2.
파일 이름과 FCB를 가리키는 포인터만 저장하는것 – 유닉스 방식(i-node)
3.
hybrid approach: 중요한건 디렉토리에 저장하고 나머지는 FCB를 가리키는 포인터로 관리 – 윈도우 방

Allocation Method

1.
정의: 디스크 내의 블록들을 관리하고 배치하는 방법
2.
Contiguous allocation: 연속적으로 블록들을 배치. 시작위치와 길이정보만 가지면 된다. 한번에 많이 읽어올 수록 spatial locality도 좋기 때문에 효율적이다. 단점은 Fragmentation이 발생한다. 데이터가 변하지 않는 경우는 성능이 우수하다.
3.
Linked Allocation: 블록에 포인터를 주고 다음 블록을 가리키게 하고, 마지막인 경우 NULL. external fragmentation이 없어지고 파일크기가 가변적이어도 상관없음. 파일이름과 시작위치만 저장하면 된다. 단점은 spatial locality가 떨어지고, 포인터가 중간에 하나라도 깨지면 데이터가 날아가기 때문에 신뢰성이 낮다. 개선된 형태로 별도의 블록에 포인터 정보만 따로 저장하는 방법도 있다. 한 블록에 포인터 정보를 몰아넣은것을 복사본을 만들어서 신뢰성을 향상시키고 디스크 스케줄링에도 효과적이다. 개선된 형태의 linked Allocation을 사용하는 파일 시스템이 FAT(File-Allocation Table)이다.
4.
Indexed Allocation: 블록별로 포인터를 두지 않고 블록에 정수 인덱스를 부여하고 인덱스 블록에서 관리하는 방법. 중간에 파일이 손상되어도 그 파일 외에는 접근 가능하므로 신뢰성이 높다.
5.
i-node: 파일에 대한 메타 데이터를 저장하는 FCB이며 i-node에서 데이터 블록을 가리키는 방법은 direct와 indirect방법이 있다. direct block들은 12개밖에 없고 각 블록은 4kbyte이므로 48kbyte까지만 저장 가능하다. 대부분의 파일들이 50kbyte를 넘지 않기 때문에 12개가 존재한다. 크기를 넘어가는 경우 multilevel index block을 사용하는데 single indirect에서 1000개의 data block을 가리키는 i-node를 가리키도록 구현되어 4MB까지 저장이 가능하다. 넘어가면 double indirect로 1000개의 i-node를 가리키는 i-node의 주소를 가리키고 그 i-node들은 다시 1000개의 i-node를 가리키므로 4GB까지 저장이 가능하다. triple indirect도 존재한다. Triple Indirect가 없는 경우 파일의 최대크기는 4GB정도가 되며 이를 넘어가면 여러개의 파일로 분할해야한다.

UFS구조

1.
/bin/a.out을 실행한다면 루트의 i-node를 읽고 i-node가 디렉토리를 가리키고 bin이 저장된 블록을 찾고 그 블록을 읽어서 디렉토리 정보가 11000번에 있어서 또 이동. a.out이 500번 블럭에 저장되어 있으니 500번 인덱스의 i-node를 읽어옴. a.out의 i-node에서 12개는 direct block, 650번은 12개의 블럭으로 모자라서 single indirect block을 할당해서 650번 i-node를 읽어와서 데이터를 접근한다. 여러명의 사용자가 동일한 파일을 읽으면 오버헤드가 발생하므로 directory cache, buffer cache에 데이터를 캐싱한다. read성능이 개선된다. 캐시 데이터가 메모리에 존재하고 해당 데이터가 변경되었을때 디스크와의 consistency를 유지하는 방법으로는 write through와 write back이 있다. write through는 성능이 떨어져서 write back을 수행한다. 비정상적 종료하는 경우 inconsistency가 발생할 수 있다.

Block Size

1.
data rate, Disk space Utilization을 고려했을때 가장 적합한 크기는 4kbyte이다.

Read Ahead

1.
Spatial locality를 활용해서 현재 엑세스하는 부분 근처의 데이터를 미리 읽어오면 성능을 항샹시킬 수 있다. 하드디스크는 arm seek의 오버헤드가 크기 때문에 많이 읽어오면 성능에 좋다.

Reliability

1.
디스크는 신뢰성이 중요한데 성능을 위해서 버퍼캐시를 사용하다보면 reliability가 깨지는 상황이 발생할 수 있다. 그런 상황을 대비해서 윈도우에서는 scandisk, 유닉스는 fsck 명령어가 존재함.
2.
Log Structured File System: Journaling file system이라고도 한다. write이 수행되면 디스크에 로그를 쓴다. 시스템이 유휴상태가 되어서 디스크에 write back되면 journal을 지운다. 재부팅될때 로그 파트를 보고 비어있으면 inconsistent하지 않은 상황이고 남아있다면 문제가 발생한것으로 보고 로그 데이터를 바탕으로 복구를 수행한다.

NFS

1.
Network File System: 내 컴퓨터에 존재하는 디스크처럼 네트워크를 통해서 파일시스템을 사용할 수 있다. NFS서버 프로그램이 존재하고 네트워크를 통해서 전달받고 클라이언트에서는 VFS인터페이스 아래에 NFS클라이언트가 존재해서 데이터를 전달받는다.