> For the complete documentation index, see [llms.txt](https://sois-organization.gitbook.io/today-i-learned/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sois-organization.gitbook.io/today-i-learned/undefined-2/10..md).

# 파일 시스템

## 파일 관리자

* 파일은 사용자가 직접 저장할 수 없고, 운영체제를 통해 저장장치(HDD, SSD)에 저장된다.
* 운영체제는 파일을 관리하기 위해 **파일 관리자**를 사용하며, 이를 파일 시스템이라 부른다.
  * 파일 관리자는 파일 테이블을 통해 파일을 관리한다.

## 파일시스템의 기능

1. 파일, 디렉토리 생성
2. 파일, 디렉토리 수정 및 삭제
3. 파일 권한 관리
   * 다른 사용자로부터 파일을 보호하기 위해서
   * 현 운영체제는 다중사용자를 지원하므로, 꼭 필요한 기능이다)
4. 무결성 보장
   * 파일이 손상되지 않도록
5. 백업과 복구
6. 파일의 암호화

## 참고

* 하드디스크와 플래시 메모리(SSD)는 블록 디바이스이다.
* 파일 시스템은 저장장치에 저장된다 → 블록 디바이스이다.
  * 저장 장치의 전송단위는 블록이지만, 사용자는 Byte 단위로 접근해야한다. → 파일관리자가 변환한다.
* 파일은 헤더와 데이터가 존재하며, 헤더에는 파일의 속성이 저장되어있다.
* 운영체제는 파일 제어 블록(파일 디스크립터)를 가지고 있으며, 이는 파일마다 독립적으로 존재한다.
  * 저장장치에 존재하다가, 파일이 열리면 메모리로 이동한다.
  * 파일 시스템이 관리하며, 사용자의 직접 참조는 불가능하다.

## 파일의 구조

* 파일 = 데이터의 집합으로, 구성 방법으로 종류를 구분한다.

1. 순차 파일 구조
   * 파일의 내용이 연속적으로 이어져있다.
   * 파일 디스크립터는 파일의 맨 앞에 위치한다.
   * lseek 함수로 파일을 이동시킨다.
   * 장점: 모든 데이터가 순차적으로 기록되어 공간의 낭비가 없고, 구조가 단순하다.
   * 단점 : 특정 지점으로 바로 이동이 어려워서, 데이터를 삽입하거나 삭제하기 위해 탐색하려면 많은 시간이 걸린다.
2. 직접 파일 구조
   * 저장하려는 데이터를 해시함수를 통해 저장 위치를 결정한다.
   * 해시함수를 잘 골라야하며, 저장 공간 낭비의 단점이 존재한다.
3. 인덱스 파일 구조
   * 순차 접근과 직접 접근 방식의 장점이 존재한다.

***

## 디렉토리

* 1개 이상의 파일을 가질 수 있으며, 자식 디렉토리를 가질 수 있다.
  * 여러 층으로 구성되며, 최상위 디렉토리를 루트 디렉토리라고 한다.
* 유닉스의 경우 루트 디렉토리와 디렉토리 구분을 /로 사용한다.
* 윈도우의 경우 루트 디렉토리는 파티션 이름 (C:), 디렉토리 구분은 \로 사용한다.
* 디렉토리도 하나의 파일이다.
  * 파일에는 데이터가 저장되며, 디렉토리에는 파일의 정보가 저장 돼 있을 뿐이다.
  * 현재 디렉토리 : `.`
  * 상위 디렉토리 : `..`
  * 루트 디렉토리의 경우, 상위 디렉토리가 없기 떄문에 점 두개도 자기 자신을 가리킨다.
* 디렉토리는 순환이 있는 트리이다. (바로가기 기능때문에)
  * 현재는 다단계 디렉토리구조이다.

***

## 파일과 디스크

## 파일시스템(디스크)

* 파일 정보를 파일 테이블로 관리한다.
  * 페이징처럼 디스크의 공간을 일정한 크기로 나누고, 해당 공간에 주소를 할당하여 관리한다.
  * 나눈 공간을 블록이라고 부른다. (크기 : 1\~8KB)
* 파일이 시작하는 위치 정보도 담겨있다.
  * 파일은 여러 개의 블록으로 연결된다.

## 연속 할당

* 디스크에 연속적으로 저장한다.
* 파일의 시작만 알면, 파일의 전체를 알 수 있다.
* 외부 단편화가 발생하기 때문에 사용되지 않는다.

## 불연속 할당

* 디스크의 비어있는 공간에 데이터를 분산해서 할당한다.
* 파일 시스템이 관리한다.
* 연결 할당과 인덱스 할당이 존재한다.
* 디스크를 나누는 크기가 1KB라면, 낭비되는 공간은 줄지만 관리해아할 블록의 수가 많아진다.
* 디스크를 나누는 크기가 8KB라면, 관리해야할 블록 수는 줄지만, 낭비되는 공간이 많아진다.

1. 연결 할당
   * 파일에 속한 데이터를 **연결리스트**로 관리한다.
   * 파일 테이블에는 시작 블록에 대한 것만 저장한다.
     * 시작부터 null이 나올 때까지 참조하여 모든 데이터를 참조할 수 있다.
2. 인덱스 할당
   * 테이블의 블록 포인터가 데이터 블록이 아닌 **인덱스 블록을 연결**한다.
   * 데이터가 많아서 테이블이 가득 차면, 인덱스 블록을 더 만들어 연결한다. (**테이블의 확장** 가능)
   * 파일의 크기가 작다면, 데이터를 바로 참조하는 블록 포인터를 이용하고, 파일의 크기가 크다면 간접 데이터를 이용해 많은 데이터에 접근할 수 있다.
   * 더 큰 데이터가 필요하면, 이중 간접 포인터, 삼중 간접 포인터를 활용할 수 있다.

## 파일 시스템의 효율적인 관리

* 파일을 저장할 때마다 빈 공간을 찾는 것은 비효율적이다.
* 파일 시스템은 효율적인 관리를 위해 free block list를 가진다.
* 특정 파일을 삭제하면, 파일의 모든 정보를 지우는 것이 아니라, 파일 테이블의 헤더를 삭제하고 free block list에 추가한다.
  * 사용자는 파일이 삭제된 것처럼 느끼지만, 실제로는 데이터가 저장돼있다.
  * 포렌식을 통해 데이터를 복구할 수 잇는 이유임.
