1 파일 시스템과 저장 장치

1.1 파일과 저장 장치

  • 파일(file) - 사용자나 응용프로그램이 정보를 저장하고 관리하는 논리적인 단위
  • 저장 장치 - 비휘발성 영구 저장 장치(HDD, SSD, USB Flash Drive, …), 휘발성 (RAM Disk)
  • 저장 장치의 빈 곳에 대한 정보와 파일이 저장된 곳에 관한 정보는 운영체제에 의해서 통제

1.2 디스크 장치 개요

하드 디스크 장치의 구조

디스크 매체 모듈

  • 플래터(platter) - 정보가 기록되는 저장소, 모두 스핀들(spindle)에 연결되어 함께 회전, 아래 윗면 모두 사용
  • 디스크 헤드(disk head) - 플래터 표면과 일정 간격을 유지한 채 플래터에서 정보를 읽거나 기록, 플래터 당 2개의 헤드가 아래위로 존재, 모든 암(arm)들은 하나의 구동기(actuator)에 달려 있어 함께 안팎으로 움직인다.

디스크 제어 모듈

프로세서가 디스크 매체 모듈을 제어하여 물리적인 디스크 액세스를 진행 입출력 데이터를 임시 저장하는 디스크 캐시를 사용하여 디스크 입출력 응답 시간을 줄인다.

트랙, 섹터, 실린더

  • 섹터 - 디스크 장치에서 읽고 쓰는 최소 단위, 섹터의 크기는 4096바이트(4KB) 트랙, 섹터, 실린더 그리고 블록

섹터와 블록

섹터는 디스크 장치가 입출력하는 물리적인 최소 단위, 블록(block)은 운영체제가 파일 데이터를 다루는 논리적인 단위

1.3 파일 입출력 주소

디스크 물리 주소와 논리 블록 주소

  • 응용프로그램 - 파일 내 바이트 주소 사용
    • 바잍트 번호(옵셋)을 사용
  • 운영체제 - 논리 블록 주소 사용
    • 논리 블록 주소(LBA, Logical Block Address) = 디스크의 모든 블록들을 일차원 배열로 나열하고 버호를 매긴 주소
    • 일차원 배열
  • 디스크 장치 - 디스크 물리 주소 사용
    • CHS(Cylinder-Head-Sector) 물리 주소 = [실린더 번호, 헤드 번호, 섹터 번호]

파일 주소 변환

운영체제는 파일을 블록 크기로 분할하고 각 블록을 디스크에 분산 저장한다. 응용프로그램, 운영체제, 디스크 장치 사이의 주소 변환

파일 내 바이트 주소 → 논리 블록 주소 → CHS 물리 주소

주소 계층화 의미

사용자나 응용프로그램, 운영체제, 디스크 장치가 상호 독립적으로 정의된 기능을 수행할 수 있다.

1.4 파일 시스템의 정의와 범위

파일 시스템은 저장 매체에 파일을 생성하고 저장하고 읽고 쓰는 운영체제의 기능을 통칭하는 말이다.

파일 시스템의 범위

파일 시스템의 논리 구조

디렉터리와 파일들로 이루어지는 트리 계층 구조로 파일 시스템 구성

저장 장치에 파일 시스템 구축

파일들을 저장 매체 속에 블록 단위로 분산 저장하고 관리하기 위한 체계

커널 내 파일 입출력 구현

  • 파일 생성
  • 파일 열기
  • 파일 읽기
  • 파일 쓰기
  • 파일 닫기
  • 파일 삭제
  • 파일 메타 정보 읽기/변경

응용프로그램을 위한 시스템 호출 제공

응용프로그램에서 활용할 수 있도록 커널이 제공하는 파일 입출력 시스템 호출 open(), close(), read(), write(), seek(), …

1.5 파일 시스템 입출력 계층

파일 시스템 입출력 계층

1.6 파일 읽기 사례

char buf[SIZE];    // SIZE 크기의 응용프로그램 버퍼
FILE* fp = fopen(...);    // 파일 열기
fread(fp, buf, n);    // 파일에서 n바이트(<=SIZE)를 읽어 buf[] 배열에 저장

디스크 캐시 → 커널의 버퍼 캐시 → C 라이브러리의 버퍼 → 응용프로그램의 buf[] 배열

파일 읽기 과정

파일 읽기 과정을 통한 주목 사항

  1. 파일 읽기 과정은 계층 구조로 이루어지고 그 역할이 잘 구분된다.
  2. 운영체제 커널의 역할은 사용자나 응용프로그램이 파일이 저장되는 저장 장치의 종류나 구조, 위치 등에 대해서 알 필요없이 입출력 할 수 있도록 하는데 있다.
  3. 파일에 대한 논리적 구조와 물리적 저장 공간을 분리시키는 것이 디스크 드라이버의 역할이다.
  4. 파일 데이터는 디스크 헤드로부터 응용프로그램 버퍼로 한 번에 전송되지 않고, 디스크 장치의 디스크 캐시, 커널의 버퍼 캐시, 라이브러리의 버퍼를 거쳐 복사된다.

