# Chamadas bloqueantes

Quando um programa precisa fazer uma chamada no I/O, a CPU sofre uma interrupção para ser liberada para outro programa do computador e o processo atual fica *bloqueado*. É por isso que chamamos de **I/O bloqueante**.

<figure><img src="https://1347906346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FADWkcUWoXJQdqxwxxE7z%2Fuploads%2FqAJhxogwz9GnXyFdxHTg%2FScreenshot%202024-12-17%20at%2019.02.18.png?alt=media&#x26;token=0235d180-14a5-4590-a57f-ecc42d65a880" alt="" width="563"><figcaption></figcaption></figure>

Durante a leitura do arquivo, a thread não faz outra coisa. Se for a thread principal do processo, o programa todo fica bloqueado até que a leitura do I/O seja concluída.

Dependendo das características do sistema, isto pode trazer problemas de performance. Se por exemplo, múltiplos requests HTTP chegam no servidor, a latência total da aplicação será muito alta, fazendo com que diversos requests fiquem travados na fila.

Uma solução? Disparar uma thread para cada requisição HTTP:

<figure><img src="https://1347906346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FADWkcUWoXJQdqxwxxE7z%2Fuploads%2FT6B4Y5s1imRzNKCYiT89%2FScreenshot%202024-12-17%20at%2019.08.32.png?alt=media&#x26;token=8c2970b1-29c0-4bae-a6ac-573d4a4bac6f" alt="" width="563"><figcaption></figcaption></figure>

Desta forma, enquanto uma thread fica bloqueada esperando I/O, outra pode fazer uso da CPU ou mesmo de outro recurso de I/O.

> Yay! Problema resolvido, certo Leandro?

Calma, *jovem*.

Problemas com esta abordagem: a criação de thread no SO tem seus custos. No caso de termos milhares de requisições, terminaríamos com a criação de milhares de threads, apenas para atender as requisições HTTP de um sistema. E quanto aos outros programas do computador?

O sistema operacional define um **limite de threads** para serem criadas. Criar thread não deveria ser algo banal, temos que criar threads com muita parcimônia.

Uma forma de resolver esta criação absurda de threads é definir uma "piscina" de threads, com um número limitado, onde estas threads seriam recicladas para todos os pedidos que chegassem na aplicação.

Sim, estamos falando de **pool de threads**.

<figure><img src="https://1347906346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FADWkcUWoXJQdqxwxxE7z%2Fuploads%2FldoYhB77QAFsOnJ4YODg%2FScreenshot%202024-12-17%20at%2019.13.28.png?alt=media&#x26;token=f11bf490-dc29-4426-9c4d-56c13c98ecac" alt="" width="563"><figcaption></figcaption></figure>

A definição de uma pool de threads pode ser implementada com qualquer linguagem de programação. Basta ter uma fila, onde os pedidos são enfileirados; e depois a definição de **um número fixo de threads** que ficam consumindo os pedidos da fila. Ao término, a thread volta a esperar algo na fila.

Pool de threads resolve a limitação de criação de threads no SO e evita com que utilizemos recursos de forma desnecessária. Entretanto, para lidar com chamadas no I/O, precisamos mesmo bloquear as threads?

E se houvesse um mecanismo no SO, bem inteligente, que permite que as chamadas no I/O possam ser *não-bloqueantes*, notificando assim o programa quando o recurso ficar pronto?
