[CS] Chapter 11 파일 시스템

Ringo·2024년 11월 7일

Computer Science

목록 보기
15/16
post-thumbnail

📌 파일과 파일 시스템

1. 파일 시스템의 개요

파일 시스템의 개념

운영체제는 사용자가 직접 파일을 보관하거나 접근하지 못하도록 합니다. 대신 파일을 보관하고 관리하는 파일 관리자를 두어 저장장치의 전체 관리를 맡기는데 이를 파일 시스템이라고 합니다. 파일 시스템에서 파일 관리자는 사용자의 요청에 따라 파일을 저장하거나 파일의 내용을 읽어옵니다.

사용자가 특정 파일에 접근하려면 파일 관리자로부터 파일에 접근할 수 있는 권한(키)을 획득해야 하는데, 파일 접근 권한을 파일 디스크립터(file descriptor)라고 합니다.

파일 시스템의 기능

운영체제마다 파일 시스템이 조금씩 다른데, 윈도우의 경우 XP 이전의 초기 버전에서는 FAT(File Allocation Table)을 사용했고, 현재는 NTFS(New Technology File System)를 사용합니다. 유닉스는 아이노드(Inode, Index, node)파일 시스템을 사용합니다.

파일 테이블의 구성도 운영체제마다 다른데 공통적으로 아래 표와 같은 기능을 수행합니다. 파일을 한 곳에 보관하면 관리하기 어렵기 때문에 파일 시스템에서는 방을 여러 개 만들어 파일을 저장합니다. 이러한 방들을 유닉스에서는 디렉터리, 윈도우에서는 폴더라고 부릅니다.

기능설명
파일 및 디렉터리 구성사용자의 요구에 따라 파일과 디렉터리를 만듭니다.
파일 및 디렉터리 관리파일 및 디렉터리의 생성, 수정, 삭제 등을 관리하며, 사용자가 파일 및 디렉터리에 접근할 수 있도록 합니다.
접근 방법 제공파일과 디렉터리에서 읽고 쓰고 실행할 수 있도록 사용자에게 접근 방법을 제공합니다.
접근 권한 관리다른 사용자에게서 파일 및 디렉터리를 보호하기 위해 접근 권한을 관리합니다.
무결성 보장파일 내용이 손상되지 않도록 무결성을 보장합니다.
백업과 복구파일을 보호하기 위해 백업과 복구 작업을 합니다.
암호화파일을 암호화하여 악의적인 접근으로부터 파일을 보호합니다.

블록과 파일 테이블

수 TB의 저장 장치를 바이트 단위로 나누고 주소를 부여하려면, 매우 큰 주소 체계가 필요합니다.

블록 : 저장장치에서 사용하는 가장 작은 단위

저장장치에서는 파일을 일정 크기로 묶어서 관리하는데 이를 블록이라고 합니다.
한 블록에 주소 하나가 할당되며 운영체제와 저장장치 사이에서는 파일을 블록 단위로 전송합니다.

2. 파일

파일 종류와 확장자

모든 파일은 0과 1의 비트 패턴(bit patter)으로 이루어지며, 운영체제 입장에서는 크게 실행 파일과 데이터 파일로 나뉩니다.

실행 파일 : 운영체제가 메모리로 가져와 CPU를 이용하여 작업하는 파일

데이터 파일 : 실행 파일이 작업하는 데 필요한 데이터를 모아놓은 파일

데이터 파일은 스스로 프로세스가 될 수 없고, 운영체제가 전송하거나 보관만 할 뿐 특별하게 다루지 않습니다.