2 파일 시스템의 논리 구조

2.1 파일 시스템 구조

  • 트리 계층 구조(tree hierarchical structure)로 파일 시스템을 구성

디렉터리와 파일의 계층 구조

디렉터리는 개념적으로 파일과 서브 디렉터리를 담기 위한 컨테이너

  • 루트 디렉터리(root directory) - 파일 시스템 계층 구조의 최상위 디렉터리
  • 서브 디렉터리(sub directory) - 루트 디렉터리의 하부에 존재하는 디렉터리 디렉터리서브 디렉터리와 파일들의 이름 목록을 저장하는 파일로 다루어진다.

파일 이름과 경로명

파일 이름 - 이름(name)과 확장자(extension)로 구성 파일의 경로명(pathname) - 루트 디렉터리에서부터 계층구조를 포함하는 완전한 파일 이름

2.2 파일 시스템 메타 정보와 파일 메타 정보

파일 시스템 메타 정보

파일 시스템 전체에 대한 정보

  • 파일 시스템 전체 크기
  • 저장 장치에 구축된 파일 시스템의 현재 사용 크기
  • 저장 장치에 구축된 파일 시스템의 비어 있는 크기
  • 저장 장치 상에 비어 있는 블록들의 리스트

파일 메타 정보

파일에 관한 여러 정보, 파일 데이터 포함 X

  • 이름
  • 크기
  • 만들어진 시간
  • 수정된 시간
  • 가장 최근에 액세스된 시간
  • 만든 사용자(소유자)
  • 속성(접근 권한)
  • 저장된 위치

파일 메타 정보는 어디에 저장되는가?

파일 데이터와 분리하여 따로 저장, 파일 시스템에 따라 디렉터리나 파일 시스템의 특정 영역 등 다양한 곳에 따로 저장된다.

3 파일 시스템 구축

3.1 파일 시스템 종류와 구현 이슈

다음과 같은 다양한 파일 시스템이 개발됨

  • FAT(File Allocation Table) 파일 시스템 - MS-DOS에서 사용
  • UFS(Unix File System) - Unix에서 사용
  • ext2, ext3, ext4 - Linux에서 사용
  • HFS(Hierarchical File System) - Mac 운영체제에서 사용
  • NTFS(New Technology File System) - 윈도우즈 3.1부터 지금까지 사용. FAT 개선. 리눅스에서도 지원됨 모두 트리 구조의 계층적 파일 시스템이지만, 디렉터리의 구조, 파일을 저장하고 파일이 있는 위치를 다루는 방법 등 저장 장치에서 파일 시스템을 구성하는 방식은 서로 다르다.

파일 시스템을 구축하기 위해서는 기본적으로 다음 이슈들을 해결해야 함

  • 디스크 장치에 비어 있는 블록들의 리스트를 어떻게 관리할 것인가?
  • 파일 블록들을 디스크의 어느 영역에 분산 배치할 것인가?
  • 파일 블록들이 저장된 디스크 내 위치들을 어떻게 관리할 것인가?

3.2 FAT 파일 시스템

MS-DOS 에서 사용된 파일 시스템. 진화된 모습으로 지금도 사용되고 있음

FAT 파일 시스템의 구조

디스크 내 FAT 파일 시스템 구조

  • 부트 섹터
    • 한 섹터 크기
    • 파일 시스템 메타 정보 및 디스크에 관련된 정보들과 컴퓨터가 부팅할 때 실행되는 코드가 저장
  • FAT1과 FAT2
    • FAT는 File Allocation Table의 약자로서, 파일 시스템의 전체 파일에 대해 파일이 저장된 디스크 블록들의 번호가 저장되는 곳
    • FAT가 훼손되면 파일을 찾을 수 없는 심각한 문제가 발생하기 때문에 FAT2를 복사본으로 사용
  • 루트 디렉터리
    • 파일을 찾을 때 루트 디렉터리에서부터 시작하므로, 루트 디렉터리를 찾기 쉽도록 위치를 고정
  • 데이터 블록 영역
    • 루트 디렉터리를 제외한 모든 파일의 데이터 블록들이 저장되는 영역

디렉터리

  • 파일(서브 디렉터리 포함)의 목록을 담은 특별한 파일
  • 파일 하나당 하나의 디렉터리 항목이 생김.
  • 디렉터리 항목은 하나의 파일 메타 정보를 모두 저장. 가장 중요한 것은 ‘시작 블록 번호’로서 파일이 저장된 첫 번째 디스크 블록 번호이다.

