파일 시스템

파일 관리자

  • 파일은 사용자가 직접 저장할 수 없고, 운영체제를 통해 저장장치(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에 추가한다.

    • 사용자는 파일이 삭제된 것처럼 느끼지만, 실제로는 데이터가 저장돼있다.

    • 포렌식을 통해 데이터를 복구할 수 잇는 이유임.

Last updated