Como um sistema de arquivos que não diferencia maiúsculas de minúsculas acessa arquivos?

5

Um programador no meu trabalho, que usou o Linux durante toda a sua vida, estava censurando o Windows por ter um sistema de arquivos que não diferenciava maiúsculas de minúsculas (entre outras coisas), o que ele disse ser a pior idéia possível e nunca pode ser benéfico. Eu disse que era só porque ele estava acostumado com sistemas de arquivos sensíveis a maiúsculas e minúsculas, e que faz muito mais sentido ter um sistema de arquivos que não diferencia maiúsculas de minúsculas (parte do meu raciocínio é que meu nome é David , mas se você se referiu a eu david eu ainda saberia que você se referia a mim, e o mesmo deveria se aplicar aos arquivos). Ele então explicou sua posição, afirmando que um sistema de arquivos insensitivo a maiúsculas e minúsculas deve incorrer em um impacto no desempenho.

Então, agora estou me perguntando ... como faz um arquivo de arquivos que não diferencia maiúsculas de minúsculas? Deixe-me tentar explicar o que estou pensando:

Digamos que você tenha um sistema de arquivos com distinção entre maiúsculas e minúsculas (e kernel do SO etc.) que, em termos práticos, se existir um diretório chamado exampleDir , devo digitar exatamente cd exampleDir para cd isto. Se eu digitar cd exampledir , devo receber um erro informando que o diretório não existe. Isso parece um simples caso em minha mente. Quando eu digito o comando, o sistema de arquivos pode simplesmente pegar os caracteres exatos que eu digitei (ignorando o que o kernel poderia fazer para adicionar o caminho atual do diretório de trabalho à string e assim por diante) e começar a correr pela lista de nomes de arquivos disponíveis. compare em cada nome; por exemplo:

for(var i=0;i<files.length;i++) {
    if(filename == files[i]) return true;
}

Agora, a parte interessante, o sistema de arquivos insensível a maiúsculas e minúsculas (assumindo o caso preservando , como no Windows). Em termos práticos, se existe um diretório chamado exampleDir , eu poderia digitar cd exampleDir ou cd eXamPleDIr e eu ainda conseguiria entrar na pasta. O que eu realmente quero saber é como é o código para conseguir isso. Para preservar o caso, o nome do diretório deve ser armazenado com seu caso. Isso significa que você precisa fazer duas conversões para maiúsculas ou minúsculas sempre que quiser acessar um arquivo pelo nome de arquivo dele? Quanto de um hit de desempenho isso se traduz em? Há algum truque usado para reduzir a diminuição de desempenho do uso de um sistema de arquivos sem distinção entre maiúsculas e minúsculas? É assim que imagino que o código do sistema de arquivos teria que ser:

for(var i=0;i<files.length;i++) {
    if(toLowercase(filename) == toLowercase(files[i])) return true;
}

Observação: Como parece que isso não ficou claro na minha pergunta, estou absolutamente não perguntando qual tipo é melhor, nem estou perguntando quais são as vantagens e as desvantagens são. Estou apenas perguntando como (em termos técnicos) um sistema de arquivos insensível a maiúsculas e minúsculas lida com o fato de que humanos podem digitar um nome de arquivo com um caso aleatório.

    
por Clonkex 12.05.2017 / 01:29

2 respostas

3

Os sistemas operacionais geralmente funcionam com alças. Uma função "aberta" é chamada, que especifica o nome do arquivo e um identificador é retornado. Outras chamadas de E / S usam um identificador, não um nome de arquivo.

Outras funções que exigem o nome do arquivo seriam criar arquivos, listar um diretório e excluir arquivos.

Portanto, qualquer impacto no desempenho ao lidar com a insensibilidade a maiúsculas e minúsculas não afetará muito a E / S real, apenas o gerenciamento de arquivos.

Alguns programas usam arquivos de bloqueio para indicar que os recursos estão em uso. Isso pode se traduzir em muitas criações e exclusões.

No entanto, a sobrecarga de fazer duas comparações em vez de uma é provavelmente uma questão de algumas instruções adicionais em linguagem de montagem. Significando menos de 50 ou mais ciclos. Talvez 500 ou 5000 se falhas de cache entrarem em jogo.

Realmente, não vale a pena se preocupar a menos que você esteja literalmente preocupado com o desempenho de criar / excluir bilhões de arquivos em um curto período de tempo. Aplicativos de E / S de disco alto incluem coisas como bancos de dados e bancos de dados normalmente abrem alguns arquivos muito grandes e os mantêm abertos enquanto o banco de dados está sendo usado. Portanto, esses tipos de aplicativos - um que normalmente requer toda a E / S de disco que existe - não fazem muitas chamadas em que o nome do arquivo precisa ser analisado.

A velocidade do meio vai ser um gargalo muito antes de o tempo de lidar com nomes de arquivos se aproximar dele.

    
por 12.05.2017 / 15:38
0

Se você assumir que o próprio sistema de arquivos é sensível a maiúsculas e minúsculas, na medida em que permite armazenar um nome de arquivo usando caracteres maiúsculos e minúsculos sem restrição, então para certas operações deve haver algum tipo de desempenho penalidade.

Por exemplo, digamos que você tenha um arquivo foobar.txt e depois diga ao seu programa para salvá-lo como fooBar.txt sem verificar se ele já existe.

Para cada arquivo que você cria em um sistema que não diferencia maiúsculas de minúsculas, ele precisa fazer apenas uma pesquisa - o nome de arquivo exato que você especificou. Salvar, pronto.

Para cada arquivo criado em um sistema que faz distinção entre maiúsculas e minúsculas, ele deve procurar por todas as combinações de "foobar" "Foobar" "fOobar" ou deve armazenar em buffer a lista de arquivos e depois converter o inteiro lista de nomes de arquivos para maiúsculas e minúsculas e fazer uma pesquisa sobre isso para ver se há arquivos duplicados. O mesmo vale para a leitura de arquivos, se uma correspondência exata não funcionar, então deve verificar todas as possibilidades.

Existe uma enorme diferença na quantidade de trabalho que o driver do sistema de arquivos deve percorrer para verificar a existência de um arquivo.

Para a leitura de nomes de arquivos, há muito menos penalidade para o sistema; em quase todos os casos, o driver do sistema de arquivos simplesmente passa a lista de arquivos para o programa que o solicitou. Tenho certeza de que já vi pessoas mencionarem que é possível criar nomes de arquivos "duplicados" em um sistema de arquivos NTFS usando um sistema que não diferencia maiúsculas de minúsculas, como o Linux e o Windows, apenas lida com isso.

Sistemas que não diferenciam maiúsculas de minúsculas envolvem uma quantidade maior de trabalho no lado dos programadores, mas simplifica um pouco a visão das coisas do ponto de vista do usuário. Existem prós e contras para ambas as formas de fazer as coisas.

Por um lado eu posso ver um problema em sistemas sensíveis a maiúsculas e minúsculas para erros de programação dependentes do caso ao ler arquivos. Se o seu programa codificar um pedido para /etc/fish e alguém o renomei para /etc/Fish (ou você esqueceu de manter o turno para o "f") então você receberá um erro que de outra forma não teria em um sistema que não diferencia maiúsculas de minúsculas.

É tudo sobre onde você está colocando seu esforço e há trocas em ambas as maneiras de fazer as coisas.

    
por 12.05.2017 / 09:21