Onde as entradas do diretório de arquivos para subdiretórios são armazenadas?

Onde as entradas do diretório de arquivos para subdiretórios são armazenadas?

Perdoe se esta pergunta tiver uma duplicata exata em outro lugar, mas até agora todas as respostas que encontrei no SE ou em outros sites em geral não respondem especificamente a essa pergunta. Estou fazendo um curso de sistemas operacionais na minha faculdade e, portanto, sou muito novo em sistemas de arquivos em geral.

Entendo que na maioria dos sistemas de arquivos existe um diretório raiz que contém entradas de diretório de arquivos. Essas entradas contêm um mapeamento do nome do arquivo para o número do inode e têm comprimento variável.

De acordo comesta resposta, acho que essas entradas são armazenadas de forma linear, como abaixo:

Posso entender perfeitamente o que são inodes e como eles mapeiam os números dos blocos de dados de um arquivo no disco físico, usando suas entradas do Índice (TOC).


No entanto, minha pergunta é:Como e onde as entradas do diretório de arquivos do subdiretório são armazenadas?

Eu acredito que eles estão armazenados no mesmo local que o diretório raiz, em algum deslocamento. No entanto, não consigo imaginar como esse deslocamento pode ser recuperado do inode.

Portanto, tenho a sensação de que as entradas de diretório dos subdiretórios são, na verdade, armazenadas na região de dados do disco, em vez de nas entradas do diretório raiz.

Portanto, se for esse o caso, passar de um diretório para outro exige que o disco leia de locais aparentemente arbitrários, o que me parece um pouco ineficiente.

No entanto, gostaria simplesmente de esclarecer meus equívocos sobre a localização das entradas do diretório de arquivos de um subdiretório.

Muita ajuda é apreciada.

Responder1

Os diretórios geralmente são implementados como arquivos. Eles têm um inode e uma área de dados, mas é claro que geralmente são acessados ​​(pelo menos gravados) por chamadas de sistema especiais. Alguns sistemas permitemleituradiretórios com a read(2)chamada de sistema usual (o Linux não, o FreeBSD fez quando verifiquei pela última vez). A área de dados do arquivo de diretório contém as entradas do diretório. Em ext4, o diretório raiz também possui um inode, que é fixado no inode número 2 (try ls -lid /).

Fazer com que o diretório atue como um arquivo facilita a alocação de espaço para as entradas do diretório, etc., pois as funções para alocar blocos para arquivos devem estar sempre lá. Além disso, como eles usam os mesmos blocos de dados conforme necessário, não há necessidade de alocar previamente espaço entre os dados do arquivo e as listagens de diretórios.

Os detalhes internos de como as entradas de diretório são armazenadas variam entre os sistemas de arquivos e, por exemplo, evoluíram entre ext2e ext4. Os sistemas modernos usam árvores em vez de listas lineares para pesquisas mais rápidas. Veraqui. Mesmo o venerávelSistema de arquivos FATarmazena diretórios como arquivos, mas pelo menos em FATs mais antigos, o diretório raiz é especial. (A estrutura das entradas de diretório no FAT é obviamente diferente dos sistemas de arquivos Unix.)

Portanto, se for esse o caso, passar de um diretório para outro exige que o disco leia de locais aparentemente arbitrários, o que me parece um pouco ineficiente.

Sim. Mas as entradas de diretório frequentemente acessadas (ou os blocos de dados subjacentes) provavelmente serão armazenadas em cache nos sistemas operacionais modernos.

Salvar centralmente o conteúdo de todos os diretórios exigiria a pré-alocação de uma grande área e ainda exigiria buscas de disco dentro da área de dados do diretório.

Responder2

A solução comum é que alguns dos inodes no diretório raiz apontem para entradas que também são diretórios. Em muitos aspectos, eles são como arquivos, mas o tipo de arquivo indica ao sistema de arquivos que os interprete como diretórios.

(Em tutoriais muito antigos, como no Unix original, você será informado de que cattambém pode criar um diretório. Isso geralmente não é mais verdade.)

Em outras palavras, cada diretório é uma lista linear simples de ponteiros de inode. Alguns deles apontam para nós folhas na árvore de diretórios (arquivos), outros apontam para nós internos (outro diretório). A única coisa especial sobre o diretório raiz é que ele é seu próprio pai e que há algo externo à árvore que diz ao sistema para começar a percorrer a árvore a partir daqui.

informação relacionada