4 tipos de IO modelo Java relacionados
1. E / S de bloqueio síncrono
Um exemplo típico é o exemplo de TCP do soquete
Comunicação entre servidor e cliente
Algo assim
A seguir, são pseudo códigos
// server端 阻塞自己直到收到消息
// 没收到 线程被挂起
msg = server.accept()
// 收到再执行
handler(msg)
2. Entrada / Saída síncrona e sem bloqueio
// server端
while(msg=server.accpet() !=null){
handle(msg)
}
Ao contrário do bloqueio de E / S, sempre deve haver um valor de retorno.
3. Entrada / Saída Multiplexada
Esse deve ser o modelo de E / S mais utilizado. Muitas estruturas de E / S de alto desempenho são baseadas em E / S multiplexadas.
Como netty
O nio é a base do IO multiplexado
Existem dois modos de multiplexação: modo Proactor e modo Reator
O Proactor é usado para E / S assíncronas
O reator é usado para E / S síncrona
-
Modo reator
O entendimento popular é
Mãe(Cliente) querEu (Servidor) meio-diaCozinhar
(Solicitação de evento / ou pedido de veiculação),Mas agora eu quero jogar (não quero esperar o tempo e depois cozinhar)
Deixa eu contarXiao Ai(Registro de eventos)
Até então, Xiao AiDespertador(Condições)Lembre-me de cozinhar(Callbakc me liga de volta)
Então eu sei que vouCozinhar(Pronto para concluir IO)O evento foi registrado como "Quero cozinhar minha própria comida"
O resultado do retorno de chamada é "isso pode ser feito"
-
Modo Proactor
O entendimento popular é
Mãe(Cliente) querEu (Servidor) meio-diaCozinhar(Solicitação de evento / ou pedido de veiculação),
Mas agora eu quero jogar (não quero esperar o tempo e depois cozinhar)
Deixa eu contarXiao AiEu quero cozinhar (separador de eventos) provavelmente1 xícara de arroz e 1,5 xícaras de água(Tamanho dos dados e área de buffer), os estudantes Xiao Ai iniciam diretamente o processoPanela de arroz(Sistema operacional) Despeje o arroz e adicione água. A panela de arroz está pronta, Xiao Ai conhece o arrozCozido(IO concluído).Lembre-me de comer(Notifique-me que eu posso comer)
Então eu entendi (evento terminado)
A inscrição do evento é "Quero que o arroz cozinhe bem mesmo. Não me importo"
O resultado do retorno de chamada é "Isso é feito de acordo com a exigência de 1,5 xícaras de água por uma xícara de arroz"
Uma análise mais detalhada do modo Reator geralmente usa o modo Reator, porque o Proactor requer um sistema operacional
Existem os três modos a seguir para lidar com solicitações de IO altamente simultâneas
Os seguintes códigos e imagens são provenientes de
Doug Lea
Recomenda-se baixar este pdf para aprender
Modelo IO tradicional
-
Thread de processamento único de reator único
O One Reactor lida com todos os pedidos, incluindo io e outras operações
-
Thread de multiprocessamento de reator único
O reator somente conclui o IO e o restante é entregue ao encadeamento do trabalhador
-
Linha de Processamento Multi Reator Multi
Solicitação separada e operação real
4. E / S Assíncronas
Raramente usado, requer sistema operacional
file = socket.getfile(buff,size);
// 等待一段时间
// buff size 中已经有了file
// 告诉我 我收到了
res = server.finishfile()