파일확장자설명
실행 파일exe, com유닉스에는 실행 파일 확장자가 없음
소스코드 파일c, cpp, pas, a, java다양한 소스코드의 확장자
라이브러리 파일lib, a, dll소스코드를 위한 라이브러리의 확장자
배치 파일bat, sh, csh초기 배치 파일의 확장자
문서 파일txt, doc, hwp, pdf, ps 등문서 데이터 파일의 확장자
동영상 파일avi, asf, mkv, mov, rmv동영상 데이터 파일의 확장자
음악 파일wav, mp3, ogg, flc, aac음악 데이터 파일의 확장자
이미지 파일bmp, gif, jpg, png, webp이미지 데이터 파일의 확장자
압축 파일rar, zip, arc, al압축 파일의 확장자

파일 이름

파일 이름은 '파일이름, 확장자'형태로 구성됩니다. 파일 이름과 관련하여 유의할 사항은 다음과 같습니다.

  1. 초창기 운영체제에서는 파일 이름 8자, 확장자 3자로 제한되었습니다.
  2. 파일 이름에 마침표(.)를 여러 번 사용할 수 있지만 마지막 마침표 다음 글자는 확장자로 인식합니다.
  3. 파일 이름은 현재 경로를 포함하여 최대 255자로 나타낼 수 있습니다.
  4. 파일 이름에는 영문자, 숫자, 붙임표(-), 밑줄(_), 마침표(.)를 주로 사용합니다. 윈도우에서는 파일 이름에 스페이스바와 &, ~ 등의 특수문자는 사용할 수 있지만 |, /, ;, *, ?, "", <>, 등의 특수문자는 사용할 수 없습니다. 또한 대문자와 소문자를 구분하지 않습니다. 유닉스에서는 파일 이름에 스페이스바를 포함하여 대부분의 특수문자를 사용할 수 없습니다. 또한 대문자와 소문자를 구분하므로 파일 이름을 붙일 때 주의해야 합니다.

파일 연결 프로그램

윈도우에서 실행 파일을 더블클릭하면 프로세스가 생성되며 실행되고 데이터 파일을 더블클릭하면 해당 파일을 사용하는 응용 프로그램이 실행됩니다. 이러한 프로그램을 연결 프로그램이라고 합니다.

파일 확장자도 바꿀 수 있습니다. 주의할 점은 확장자를 바꾼다고 해서 내용이 바뀌지는 않습니다.

파일 속성

파일 속성은 각 파일 헤더에 기록되며, 운영체제는 이러한 파일 헤더를 파일 테이블에서 관리합니다.

속성특징
name파일 이름
type파일 종류
size파일 크기
time파일에 대한 접근 시간
location파일 위치
accessibility파일에 대한 접근 권한
owner파일 소유자

파일 작업

파일을 지우거나 이름을 바꾸는 것과 같이 파일을 변경하는 일을 파일 작업 또는 파일 연산(file operation) 이라고 합니다.

파일 내용을 변경하는 작업은 프로세스 입장에서 수행하는 것으로, 다음과 같이 주로 함수 형태로 이루어집니다.

작업설명작업설명
open()파일을 엽니다.write()파일에 새로운 내용을 씁니다.
create()새로운 파일을 생성합니다.update()파일 내용 중 일부를 변경합니다.
close()파일을 닫습니다.insert()파일에 새로운 내용을 추가합니다.
read()파일 내용을 읽습니다.delete()파일 내용 중 일부를 지웁니다.

파일 헤더

파일 크기, 만든 날짜, 접근 권한과 같은 파일 속성은 모든 파일에 공통으로 적용됩니다. 파일 속성과 달리 파일마다 자신에게 필요한 정보를 따로 정의하여 사용할 수 있는데, 이는 파일 헤더(header)에 기록됩니다.

3. 저장장치 관리 기법

파티션

