[OS 공룡책] Ch13. File-System Interfaces

Jnary·2024년 1월 21일
0

Operating System

목록 보기
12/14
post-thumbnail

File-System Overview

파일

  • 사용자 관점
    • 정보 저장, 관리하는 논리적인 단위
  • 컴퓨터 시스템 관점
    • 정보 저장하는 컨테이너
    • 0, 1 데이터
    • 파일이 저장되는 저장 장치
      • HDD, USB, SDD, 테이프 저장 장치
      • RAM Disk
  • 운영체제 역할
    • 파일 생성, 기록, 읽기의 모든 과정 관리
    • 응용프로그램 : OS 통해 파일 다룸 → 저장 매체, 빈 공간 등의 관리

파일 입출력 주소

  • 디스크 장치 : 디스크 물리 주소 사용
  • 운영체제 : 논리 블록 주소 사용
    • Logical Block Address (LBA)
    • 1차원의 연속된 데이터 블록 → 저장 매체 종류 관계 X
    • 0번부터 시작하는 블록 번호 → HDD : 맨 바깥쪽 실린더에서 안쪽으로, 맨 위 트랙에서 아래쪽으로
  • 응용프로그램 : 파일 내 바이트 주소(오프셋) 사용

파일 주소 변환

  1. 응용프로그램 : 파일 내 바이트 주소
  2. 운영체제 : 논리 블록 주소
    • 파일 내 바이트 주소 → 논리 블록 주소 변환
    • 파일을 블록 크기로 분할
    • 각 블록 디스크에 분산 저장
    • 블록 : 운영체제가 입출력하는 단위
  3. 디스크장치 : 물리 주소
    • 디스크장치 펌웨어 : 논리주소 → 물리주소 변환

파일 입출력 계층

  1. 응용 프로그램
  2. 파일 입출력 C 라이브러리
  3. 파일 입출력 커널 코드
    • 파일의 바이트 주소 → 논리 블록 주소 변환
    • 파일이 어느 블록에 있는지 찾아야 함
  4. 디스크 드라이버
  5. 물리적 입출력 시행
  6. 디스크 캐시
  7. 블록 저장하는 버퍼 캐시
  8. c 라이브러리 버퍼

파일 시스템 구조

  • 트리 계층 구조
    • 루트 디렉토리
    • 서브 디렉토리
    • 디렉토리도 하나의 파일
  • 논리적 구성 & 물리적 구성

디렉토리와 파일 경로명

  • 디렉토리
    • 논리적인 관점
      • 여러 파일, 서브 디렉토리를 포함하는 컨테이너
      • 파일에 대한 경로 제공
    • 물리적인 관점
      • 디렉토리도 파일로 구현
      • 서브디렉토리, 위치정보, 속성등을 저장
  • 파일 이름과 경로명
    • 루트 디렉토리에서부터 파일에 이르기까지의 계층 경로

파일 시스템을 다루기 위한 메타 정보

  1. 파일 시스템 메타 정보 : 파일 시스템 전체에 관한 정보
    • 파일 시스템 전체 크기, 현재 사용 크기
    • 저장 장치에 구축된 파일 시스템의 비어있는 크기
    • 저장 장치의 빈 블록 리스트
    • 저장 위치 : 저장 매체의 특별한 위치에 저장 (쉽게 읽고 쓰기)
  2. 파일 메타 정보 : 파일에 관한 정보
    • 파일 이름, 파일 크기, 저장된 위치
    • 파일 생성시간, 최근 접근 시간, 파일 수정 시간 등의 파일 속성
    • FCB에 저장 (ex. i-node)

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

  • 파일 시스템 종류
    1. FAT (File Allocation Table)
      • MS-DOS에서 사용
      • NTFS의 근간
      • 확장성 부족
    2. UFS (unix File System) : Unix에서 사용
    3. ext2, ext3, ext4 : Linux에서 사용
    4. HFS (Hierarchical File System)
      • Windows3.1부터 지금까지 사용
      • FAT 개선, Linux에서도 지원
  • 구현 이슈
    • 디스크에 파일 시스템 포맷 → 비어 있는 블록들의 리스트 어떻게 관리?
    • 파일 블록 할당/배치 관리 → 파일 블록들 디스크의 어느 영역에 분산 배치?
    • 파일 블록 위치 관리 → 파일 블록들이 저장된 디스크 내 위치들 어떻게 관리?

