요즘 회사에서 개발하면서 느낀거지만 최근 우리가 프로그래밍에서 사용하는 파일을 읽어주는 함수들은 굉장히 추상화가 잘되어 있다.
특정 직군 아니면 파일과 관련된 깊은 내용은 크게 알 필요 없이 메뉴얼만 따라도 문제가 없기 떄문이다.
물론 나도 크게 파일과 관련되서 크게 신경을 쓰면서 살진 않았짐나 최근에 엔진에 파일 탐색과 추출 관련 라이브러리 개발 및 기능을 추가하면서 구조를 파악하고 오류를 고칠일이 생겨서 고생을 좀 많이 했다. 결국에 내가 직접적으로 해결을 하진 못했지만 이번 기회에 파일이란 정말 자유롭고 복잡한 시스템이구나를 느꼈다. 여기에 봤던 자료들을 보면서 내용을 정리하려고 한다.
inode
개인적으로 리눅스 관련 파일 업무를 처리하면서 느낀건 파일에서 가장 중요하다고 생각하는 inode라는 것이다.
inode란 파일에 대한 정보들이 들어가 있다.
파일의 종류나 할당된 블럭 수, 보호 정보, 시간 정보와 더불어 데이터 블럭이 디스크에 존재하는 지 등 중요한 데이터, 메타 데이터가 들어가 있다.
옛날에 쓰던 파일 간단한 파일 시스템들을 봐보면 직접적으로 아이노드에 디스크 주소를 가리키는 포인터를 두게 했다.
근데 직접적으로 접근하기에 파일 자체의 크기 제한이 생길 수 밖에 없다.
그래서 더 큰 파일 시스템을 만들기 위해 아이노드 내에 포인터들이 저장되어있는 블럭을 가리키는 간접 포인터(indirect pointer)라는 특수한 포인터를 사용하는 방법을 이용하여 크기에 대한 제한을 무력하게 만드는 방법을 생각해냈다.
큰 파일에 대해서는 간접 블럭이 할당되고 아이노드의 간접 포인터는 이 간접 블럭을 가리킨다.
한 블럭이 만약 4KB고 디스크 주소가 4바이트면 1024개의 포인터들을 추가할 수 있게된다.
여기서 내가 이전에 말한 자유롭다고 말한 특징이 나온다.
만약에 더 큰 파일을 저장하고 싶으면 inode에 이중 간접 포인트를 추가한다.
이중간접 포인터는 간접 포인터를 가진 블럭을 가르키고 이는 더 많은 용량을 가질 수있음을 의미한다.
익스텐트
우리가 쉽게 볼 수 있는 Linux의 ext2 나 ext3같은 파일 시스템이 이런 멀티레벨 인덱스 방식으로 되어있다.
하지만 ext4는 익스텐트라는 개념을 사용하는데 익스텐트는 그냥 디스크 푄터와 길이만을 통해 이루어진다.
하나의 포인터와 디스크 길으를 가지고 있으므로 연속적으로 배치 되어있는 파일에 더 잘 동작한다.
그렇다고 포인터 기반 파일시스템이 안좋다는건 아니다. 포인터는 메타데이터를 가져야한다는 메모리 공간을 차지하는게 있지만 그만큼 자율성을 보장하기 때문이다.
디렉토리
디렉토리는 항목의 이름 아이노드 번호 쌍의 배열로 구성되어있는데 디렉토리의 데이터 블럭에는 문자열과 숫자가 쌍으로 존재하며 문자열 길이에 대한 정보도 있다.
만약 디렉토리가 삭제되면 중간에 빈공간이 생긴다. 새로 또 디렉토리를 만들 때 빈 공간에 새로 생성된 항목이 위치 가능하게 해야한다.
대부분 파일 싯템에서 디렉토리 자체는 특수한 종류의 파일로 보는데 디렉터리는 자신의 아이노드를 가지고 이 아이노드는 아이노드 테이블에 존재한다.
전에 OS 구현 과제였던 Pintos에서 파일시스템을 구현했던 경험이 있다.
이때 아이노드를 관리하는 초기 자료구조는 연결 리스트이다.
특정 정보를 얻기 위해서는 계속 타고타고 들어가야하기때문에 성능에 이점이 크게 없었다.
근데 이를 포인터 정보들만 테이블로 관리하여 직접적으로 바로 접근할 수 있게 개선해여 성능 이점을 봤었다. 이처럼
테이블을 메모리에 상주 시키고 간단하게 접근이 가능하게 설계가 가능하다.
만약 다음 포인터를 저장하는 테이블을 사용하는 연결식 할당방법과 같이 사용하여도 파일 접근을 효율적으로 사용 가능하다.
이외에도 다른 방법이 존재하는데 애초에 B-tree로 구현을 하는 것이다.
애초에 검색전용 자료구조 이기에 탐색 자체가 더 빠를것이다.
이처럼 모든 파일시스템마다 구조와 구현된 것 자체가 모두 틀리기에 특정 운영체제에서 열 수 있는 파일과 없는 파일이 있다는게 신기하다.
이 또한 내가 느꼈던 파일의 자율성에 의해서 일어나는 현상이라 재밌으면서 아주 어려운 내용이다.
이 이후엔 파일의 read,write()에 대해 적어보려고 한다.
'OS' 카테고리의 다른 글
[TIL 48] 인증정보 관련 탐지 (0) | 2025.02.06 |
---|---|
[TIL 47] 파일의 읽기와 쓰기 (0) | 2025.01.22 |
[TIL 45] 파일 정보 확인하기 (0) | 2024.12.21 |
[TIL 42일차] 리눅스 디렉토리 표준 (0) | 2024.09.10 |
[TIL 41일차] 멀티 스케줄링 (0) | 2024.08.30 |