저장장치를 2개 이상의 묶음으로 나누는 것을 파티션을 나눈다고 하며 파티션은 디스크를 논리적으로 분할하는 작업입니다.

  • 윈도우 드라이브 관리 시 유의점
    윈도우에서 드라이브를 사용할 때는 다음 두 가지 사항을 유의해야 합니다.
  1. C, D, E 드라이브로 나눠서 사용할 것을 권장합니다. 예를 들어, C 드라이브에는 운영체제와 각종 응용 프로그램, D 드라이브에는 문서, 사진, 영화 등의 일반 데이터, E 드라이브에는 중요한 데이터를 백업하는 용도로 사용하는 것이 좋습니다. 이렇게 디스크를 나누어 사용하면 시스템 오류나 바이러스로 운영체제를 새로 설치해야 할 때 C 드라이브만 포멧하면 되어 편리합니다. 또한 중요한 데이터는 E 드라이브에 백업되어 있어 중요 데이터를 잃을 가능성도 줄어듭니다.
  2. C 드라이브에는 개인적인 데이터를 저장하지 말고 드라이브를 넉넉하게 비워 둘 것을 권장합니다. 개인적인 데이터를 C 드라이브에 저장하면 운영체제를 새로 설치할 때 잃어버릴 가능성이 있습니다. 그리고 가상 메모리에서 설명한 스왑 영역이 C 드라이브에 있기 때문에 C 드라이브에 여유 공간이 없으면 스왑 영역으로 사용할 공간이 줄어들어 메모리 관리에 문제가 생깁니다.

포맷

포맷(format)은 저장장치의 파일 시스템을 초기화하는 작업입니다. 파일 테이블이 없는 저장장치를 포맷하면 파일 테이블이 새로 탑재되고, 파일 테이블이 있는 저장장치를 포맷하면 파일 테이블이 초기화되어 아무것도 저장되지 않은 처음 상태로 돌아갑니다.

포맷은 빠른 포맷과 느린 포맷으로 나뉩니다.

빠른 포맷 : 데이터는 그대로 둔 채 파일 테이블만 초기화 하는 방식

기존에 저장된 데이터는 저장장치에 그대로 남지만 사용자에게는 보이지 않습니다.

느린 포맷 : 파일 테이블을 초기화할 뿐 아니라 블록의 모든 데이터를 0으로 만듦

포맷하는데 시간이 많이 걸립니다. 한편, 느린 포맷을 하는 동안에는 데이터를 저장할 수 없는 불량 섹터를 찾으므로 오래 사용한 하드디스크, SSD, USB 메모리의 불량 섹터를 찾고 싶다면 느린 포맷을 하면 됩니다.

내부 단편화 : 낭비되는 공간

페이징 메모리 관리를 설명할 때 한 페이지의 크기를 너무 크게 하면 내부 단편화가 발생합니다.

전체 파일의 크기는 22.1GB인데, 파일에 할당된 저장장치(디스크)의 크기는 22.3GB로 약 200MB 차이가 납니다. 이 차이는 내부 단편화로 사용할 수 없게 된 부분입니다. 내부 단편화 때문에 전체 파일의 크기보다 저장장치에 할당된 파일의 크기가 더 큽니다.

조각 모음

하드디스크를 처음 사용할 떄는 데이터가 앞에서부터 차곡차곡 쌓이지만 파일을 저장했다가 지우기를 반복하면 중간중간 빈 공간이 생깁니다. 이를 조각화 또는 단편화라고 합니다.

반도체를 이용한 저장장치는 조각 모음을 하지 않아도 성능의 차이가 없습니다. 그리고 USB 메모리나 SSD의 소자에는 수명이 있습니다. 약 10,000번 사용하면 기능을 잃어버리는데 USB 메모리나 SSD에 조각 모음을 자주 하면 수명이 단축됩니다.

4. 파일 구조

파일은 하나의 데이터 덩어리입니다. 파일 구조는 이 덩어리를 어떻게 구성하느냐에 따라 순차 파일구조, 인덱스 파일 구조, 직접 파일 구조로 나뉩니다.

순차 파일 구조

일반 파일은 기본적으로 순차 파일 구조(sequential file structure)입니다. 순차 파일 구조는 파일 내용이 하나의 긴 줄로 늘어선 형태로 카세트테이프가 대표적인 예입니다.

