IT 지식

파일 시스템과 블록

OIIUOI 2022. 8. 31. 01:42

파일 시스템은 운영체제에서 하드 디스크, CD와 DVD, 다른 이동식 메모리 장치 같은 물리적인 저장 매체를 파일과 폴더의 계층 구조처럼 보이게 하는 부분이다. 파일 시스템은 논리적 구성과 물리적 구현 간의 분리를 보여 주는 훌륭한 사례다. 파일 시스템은 다양한 종류의 장치에 정보를 조직화하고 저장하지만, 운영체제는 모두 동일한 인터페이스로 표시한다. 앞으로 살펴보겠지만, 파일 시스템이 정보를 저장하는 방식은 실생활에 영향을 미칠뿐더러 법적인 영향력도 가진다. 따라서 파일 시스템에 대해 배우는 것은 파일 제거하기가 왜 해당 내용이 영원히 사라졌음을 의미하지 않는지 이해하기 위해서이기도 하다.

여러분 대부분은 윈도우 파일 탐색기나 맥 OS 파인더를 사용해 봤을 것이다. 각 프로그램에서는 최상위(예를 들면, 윈도우의 C: 드라이브)부터 시작하는 계층 구조를 보여 준다. 폴더는 다른 폴더와 파일의 이름을 담고 있다. 폴더를 탐색해 보면 더 많은 폴더와 파일이 나타난다(유닉스 계열 운영체제에서는 전통적으로 폴더 대신 디렉터리 directory라는 용어를 사용 한다). 폴더는 조직화된 구조를 제공하는 반면, 파일은 문서, 사진, 음의, 스프레드시트, 웹페이지 등의 실질적인 내용을 담고 있다. 컴퓨터가 보유하는 모든 정보는 파일 시스템에 저장되고, 사용자는 파일 시스템을 통해 정보에 접근한다. 여기에는 데이터뿐만 아니라 워드와 크롬 브라우저 같은 프로그램의 실행 파일, 라이브러리, 환경 설정 정보, 디바이스 드라이버 그리고 운영체제 자체를 구성하는 파일들이 포함된다. 파일의 양은 놀라울 만큼 많다. 내가 쓰고 있는 평범한 맥북에 파일이 90만 개 넘게 있는 것을 알고 놀란 적도 있다. 친구 한 명은 자신의 윈도우 컴퓨터에 파일이 80만 개 넘게 있다고 했다

이름과는 달리, 파인더와 파일 탐색기는 파일이 어디 있는지 이미 알 때 가장 유용하다. 언제든지 파일 시스템 계층 구조의 루트, 즉 최상위에서부터 탐색해 볼 수 있다. 파일이 어디 있는지 모른다면 맥 OS의 스포트라이트 Spotlight 같은 검색 도구를 사용해야 한다.

 파일 시스템은 이 모든 정보를 관리하면서 애플리케이션이나 운영 체제의 나머지 부분이 정보를 읽고 쓸 수 있도록 접근 가능하게 만든다. 또한 파일에 대한 접근이 효율적으로 수행되고 서로 간섭하지 않도록 조정하는 역할을 하고, 데이터의 물리적인 위치를 계속 파악한다. 각각의 데이터 조각을 반드시 서로 분리해 알 수 없는 이유로 이메일의 일부가 스프레드시트나 납세 신고서에서 발견되지 않도록 한다. 다수의 사용자를 지원하는 시스템에서는 프라이버시와 보안을 강하게 적용해서 한 사용자가 다른 사용자의 파일에 권한 없이 접근할 수 없게 하며, 사용자마다 사용할 수 있는 공간의 용량에 한도를 부과할 수 있다.

 파일 시스템 서비스는 가장 낮은 레벨의 시스템 콜을 통해 사용할 수 있으며, 파일 시스템 서비스를 만들 때 공통적인 부분은 라이브러리에 제공되어 있어 프로그래밍하기 쉽다.

 

보조 기억 장치 파일

시스템 파일 시스템은 매우 다양한 물리적 시스템이 균일한 논리적 구조로 나타나게 하는 방법을 보여 주는 훌륭한 사례다. 과연 어떻게 작동하는 것일까? 예를 들어 보자. 500GB 드라이브는 5천억 바이트를 담을 수 있다. 하지만 드라이브 자체의 소프트웨어는 이것을 각각 1,000바이트 덩어리 또는 블록 block 5억 개로 표시한다(실제 컴퓨터에서는 이 크기가 2의 거듭제곱 값이다. 여기서는 관계를 쉽게 파악하도록 십진수를 사용한 것이다). 가령 작은 메일 메시지 같은 2,500바이트 크기의 파일은 1,000바이트짜리 블록 세 개에 저장된다. 두 개에 들어가기에는 너무 크지만 세 개면 충분하다.

 파일 시스템은 한 파일이 사용하는 바이트를 다른 파일이 사용하는 바이트와 같은 블록에 저장하지 않는다. 그러므로 마지막 블록이 완전히 꽉 차지 않는다면 약간의 공간이 낭비된다. 방금 든 예에서 세 번째 블록의 500바이트는 사용되지 않았다. 그 정도면 손수 관리해야 하는 수고를 상당히 덜어 주는 대가로는 크지 않다. 특히 보조 기억 장치가 너무 저렴하기 때문이다.

