Entendo que quando escrevo em um arquivo no meu disco rígido, um thread do kernel (pdflush em kernels anteriores a 3.6) irá, em algum momento, realmente liberar isso para o arquivo. Tenho lido sobre redes em "Understanding the Linux Kernel, Second Edition" (desculpe, não há nenhum e-book para o qual eu possa vincular) e parece sugerir que, ao chamar send(), descemos direto para o kernel, terminando com os dados sendo colocados na fila de saída da placa de rede.
Não há menção de nenhum outro tópico.
Alguém pode esclarecer que não interpretei mal ou entendi mal, e que para cada chamada send() que faço, o thread que faz a chamada no meu processo vai direto para o ponto em que o kernel a coloca na fila TX da NIC?
Se for esse o caso, estou confuso sobre como isso acontece com envios assíncronos; ou, neste caso, assíncrono significa simplesmente que recebemos uma notificação posteriormente de que o envio ocorreu?
Confuso.
(Eu já perguntei isso no SO normal, mas me disseram que essa era a melhor área para isso.)
Você está discutindo a técnica de gravar dados em um dispositivo com os dados sendo armazenados em cache na memória antes de serem entregues ao dispositivo. Em seus dois exemplos, os dispositivos são um "disco rígido" (que pode usar tecnologia SSD para maior velocidade) e uma interface de rede (geralmente Ethernet com ou sem fio).
Nos livros/sites que você tem lido, as gravações em um disco rígido são armazenadas em cache na memória e um thread em segundo plano move os dados do cache para o disco físico. As gravações em um dispositivo de rede não são armazenadas em cache na mesma extensão (há cache, mas é muito menor). Por que isso acontece?
Os discos rígidos são lentos . Esta resposta em um tópico da lista de discussão do Redis sobre velocidade de memória/disco ilustra a diferença entre as velocidades de memória, SSD e HD. Os programas vivem na memória e quando trabalham com código, variáveis e estruturas de dados na memória, eles podem ser executados em velocidades de memória. Mas quando os programas precisam gravar no disco, a velocidade mais lenta do dispositivo - sem buffer - faz o programa parar bruscamente. Como a comparação na resposta da lista de discussão mostra, é a diferença entre cerca de um segundo (gravando na memória) e esperar vários dias (gravando no HD) antes que você possa fazer qualquer outra coisa. O SSD é melhor, mas ainda representa esperas que prejudicarão qualquer programa. E não são apenas gravações no disco; as leituras sofrem tanto.
Não é tolerável deixar os programas tão lentos, então, por décadas, os sistemas operacionais colocaram um buffer de memória (cache) entre o disco e os programas. As gravações vão para o buffer de memória rapidamente, permitindo que o programa continue sua função. Os threads do kernel liberam os dados armazenados no buffer para o disco na taxa mais lenta do disco, mas isso é feito em segundo plano, onde não prejudica o desempenho. Ao ler do disco, o sistema operacional tenta ler dados extras no cache de leitura para que o programa que solicita os dados espere menos. Não é perfeito, e quando o programa solicita dados do disco que não estão no cache, o programa tem que esperar por eles.
Com dispositivos de rede, também há buffer de dados para ajudar os programas a terem um bom desempenho, mas o buffer é menor e mais simples. Livros e sites não entram na mesma quantidade de detalhes que entram com buffer de disco.