장점

  1. 모든 데이터가 순서대로 기록되기 때문에 저장 공간에 낭비되는 부분이 없습니다.
  2. 구조가 단순하여 테이프는 물론 플로피디스크나 메모리를 이용한 저장장치에도 적용할 수 있습니다.
  3. 순서대로 데이터를 읽거나 저장할 때 매우 빠르게 처리됩니다.

단점

  1. 파일에 새로운 데이터를 삽입하거나 삭제할 때 시간이 많이 걸립니다. 중간에 데이터를 삽입하려면 데이터를 뒤로 밀어 빈 공간을 만들어야 하고, 중간에 데이터를 삭제하려면 남은 빈 공간을 메우기 위해 데이터를 앞으로 당겨야 합니다. 데이터의 변경이 잦은 경우에는 순차 파일 구조가 적당하지 않습니다.
  2. 특정 데이터로 이동할 때 직접 접근이 어렵기 때문에 앞에서부터 순서대로 움직여야 합니다. 데이터 검색에는 순차 파일 구조가 적당하지 않습니다.

인덱스 파일 구조

인덱스 파일 구조(index file structure)는 이러한 단점을 해결한 것으로 순차 파일 구조에 인덱스 테이블을 추가하여 순차 접근과 직접 접근이 가능합니다.

인덱스를 이용한 접근 방식을 인덱스 순차 접근(indexed sequential access)이라고 하며, 이렇게 구성된 파일을 ISAM(Index Sequential Access Method)파일이라고 합니다.

직접 파일 구조

직접 파일 구조(direct file structure) : 저장하려는 데이터의 특정 값에 어떤 관계를 정의하여 물리적인 주소로 바로 변환하는 파일 구조

  • 장점 : 해시 함수를 이용하여 주소를 변환하기 때문에 데이터 접근이 매우 빠르다

  • 단점 : 직접 파일 구조를 제대로 작성하려면 해시 함수의 선정이 매우 중요한데, 전체 데이터가 고르게 저장될 수 있는 해시 함수를 찾기가 쉽지 않다는 것입니다. 해시 함수를 잘 찾았다 해도 저장 공간이 낭비되는 문제가 있습니다. 모든 주소에 일정량의 데이터가 고르게 저장되지 않고 들쑥날쑥합니다. 이런 경우 빈 공간이 생겨서 저장장치의 이용 효율이 떨어집니다.

📌 디렉터리의 구조

1. 디렉터리의 개념

디렉터리는 관련 있는 파일을 하나로 모아놓은 곳으로 1개 이상의 자식 디렉터리(sub directory)와 1개 이상의 파일을 가질 수 있습니다.

최상위에 있는 디렉터리를 루트 디렉터리(root directory)라고 합니다. 슬래시(/)는 루트 디렉터리를 뜻합니다. 루트 디렉터리 아래에 program, windows, user라는 이름의 자식 디렉터리가 있습니다.

2. 디렉터리 파일

디렉터리도 파일입니다. 일반 파일에는 데이터가 담겨 있고 디렉터리에는 파일 정보가 담겨있습니다. 디렉터리에도 일반 파일과 마찬가지로 헤더가 있습니다. 디렉터리 헤더에는 디렉터리 이름, 마늗ㄴ 시간, 접근 권한 등의 정보가 기록되어 있습니다.

디렉터리에는 마침표(.) 파일과 2개 마침표(..) 파일이 있습니다. 마침표 파일은 자기 자신의 디렉터리를 가리키고, 2개 마침표 파일은 상위 디렉터리를 가리킵니다. 루트 디렉터리의 마침표 파일은 자기 자신을 가리킵니다. 2개 마침표 파일은 상위 디렉터리를 가리켜야 하지만 루트 디렉터리가 맨 위에 있기 때문에 자기 자신을 가리킵니다.

3. 경로