파일 블록 배치(File Allocation)

  • 파일 데이터를 블록 단위로 비스크에 분산 저장하고 저장된 취치는 FAT라고 불리는 테이블에 기록
  • FAT의 항들은 연결 리스트(linked list)로 연결

FAT 파일 시스템의 장단점

  • 장점
    • 단순하여 구현이 쉽다.
    • 디스크에 외부 단편화가 없다.
  • 단점
    • 파일 당 1/2블록 크기로 내부 단편화 발생
    • seek time이 크다.
    • FAT 테이블 영역이 손상되면 파일 시스템 전체를 읽을 수 없다.

3.3 Unix 파일 시스템

Unix 파일 시스템의 구조

디스크에서 Unix 파일 시스템의 구조

  • 부트 블록(boot block)
    • 부팅이 진행된 때 처음에 메모리로 적재되는 디스크 블록
    • 운영체제를 적재하는 코드와 쿠팅 시 필요한 정보가 저장됨
  • 수퍼 블록(super block)
    • 파일 시스템의 유지 관리를 위해 중요한 정보인 ‘파일 시스템 메타 정보’가 기록되는 공간
    • 파일 시스템 크기와 상태 정보 + …
    • 파일이 생성되고 읽고 쓰는 동안 자유 i-node를 찾거나 자유 블록을 찾는 등 커널에 의해 자주 액세스되기 때문에, 부팅 초기에 메모리에 적재된다.
    • 메모리에 적재된 수퍼 블록은 주기적으로 디스크의 수퍼 블록에 기록되어야 함
  • i-node와 i-node 리스트
    • i-node(index node) - ‘파일 메타 정보’가 기록되는 구조체로서 파일마다 한 개씩 사용
    • 운영체제에 따라서 다르지만 대체로 64바이트, 128바이트 크기
    • i-node 리스트는 i-node들의 테이블로서 수퍼블록 다음에 저장되며 파일 시스템이 구축될 때 크기가 고정되므로 i-node 개수도 고정된다. i-node 리스트와  i-node에 저장되는 정보
  • 데이터 블록들
    • 파일과 디렉터리가 저장되는 공간
    • 블록 단위로 분산 저장
    • 블록의 크기는 수퍼 블록에 기록, 보통 4KB

디렉터리

디렉터리 항목 = [ i-node 번호(2 바이트), 파일 이름(14바이트) ] 디렉터리 블록과 디렉터리 항목

파일 블록 배치(File Allocation)

  • 파일을 블록 단위로 디스크의 여러 블록에 분산 저장
  • i-node에 15개의 인덱스를 통해 파일이 저장된 디스크 블록들의 번호를 기억
  • 12개의 직접 인덱스 + 1개의 간접 인덱스 + 1개의 이중 간접 인덱스 + 1개의 3중 간접 인덱스 i-node 속의 15개의 인덱스를 이용한 파일 블록들의 할당

파일의 i-node를 찾는 과정

i-node 번호와 블록 번호 알아내기

4 파일 입출력 연산

4.1 파일 찾기

4.2 파일 열기, open()

파일을 여는 이유

  • 파일이 존재하는지 확인
  • 현재 프로세스가 파일 연산을 할 수 있는지 파일에 대한 접근 권한 확인
  • 연이어 파일을 읽거나 쓰기 위한 커널 내에 자료 구조 형성 다음 순서로 진행
  1. 파일이 존재하는지 확인
  2. 존재한다면 디스크에서 메모리로 i-node를 읽어 들이고
  3. 권한 여부 확인
  4. 읽고 쓰기 위한 커널 자료 구조를 형성 파일 열기 후 형성되는 커널 자료 구조

파일 입출력을 위한 커널 자료 구조

  • 메모리 i-node 테이블
    • 현재 열린 파일들에 대해 디스크에서 i-node를 읽어 메모리에 형성한 테이블
    • 시스템에 1개
  • 오픈 파일 테이블
    • 시스템 내에 열려있는 모든 파일에 관한 정보를 기록해두는 테이블
    • 시스템에 1개
  • 프로세스별 오픈 파일 테이블
    • 프로세스 당 하나
    • 오픈 파일 테이블에 대한 메모리 주소가 기록됨
  • 버퍼 캐시

파일 열기 과정

위 그림 참고

파일 디스크립터

  • 열린 파일마다 매겨진 고유한 정수 번호
  • 파일을 연 응용프로그램에게 전달됨
  • open()의 리턴 값
  • 프로세스별 오픈 파일 테이블의 인덱스

4.3 파일 읽기, read()

파일 읽기 과정

4.4 파일 쓰기, write()

파일 읽기 과정

4.5 파일 닫기, close()

파일 읽기 과정