(7) 파일 관리
- -
TL;DR (용어 정리)
파일
: 보조기억장치에 저장된 관련된 데이터 레코드들의 집합에 이름을 붙인 것디렉터리
: 모여있는 파일의 정보를 담고 있는파일
로 파일을 관리하고 추적하기 위해 사용함파일 시스템
: 운영체제와 모든 데이터, 프로그램의 저장과 접근을 위한 기법을 제공하는 것
들어가기 전에
프로세스 주소 공간에만 정보를 저장하면 다음과 같은 문제점이 발생한다.
- 제한된 양만 저장이 가능하고,
- 프로세스 종료시 정보가 사라지며
- 다수의 프로세스가 동시에 정보에 접근하기 어렵다.
따라서 Long-term Information Storage 의 필요성이 대두되었다. 디스크에 정보를 저장하면 메인 메모리보다 더 많은 정보를 저장할 수 있고, 프로세스가 종료되어도 정보가 사라지지 않으며 다수의 프로세스에서 정보를 동시에 접근할 수 있다.
👆 그렇다면 디스크에서 어떻게 정보를 찾고, 동기화 문제를 해결할 수 있을까?
이 문제를 파일이란 새로운 추상화를 통해 해결한다. 즉, 파일 시스템은 디스크에 존재하는 데이터를 저장하고 접근할 수 있는 기법을 제공한다.
✅ 파일
- 파일이란 "A named collection of related information"
- 보조기억장치에 저장된 관련된 데이터 레코드들의 집합이다.
- 모든 파일은 0과 1의 비트 패턴으로 이루어지고 크게 실행 파일과 데이터 파일로 나뉨
- 파일의 이름은
파일 이름.확장자
형태로 구성됨
👆 PC에서 사용하는 파일이란 단어는 무엇일까?
PC에서의 파일은 시스템 사용자가 이용할 수 있는 데이터의 실체를 의미한다. 그러나 사실 시스템도, 응용 프로그램도, 디스크에 저장되는 모든 단위는 파일이다. 운영체제는 다양한 저장 장치를 동일한 단위로 구분하기 위해 file이라는 단위를 사용하는 것이다.
👆 실행 파일과 데이터 파일
- 실행 파일은 운영체제가 메모리로 가져와 CPU를 이용하여 작업을 하는 파일로 사용자의 요청으로 프로세스가 된 파일을 의미한다.
- 데이터 파일은 실행 파일이 작업하는데 필요한 데이터를 모아놓은 파일로 스스로 프로세스가 될 수 없고, 전송되거나 보관만 된다.
ex) 이미지 뷰어 프로그램의 사진 파일, 뮤직 플레이어의 음악 파일 등
🔺 파일의 종류
파일은 크게 구분할 때 일반 파일, 디렉토리, 링크, 장치 파일이 있습니다.
- 일반 파일은 각종 실행 파일, 이미지 파일 등에 해당되고
- 디렉토리는 해당 디렉토리에 저장된 파일과 하위 디렉토리에 대한 정보를 저장하고
- 심볼릭 링크는 원본 파일을 대신하도록 하는 '바로가기' 파일이고
- 장치 파일은 하드 디스크나 키보드 등 각종 장치를 관리하기 위한 특수 파일입니다.
🔺 File Attribute
파일의 속성들은 각 파일 헤더에 기록되며, 운영체제는 파일 헤더를 파일 테이블에서 관리한다.
- name : 확장자를 포함한 전체 이름을 의미
- type : 실행 파일, 동영상 파일, 사진 파일 등 확장자로 구분
- size : 파일 용량을 의미
- time : 파일 접근 시간을 의미하며 만든 시간, 변경 시간, 최근 열어본 시간 등으로 세분화
- location : 파일의 위치, 이름과 확장자가 같은 두 파일은 한 디렉터리에 존재할 수 없음
- accessibility : 파일의 접근 권한을 의미
- owner : 파일의 소유자라는 의미, 윈도우에는 거의 없지만 유닉스에서는 자주 사용됨
운영체제가 관리하는 파일 헤더 외에 데이터 파일마다 자신에게 필요한 속성을 따로 정의할 때 고유 헤더를 사용한다.
🔺 File Operation
파일 자체를 변경하거나, 파일의 내용을 변경하는 작업들을 말한다.

🔺 File Structure
현대의 파일 시스템은 인덱스 파일 구조로, 파일을 저장할 땐 순차 파일 구조로, 파일에 접근할 땐 인덱스 테이블을 보고 파일에 직접 접근한다.
순차 파일 구조

인덱스 파일 구조

직접 파일 구조

🔺 File Protection
- Access Control : 파일에 대한 사용자의 접근 권한을 조절해 파일을 보호한다.
- Grouping : (UNIX) 전체 사용자를 owner, group, public 세 그룹으로 구분한 뒤 각 파일에 대해 세 그룹의 접근 권한을 3비트씩 표시한다.
- Password : 파일마다 password 를 둬서 파일을 보호한다.
✅ 디렉터리
- 파일을 관리하고 추적하기 위해 사용하는 개념
- 관련있는 파일을 하나로 모아놓은 곳으로, '모여있는 파일의 정보'를 담는 파일이다.
- 디렉터리는 여러 층으로 구성되고 최상위에 루트 디렉터리가 있다.
🔺 경로
- 절대 경로 : 루트 디렉토리 기준으로 파일의 위치를 나타내는 방식
- 상대 경로 : 현재 위치를 기준으로 파일의 위치를 표시
🔺 디렉터리 구조
1단계 디렉터리 구조