경로는 파일이 전체 디렉터리 중 어디에 있는지를 나타내는 정보입니다. 한 디렉터리에는 같은 이름을 가진 파일이 존재할 수 없지만, 서로 다른 디렉터리에는 같은 이름의 파일이 존재할 수 있습니다.

절대 경로(absolute path) : 루트 디렉터리를 기준으로 파일의 위치를 나타내는 방식

이는 루트 디렉터리에서 시작하는 절대적인 위치를 의미합니다.

상대 경로(relative path) : 현재 위치를 기준으로 파일의 위치를 표시하는 방식

상대 경로는 절대 경로와 달리 문자로 시작하며, 언제나 자신이 위치한 디렉터리를 기준으로 합니다.

디렉터리를 이동할 때는 cd(change directory)명령을 사용합니다. 현재 위치보다 아래에 있는 데이터에 접근할 때는 상대 경로를 사용하고 다른 디렉터리로 이동할 떄는 절대 경로를 사용합니다.

4. 디렉터리 구조

초기 파일 시스템의 디렉터리는 1단계 구조였습니다. 1단계 디렉터리 구조에서는 루트 디렉터리에 새로운 디렉터리를 만들 수 있지만 디렉터리 안에 자식 디렉터리를 만들 수 없습니다. 최대 1단계만 구현할 수 있으며 디렉터리 안에는 파일만 존재합니다.

1단계 디렉터리 구조는 매우 단순하지만 파일이 많아지면 사용하기 불편하여 다단계 디렉터리 구조가 등장하게 되었습니다. 다단계 디렉터리 구조는 단계 확장에 제약이 없고 디렉터리에 파일과 디렉터리를 둘 다 저장할 수 있습니다.

자료구조에서는 트리를 순환이 없는 그래프라고 정의합니다.

5. 마운트

파티션은 논리적인 디스크 분할로, 하나 또는 여러 개의 디스크를 파티션으로 나누어 사용할 수 있습니다. 윈도우에서 각 파티션이 따로 보이는 이유는 파티션마다 파일 테이블이 따로 존재하기 때문입니다.

사실 윈도우에서 파티션을 나눌 수밖에 없었던 이유는 초기 윈도우 개발 시의 파일 테이블 설계 문제에 있습니다. 윈도우 FAT16 파일 시스템의 최대 디스크 크기는 32GB입니다. 만약 100GB의 하드 디스크를 FAT16 파일 시스템으로 포맷하면 40GB, 40GB, 20GB의 세 파티션으로 나누어 써야 합니다. 이와 같이 초기 윈도우에서는 파일 시스템의 최대 디스크 크기가 제한되었기 때문에 파티션을 나누어 파티션마다 서로 다른 파일 테이블을 사용해야 했습니다.

유닉스에서는 하나의 파일 테이블에 여러 개의 파티션을 붙여서 사용하는데, 이렇게 여러 개의 파티션을 통합하는 명령어가 마운트입니다.

📌 디스크 파일 할당

1. 할당 방식

연속 할당과 불연속 할당

전체 디스크 공간을 같은 크기로 나누고 각 공간에 주소를 붙여서 관리합니다. 이때 같은 크기로 나뉜 공간 하나를 블록이라고 하는데 한 블록의 크기는 1~8KB 정도입니다.

일반적으로 하나의 파일은 여러 개의 블록을 사용하는데, 여러 개의 블록을 어떻게 연결하는지에 따라 연속 할당과 불연속 할당 방식으로 구분됩니다.

  • 연속 할당(contiguous allocation) : 파일을 구성하는 데이터를 디스크상에 연속적으로 배열하는 간단한 방식, 실제로는 사용되지 않습니다.

  • 불연속 할당(non-contiguous allocation) : 비어 있는 블록에 데이터를 분산하여 저장하고 이에 관한 정보를 파일 시스템이 관리하는 방식입니다.

연결 할당

