본문 바로가기
컴퓨터공학/기초

파일 & 파일 시스템

by 하이방가루 2022. 9. 4.
728x90
반응형

이 글은 Crash Course의 Computer Science를 보고 정리한 글입니다.

  서로 연관된 데이터를 기록하기에 적합한 것을 일반적으로 컴퓨터 파일(Files)이라고 부른다. 파일에 임의의 형식화되지 않은 데이터가 포함되는 것은 문제가 없지만, 어쨌든 파일 내부가 조직화되어 있는 것이 가장 유용하고 실용적이다. 이를 파일 형식(File format)이라고 한다. 프로그래머들은 가끔 자신만의 파일 형식을 만들기도 하지만, JPEG 및 MP3와 같은 기존 표준을 사용하는 것이 가장 쉽게 파일을 만들 수 있다.

 

  파일 형식 중 가장 간단한 것은 텍스트를 포함하고 있는 TXT 파일이다. 모든 컴퓨터 파일과 마찬가지로, 이 파일 형식은 이진수로 저장된 숫자 목록의 방대한 파일이다. 이 데이터를 해석하는 열쇠는 TXT 파일은 문자 인코딩(ASCII, UTF-8 등)을 사용한다는 것을 아는 것이다. 인코딩 방식에 맞게 각 바이트(8bit)를 문자에 매핑하여 전체 파일을 디코딩한다.

 

  다음은 오디오를 저장하는 WAVE 파일, WAV이다. 데이터를 올바르게 읽을 수 있으려면 비트 전송률, 단일 트랙인지 스테레오인지 등의 정보를 알아야 한다. 데이터에 관한 데이터를 메타 데이터라고 한다. 이 메타 데이터는 헤더라고 하는 실제 데이터보다 먼저 파일 앞에 저장된다.

WAV의 메타 데이터(한 칸당 1바이트를 뜻한다.)

WAV의 처음 44 바이트는 위와 같이 메타 데이터로 구성되어 있다. 일부분은 RIFF의 철자와 같이 항상 동일하다. 다른 부분은 그 안에 포함된 데이터에 따라 숫자가 변경된다. WAV의 실제 데이터 값은 초당 여러 번 캡처한 사운드의 진폭을 나타낸다.

소리의 파형

 소리는 위와 같이 파형을 이룬다.

소리의 파형을 캡처한 사운드의 진폭을 샘플(Sample)이라고 하며, 샘플의 값을 얻어내는 것을 샘플링이라고 한다. 컴퓨터 또는 스마트폰에 있는 것과 같은 디지털 마이크는 수 천 번 정도 소리의 압력(진폭)을 샘플링한다. 숫자가 클수록 진폭이라 불리는 음압이 높은 것이다. 그리고 오디오의 모든 초당 수천 개의 진폭은 정확히 WAVE 파일에 저장된다. 파일을 재생할 때가 되면 오디오 프로그램이 컴퓨터의 스피커를 작동시켜 원래 파형이 방출되도록 해야 한다.

 

  이제 비트맵(BITMAP) 또는 BMP라고 하는 사진을 저장하는 파일 형식에 대해 알아보자. 컴퓨터에서 사진은 픽셀이라는 작은 사각형의 요소들로 구성된다. 각 픽셀은 빨강, 파랑, 녹색 이 세 가지 색상의 조합이다. 이를 기본 색상이라 하며, 전자 화면에서는 이 색상들을 혼합해 다른 색을 만들 수 있다.