FAT File-System

FAT 파일 시스템

  • boot sector
    • 섹터 1개
    • 운영체제 초기 코드를 적재하고 실행시키는 코드
  • FAT1, FAT2
    • FAT : 파일 블록들의 할당 테이블
    • FAT2 = FAT1의 복사본
  • 루트디렉토리
    • 고정 크기
    • 생성되는 파일이나 서브 디렉토리 개수 유한
  • 데이터 블록
    • 파일 블록들이 저장되는 곳
    • 파일 : 블록들로 분할되어 분산 저장
  • 디렉토리
    • 파일, 서브디렉토리 목록을 담은 특수 파일
    • 파일 이름 8.3형식 : 최대 8글자 + 확장자 3글자
    • 디렉토리 항목 : 32B 크기로 하나의 파일에 대한 메타 정보 저장

파일 블록 배치

  • FAT 파일 시스템의 파일 블록 저장
    • 파일 데이터 블록 단위로 디스크에 분산 저장
    • 파일 메타 데이터 : 디렉토리에 저장
    • 저장된 파일 블록들의 위치 → FAT 테이블에 기록
  • FAT 테이블
    • 저장된 파일 블록 번호들이 담겨있는 테이블
    • 테이블 항목
      • 디스크 블록 번호 = FAT 항목 번호
      • 다음 디스크 블록 번호 저장 (다음 FAT 항목 가리킴)
      • 저장된 번호 -1 → 파일 끝 저장된 번호 0 → 빈 블록
    • FAT 항목 : 연결리스트로 연결
    • FAT 손상 (심각한 문제) → FAT2 백업으로 해결

파일이 저장된 모든 블록 알아내기

  • 파일이 포함된 디렉토리 항목 검색
  • 디렉토리 항목
    • 해당 파일이 시작되는 FAT 항목 번호 저장
    • 해당 파일의 크기 저장
    • 파일 크기 + 시작 블록 번호 → FAT 테이블 연결 리스트 방식으로 검색
  • 하나의 파일을 읽는 데 여러번의 디스크 탐색(seek) 필요 → 분산 저장돼서
  • FAT 한 항목 크기 16bit, 블록 4KB
    • 접근 가능한 블록 수 2^16-2 = 대략 2^16개 → 0번(비어있는 데이터 블록), 1번(예약) 제외
    • FAT 파일 시스템이 저장할 수 있는 최대 데이터양 2^16 x 4KB = 2^16 x 2^12 = 2^28바이트 = 256 x 2^20 = 256MB

FAT 파일 시스템의 파일 할당

  • 파일의 메타 데이터 : 디렉토리 엔트리에 저장
    • 시작하는 FAT 테이블 엔트리 번호
    • size (9000B) → 한 블록 4KB : FAT 테이블 엔트리 3개로 구성

Unix File-System

Unix 파일 시스템 구조

  • boot block
    • 부팅 시 메모리에 적재되어 실행되는 코드
    • 운영체제 적재하는 기능
  • super block
    • 파일 시스템 메타 정보 저장
  • i-node
    • 파일 하나당 1개 i-node 필요
    • 파일 메타 정보 저장
    • i-node 번호만 알면 파일 하나에 대한 정보 모두 읽을 수 있음
  • i-node 리스트
    • i-node 리스트 크기 : 포맷 시 결정 → 고정
    • 파일 생성 시 빈 i-node 할당 (0번부터 시작)
    • 루트 리덱토리의 i-node 번호 super block에 기록 (Linux : 2, Unix : 1)
  • data block
    • 파일, 디렉토리 저장