- 가장 간단한 구조의 디렉터리로 각 파일은 사용자가 다르더라도 서로 유일한 이름을 가져야 한다.
- 파일이 많아지거나 다수의 사용자가 사용하면 심각한 제약이 따른다.
2단계 디렉터리 구조

- 사용자 별로 디렉터리를 만들어 관리하는 방법이다.
- 사용자의 이름이나 계정 번호로 색인을 하고, 각 엔트리는 사용자 파일 디렉터리를 가리킨다.
- 파일 참조 시 사용자의 파일 디렉터리에서만 탐색하므로 파일 이름 충돌 문제가 발생하지 않지만, 다른 사용자 파일에 접근해야 할 경우 단점이 된다.
트리 디렉터리 구조

- 2단계 디렉터리 구조를 확장해 다단계 트리 구조로 만든다.
- 사용자들이 자신의 서브 디렉터리를 만들어 파일을 구성할 수 있도록 한다.
- 디렉터리의 각 항목은 일반 파일인지(0) 디렉터리 파일인지(1) 항목을 추가해 구분한다.
그래프 디렉터리 구조

- 디렉터리들이 서브 디렉터리와 파일을 공유할 수 있도록 허용한다.
- 트리 구조의 디렉터리를 일반화한 방식으로 링크 라고 불리는 새로운 디렉터리 항목을 통해 파일을 공유한다.
파일 시스템
파일 시스템은 디스크에 존재하는 데이터를 저장하고 접근할 수 있는 방법을 말한다.
- 컴퓨터 내 다양한 파일은 하드디스크나 CD 같은 저장 장치에 보관하는데, 이러한 파일들을 파일 관리자 를 두어 저장 장치의 전체 관리를 맡긴다. ⇒ 파일 시스템
- 파일 관리자는 파일 테이블을 이용해 파일을 관리하고, 파일 읽기, 쓰기, 실행과 같은 다양한 접근 방법을 제공한다. 이때 권한이 필요한데 이를 파일 디스크럽터(File Descriptor)라고 한다.
👆 파일 디스크립터
파일 디스크럽터란 유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용하는 개념으로, 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값이다.
- 프로세스가 실행 중에 파일을 Open하면
- 커널은 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않는 가장 작은 값을 할당해준다.
- 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터(FD)값을 이용해서 파일을 지칭할 수 있다.
✅ 블록 Block
- 블록은 저장 장치에서 사용하는 가장 작은 단위로 한 블록에 주소 하나가 할당되고,
- 데이터는 운영체제와 저장장치 간에 블록 단위로 전송된다.
- 블록의 크기는 시스템마다 다르다. (시스템이 정한 기본 크기를 사용하거나 직접 지정)
- 블록 크기를 너무 작게 설정하면 내부 단편화 현상이 줄어들지만 파일이 여러 블록으로 나뉘어 파일 입출력 속도가 느려진다.
✅ Layout
1) 하드 디스크는 다음으로 구성된다.
- MBR(Master Boot Record) : 기억 장치의 첫 섹터로 부팅에 사용된다.
- Partition table : 각 파티션의 정보가 담긴 테이블
- Disk Partition ( Partition1, Partition2, ....) : 각 파티션은 독립적인 파일 시스템이다.
2) 하드 디스크 내 하나의 파티션(파일 시스템)은 다음으로 구성된다.
- Boot block
- Super block : 파일 시스템에서 가장 중요한 정보들
- Free space mgmt : bitmap or pointer list
- I-nodes : 파일 블록의 속성과 디스크 주소를 갖고 있는 정보들
- UNIX 에서는 I-nodes 방식을 사용하지만 파일 시스템에서 파일을 어떻게 구현할 것이냐에 따라 달라진다.
- Root dir : 최상단의 정보
- Files and directories : 실제 데이터들
✅ 빈공간 리스트
- 파일 시스템은 디스크의 빈 공간을 효율적으로 관리하기 위해 빈 블록의 정보만 모아놓은 빈 공간 리스트를 유지한다.
- 파일 테이블의 헤더를 삭제하고 사용했던 블록을 빈 공간 리스트에 등록하는 것을 파일이 삭제된 것으로 간주
- 어떤 데이터를 지우고 새로운 데이터를 디스크에 넣을 때 방금 지워진 블록에 할당되는 것이 아니라 리스트에 있던 블록 중 맨 앞에 있는 블록에 할당
- Free space mgmt : 파일 시스템 내 디스크의 자유 공간을 어떻게 유지하고 관리할 것인지를 지정하는 변수
- Bitmap : 자유 공간(블락)의 리스트를 비트 맵을 구현
- list of pointer : 자유 공간을 링크드 리스트 형태로 연결시켜 가지고 있기
✅ 파일 복사
🔺 Hard Link
- 디렉터리 I-node에 해당 파일의 주소를 기록한다. (Point to same I-node)
🔺 Symbolic Link
- Link 유형의 새 파일을 만들어서 링크하고자 하는 파일의 경로 이름을 기록한다.
- 실제 파일의 owner 만 i-node를 가리키는 포인터를 갖고 있고, 링크한 다른 사용자들은 경로 이름만 가지고 있게 된다.
- Symbolic Link는 쉽게 말하면 바로가기 와 같다.
- 서로 다른 경로에 위치해 있지만 같은 File을 사용하도록 하는 Sharing 기법인 셈이다.
✅ 파일 구현 방식 (Implementing Files)
🔺 Contiguos Allocation
파일을 연속된 디스크 블록에 저장하는 방법
- 구현이 쉽다. (시작 주소와 block 개수만 알면 끝)
- 연속적으로 읽기 때문에 Read Performance가 좋다.
- 디스크 외부 단편화 문제가 있다.
⇒ CD-ROM처럼 파일 사이즈에 변화가 없는 시스템, 또는 동영상 서버처럼 파일 변경 없이 읽기만 하는 경우에 유용하다.
🔺 연결 할당 방식
파일에 속한 데이터를 연결 리스트로 관리하는 방식
- 디스크 외부 단편화가 없다 (물론 Internal은 항상 존재)
- 모든 디스크 블록을 사용할 수 있게 된다.
- Random 접근이 매우 느리다. (뒷 block 읽으려면 모든 block을 디스크 접근으로 읽어야 한다.)
- pointer로 사용될 몇 바이트 때문에 저장되는 데이터의 양이 block 2개가 될 수 있다.
🔺 파일 테이블 이용한 불연속 할당 (FAT)
- File Allocation Table(FAT)을 메모리에다 저장해둔다. 연결리스트에서 다음 블록을 가리키는 포인터 정보만 빼다가 테이블 만든 것
- Random access 가 쉬워진다. Disk access 아닌 Mem access로 해결되니까.
- 하나의 파티션이 사용할 수 있는 디스크 용량이 테이블의 주소 크기로 제한된다.
ex) FAT16은 16bit 주소 → 32GB - FAT 이 작지 않기 때문에 공간 차지를 꽤 하고, FAT 이 깨지거나 망가지면 시스템이 다 날아가기 때문에 Fault에 취약함
🔺 인덱스 이용한 물연속 할당 (Index-node)
- 테이블의 블록 포인터가 데이터 블록을 연결하는 것이 아니라, 데이터의 인덱스를 담고 있는 인덱스 블록(inode)을 연결
- 인덱스 노드는 파일 하나당 한 개씩 배치되고, 파일이 오픈될 때 메모리에 올린다.
- 인덱스 블록은 실제 데이터의 위치에 관한 정보를 순서대로 보관
- 테이블이 꽉 차서 더 이상 데이터를 연결할 수 없을 때는 인덱스 블록을 연결하는 간접 인덱스 블록(. index block)을 만들어 테이블을 확장할 수 있음
✅ 운영체제별 파일 시스템
- Windows : FAT(12/16/32), NTFS
- Linux : ext(2/3/4)
- MacOS : HFS, HFS+, APFS
- Google : GFS (구글 사내에서 사용하기 위한 파일 시스템)
이렇듯 운영체제별로 파일 시스템이 다르기 때문에 파일 읽기/쓰기/실행이 꼬이는 것이다.
🔺 FAT (File Allocation Table)
- FAT에 파일의 위치를 기록하고 관리한다.
- 저용량에 적합하고 보안성이 좋지 못하지만, 다양한 운영체제에서 지원해 호환성이 좋다.
🔺 NTFS
- FAT을 보완하기 위해 만들어진 윈도우 계열의 파일 시스템
- FAT이 아닌 MFT(Master File Table) 사용
- 이에 대한 미러와 파일 로그가 유지되어 파일 복구 가능하다.
- 대용량도 지원하고 보안과 암호화 또한 지원하지만, 다른 운영체제와 호환이 안된다.
🔺 EXT2
- 리눅스를 위한 확장성 있고 강력한 파일 시스템
- fsck를 이용해 파일 복구에 매우 강하다.
- 캐시에 저장되어 있는 데이터들을 디스크로 저장하는 도중에 문제가 발생하면 파일 시스템이 손상된다.
-> EXT3에선 저널링 이용해 파일 시스템 수정 전 저널에 수정 사항을 먼저 기록하는 것으로 해결
'CS > OS' 카테고리의 다른 글
(8) 입출력 시스템과 디스크 관리 (0) | 2023.05.05 |
---|---|
(6) 가상 메모리 (요구 페이징/ 페이지 교체 알고리즘) (0) | 2023.05.04 |
(5) 메모리 관리 전략 (페이징, 세그멘테이션) (0) | 2023.05.04 |
(4) Deadlock / 세마포어 & 뮤텍스 (0) | 2023.05.04 |
(3) 분산 시스템 / 멀티 프로세스 vs 멀티 스레드 (0) | 2023.05.04 |
소중한 공감 감사합니다