비트맵 파일의 메타 데이터

  WAV 파일과 마찬가지로 BMP는 메타 데이터로 시작하여 그 안에 이미지의 너비, 높이, 색상의 심도와 같은 키 값을 포함하고 있다.

  각 픽셀은 빨강(R), 녹색(G), 파랑(B)의 조합으로 3바이트가 각 픽셀에 매핑되어 색을 나타낸다. 위의 예시에서 첫 픽셀은 R-255, G-255, B-255로 흰색을 나타낸다. 다음 두 번째 픽셀은 R-255, G-255, B-0으로 노란색을 나타낸다. 다음은 R-0, G-0, B-0으로 검은색이다. 다음은 이전과 같이 노란색이다. 이 예시의 메타 데이터는 Image width와 Image heigh가 각각 4인 이미지이기 때문에, 픽셀 첫 행의 끝에 도달했음을 알게 되어, 다음 행으로 넘어가 마찬가지로 픽셀에 색을 매핑하여 나타내게 된다. 분명히 이것은 작은 이미지의 간단한 예이지만, 이것을 쉽게 BMP안에 이미지로 저장할 수 있다.

  모든 파일 형식을 다 살펴볼 순 없지만, 다른 파일 형식들도 그 안을 살펴보면, 모두 동일하게 2진수로 저장된 긴 숫자 목록일 뿐이다. 파일 형식은 데이터를 읽고 이해하는 것이 핵심 요소이다.

 

 

  이제 컴퓨터가 어떻게 파일들을 저장하는지 알아보자. 기본 저장 매체가 데이프 스트립, 드럼, 디스크, 또는 집적 회로 등 무엇이든 상관없이 하드웨어와 소프트웨어의 추상화는 저장장치를 값을 저장하는 작은 버킷의 긴 줄로 생각할 수 있다.

  컴퓨터가 대포 범위의 테이블 같은 계산만 수행했던 초기에는 전체 저장장치가 하나의 큰 파일처럼 작동했다. 데이터는 저장 장치의 처음 부분부터 시작하여, 출력이 생긴 순서대로 최대 저장 용량까지 채워졌다.

  그러나 계산 능력과 저장 용량이 향상됨에 따라 한 번에 둘 이상의 파일을 저장할 수 있게 되었다. 파일을 구분하는 가장 간단한 옵션은 파일을 연속적으로 저장하는 것이다. 이 작업은 가능하지만, 컴퓨터가 파일의 시작과 끝을 어떻게 알 수 있을까? 저장 장치는 파일 개념이 없으며 많은 비트를 저장하는 메커니즘일 뿐이다.

  따라서 이 작업을 하려면 다른 파일이 있는 위치를 기록하는 특수 파일이 있어야 한다. 이것은 많은 이름으로 불릴 수 있지만, 일반적인 용어는 디렉터리 파일(Directory File)이다.

 

  디렉터리 파일은 대부분 저장 공간의 맨 처음 위치에 보관되어 액세스 할 위치를 항상 알 수 있다. 디렉터리 파일에는 저장공간의 다른 모든 파일의 이름이 들어 있다. 각 파일의 이름이 뒤에 마침표와 함께 BMP나 WAV와 같은 파일 확장자로 끝난다. 디렉터리 파일은 또한 생성되거나 마지막으로 수정된 날짜, 소유자, 읽기/쓰기 가능 여부와 같은 메타 데이터를 저장한다.

  하지만 가장 중요한 것은 저장소에서 이러한 파일이 시작되는 위치와 길이이다.

 

  파일을 추가 또는 제거하거나, 이름을 변경하거나, 유사한 파일을 추가하려면 디렉터리 파일 정보를 업데이트해야 한다. 그것은 책의 목차와 같다. 장을 더 짧게 만들거나 이동하면 다른 곳에서는 목차를 업데이트해야 한다. 그렇지 않으면 페이지 번호가 일치하지 않는다.

  디렉터리 파일의 유지는 저장된 파일을 관리하고 파악하는 운영 체제의 매우 기본적인 파일 시스템의 예이다. 위의 경우는 모두 하나의 레벨에 저장되기 때문에 단층 파일 체계(Flat File System)이라고 불린다. 물론, 파일들을 서로 맞닿게 묶어서 저장하는 것은 데이터를 추가할 때 약간의 문제가 있다. 만약 첫 파일에 데이터를 추가한다면 다음 파일의 일부를 덮어쓰지 않고선 공간이 없다.

  그래서 현대 파일 시스템을 두 가지를 한다. 첫째, 파일을 블록 단위로 저장한다. 이렇게 하면 변경 사항을 위한 약간의 여유 공간이 남는데, 이를 느슨한 공간(Slack Space)이라고 한다. 또한 모든 파일 데이터가 공통 크기로 정렬되므로 관리가 간단하다. 이와 같은 스키마에서 디렉터리 파일은 파일이 시작되는 위차와 길이가 아닌 각각의 저장된 블록을 파악하기만 하면 된다. (*스키마는 대략적인 계획이나 도식을 뜻하는 말로, 전산학에서는 자료를 저장하는 구조와 표현법을 정의한 것을 뜻한다.)

  파일 시스템이 하는 두 번째는, 파일이 덩어리로 분해되어 여러 블록에 저장되는 것을 허용한다. 이제 첫 파일에 데이터를 추가하다가 하나의 블록에 저장하기에 크기가 너무 커졌다면, 파일 시스템은 여분의 데이터를 수용할 수 있는 사용되지 않은 블록을 할당한다. 이와 같은 파일 시스템 스키마를 사용하면 디렉터리 파일은 파일 당 하나의 블록이 아닌 파일 당 블록 목록을 저장해야 한다. 이런 방식으로 블록을 할당하고 할당을 해제함으로써 쉽게 확장 및 수축할 수 있는 가변 크기의 파일을 가질 수 있게 된다. 이것은 운영 체제에서 설명한 가상 메모리와 비슷한 것으로 개념적으로 매우 유사하다.

  만약 어떠한 파일을 삭제하실 원한다고 해보자. 그렇게 하기 위해 단순히 디렉터리 파일에서 엔트리를 제거하면 된다. 이것은 차례로 하나의 블록을 자유롭게 만든다. 파일의 내용을 저장소에서 실제로 지우지는 않고, 기록을 삭제한다는 사실에 주목하세요. 어떤 시점에서, 새로운 데이터로 덮어 쓰일 때까지 그 데이터는 블록에 그냥 있다. 이것이 컴퓨터 법의학팀이 컴퓨터에서 데이터를 "복구"할 수 있는 한 가지 방법이다.

 

  파일이 저장 공간 전반에 걸쳐 나뉘어 있는 경우 이를 조각화(Fragmentation)라고 한다. 파일이 생성, 삭제, 및 수정될 때 생기는 불가피한 부산물이다. 많은 저장기술의 경우 이것은 안 좋은 소식이다. 자기 테이프로 이러한 파일을 메모리로 읽어 들이려면 파일의 순서에 맞게 블록을 찾아서 앞으로 뒤로 이동을 많이 해야 한다. 실제 파일 시스템에서 대용량 파일은 수백 개의 블록에 걸쳐 저장되는데, 자기 테이프로 대용량 파일을 열기 위해서는 5분은 기다려야 할 것이다. 이런 문제는 조각 모음(Defragmentation)을 통해 해결될 수 있다. 과정은 정말 간단하다. 컴퓨터가 데이터를 복사하여 저장소에 있는 파일 블록들을 올바른 순서로 함께 배치하는 것이다.

 

  하지만 저장장치의 용량이 폭발적으로 증가함에 따라 컴퓨터의 파일 수도 엄청 증가했다. 모든 파일을 한 수준에서 함께 저장하는 단층 파일 체계는 비효율적이게 되었다. 실제 현대의 문서와 마찬가지로 관련 파일을 폴더에 함께 저장하는 것이 편리하다. 그런 다음 연결된 폴더를 폴더에 넣고, 또 넣는 방식으로 할 수 있다. 이것은 컴퓨터가 사용하는 계층적 파일 시스템이며 이를 구현하는 방법은 다양하다.

  이러한 계층적 파일 시스템의 가장 큰 변화는 디렉터리 파일이 파일뿐만 아니라 다른 디렉터리도 가리킬 수 있다는 점이다. 어떤 것이 파일이고, 디렉터리인지 파악하려면 디렉터리에 추가 메타 데이터가 필요하다. 또한 모든 파일과 폴더를 포함하는 최상위 가장 중요한 디렉터리 파일을 루트 디렉터리라고 한다. 모든 파일과 폴더는 이 루트 디렉터리의 아래에 다양한 파일 경로를 따라 존재한다.

  계층적 파일 시스템을 사용하면 무제한 깊이의 계층을 만들 수 있는 것 외에도 파일을 쉽게 옮길 수 있다. 파일을 옮길 때 굳이 어떤 데이터 블록을 재배치할 필요 없이, 단순히 두 개의 디렉터리 파일을 수정하여 옮길 파일이 있는 디렉터리 파일에서 항목을 제거하고 옮겨질 디렉터리 파일에 항목을 추가하기만 하면 된다. 파일을 저장장치에 같은 블록에 계속 존재한다.

 

  이러한 파일 시스템을 사용하면 자기 테이프, 스피닝 디스크 등에 있는 원시 비트를 숨길 수 있다. 파일 시스템은 사용자에게 데이터가 깔끔하게 정리되어 있고, 쉽게 접근할 수 있도록 여기게 한다.

728x90
반응형

'컴퓨터공학 > 기초' 카테고리의 다른 글

키보드 & 명령 라인 인터페이스(CLI)  (0) 2022.09.12
압축  (0) 2022.09.09
메모리(Memory) & 저장 장치(Storage)  (0) 2022.08.28
운영 체제 OS  (0) 2022.08.25
집적 회로와 무어의 법칙  (0) 2022.08.20

댓글