하위 디렉터리의 파일 디렉터리 항목은 어디에 저장됩니까?

하위 디렉터리의 파일 디렉터리 항목은 어디에 저장됩니까?

이 질문이 다른 곳에 정확하게 중복된 경우 죄송합니다. 하지만 지금까지 SE나 다른 사이트에서 찾은 모든 답변은 이 질문에 구체적으로 답변하지 않았습니다. 저는 대학에서 운영 체제 과정을 수강하고 있으므로 일반적으로 파일 시스템에 대해 처음 접합니다.

대부분의 파일 시스템에는 파일 디렉터리 항목을 포함하는 루트 디렉터리가 있다는 것을 알고 있습니다. 이러한 항목에는 파일 이름에서 inode 번호로의 매핑이 포함되어 있으며 길이가 가변적입니다.

에 따르면이 답변, 이 항목은 아래와 같이 선형 방식으로 저장되는 것 같습니다.

나는 inode가 무엇인지, 목차(TOC) 항목을 사용하여 물리적 디스크에 있는 파일의 데이터 블록 번호에 어떻게 매핑되는지 완전히 이해할 수 있습니다.


그러나 내 질문은 다음과 같습니다.하위 디렉터리 파일 디렉터리 항목은 어떻게, 어디에 저장됩니까?

나는 그것들이 루트 디렉토리와 같은 위치에 약간의 오프셋을 두고 저장되어 있다고 믿습니다. 그러나 이 오프셋을 inode에서 검색할 수 있는 방법은 상상할 수 없습니다.

따라서 하위 디렉터리의 디렉터리 항목이 실제로 루트 디렉터리의 항목이 아닌 디스크의 데이터 영역에 저장되는 것 같은 느낌이 듭니다.

따라서 이 경우 한 디렉터리에서 다른 디렉터리로 이동하려면 디스크가 임의의 위치에서 읽어야 하는데 이는 약간 비효율적으로 보입니다.

그럼에도 불구하고 나는 하위 디렉터리의 파일 디렉터리 항목 위치에 대한 나의 오해를 간단히 해결하고 싶습니다.

많은 도움을 주시면 감사하겠습니다.

답변1

디렉터리는 일반적으로 파일로 구현됩니다. 여기에는 inode와 데이터 영역이 있지만 물론 일반적으로 특수 시스템 호출을 통해 액세스(적어도 기록)됩니다. 일부 시스템에서는 다음을 허용합니다.독서일반적인 read(2)시스템 호출을 사용하는 디렉터리입니다(Linux는 그렇지 않으며 FreeBSD는 제가 마지막으로 확인했을 때 그랬습니다). 그러면 디렉토리 파일의 데이터 영역에는 디렉토리 항목이 포함됩니다. 의 경우 ext4루트 디렉터리에도 inode가 있으며 inode 번호 2로 고정되어 있습니다(try ls -lid /).

디렉토리를 파일처럼 작동하게 하면 파일에 블록을 할당하는 기능이 항상 있어야 하므로 디렉토리 항목 등을 위한 공간을 쉽게 할당할 수 있습니다. 또한 필요에 따라 동일한 데이터 블록을 사용하므로 파일 데이터와 디렉터리 목록 사이에 미리 공간을 할당할 필요가 없습니다.

디렉토리 항목이 저장되는 내부 방식은 파일 시스템에 따라 다르며, 예를 들어 ext2ext4. 최신 시스템은 더 빠른 조회를 위해 선형 목록 대신 트리를 사용합니다. 보다여기. 심지어 존경하는 사람이라도FAT 파일 시스템디렉터리를 파일로 저장하지만 적어도 이전 FAT에서는 루트 디렉터리가 특별합니다. (FAT의 디렉토리 항목 구조는 물론 Unix 파일 시스템과 다릅니다.)

따라서 이 경우 한 디렉터리에서 다른 디렉터리로 이동하려면 디스크가 임의의 위치에서 읽어야 하는데 이는 약간 비효율적으로 보입니다.

네. 그러나 자주 액세스되는 디렉터리 항목(또는 기본 데이터 블록)은 최신 운영 체제에서 캐시될 가능성이 높습니다.

모든 디렉터리의 내용을 중앙 집중식으로 저장하려면 넓은 영역을 사전 할당해야 하며 여전히 디렉터리 데이터 영역 내에서 디스크를 검색해야 합니다.

답변2

일반적인 해결책은 루트 디렉터리의 일부 inode가 디렉터리이기도 한 항목을 가리키는 것입니다. 많은 측면에서 파일과 유사하지만 파일 형식은 파일 시스템이 이를 디렉터리로 해석하도록 지시합니다.

cat(오리지널 Unix와 같은 아주 오래된 튜토리얼에서는 디렉터리도 만들 수 있다는 말을 듣게 됩니다 . 이는 일반적으로 더 이상 사실이 아닙니다.)

즉, 모든 디렉토리는 inode 포인터의 간단한 선형 목록입니다. 그 중 일부는 디렉터리 트리(파일)의 리프 노드를 가리키고 다른 일부는 내부 노드(다른 디렉터리)를 가리킵니다. 루트 디렉터리의 유일한 특별한 점은 루트 디렉터리가 자신의 부모라는 점과 여기서부터 트리 탐색을 시작하도록 시스템에 지시하는 트리 외부의 무언가가 있다는 점입니다.

관련 정보