[시스템 프로그래밍] - Linux / 파일 시스템
리눅스 시스템 프로그래밍에서 파일 시스템에서 file IO에 대해 배울 때 가장 많이 언급 되었던 것이 inode라는 개념이었다.
위 이미지에서 알 수 있듯이 리눅스에서 파일을 다룰 때에는 실제 파일 데이터와 그 데이터를 가리키는 inode가 존재한다.
이 inode는 파일에 대한 정보라 불리는 metadata이며 프로그래밍적으로 생각해보면 파일을 가리키는 일종의 포인터이다.
이 inode와 data는 운영체제에의해 구역이 나뉘어서 블럭단위로 저장된다.
또한 저장될 때, 디렉토리 파일의 내부에 inode의 값을 같이 저장한다. 이 때문에 특정 디렉토리의 특정 파일을 찾고자 하는 경우, 그림과 같이 경로를 이용하여 원하는 파일의 inode를 찾을 때까지 계속해서 참조하여 들어가는 것을 확인 할 수 있다.
리눅스에서는 프로그램 실행 시, 메모리에 PCB(process control block)를 생성하여 해당 프로세스를 관리한다. 만약 현재 실행 중인 프로세스에서 파일에 접근하여 사용하고자 하면 마찬가지로 FCB(file contrrol block)를 생성하여 사용중인 파일을 관리하도록한다. 앞서 언급된 inode와 같은 metadata가 FCB에 저장된다.
PCB나 FCB는 모두 커널 공간에 존재하며 운영체제(리눅스)에서 관리가 된다.
FCB에는 현재 메모리에 올라와있는(프로세스가 사용중인)파일의 metadata를 저장하여 관리 한다고 하였는데, 만약 서로 다른 두개의 프로세스에서 동일한 파일에 접근하여 사용하고자 하면 2개의 FCB가 만들어지게 된다.
이때 파일의 크기, 소유자, 권한, 유형 등은 비교적 바뀌지 않는 정보임에도 2번 접근하였다는 이유로 FCB에 중복해서 저장된다면 이는 메모리의 낭비이며 데이터 불일치 문제가 발생할 문제가 생긴다. 따라서 프로세스마다 다르게 저장되어야할 정보와 프로세스에 관계없이 파일마다 가지는 데이터를 분리하여 저장할 필요가 생기게 된다.
따라서 실제로는 위와같은 구조를 가진다. FD table은 프로세스마다 가지는 파일 디스크립터 테이블로 fd(file descriptor)에 대한 정보를 담고 있으며 file table은 프로세스마다 다르게 가져야하는 파일에 대한 정보(offset, ptr, ...)를 가지고 있다.
vnode는 file table에 존재하는 data에 비해 비교적 변화하지 않는 metadata로 크기, 소유자, 권한 등의 정보를 담고있다. 이 정보들은 실제 파일마다 하나씩만 존재하게 된다.
위에서 설명한 내용을 정리한 그림이다. 서로 다른 프로세스가 동일한 파일에 접근하였고, fd table이 가리키는 file table의 내용은 프로세스마다 다른 반면에 vnode는 서로 같은 값을 가지는 것을 확인 할 수 있다.
이번 포스팅에서는 리눅스 file system에 대해 정리해 보았다.