Fale também sobre bloqueio, não bloqueio, síncrono e assíncrono

Em um recrutamento recente, descobri que muitas pessoas têm um entendimento muito vago sobre BIO, NIO, AIO, etc., e achavam necessário escrever artigos para corrigir os mal-entendidos de muitas pessoas.
Antes de falar sobre isso, é muito necessário apresentar os cinco modelos Unix IO:
Bloqueio: O
bloqueio é o modelo IO mais comumente usado. Por padrão, todas as operações de arquivo são bloqueadas. Tome a programação de soquete como exemplo. Chame recvfrom no espaço do processo e sua chamada de sistema não retornará até que a mensagem de dados chegue e seja copiada para a área de buffer do processo do aplicativo (ou ocorra um erro) e esteja aguardando durante esse período. O processo é bloqueado por todo o período, desde quando recvfrom é chamado até quando ele retorna. Há uma imagem muito clássica:
Modelo de bloqueio de E / S
sem bloqueio:
no processo de chamar recvfrom da camada de aplicativo para o kernel, se não houver dados no buffer, um erro EWOULDBLOCK será retornado diretamente e o status de verificação geralmente será pesquisado para ver se o espaço do kernel está disponível Não há dados para vir. Até que haja dados, a cópia está finalmente concluída. Conforme mostrado na figura abaixo:
Modelo de IO sem bloqueio
Multiplexação IO:
select / poll / epoll fornecido pelo sistema Linux, o processo passa um ou mais FD (descritor de arquivo) para uma ou mais chamadas de sistema poll / select, bloqueando em select. Selecionar e pesquisar pode ajudar a monitorar se muitos FDs estão prontos. No entanto, selecionar e pesquisar são varreduras sequenciais para verificar o status de prontidão do FD, que é relativamente ineficiente, e o número de FDs suportados é limitado (se bem me lembro, o padrão parece ser 1024 ou 2048, o que não está claro) . E epoll é uma forma orientada por eventos, quando o FD está pronto, a reversão da função de retorno de chamada é imediatamente chamada de volta. Figura: Por
Modelo de multiplexação IO
falar em epoll, tenho que citar uma questão clássica, a comparação entre o apache e o nginx, por que o nginx é muito mais eficiente do que o apache, esse é o motivo fundamental.
Orientado por sinal:
este modelo tem muito poucas aplicações práticas. Não vou apresentar muito aqui. Você pode ver a imagem:
Modelo de IO orientado por sinal
Assíncrono:
Diga ao kernel para iniciar uma operação e deixe o kernel notificar após toda a operação (incluindo a cópia de dados do espaço do kernel para seu próprio buffer). A principal característica do IO assíncrono é notificar ativamente após a conclusão da operação. Como mostrado:
Modelo de E / S assíncrono

Bem, o que foi dito acima pode ser um pouco abstrato. Aqui, a linguagem do ponto popular para resumir bloqueio, não bloqueio, síncrono,
bloqueio assíncrono , não bloqueio: o processo de dados / thread está pronto para ser acessado, seja o processo / thread a aguardar;
síncrono, assíncrono: dados de acesso , a sincronização precisa ler e gravar dados ativamente, ela ainda bloqueará no processo de leitura e gravação de dados;
assíncrona requer apenas a notificação da conclusão da operação de E / S e não lê e grava dados ativamente. O kernel do sistema operacional completa a leitura e a gravação dos dados.
Vejamos outro exemplo que circula na Internet e é muito fácil de entender:
Lao Zhang adora tomar chá, não falar besteiras, ferver água.
Personagens: Lao Zhang, duas chaleiras (chaleira comum, conhecida como chaleira; chaleira que toca, chamada de chaleira).
1 Lao Zhang colocou a chaleira no fogo e imediatamente esperou a água ferver. (Bloqueio de sincronização) Lao Zhang se sente um pouco bobo
2 Lao Zhang coloca a chaleira no fogo, vai para a sala assistir TV e vai para a cozinha de vez em quando para ver se a água está fervendo. (Sincronizado sem bloqueio)
Lao Zhang ainda se sentia um pouco estúpido, então ele se tornou um cara de ponta e comprou uma chaleira que pode tocar flauta. Depois que a água é fervida, ela pode fazer um barulho muito alto.
3 Lao Zhang pôs a chaleira no fogo e esperou a água ferver. (Bloqueio assíncrono) Lao Zhang se sente tão estúpido que não faz muito sentido esperar.
4 Lao Zhang colocou a chaleira no fogo e foi para a sala de estar assistir TV. Ele parou de assistir antes que a chaleira tocasse e foi para pegar a chaleira quando tocou. (Sem bloqueio assíncrono) Zhang acha que é inteligente.
O chamado síncrono e assíncrono é apenas para a chaleira. Chaleira comum, síncrona; chaleira com toque, assíncrona. Embora possam funcionar, o som da chaleira pode lembrar Lao Zhang que a água está fervendo depois que ele termina o trabalho. Isso está além do alcance das chaleiras comuns.
A sincronização só pode permitir que o chamador faça uma sondagem (no caso 2), causando a ineficiência de Zhang. O chamado bloqueio não bloqueador é apenas para Lao Zhang. O velho Zhang está
bloqueando, o velho Zhang assistindo TV não bloqueia. Nos casos 1 e 3, Lao Zhang foi obstruído e não soube quando sua esposa ligou.
Embora a chaleira tocando em 3 seja assíncrona, não faz muito sentido para o velho Zhang que está esperando. Portanto, geralmente o assíncrono é usado em conjunto com o não bloqueador, de modo a desempenhar o papel de assíncrono.

Acho que você gosta

Origin blog.csdn.net/dinglang_2009/article/details/50461697
Recomendado
Clasificación