티스토리 뷰
파일 시스템
파일 (File)
파일은 보조 기억 장치에 기록된 관련 정보들의 이름 붙여진 집합체입니다.
*FCB(File Controll Block)은 파일 메타데이타와 데이타 블록 주소를 담고 있습니다.
Shared lock과 Exclusive Lock
Shared lock은 여러 프로세스가 공유할 수 있는 락이며, Exclusive lock은 한 프로세스만 획득할 수 있는 락입니다.
파일 읽기와 같은 경우는 shared lock을 통해, 쓰기는 exclusive lock을 통해 동시성을 보장해야 합니다.
Memory Mapped File (MMF)
read, write 등의 시스템 콜을 통해 파일 작업을 하게 되면 성능 저하가 생기기 마련입니다. 커널 영역에서 데이터 전송이 이루어져야 하기 때문에 유저 영역과 커널 영역 간의 데이터 복사가 수시로 이루어지기 때문입니다.
이를 해결하는 방법 중 하나가 MMF입니다. MMF는 파일 내용을 유저 메모리 공간에 로드하여 일반적인 메모리 접근으로 파일을 읽고 쓸 수 있게 합니다. 이 페이지 cache와 shared memory를 통해 여러 프로세스가 파일에 동시에 접근할 수도 있습니다.
파일 시스템 (File System)
파일 시스템은 저장 장치에 접근할 수 있는 편리한 인터페이스를 제공합니다.
Block
메모리와 대용량 저장 장치 사이의 데이터 전송 단위입니다. 블락은 여러 섹터로 구성됩니다.
파일 시스템의 계층적 구조
프로그램에서 장치에 접근하기 위해서는 4개 계층을 건너야 합니다.
- 논리 파일 시스템: 파일 관리를 위한 메타 데이터를 관리합니다.
- 파일 조직 모듈: 파일과 관련된 논리 블록 정보를 관리합니다.
- 기본 파일 시스템: 물리 블록과 관련된 명령을 내립니다.
- I/O 컨트롤 계층: I/O 드라이버가 관련된 명령을 번역하여 컨트롤러에게 전달합니다.
예시: LoL.exe 실행 과정
논리 파일 시스템에서 메타 데이터를 찾아 파일 조직 모듈에 전달 → 모듈은 논리 블록 주소를 물리 블록 주소로 변환하여 기본 파일 시스템에 전달 → 기본 파일 시스템이 I/O 컨트롤 계층에 명령 하달.
이런 계층 시스템 구조는 네트워크에서도 등장하는데, 모듈화, 확장성, 디버깅 용이성이라는 장점이 있지만 계층을 거치며 발생하는 성능 저하와 역할 구분의 모호함이 단점으로 꼽힙니다.
폴더 구조 구현
- 1. Linear list
(파일 이름, 데이터 블록 포인터)를 원소로 관리합니다.- 구현이 간단하지만 검색/추가/삭제에 선형 시간 \(\mathcal{O}(n)\)이 소요됩니다.
- 정렬된 상태 유지 시 이진 탐색(Binary Search) 사용이 가능합니다.
- 2. Hash table
폴더를 해시 테이블로 관리합니다.- 검색이 매우 빠르지만 해시 함수의 성능과 충돌 영향을 받습니다.
파일 할당 방법
1. 연속 할당 (Contiguous Allocation)
파일을 연속된 블록에 저장하며, 폴더는 (파일명, 시작 블록, 길이)를 관리합니다.
- 외부 단편화 문제가 발생하며, 해결을 위한 압축 과정 시 성능 저하가 큽니다.
- 파일 크기를 미리 정해야 하며, 증가 시 내부 단편화가 발생할 수 있습니다.
- Extent 방식: 추가 공간을 할당하여 (파일명, 시작 블록, 길이, 다음 extent 위치)를 저장함으로써 최적화합니다.
2. 연결 할당 (Linked Allocation)
모든 블록을 링크드 리스트로 관리합니다. 폴더는 (파일명, 시작 블록, 끝 블록)을 관리합니다.
- 외부 단편화가 해결되지만, 검색에 선형 시간이 걸리고 포인터 저장 공간이 낭비됩니다.
- 클러스터(Cluster): 여러 블록을 묶어 관리하여 포인터 낭비를 줄이나 I/O 성능 저하 우려가 있습니다.
- FAT (File Allocation Table): (블록 번호, 다음 블록 번호) 테이블을 별도로 관리하여 탐색 효율을 높인 방식입니다.
3. 인덱스 할당 (Indexed Allocation)
인덱스 블록이 (i, i번째 블록 주소)를 관리합니다. 폴더는 (파일명, 인덱스 블록 주소)를 가집니다.
- 인덱스 블록 크기 결정 문제가 있으며, 이를 위해 다중 레벨 인덱스를 사용하기도 합니다.
- 현대 시스템은 파일 크기에 따라 direct, double indirect, triple indirect 블록을 혼합 관리합니다.
빈 공간 리스트 (Free Space Management)
1. Bit vector
0/1로 관리하나 디스크가 커질수록 벡터 크기도 비대해짐.
2. Linked list
Free block을 연결. 탐색 즉시 할당 가능하여 효율적임.
3. 그룹화 (Grouping)
첫 블록에 n-1개의 주소를 적고 마지막에 다음 그룹 주소를 저장.
4. Counting
연속된 빈 블록 개수를 저장. Balanced Tree로 관리 가능.
통합 버퍼 캐시 (Unified Buffer Cache)
기존 시스템에서는 MMIO를 위한 Page Cache와 디스크 블록을 위한 Buffer Cache가 공존하며 동일 데이터가 양쪽 모두에 올라오는 더블 캐싱(Double Caching) 문제가 발생했습니다.
이러한 중복과 데이터 불일치 문제를 해결하기 위해 두 캐시를 하나로 통합하여 관리하는 것을 통합 버퍼 캐시라고 부릅니다.