Compreendendo estruturas bloqueantes e não-bloqueantes

5

Alguém poderia me ajudar a entender qual é a diferença entre estruturas de bloqueio e de não bloqueio?

Até agora, eu entendo que quando o pedido chega a um framework de bloqueio ele cria um novo thread para esse pedido e o processa, se o segundo pedido chegar ao servidor antes do primeiro ter terminado a execução, ele criará outro thread.

Agora para o servidor que não bloqueia quando uma solicitação chega a um servidor da Web, ela não criará um thread, mas aguardará a conclusão de uma solicitação e, caso outra solicitação chegue a uma estrutura antes de sua execução ser concluída, não será capaz de processar antes de retornar o resultado do primeiro pedido.

Outra pergunta que tenho é exatamente o que acontece com a segunda solicitação na estrutura sem bloqueio que o navegador apenas espera que o servidor responda até que a solicitação expire ou algo mais aconteça?

Se as estruturas sem bloqueio puderem processar uma solicitação de cada vez, como aplicativos Web construídos com estruturas não-bloqueadoras processarão mais solicitações do que aquelas construídas com estruturas de bloqueio (supondo que a afirmação acima esteja correta). Isso significa que para cada instância de estrutura de bloqueio em nosso servidor, nós realmente implementamos várias instâncias de frameworks não-bloqueantes?

    
por Havir 17.04.2012 / 21:44
fonte

3 respostas

4

O que é um quadro de não bloqueio?

Explique como se eu tivesse 5 anos: imagine que você deseja fazer um depósito em sua conta bancária. Você entra e percebe que não há fila de pessoas esperando fila.

O sinal no caixa do banco diz: "Caixa não bloqueante". Você anda e pede ao caixa para processar seu depósito, o caixa responde: "Estou ocupado com outra transação, tente novamente mais tarde".

Espere um pouco e tente novamente mais tarde. Você toma sua própria decisão se quiser continuar tentando processar ou não sua transação. Você tenta e, na quinta vez que tentar, sua transação é processada imediatamente.

O "caixa de bloqueio" teria dito para você "ficar na fila como uma fila FIFO". O caixa não bloqueador diz: "tente novamente mais tarde". Com qual caixa de banco você prefere interagir e por quê?

Definição: Uma estrutura sem bloqueio fornece um serviço e retorna um resultado imediatamente, em vez de esperar que os outros programas solicitem que um recurso aguarde.

Em outras palavras: Quando um programa do lado do cliente faz uma chamada para a estrutura, a chamada sempre retornará imediatamente com qualquer resposta que tenha para você, sem esperar que você espere por algo. Essa garantia é boa para programadores que não querem se preocupar com programação em torno da situação em que o framework espera que esperemos 5 minutos.

Um exemplo de programação concreta: Suponha que sua estrutura queira fornecer acesso mutuamente exclusivo a um arquivo salvo no lado do servidor. Um exemplo de uma "chamada sem bloqueio" seria try_lock . Se o lado do cliente quiser acesso ao arquivo, o framework responderá: "Não, tente novamente mais tarde", em vez de colocá-lo em uma fila e esperar que você fique aguardando.

O lado do cliente continua tentando o bloqueio, até que ele chegue, uma vez que obtém, faz o seu negócio e desbloqueia-lo. O benefício disso é que o que você tentar tem um efeito imediato.

Desvantagens para estruturas sem bloqueio: Quando há muito trabalho a ser feito para uma estrutura sem bloqueio, os clientes são negados, e a justiça não é aplicada, apenas os clientes que importam o servidor a maioria tem acesso ao serviço. Não é justo.

    
por 01.05.2015 / 17:22
fonte
1

Did I get it right?

Acho que você conseguiu isso de volta.

"bloqueio" refere-se a proibir outras coisas de continuar durante o processamento de uma tarefa.

Um servidor escuta em uma porta por uma solicitação. Quando recebe um, ele pode (a) processar o pedido (não escutando mais solicitações enquanto bloqueia pedidos adicionais até que o trabalho seja concluído) ou (b) gerar um thread para manipular o pedido e retornar imediatamente ao escutar na porta para mais pedidos.

Como alternativa, ele pode enviar a solicitação para um thread já gerado em um pool de threads que está gerenciando.

    
por 18.04.2012 / 02:55
fonte
0

Acho que o que você está descrevendo está confundindo duas coisas diferentes - mecanismos de chamada síncrona / assíncrona e o padrão de design do reator ( que é uma maneira de um aplicativo de serviço de longa execução lidar com várias solicitações de serviço).

O bloqueio é outro nome para uma chamada síncrona em que o chamador aguarda até que a tarefa termine antes de retomar.

Non-blocking é outro nome para uma chamada assíncrona em que o chamador retorna imediatamente após fazer a chamada e pode ser informado por meio de um evento (ou callback) quando a tarefa terminar.

    
por 18.04.2012 / 03:49
fonte