No design do sistema de IO de alto desempenho, existem vários conceitos de substantivo que geralmente nos confundem. Os detalhes são os seguintes:
1 O que é sincronização?
2 O que é assíncrono?
3 O que é bloquear?
4 O que não é bloqueador?
5 O que é bloqueio síncrono?
6 O que não é bloqueio síncrono?
7 O que é bloqueio assíncrono?
8 O que é não síncrono não bloqueando?
Deixe -me dar um exemplo na vida:
Se você quiser uma tigela de arroz com cortinas de frango com kung pao:
Bloqueio síncrono: você vai a um restaurante para pedir comida, depois espera lá e grite: ok?
Não-bloqueio síncrono: depois de pedir em um restaurante, fui passear com o cachorro. Mas depois de caminhar por um tempo, ele voltou para o restaurante e gritou: ok?
Bloqueio assíncrono: Ao passear com o cachorro, recebi uma ligação do restaurante dizendo que a refeição estava pronta e pedi que você a pegasse pessoalmente.
Não-síncrono não bloqueando: o restaurante chamou e disse: "Conhecemos sua localização e enviarei para você mais tarde, para que eu possa passear com o cachorro com paz de espírito".
Antes de descobrirmos os problemas acima, devemos primeiro entender o que são sincronização, assíncrono, bloqueio e não bloqueio. Somente quando esses conceitos únicos são entendidos claramente e, quando combinados, será relativamente mais fácil.
1. Sincronização e assíncroneidade são para a interação entre a aplicação e o kernel.
2. Bloqueio e não bloqueio são métodos diferentes adotados pelo processo ao acessar dados de acordo com o estado pronto da operação de IO. Para ser franco, é um método de implementação de leitura ou escrita de funções de operação. Sob o método de bloqueio, a função de leitura ou escrita aguardará, em vez da função de leitura ou gravação, retornará imediatamente um valor de estado.
A partir da descrição acima, podemos basicamente resumir uma frase curta: a sincronização e a assíncrono são o objetivo, e o bloqueio e o não bloqueio são os métodos de implementação.
1. Sincronização: refere -se ao processo do usuário, acionando uma operação de IO e espera ou pesquisa para verificar se a operação de IO está pronta. Saí para comprar roupas na rua e fiz isso eu mesmo, e não pude fazer mais nada.
2. Asíncronas: assíncronas significa que, após o processo do usuário desencadear a operação de IO, ele começa a fazer suas próprias coisas. Quando a operação de IO for concluída, será notificada da conclusão do IO (a característica do assíncrono é uma notificação). Diga ao seu amigo para se adequar ao tamanho, tamanho e cor das roupas e deixe seu amigo confiar para vender, e então você pode fazer outras coisas. (Ao usar o IO assíncrono, o Java delega a leitura e a escrita do IO para o sistema operacional, e precisa passar o endereço e o tamanho do buffer de dados para o sistema operacional)
3. Bloqueio: o chamado método de bloqueio significa que, ao tentar ler e escrever o descritor de arquivos, se não houver nada para ler ou for temporariamente inconsciente, o programa entrará em um estado de espera até que algo leia ou tenha escrito e vá para a parada de ônibus para recarregar. Neste momento, o recarrego não está lá (talvez ele tenha ido ao banheiro) e depois esperamos aqui até que o recarregador volte. (É claro, esse não é o caso na sociedade real, mas é realmente o caso em computadores.)
4. Não bloqueando: No estado não bloqueador, se não houver nada para ler ou não pode ser escrito, a função de leitura e gravação retornará imediatamente sem esperar. Quando o banco retirar dinheiro para lidar com os negócios, receberemos um pequeno recibo. Depois de recebê -lo, podemos brincar com nossos telefones celulares ou conversar com outras pessoas. Quando nos virarmos, o orador do banco nos notificará e podemos ir.
Uma operação de IO é realmente dividida em duas etapas: iniciando uma solicitação de IO e operação de IO real.
A diferença entre IO síncrono e IO assíncrono é se o segundo passo está bloqueado. Se o IO real leia e gravar bloquear o processo de solicitação, será síncrono de IO.
A diferença entre bloquear o IO e o IO não bloqueador está na primeira etapa, se a solicitação de IO será bloqueada. Se estiver bloqueado até que seja concluído, é o IO tradicional de bloqueio. Se não estiver bloqueado, é o IO não bloqueador.
A sincronização e a assíncrona visam a interação entre o aplicativo e o kernel. A sincronização refere -se ao processo do usuário, acionando operações de IO e espera ou pesquisa para ver se a operação de IO está pronta. Assíncrono significa que o processo do usuário começa a fazer suas próprias coisas depois de acionar a operação de IO e, quando a operação de IO for concluída, será notificado que a conclusão de IO será concluída.
Bloqueio e não bloqueio são métodos diferentes adotados pelo processo ao acessar dados de acordo com o estado pronto da operação de IO. Para ser franco, é um método de implementação de leitura ou escrita de funções de operação. Sob o método de bloqueio, a função de leitura ou escrita aguardará, em vez da função de leitura ou gravação, retornará imediatamente um valor de estado.
Portanto, as operações de IO podem ser divididas em três categorias: bloqueio síncrono (ou seja, operações biológicas precoces), não bloqueio síncrono (NIO) e não-síncrono não bloqueio (AIO).
Bloqueio síncrono (Bio):
Dessa forma, depois que o processo do usuário inicia uma operação de IO, ele deve aguardar a conclusão da operação de IO. Somente depois que a operação de IO é realmente concluída, o processo do usuário pode ser executado. O modelo tradicional de IO tradicional de Java pertence a esse método.
Não bloqueio síncrono (NIO):
Dessa forma, o processo do usuário pode retornar a fazer outras coisas após o lançamento de uma operação de IO, mas o processo do usuário precisa perguntar se a operação de IO está pronta de tempos em tempos, o que exige que o processo do usuário pergunte constantemente, introduzindo desperdício desnecessário de recursos da CPU. Entre eles, atualmente o NIO de Java é o IO não bloqueador síncrono.
Não-síncrono não bloqueando (AIO):
Dessa forma, depois que o aplicativo inicia uma operação de IO, ele não aguarda a conclusão da operação de IO do kernel e notificará o aplicativo depois que o kernel concluir a operação de IO.
Bloqueio síncrono io (Java Bio):
Sincronizar e bloco, o modo de implementação do servidor é conectar a um thread, ou seja, quando o cliente tem uma solicitação de conexão, o servidor precisa iniciar um thread para processamento. Se essa conexão não fizer nada, causará uma sobrecarga desnecessária do encadeamento e, é claro, pode ser melhorado através do mecanismo do pool de threads.
IO não bloqueador síncrono (Java Nio):
Não bloqueio síncrono, o modo de implementação do servidor é solicitar um thread, ou seja, as solicitações de conexão enviadas pelo cliente serão registradas no multiplexador. O multiplexador pesquisa a conexão com a solicitação de E/S e inicia um thread para processamento. O processo do usuário também precisa perguntar se a operação de IO está pronta de tempos em tempos, o que exige que o processo do usuário pergunte constantemente.
Bloqueio assíncrono io (Java Nio):
Dessa forma, depois que o aplicativo inicia uma operação de IO, ele não aguarda a conclusão da operação de IO do kernel e notificará o aplicativo depois que o kernel concluir a operação de IO. Essa é realmente a diferença mais crítica entre sincronização e assíncrono. A sincronização deve esperar ou perguntar ativamente se o IO está concluído. Então, por que está bloqueado? Como é feito por chamadas de sistema selecionadas no momento, e a implementação da própria função de seleção está bloqueando, e uma vantagem de usar a função selecionada é que ela pode ouvir várias alças de arquivo ao mesmo tempo (se da perspectiva da UNP, a seleção é uma operação síncrona. Porque após o processo, o processo também precisa ler e escrever dados), melhorando a concorrência do sistema!
(Java AIO (NIO.2)) IO não síncrono não bloqueador:
Nesse modo, o processo do usuário precisa apenas iniciar uma operação de IO e retornar imediatamente. Após a operação de IO ser realmente concluída, o aplicativo será notificado de que a operação de IO é concluída. No momento, o processo do usuário precisa processar apenas os dados e não precisa executar operações reais de leitura e gravação de IO, porque as operações de leitura ou gravação reais de IO foram concluídas pelo kernel.
Análise dos cenários aplicáveis para Bio, Nio e AIO:
O método bio é adequado para arquiteturas com conexões relativamente pequenas e conexões fixas. Este método requer altos recursos do servidor e a simultaneidade é limitada a aplicativos. É a única opção antes do JDK1.4, mas o programa é intuitivo, simples e fácil de entender.
O método NIO é adequado para arquiteturas com um grande número de conexões e conexões relativamente curtas (operação leve), como servidores de bate -papo. A simultaneidade é limitada a aplicações e possui programação relativamente complexa. O JDK1.4 começou a apoiá -lo.
O método AIO é usado para arquiteturas com um grande número de conexões e uma conexão relativamente longa (reoperação), como servidores de álbuns, que chamam totalmente o sistema operacional para participar de operações simultâneas, e a programação é relativamente complicada. O JDK7 começou a apoiá -lo.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.