Perguntas 12 da entrevista em Python (buffer completo, buffer de linha e sem buffer)

O buffer aqui refere-se ao buffer de E / S do espaço do usuário, não ao buffer do kernel.

  • Sem buffer: a camada do usuário não fornece buffer e o fluxo de dados vai diretamente para o buffer do kernel e, em seguida, para periféricos como discos. A saída de erro padrão (2) geralmente não é armazenada em cache, porque deve ser gerada o mais rápido possível e gerada em um dispositivo interativo, como uma tela, não um disco.

  • Buffer de linha: ao encontrar um caractere de nova linha no buffer de E / S ou quando o buffer está cheio, os dados são automaticamente enviados para a entrada padrão do buffer do kernel (0) e a saída padrão (1) correspondente ao dispositivo terminal geralmente é buffer da linha . Além disso, no final do programa; quando o retorno na função principal (representa o final da execução do programa); quando a função principal chama a função de saída (finaliza o processo atual); quando a função da biblioteca C é liberada ou quando o arquivo é fechado, os dados em buffer de E / S também serão Pincele até o núcleo e depois envie para o periférico.

  • Buffer completo: escreva de volta para o kernel se o buffer estiver cheio. Gravações e gravações regulares de arquivos (disco) geralmente são totalmente armazenadas em buffer. Além disso, no final do programa; quando o retorno na função principal (representa o final da execução do programa); quando a função principal chama a função de saída (finaliza o processo atual); quando a função da biblioteca C é liberada ou quando o arquivo é fechado, os dados em buffer de E / S também serão Pincele até o núcleo e depois envie para o periférico. Os dois últimos são: data --- I / O buffering ------- core buffering ------- periféricos.

Os itens acima são todos os buffers de E / S, e sua função é reduzir o número de leituras e gravações, ou seja, reduzir chamadas de sistema, reduzindo assim a sobrecarga do sistema e melhorando a velocidade de E / S.

Buffer do kernel. Em teoria, o kernel pode gravar no disco a qualquer momento, mas nem todas as operações de gravação farão com que o kernel seja gravado. O kernel armazenará temporariamente os dados a serem gravados no buffer e os gravará novamente depois de acumular uma certa quantia. Às vezes, isso leva a situações inesperadas, como falta de energia, o kernel não tem tempo para gravar os dados no buffer do kernel no disco e esses dados atualizados são perdidos.

A leitura copia os dados do buffer do kernel para o buffer de E / S e grava os dados das cópias do buffer de E / S para o buffer do kernel.Eles não são equivalentes à troca de dados entre o buffer do kernel e o disco. Nota: Para o processo do usuário, enviar os dados para o buffer do kernel é equivalente a enviá-los para o periférico (o mesmo efeito), ou seja, é transparente para o processo do usuário.

A diferença entre a saída padrão (1) e a saída de erro (2). Primeiro, o primeiro é o buffer de linha e o segundo não é armazenado em buffer.Você pode enviar imediatamente a mensagem de erro para a tela sem deixá-la no buffer de E / S; ambos são enviados para a tela por padrão.

Publicado 44 artigos originais · gostei 0 · visitas 1226

Acho que você gosta

Origin blog.csdn.net/weixin520520/article/details/105451556
Recomendado
Clasificación