컴퓨터 과학에 대한 지식을 습득하고 정리하는 기록용 포스팅입니다.
예외를 판단하는 사고를 기르고, 효율적인 코드를 작성하기 위해
컴퓨터 과학 지식을 활용하는 것을 목표로 합니다.
운영체제는 사용자가 직접 파일을 보관하거나 접근하지 못하도록 하기 위해, 대신 파일을 보관하고 관리하는 파일 관리자를 두어 저장 장치의 전체 관리를 맡기는데 이를 파일 시스템
이라고 한다.
가상 메모리에서 메모리 관리자가 메모리 매핑 테이블
을 사용하여 가상 주소를 물리 주소로 변환하는 것과 마찬가지로, 저장 장치에서는 파일 관리자가 파일 테이블
을 사용하여 파일을 관리한다.
윈도우의 경우 FAT
(File Allocation Table), 유닉스의 경우 I-node
와 같은 파일 할당 테이블을 유지한다.
데이터는 운영체제와 저장 장치 간에 블록 단위로 전송된다. 블록은 저장 장치에서 사용하는 가장 작은 단위로, 한 블록에 주소 하나가 할당 된다.
메모리는 바이트
단위로 저장되고, 하드 디스크의 물리적인 구조상 가장 작은 저장 단위는 섹터
이다.
섹터마다 주소를 부여하면 너무 많은 양의 주소가 필요하기 때문에 파일 관리자는 여러 섹터를 묶어 하나의 블록으로 만들고, 블록 하나에 주소 하나를 배정한다.
모든 파일은 0과 1의 비트 패턴으로 이루어지며, 운영체제 입장에서는 크게 실행 파일
과 데이터 파일
로 나뉜다.
실행 파일
: 운영체제가 메모리로 가져와 CPU를 이용하여 작업을 하는 파일이다. 즉, 사용자의 요청으로 프로세스가 된 파일을 말한다.
데이터 파일
: 실행 파일이 작업하는 데 필요한 데이터를 모아놓은 파일이다.
실행 파일과 데이터 파일은 둘 다 더블클릭하면 실해외딕 때문에 데이터 파일을 실행 파일로 착각하기 쉽다. 그러나 데이터 파일이 필요로하는 응용 프로그램을 운영체제가 실행하는 것이지 데이터 파일 자체가 실행되는 것은 아니다.
일반 파일은 기본적으로 순차 파일 구조이다. 순차 파일 구조는 파일 내용이 하나의 긴 줄로 늘어선 형태로 카세트 테이프가 대표적인 예이다.
장점
1. 모든 데이터가 순서대로 기록되기 때문에 저장 공간에 낭비되는 부분이 없다.
2. 구조가 단순하다.
3. 순서대로 데이터를 읽거나 저장할 때 매우 빠르게 처리된다.
단점
1. 파일에 새로운 데이터를 삽입하거나 삭제할 때 시간이 많이 걸린다.
2. 특정 데이터로 이동할 때 직접 접근이 어렵기 때문에 앞에서부터 순서대로 움직여야 한다.
순차 파일 구조에 인덱스 테이블
을 추가하여 순차 접근과 직접 접근이 가능하다.
현대의 파일 시스템은 인덱스 파일 구조로,
파일을 저장할 때는 순차 파일 구조로 저장하고, 파일에 접근할 때는 인덱스 테이블을 보고 원하는 파일에 접근한다.
데이터베이스
와 같이 데이터의 빠른 접근이 필요한 시스템에 사용된다.
저장하려는 데이터의 특정 값에 어떤 관계를 정의하여 물리적인 주소로 변환하는 파일 구조이다.
특정 함수를 이용하여 직접 접근이 가능한 파일 구조이며, 이때 사용하는 함수를 해시 함수
라고 한다.
해시 함수를 이용하여 주소를 변환하기 때문에 데이터 접근이 매우 빠르지만, 해시 함수를 선정하는 것이 큰 중요 포인트이다.
파일 시스템은 기본적으로 메인 메모리 시스템과 유사하다.
전체 디스크 공간을 같은 크기로 나누고 각 공간에 주소를 붙여서 관리한다.
이때 같은 크기로 나뉜 공간 하나를 블록이라하며, 한 블록의 크기는 1~8KB이다.
일반적으로 하나의 파일은 여러 개의 블록으로 사용하는데, 여러 개의 블록을 어떻게 연결하는지에 따라 연속 할당과 불연속 할당 방식으로 구분된다.
연속 할당 : 연속 할당은 파일을 구성하는 데이터를 디스크상에 연속적으로 배열하는 방식이다.
파일을 저장하거나 삭제하다 보면 빈 공간이 생기는데, 디스크에 남은 공간 중 파일의 크기와 맞는 연속된 공간이 없을 때는 연속 할당이 불가능하기 때문에 실제로 사용되지 않는다.
불연속 할당 : 불연속 할당은 비어 있는 블록에 데이터를 분산하여 저장하고 이에 대한 정보를 파일 시스템이 관리하는 방식이다.
대표적으로 연결 할당과 인덱스 할당 방식이 있다.
파일에 속한 데이터를 연결 리스트
로 관리하는 방식이다.
파일 테이블에는 시작 블록에 대한 정보만 저장하고 나머지 데이터는 시작 블록부터 연결하여 저장한다.
파일의 맨 끝에는 링크 대신 NULL
을 삽입한다. 체인 할당이라고도 한다.
윈도우의 FAT가 연결 할당 방식으로 관리된다.
하나의 파티션이 사용할 수 있는 디스크 용량이 테이블의 주소 크기로 제한된다는 단점이 있다.
인덱스 할당 방식에서는 테이블의 블록 포인터가 데이터 블록을 연결하는 것이 아니라,
데이터의 인덱스를 담고 있는 인덱스 블록
을 연결한다.
인덱스 블록은 실제 데이터의 위치에 관한 정보를 순서대로 보관하고 있다.
블록 하나의 크기를 크게 잡으면 -> 적은 주소로 많은 양의 데이터를 관리할 수 있지만 낭비되는 공간이 생기고,
블록 하나의 크기를 작게 잡으면 -> 많은 양의 블록 포인터가 필요하다.
단편화에 의해 발생된 블록의 빈공간을, 디스크에 파일을 저장할 때마다 모든 테이블을 다 뒤져서 찾는 것은 비효율적이다.
내부 단편화를 줄이고 빈 공간을 효율적으로 관리하기 위해 파일 시스템은 빈 블록의 정보만 모아놓은 빈 공간 리스트(Free Block List)
를 유지한다.
블록의 내용을 지우지 않고 빈 공간 리스트에 삽입하는 것은 해당 블록에 새로운 데이터를 덮어쓰지 않는 한 원래 데이터를 복구할 수 있는 여지를 남긴다.
도서 : 쉽게 배우는 운영체제