[혼공컴운] Ch15 파일 시스템

Hyunjoon Choi·2023년 8월 20일
0

혼공컴운

목록 보기
15/15

📢 본 글은 혼공학습단 미션과 함께 정리해보는 글 입니다.

파일과 디렉터리

우리가 일상적으로 이용하는 파일과 디렉토리는 운영체제 내부에 있는 파일 시스템에 의해 관리된다.

파일 시스템

  • 파일과 디렉터리를 관리하는 운영체제 내의 프로그램
  • 파일과 디렉터리를 다루어주는 프로그램

파일과 디렉터리는 보조기억장치의 데이터 덩어리이다. 운영체제가 이것을 일목요연하게 관리한다.

파일

  • 보조기억장치에 저장된 관련 정보의 집합
    • 파일을 실행하기 위한 정보
    • 구성 정보
    • 부가 정보 (속성, 크기, 만든 날짜..)
  • 의미있고 관련 있는 정보를 모은 논리적 단위

파일의 속성


파일을 다루는 모든 작업들은 전부 운영체제에 의해 다뤄짐

= 어떤 응용 프로그램들도 임의로 파일에 접근하고 조작할 수 없으며 파일을 다루려면 운영체제에게 시스템 호출을 해서 요청해야 함 (파일 생성, 삭제, 열기, 닫기..)

디렉터리

  • 윈도우에서는 폴더 (folder)를 의미함
  • 예전에는 하나의 디렉터리 안에 여러 개의 파일들이 보관되었지만, 현재는 여러 개의 디렉터리가 계층적으로 구성되곤 함 (트리 구조 디렉터리)

이때, 최상위 디렉터리를 루트 (맥은 /, 윈도우는 C:₩) 디렉터리라고 하며, 나머지 디렉터리들을 서브 디렉터리라고 함

경로

  • 디렉터리를 이용해 파일/디렉터리의 위치, 이름까지 특정지을 수 있는 정보
  • 절대 경로: 루트 디렉터리에서 자기 자신에까지 이르는 고유한 경로 (ex: /home/etc/a.sh)
  • 상대 경로: 현재 디렉터리에서 자기 자신에까지 이르는 경로 (ex: 현재 디렉터리 경로가 /test일 경우 guest/d.jpg)
  • 같은 경로에는 동일한 이름의 파일 위치 불가능, 다른 경로는 가능

파일과 마찬가지로 어떠한 응용 프로그램도 임의로 디렉터리 연산 (디렉터리 생성, 삭제..)을 할 수 없으며 운영체제에게 시스템 호출 필요

디렉터리 엔트리

많은 운영체제에서는 디렉터리를 그저 특별한 형태의 파일로써 간주한다. 즉, 파일과 디렉터리를 특히 구분짓지는 않고 있다. 디렉터리의 내부에는 해당 디렉터리에 담겨있는 대상과 관련된 정보들이 있으며, 이 정보는 보통 테이블 표 형태로 구성되어 있다.


파일 시스템

파티셔닝과 포매팅

이제 막 공장에서 생산되어 한 번도 사용된 적 없는 새 하드디스크 또는 SSD는 이 과정을 거치지 않으면 사용할 수 없다.

파티셔닝

  • 파티셔닝은 저장 장치의 논리적인 영역을 구획하는 작업을 뜻한다.
  • 용량이 큰 저장 장치를 하나 이상의 논리적인 단위로 구획한다.
  • 나누어진 영역들 각각을 파티션 (partition)이라 한다.

포매팅

  • 파일 시스템을 결정함
  • 어떤 방식으로 파일을 관리할 지 결정, 새로운 데이터를 쓸 준비를 하는 과정
  • 저수준 포매팅 (물리적 포매팅), 논리적 포매팅 (파일 시스템 생성)이 있음. 대부분의 경우에는 논리적 포매팅에 대해 공부함
  • 파일 시스템에는 여러 종류가 있고 파티션마다 다른 파일 시스템을 설정할 수 있다.

파티셔닝과 포매팅은 동시에 진행되는 경우도 있고, 이미 포매팅까지 완료된 후 판매되는 경우도 있음.

파일 할당 방법

  • 포매팅까지 끝난 하드 디스크에 파일 저장
  • 운영체제는 파일/디렉터리를 블록 단위로 읽고 씀
    • 하나의 파일이 보조기억장치에 저장될 때는 여러 블록에 걸쳐 저장됨

하드 디스크의 가장 작은 단위는 섹터이지만 (Ch7 보조기억장치), 갯수가 많고 크기도 작기 때문에 관리가 어려워 운영체제는 하나 이상의 섹터를 블록이라는 단위로 묶은 뒤 파일과 디렉터리를 블록 단위로 읽고 씀

