운영체제(Operating System Concepts) 를 읽고 정리한 정리본입니다.

📌 Chap14-02 : 파일 시스템 구현_파일 시스템 구현

파일 시스템 구현은 운영체제에 따라 다르게 나타날 수 있으나, 대개 다음과 같은 것들을 디스크 상에 가지고 있다.

  • 저장장치에 저장된 운영체제 부트 방법
  • 블록의 총 수, 가용 블록의 수와 위치
  • 디렉터리 구조
  • 개별 파일에 대한 정보

이러한 것들은 운영체제와 파일 시스템에 공통 적용되는 원칙이다.

🫧 파일 시스템 용어 정리

본격적으로 디스크 구조를 파악하기 전, 파일 시스템 용어 정리가 필요하다. 관련 용어를 먼저 짚고 디스크 구조를 파악해보자.

✨ 디스크

: 시스템에 장착되어 있는 물리적인 저장 장치 (자기 디스크)

  • 둥근 원반에 자성을 가진 물체를 입히고, 표면에 자력을 이용해 데이터를 기록하고, 자기장의 변화를 통해 데이터를 읽는 방식의 기록 매체
  • 고정 디스크 (HDD, SSD), 이동식 디스크(USB), 가상 디스크가 있다.

자세한 내용은 Chap14-01에 정리되어 있다.

✨ 파티션

: 디스크의 공간을 논리적인 별도의 데이터 영역으로 분할한 공간

하나의 물리적인 디스크 저장장치를 여러 독립적인 공간으로 구분해서 사용할 수 있게 한다.

디스크를 서로 분리해서 여러 개의 디스크를 쓰는 것처럼, 파티션 또한 여러 개로 분리해 사용할 수 있게 했다.

image

✨ 볼륨

: 단일 파일 시스템을 사용해서 액세스 할 수 있는 저장 공간

image

하드디스크 전체의 볼륨이 파티션으로 나뉠 수 있으며, 나뉜 파티션 덩어리들도 각각의 볼륨으로 볼 수 있다.

반대로, 여러 물리 디스크를 하나의 파티션으로 구성하기도 한다.

✨ 파일 시스템

: 저장장치에 파일을 어떻게 쓰고, 관리하고, 찾고, 읽을 것인지에 대한 규칙

도서관으로 비유를 들자면 각각은 다음과 같다.

  • 하드디스크 = 도서관
  • 파일시스템 = 도서검색대
  • 파일 = 책
  • 데이터 = 원하는 내용

원하는 내용의 책을 찾기 위해 도서관에 있는 도서검색대를 이용

=> 원하는 데이터가 들어 있는 파일을 찾기 위해 하드디스크 안에 있는 파일시스템 이용

🫧 디스크 구조

디스크 구조는 운영체제에서 데이터를 효율적으로 관리하고 접근하기 위해 메타데이터 및 기타 정보들을 포함하고 있다.

파일 할당 테이블, 슈퍼 블록 등 다양한 구조들이 존재하지만 여기서는 아래 네 가지만 살펴보고자 한다.

✨ 1. 부트 제어 블록

: 시스템이 그 파티션으로부터 운영체제를 부트시키는 데 필요한 정보를 가지고 있는 블록

  • 일반적으로 한 파티션의 첫 번째 블록에 존재
  • 파티션마다 부트 제어 블록 존재
  • 만일 디스크가 운영체제를 가지고 있지 않다면 부트 제어 블록에 정보 존재 X

cf) UFS에서는 부트 블록, NTFS에서는 파티션 부트 섹터라 불린다.

✨ 2. 볼륨 제어 블록

: 파일 시스템에 대한 메타데이터 저장하고 볼륨 및 파티션 관리를 해 주는 블록

볼륨 제어 블록은 볼륨의 블록 수, 블록의 크기, 가용 블록의 수와 포인터, 가용 FCB 수와 포인터 같은 볼륨 정보를 포함하고 있다.

☁️ 사용

  • 파일 시스템이 [1]마운트될 때
  • 파일 시스템 정보에 접근할 때
  • 디스크 상태가 변경될 때

외에도 파일 시스템 크기 조정, 마운트 해제 등 다양한 상황에서 사용된다.

cf) UFS에서는 슈퍼 블록, NTFS에서는 마스터 파일 테이블 (master file table) 이라 불린다.

💡 마운트

: 파일 시스템을 디렉터리 계층 구조의 특정 디렉터리와 연결하는 것

✨ 3. 디렉터리 구조

  • UFS : 디렉터리 구조에 파일 이름 및 해당 inode 번호 저장
  • NTFS : 마스터 파일 테이블에 파일 이름 및 해당 inode 번호 저장