이 파일에 대한 폴더 엔트리 folder entry는 파일 이름, 2,500바이트라는 크기 생성되거나 변경된 날짜와 시간, 다른 각종 정보(권한, 파일 유형 등으로, 운영체제에 따라 다르다)를 담고 있다. 이 모든 정보를 파일 탐색기나 파인더 같은 프로그램에서 확인할 수 있다.

 폴더 엔트리는 또한 그 파일이 드라이브 어디에 저장되어 있는지, 즉 5억 개의 블록 중 어느 것이 파일의 바이트를 담고 있는지 정보를 넣고 있다. 파일의 위치 정보를 관리하는 방법은 다양하다. 폴더 엔트리가 블록 번호 목록을 담고 있거나, 블록 번호 목록을 담고 있는 블록을 참조하기도 하고, 또는 첫 번째 블록 번호를 담고 있어서 차례로 두 번째 블록 번호, 다음 블록 번호를 계속해서 구하는 방법도 있다.

같은 파일을 나눠 담고 있는 블록들이 하드 드라이브에서 물리적으로 인접해 있지 않아도 된다. 적어도 용량이 큰 파일에서는 블록들이 실제로 인접해 있지 않을 공산이 크다. 1MB 파일이라면 1,000개의 블록을 차지하며 블록들은 이 정도 흩어져 있다. 폴더와 블록 목록 자체는 같은 드라이브 상의 블록에 저장된다.

 SSD는 물리적 구현은 크게 다르겠지만 하드 드라이버와 기본 아이디어는 같다. 앞서 언급했듯이 요즘은 대부분의 컴퓨터에서 SSD를 사용한다. 바이트당 가격이 비싸기는 해도 더 작고 훨씬 안정적이고 가벼우며 전력 소모가 적기 때문이다. 사실 파인더나 파일 탐색기 같은 프로그램에서 보면 차이가 전혀 없다. 하지만 SSD 장치는 하드 드라이브와는 다른 드라이버를 사용하며, 장치 자체에 정보가 어느 위치에 있는지 기억하기 위한 정교한 코드가 들어 있다. 이는 SSD 장치의 각 영역이 사용될 수 있는 횟수에 제한이 있기 때문이다. SSD 내부 소프트웨어는 각 물리적 블록이 몇 번 사용되었는지 파악하고, 각 블록이 거의 같은 횟수로 사용되도록 데이터를 옮긴다. 이러한 처리를 웨어 레벨링 wear leveling이라고 한다.

폴더는 다른 폴더와 파일이 어디에 있는지 정보를 담고 있는 파일이다. 파일 내용과 구조에 대한 정보가 정확해야 하고 완벽하게 일치해야 하므로 파일 시스템은 폴더의 내용을 관리하고 유지하기 위한 권리를 독점적으로 보유한다. 사용자와 애플리케이션은 파일 시스템에 요청을 해야만 간접적으로 폴더 내용을 바꿀 수 있다.

어떤 관점에서는 폴더 또한 파일이다. 파일 시스템이 폴더 내용에 완전히 책임을 지고 있고, 애플리케이션이 그 내용을 직접 바꿀 방법이 없다는 점을 제외하면 폴더와 파일이 저장되는 방법에는 차이가 없다. 하지만 가장 낮은 레벨에서 보면 폴더는 그저 블록이며, 모두 같은 메커니즘으로 관리된다.

 

프로그램이 기존 파일에 접근하려 할 때, 파일 시스템은 계층 구조의 최상위부터 시작해서 파일 경로명의 각 요소를 해당하는 폴더에서 찾으면서 파일을 검색해야 한다. 예를 들어, 맥 컴퓨터에서 찾으려는 파일 경로가

/users/bwk/book/book.txt라면 파일 시스템은 파일 시스템의 최상위에서 Ilcers를 찾고, 다음으로 그 폴더에서 bwk를 찾고, 다음으로 그 폴더에서 book을, 이어서 그 폴더에서 book.txt를 찾을 것이다. 윈도우에서는 파일 이름이 C:\My Documents\book\book.txt 같은 꼴이 될 수 있고, 검색 과정 은 비슷하다.

 이 방식은 효율적인 전략인데, 경로에서 폴더를 찾아 들어갈 때마다 그 폴더 이하에 있는 파일과 폴더에 수행되는 검색의 범위가 좁아지기 때문이다. 해당되지 않는 파일과 폴더는 검색 대상에서 제외된다. 여러 파일이 경로의 일부를 공유할 수는 있지만 전체 경로명이 유일무이해야 한다는 조건을 반드시 충족해야 한다. 실제로는 프로그램과 운영체제가 현재 사용되는 폴더를 계속 파악하기 때문에 검색이 매번 최상위에서 시작할 필요는 없다. 또한 시스템이 작업 속도를 높이기 위해 자주 사용되는 폴더를 캐싱하기도 한다.

프로그램이 새 파일을 생성하려고 할 때, 파일 시스템에 요청을 한다. 파일 시스템은 적절한 폴더에 새로운 엔트리를 넣으면서 이름, 날짜 등을 넣고, 크기를 0으로(완전히 새로운 파일에는 아직 어떤 블록도 할당되지 않았으므로) 표시한다. 나중에 프로그램이 파일에 데이터를 쓰면(가령 메일 메시지에 텍스트를 추가하면) 파일 시스템은 요청된 정보를 담기에 충분한 수의 미사용 블록 free block을 찾아서 데이터를 복사해 넣고, 폴더의 블록 목록에 그 블록들을 삽입하고, 애플리케이션으로 되돌아간다. 이 점은 파일 시스템이 드라이브상에서 현재 사용되지 않는, 즉 어떤 파일의 일부가 아닌 모든 블록의 목록을 유지하고 있다는 것을 암시한다. 새로운 블록에 대한 요청이 도착하면 미사용 블록의 목록에서 가져온 블록으로 요청을 만족시킨다. 파일 시스템에서 관리하는 미사용 블록 목록에는 운영체제만 접근할 수 있고 애플리케이션은 접근할 수 없다.