연속 할당 방법

보조기억 장치 내 연속적인 블록에 파일을 할당하는 방법

예시로 파일 a가 세 블록의 양을 차지할 만큼의 크기를 가졌다면 연속적인 블록에 저장되도록 함

이때 디렉터리 엔트리는 파일 이름, 첫 번째 블록 주소, 블록 단위 길이를 명시함

단점

  • 구현이 단순하지만 외부 단편화 야기 가능

    처음에 파일들이 아래와 같이 저장되어 있을 때, 특정 파일이 삭제된다면 해당 공간보다 더 큰 파일을 새로 보관할 수 없음

불연속 할당 방법 - 연결 할당

불연속 할당 방법은 오늘날 자주 사용되고 있는 방식

  • 각 블록의 일부에 다음 블록의 주소를 저장하여 각 블록이 다음 블록을 가리키는 형태로 할당
  • 파일을 이루는 데이터 블록을 연결 리스트로 관리
  • 파일이 여러 블록에 흩어져 저장되어도 무방함
  • 디렉터리 엔트리에는 파일 이름, 첫 번째 블록 주소, 블록 단위의 길이가 들어감
    • 디렉터리 엔트리에 첫 번째 블록 주소와 마지막 블록 주소를 기록할수도 있음

단점

  • 반드시 첫 번째 블록부터 하나씩 읽어들여야 한다. (파일의 임의의 위치에 접근하는 임의 접근 속도가 느릴 수 있음)
  • 오류 발생 시 해당 블록 이후 블록은 접근이 어려움

불연속 할당 방법 - 색인 할당

  • 파일의 모든 블록 주소를 색인 블록이라는 하나의 블록에 모아 관리하는 방식
  • 파일 내 임의의 위치에 접근하기 용이 (하나의 블록 안에 어떤 주소에 접근해야 하는지 전부 다 적혀있기 때문)
  • 디렉터리 엔트리에는 파일 이름과 색인 블록 주소가 저장됨

실제 파일 시스템

FAT 파일 시스템

  • 연결 할당 기반 파일 시스템
  • 연결 할당의 단점 보완: 각 블록에 포함된 다음 블록 주소를 한 데 모아 테이블 (FAT: File Allocation Table)로 관리
  • FAT 데이터가 메모리에 캐시될 수 있어 임의 접근 속도가 더 개선될 수 있음
  • FAT 영역에 FAT가 저장되고, 루트 디렉터리 영역 이후 데이터 영역에 파일과 디렉터리가 저장됨
  • 디렉터리 엔트리에는 파일 이름, 확장자, 속성, 예약 영역, 생성 시간, 마지막 접근 시간, 마지막 수정 시간, 시작 블록, 파일 크기가 명시됨
  1. 루트 디렉터리 접근
  2. home 디렉터리는 3번에 있음
  3. minchul 디렉터리는 15번에 있음
  4. a.sh 파일은 9번에 있음
  5. FAT 참고: 9번 → 8번 → 11번 → 13번

유닉스 파일 시스템

  • 색인 할당 기반 파일 시스템
  • 색인 블록 == i-node
  • 파일의 속성 정보와 15개의 블록 주소 저장 가능
  • 파일마다 i-node를 갖고 있고, 고유한 번호가 부여되어 있으며, 이것만 봐도 어떤 파일이 어떤 속성을 가지며 어디에 저장되어 있는지도 알 수 있음
  • 디렉터리 엔트리에는 i-node 번호와 파일 이름이 저장됨
  • 파티션 내에 특정 영역에 모여서 저장되어 있음

그런데 15개 이상의 블록이 필요한 파일을 저장해야 한다면?

  1. 블록 주소 중 12개에는 직접 블록 주소 저장 (직접 블록: 파일 데이터가 저장된 블록)
  2. 1번으로 충분하지 않다면 13번째 주소에 단일 간접 블록 주소 저장 (단일 간접 블록: 파일 데이터를 저장한 블록 주소가 저장된 블록)
  3. 이래도 충분하지 않다면 14번째 블록에 이중 간접 블록 등을 활용하기도 함 (최대 15번째 블록에 삼중 간접 블록 사용)

  1. 루트 i-node 접근, home i-node (3번)파악 가능
  2. home i-node 접근, minchul i-node (8번) 파악 가능
  3. minchul i-node 접근, a.sh의 i-node (9번) 파악 가능
  4. 98번, 12번, 13번 읽으면 됨

부족하거나 보완할 점이 있다면 댓글 부탁드립니다 😃

profile
개발을 좋아하는 워커홀릭

0개의 댓글