여기서 헷갈리지 말아야 할 점은 디렉터리와 파일의 취급 방식이다.

UFS에서는 디렉터리 구조가 별도로 존재하지만 파일과 디렉터리를 동일하게 취급해 같은 방식(inode)으로 관리된다.

반면 NTFS는 볼륨 제어 블록 (마스터 파일 테이블)에 디렉터리와 관련된 정보(디렉터리 구조)도 함께 포함하지만 디렉터리와 파일은 다른 방식으로 관리된다.

✨ 4. 파일 구조 (FCB)

: 각 파일에 대한 정보를 저장하는 구조

디렉터리와 연결을 위해 고유한 식별 번호를 가지고 있으며, NTFS에서 이 정보는 마스터 파일 테이블(MFT) 안에 저장된다.

각 파일은 MFT에 하나의 MFT 엔트리를 가지며, 이 엔트리에는 파일의 정보 및 실제 데이터 저장 위치, 파일 포인터 정보가 포함된다.

UFS에서는 inode로 FCB가 구현되어 있다.

🫧 파일 시스템 자료구조

메모리 내 정보는 마운트 시점에 적재되고, 파일 시스템 동작 중 갱신되며 마운트 해제 시 제거된다.

이러한 정보를 표현하기 위해 여러 자료구조가 사용된다.

다음은 가장 대표적인 자료구조 유형이다.

  1. 파티션 테이블
    -> 마운트된 모든 파티션 정보를 포함하는 테이블

  2. 디렉터리 구조
    -> 최근 접근된 디렉터리의 디렉터리 정보를 가지며, 이미 파티션이 마운트된 경우 파티션 테이블에 대한 포인터도 함께 가진다.

  3. 범 시스템 오픈 파일 테이블 (system wide open file table)
    -> 시스템 당 하나만 존재하며, 열린 파일에 대한 모든 정보(각 파일의 메타데이터)가 이 테이블에 저장된다.

  4. 프로세스별 오픈 파일 테이블 (per-process open file table)
    -> 프로세스 당 하나 존재하며, 프로세스가 연 모든 파일에 대한 정보가 포함되어 있다. 또한 범 시스템 오픈 파일 테이블 내 해당 파일에 대한 포인터도 포함한다.
    -> 참고로 프로세스가 연 모든 파일에 대한 정보 중에 파일명은 포함되어 있지 않다. FCB를 디스크에서 찾으면 시스템이 파일명을 더는 사용하지 않기 때문이다.

  5. 버퍼

🫧 파일 오픈(생성) 과정

새 파일 생성을 위해서는 파일이 반드시 오픈되어야 하며, open() 또는 creat()와 같은 시스템 호출을 사용되어야 한다.

다음은 파일 생성 과정을 간략하게 나타낸다.

해당 과정에서는 open()을 사용해 새 파일을 생성 및 오픈하였다.

  1. 논리적 파일명과 함께 open() 시스템 호출
  2. 범 시스템 오픈 파일 테이블 검색
  3. 파일이 이미 다른 시스템에 의해 사용 중이라면
    -> 이미 범 시스템 오픈 파일 테이블에 항목이 존재한다는 이야기이므로, 기존 범 시스템 오픈 파일 테이블을 가리키는 프로세스별 오픈 파일 테이블 항목 생성

  4. 파일이 사용되고 있지 않다면
    -> 주어진 파일 이름을 디렉터리 구조에서 찾고 FCB와 파일을 오픈한 프로세스 수를 범 시스템 오픈 파일 테이블에 추가한다.

  5. 프로세스별 오픈 파일 테이블의 항목에 대한 포인터를 open() 시스템 호출에 대한 리턴 값으로 전달한다.

전달된 포인터는 UNIX에서는 파일 디스크립터, Windows에서는 파일 핸들이라 부른다.

🫧 파일 닫기 과정

  1. 프로세스별 테이블 항 삭제
  2. 범 시스템 항목 오픈 계수 감소
  3. 만일 범 시스템 항목 오픈 계수가 0이라면
    -> 디스크 상의 디렉터리 구조에 파일 정보 업데이트 (수정 시간, 접근 시간 등)
    -> 범 시스템 오픈 파일 테이블에서 항목 삭제

🫧 참고 자료

  • [[OS] 디스크(Disk)/파티션(Partition)/볼륨(Volum)/파일시스템 용어 정리_카프리썬_/데엔잘하고싶은데엔 tistory](https://pearlluck.tistory.com/179)
  • [[마운트] $ mount, $ umount , /etc/fstab_markyang92/markyang92.log tistory](https://velog.io/@markyang92/mount)

카테고리:

업데이트: