-
Linux Programming - File Descriptor(2)Tech/Development 2021. 5. 22. 01:13반응형
이전 포스팅에서는 파일 디스크립터(File Descriptor)에 대한 개념에 대해 알아봤습니다. 파일 디스크립터는, 프로세스에서 파일을 Open할 때 할당되는 index와 같은 역할을 수행한다고 하였습니다. 하지만, 파일 디스크립터가 할당되기 전 까지 추가적인 단계가 존재합니다.
프로세스에서 파일을 Open할 때, 디스크에서 해당하는 파일을 찾아 해당 파일의 i-node를 메모리에 올립니다. i-node는 index node의 약자로, 실제 데이터를 저장하고 있는 위치인 데이터 블록의 주소, 파일의 크기, 종류, 퍼미션 등의 정보를 가지고 있습니다. i-node의 정보 중, 데이터 블록은 실제 데이터가 저장되는 공간입니다. 디스크에 파일이 저장될 때 특별한 구분없이 데이터 블록으로 쌓이게 됩니다. 따라서 어떤 부분이 어느 파일인지 구분이 필요하기에, 데이터 블록의 정보가 i-node에 담겨져 존재하게 됩니다. 참고로 디스크 내 i-node는 전체 공간의 1% 정도를 차지한다고 합니다.
* 기본적으로 디스크에 접근하는 속도와 메모리에 접근하는 속도에 차이가 있기 때문에 이와 같이 메모리에 로딩하는 작업이 필요합니다.
만약, i-node 정보가 이미 메모리에 로딩되어 있다면, 새롭게 생성하지 않고 해당 i-node의 참조 카운트만 증가시킵니다. 다음으로 (Open) File Table에 해당 파일의 정보를 할당합니다. (Open) File Table에는 file status flag, file offset(f_pos), i-node의 주소 정보를 가집니다. 처음으로 File Table 엔트리에 할당되었다면, file offset(f_pos)라는 읽기/쓰기의 위치는 0으로 설정됩니다. 이후 (Open) File Table에 연결된 File Descriptor를 생성하게 되는데, File Descriptor Table을 살펴보고 아직 할당되지 않은 가장 작은 수의 정수를 (Open) File Table의 포인터를 기록하고 그 index를 반환합니다. 여기서 반환된 index가 바로 파일 디스크립터입니다.
i-node Table(Index Node)
i-node는 index node의 약자로 리눅스 계열의 OS에서 각 파일이 만들어질 때 OS에 의해 부여되는 고유 번호를 말합니다. 가지고 있는 데이터를 빠르게 찾기 위해 순서대로 정리한 index라고 볼 수 있죠. ls -li 명령어를 통해 확인할 수 있고, 가장 앞에 있는 번호가 i-node의 고유 번호입니다. i-node에는 두 가지 개념이 있는데, 하나는 디스크에 기록되어 저장된 파일에 대한 정보를 담는 구조체이고, 또 하나는 시스템에서 사용을 위해 Open 시스템 콜로 오픈한 파일에 대한 정보를 나타내는 객체로 메모리에서 관리되어지는 개념이 있습니다.
(Open) File Table
프로세스에 의해 Open된 파일의 읽기/쓰기 동작을 지원하기 위한 테이블입니다. 파일이 열릴 때마다 하나씩 할당되고, 하나의 프로세스가 A라는 파일을 3번 Open한다면 A의 파일 엔트리가 3개 생성됩니다. 이는 이전 포스팅의 예제에서 확인할 수 있습니다. 이 테이블 엔트리 안에는 file status flag, file offset, ref-cnt(참조카운트), i-node를 가르키는 포인터가 들어있습니다.
File Descriptor Table
파일 디스크립터에 대한 설명은 이미 진행하였습니다. 파일 디스크립터의 집합이 파일 디스크립터 테이블입니다. 참고로 프로세스에서 파일을 Open() 하고나서 작업을 진행하고, Close() 하게 된다면 (Open) File Table의 엔트리가 삭제됩니다. 따라서 File Descriptor도 함께 삭제되죠.
참고자료
https://dololak.tistory.com/291
https://operatingsystems.tistory.com/entry/OS-File-System?category=495588
https://helpdeskgeek.com/linux-tips/what-are-inodes-in-linux-and-how-are-they-used/
반응형'Tech > Development' 카테고리의 다른 글
Linux Programming - C언어 VScode 설정(for Mac) (0) 2021.05.22 Linux Programming - File Descriptor(1) (0) 2021.05.21 Golang #3 - Interface (0) 2021.03.01 Golang #2 - Method vs Function (0) 2021.03.01 Golang #1 - Map (0) 2021.02.14