연결 할당(linked allocation)은 파일에 속한 데이터를 연결 리스트로 관리하는 방식입니다. 파일 테이블에는 시작 블록에 대한 정보만 저장하고, 나머지 데이터는 시작 블록부터 연결하여 저장합니다. 파일의 맨 끝에 해당하는 불록에는 링크 대신 널을 삽입합니다.

연결 할당 방식은 테이블 형태로 관리됩니다. 테이블을 이용한 연결 할당 방식의 예로 윈도우의 FAT가 있습니다. FAT는 파티션 전체 블록에 대한 정보를 가진 테이블로, 열의 갯수가 그 파티션에 존재하는 블록의 갯수와 같습니다.

FAT는 버전에 따라 FAT12, FAT16, FAT32 가 있습니다. FAT 다음의 숫자는 파일 할당 주소의 최대 크기를 나타냅니다. 예를 들어 FAT16의 최대 주소 크기는 216이고 FAT32의 최대 주소 크기는 232입니다.

테이블을 이용한 방식의 단점은 하나의 파티션이 사용할 수 있는 디스크 용량이 테이블의 주소 크기로 제한된다는 점입니다. 예를 들어 FAT16은 16bit 주소를 사용하기 때문에 지원하는 최대 파티션의 크기가 32GB로 한정됩니다. 또한 32GB보다 큰 용량의 파티션을 지원하기 위해 만들어진 FAT32의 경우 8TB까지 지원하지만 파일 하나의 크기가 4GB로 한정됩니다. 이러한 이유로 현재 윈도우 운영체제는 64bit 주소를 지원하는 NTFS 파일 시스템을 사용하고 있습니다.

USB 메모리의 경우 대부분 FAT32를 사용합니다. USB 메모리에 4GB보다 큰 파일을 저장하려고 하면 빈 공간이 있어도 '빈 공간 없음'이라는 메시지가 뜹니다. 이는 FAT32가 4GB 이상의 파일을 지원하지 않아 발생하는 문제로, FAT32를 NTFS 파일 시스템으로 바꾸면 해결됩니다.

인덱스 할당

연결 리스트를 이용한 불연속 할당 방식은 구현하기 쉽지만 최대 할당 크기에 제한이 있다는 것이 문제입니다. 이러한 문제를 해결하기 위해 인덱스를 이용한 인덱스 할당(indexed allocation) 방식이 사용됩니다.

2. 빈 공간 관리

디스크에 파일을 저장할 때마다 모든 테이블을 뒤져서 빈 공간을 찾는 것은 비효율적입니다. 디스크의 내부 단편화를 줄이고 빈 공간을 효율적으로 관리하기 위해 파일 시스템은 빈 블록의 정보만 모아놓은 빈 공간 리스트(free block list)를 유지합니다.

파일 시스템에서는 파일 테이블의 헤더를 삭제하고, 사용했던 블록을 빈 공간 리스트에 등록하는 것을 파일 삭제로 간주합니다.

빈 공간 리스트를 보고 새로운 블록을 할당할 때는 리스트에 먼저 들어온 블록부터 할당합니다. 어떤 데이터를 지우고 새로운 데이터를 디스크에 넣을 때 방금 지워진 블록에 할당하는 것이 아니라 리스트에 있던 블록 중 맨 앞에 있는 블록에 할당합니다.

📌 유닉스 파일의 특징

유닉스의 파일 접근 패턴에서 첫 번째 자리를 제외한 나머지 아홉 자리는 rwx라는 세 덩어리로 구성됩니다. 여기서 r은 read, w는 write, x는 execute 권한을 의미합니다. rwx 덩어리 중 첫 번째 덩어리는 파일의 소유자 권한을, 두 번째 덩어리는 소유자가 속한 그룹의 권한을, 세 번째 덩어리는 소유자도 아니고 같은 그룹도 아닌 제삼자의 권한을 나타냅니다.

profile
끄적끄적…

0개의 댓글