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 por escrito) por chamadas especiais do sistema. Alguns sistemas permitem os diretórios reading com a usual chamada de sistema read(2)
(o Linux não, o FreeBSD fez quando eu 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 tem um inode, ele é fixado no número de inode 2 (tente ls -lid /
).
Ter o diretório agindo como um arquivo facilita a alocação de espaço para as entradas de diretório, etc., já que as funções para alocar blocos para arquivos sempre devem estar lá. Além disso, como eles usam os blocos de dados sama conforme necessário, não é necessário alocar espaço entre os dados do arquivo e as listagens de diretório de antemão.
As partes internas de como as entradas do diretório são armazenadas variam entre os sistemas de arquivos e, por exemplo, evoluíram entre ext2
e ext4
. Sistemas modernos usam árvores em vez de listas lineares para pesquisas mais rápidas. Veja aqui . Mesmo o venerável sistema de arquivos FAT armazena diretórios como arquivos, mas pelo menos em FATs antigos, o diretório raiz é especial. (A estrutura das entradas de diretório no FAT é obviamente diferente dos sistemas de arquivos unix).
Hence, if this is the case, traversing from one directory to another requires the disk to read from seemingly arbitrary locations, which seems a little inefficient to me.
Sim. Mas as entradas de diretório acessadas com frequência (ou os blocos de dados subjacentes) provavelmente são armazenadas em cache nos sistemas operacionais modernos.
Salvar o conteúdo de todos os diretórios centralmente exigiria a pré-alocação de uma área grande e ainda exigiria procura de disco na área de dados do diretório.