[운영체제-양희재 교수님]28-29강 파일 할당
파일 시스템
- 컴퓨터 시스템 자원 관리
- CPU: 프로세스 관리
- CPU 스케쥴링, 프로세스 동기화
- 주기억장치: 메인 메모리 관리
- 페이징, 가상 메모리
- 보조기억장치: 파일 시스템
- 파일 할당
- CPU: 프로세스 관리
파일 할당(File Allocation)
- 하드 디스크는 크게 track(cylinder), sector로 구성
- Sector size는 일반적으로 512 bytes ⇒ 크기가 너무 작아 여러 sector를 모은 block 단위로 읽기/쓰기 ⇒ 하드 디스크는 block device
- 참고) blockdevice ↔ character device(키보드 등)
- 하드 디스크 = pool of free blocks
- 각각의 파일에 대해 free block을 어떻게 할당하는가?
연속 할당(Contiguous Allocation)
- 각 파일에 대해 디스크 상의 연속된 블록을 할당
- 장점
- 디스크 헤더의 이동 최소화 ⇒ 빠른 IO 성능으로 읽고 쓰기가 빠르다.
- 따라서 동영상, 음악, VOD 등에 적합
- 순차 접근과 직접 접근 가능
- 순차 접근(sequential access): 순서대로 읽기 가능
- 직접 접근(direct access): 연속적으로 할당되어 있으니 디렉토리의 block 정보를 보고 다음 블록의 위치를 추정하여 특정 부분을 바로 읽기 가능
- 디스크 헤더의 이동 최소화 ⇒ 빠른 IO 성능으로 읽고 쓰기가 빠르다.
- 단점
- 파일이 삭제되면 hole 생성 ⇒ 파일 생성/삭제가 반복되면 곳곳에 흩어지는 holes ⇒ 외부 단편화 발생 ⇒ 디스크 공간 낭비
- Compaction을 할 수 있지만 시간이 오래 걸린다.
- 파일 생성 당시 파일의 크기를 알 수 없음 ⇒ 파일을 어느 hole에 넣어야 하는지 알 수 없음
- 파일의 크기가 계속 증가할 수 있음 ⇒ 크기가 늘어나는 파일 배치 불가능
- 파일이 삭제되면 hole 생성 ⇒ 파일 생성/삭제가 반복되면 곳곳에 흩어지는 holes ⇒ 외부 단편화 발생 ⇒ 디스크 공간 낭비
- 연속 할당의 단점을 극복하기 위해 연결 할당 등장
연결 할당(Linked Allocation)
- 파일 = linked list of data blocks
- 파일 디렉토리(directory)는 제일 처음 블록을 가리킨다.
- 각 블록은 포인터 저장을 위해 4바이트 또는 그 이상 소모
- 새로운 파일 만들기
- 비어있는 임의의 블록을 첫 블록으로 지정
- 파일이 커지면 다른 블록을 할당 받고 연결
- 따라서 외부 단편화 없음
- 단점
- 순서대로만 읽기(sequential access) 가능
- 순서대로 포인터를 읽어야 하기 때문에 Direct access 불가
- 포인터 저장 위해 4바이트 이상 손실
- 포인터 끊어지면 이하 접근 불가 ⇒ 낮은 신뢰성
- 헤더의 움직임 증가 ⇒ 느린 속도
- 순서대로만 읽기(sequential access) 가능
File Allocation Table(FAT) 파일 시스템
- 연결 할당의 단점을 개선한 시스템
- 포인터만 모은 테이블(FAT)을 별도의 블록에 저장
- Direct access 가능
- FAT는 일반적으로 부팅시 메모리에 바로 올라가 메모리 캐싱
- FAT 손실 시 복구 위해 이중 저장
색인 할당(Indexed Allocation)
- 파일은 데이터 블록 외에 한 개의 인덱스 블록을 추가로 가짐
- 인덱스 블록 = 포인터의 모음
- 디렉토리는 시작하는 블록의 위치가 아닌 인덱스 블록을 가리킨다.
- Unix/Linux 등에서 사용
- 장점
- Direct access 가능
- 외부 단편화 없음
- 단점
- 추가적인 인덱스 블록 할당을 위한 저장 공간 손실
- 인덱스 블록 하나에 파일의 인덱스가 포함되어야 하므로 파일의 최대 크기가 제한된다.
- 예) 1블록 = 512바이트 = 4바이트 x 128개 인덱스 ⇒ 한 파일당 128개의 인덱스만 소유 가능 ⇒ 최대 파일 크기 = 128 * 512바이트 = 64KB
- 예) 1블록 = 1KB = 4바이트 x 256개 인덱스 ⇒ 최대 파일 크기 = 256 * 1KB = 256KB
- 해결 방법
- Linked: 여러 개의 인덱스 블록을 연결하여 사용
- Multilevel index: 계층을 두어 인덱스 블록을 여러개 사용
- Combined: Linked + Multilevel index
This post is licensed under CC BY 4.0 by the author.