Unix 파일시스템의 파일 블록 배치

  • 파일 : 블록 단위 분산 배치
  • i-node : 15개 인덱스
    • 12개 직접 인덱스
      • 가리킬 수 있는 파일 크기 : 12 x 4KB = 48KB
    • 1개 간접 인덱스
      • 디스크 블록 가리킴 : 파일 블록 번호 집합
      • 한 블록 4KB, 블록 번호 32bit(4B) → 가리킬 수 있는 파일 블록수 = 4KB / 4B = 1024블록 파일 크기 1024 x 4KB = 4MB
    • 1개 2중 간접 인덱스
      • 파일 블록 수 : 1024 x 1024 블록
      • 파일 크기 : 1024 x 1024 x 4KB = 4GB
    • 1개 3중 간접 인덱스
      • 파일 블록 수 : 1024 x 1024 x 1024 블록
      • 파일 크기 : 1024 x 1024 x 1024 x 4KB = 4TB
  • Unix 파일 최대 크기
    • 48KB + 4MB + 4GB + 4TB

파일의 i-node 찾기

  • 파일 블록들 위치 : i-node 15개 인덱스로 파악

  • /usr/source/main.c 파일 찾는 과정

    • 루트디렉토리(/)의 i-node 번호 찾기 : super block
    • 루트디렉토리의 i-node 읽기
    • /usr의 i-node 번호 알아내기
    • /usr 디렉토리 읽고 /usr/source 파일의 i-node 번호 알아내기
    • /usr/source 디렉토리 읽고 /usr/source/main.c 파일의 i-node 번호
    • /usr/source/main.c 파일 읽기

파일 입출력 연산

  • 파일 열기

    1. 파일 이름으로 i-node 번호 알아내기

      → 파일 존재X, 접근 권한X : 오류

    2. 디스크 i-node를 커널 메모리의 i-node 테이블에 적재

    3. 오픈 파일 테이블에 항목 생성 : i-node 주소 기록

    4. 프로세스별 오픈 파일 테이블에 항목 생성

      • 프로세스별 오픈 파일 테이블에 항목 할당
      • 파일 테이블의 주소 기록
    5. open() : 프로세스별 오픈 파일 테이블 항목 번호(정수) 리턴

      • 항목 번호 = file descriptor
      • 응용프로그램 : 파일 입출력 시 file descriptor 사용
  • 파일 읽기 read() 과정

    1. read(fd, …) : fd 번호의 프로세스별 오픈 파일 테이블 참조

    2. 파일 테이블 참조

      → R(읽기 허용)모드 X : 오류

    3. i-node 참조

      • i-node에서 파일 블록들의 리스트 확보
      • 파일 테이블 항목에 적힌 offset 확인
      • offset → 파일 블록 번호 변환
    4. 해당 블록이 버퍼 캐시에 있는지 확인

      • 없으면, 버퍼 캐시 할당 → 디스크에서 버퍼캐시로 읽기
      • 버퍼캐시 dirty면, 버퍼 캐시에 있는 블록 디스크에 쓰기
  • 파일 쓰기 write() 과정

    1. write(fd, ..) : fd 번호의 프로세스별 파일 테이블 참조

    2. 파일 테이블 참조

      → W(쓰기 허용)모드 X : 오류

    3. i-node 참조

      • i-node에서 파일 블록들의 리스트 확보
      • 파일 테이블 항목에 적힌 offset 확인
      • offset → 파일 블록 번호 변환
    4. 해당 블록이 버퍼 캐시에 있는지 확인

      • 있으면, 사용자 영역에서 버퍼캐시에 쓰기
      • 없으면, 버퍼캐시 할당 → 디스크블록을 버퍼 캐시로 읽어 들이기
    5. 사용자 공간의 버퍼에서 버퍼 캐시로 쓰기

    6. 추후 버퍼캐시가 교체, 플러시될 때 버퍼 캐시의 내용이 저장 장치에 기록

  • 파일 닫기 close() 과정

    1. 프로세스의 오픈 파일 테이블 항목에 기록된 내용 지우기
    2. 지우기 전에, 파일 테이블의 항목 찾고 (지우고) 반환하기
    3. 반환하기 전에, 메모리 i-node의 사용 해제
    4. 버퍼 캐시에 있는 이 파일의 블록들이 수정, 새로 만든 블록인 경우 디스크에 기록
profile
숭실대학교 컴퓨터학부 21

0개의 댓글