É uma medida de eficiência. A CPU roda muito mais rápido que a porta serial, se o kernel permitir que o processo userspace seja executado toda vez que houver um pouco de espaço no buffer, ele acabará fazendo uma viagem ao userspace e retornando para cada byte de dados. Isso é muito desperdício de tempo de CPU:
$ time dd if=/dev/zero of=/dev/null bs=1 count=10000000
10000000+0 records in
10000000+0 records out
10000000 bytes (10 MB, 9.5 MiB) copied, 5.95145 s, 1.7 MB/s
real 0m5.954s
user 0m1.960s
sys 0m3.992s
$ time dd if=/dev/zero of=/dev/null bs=1000 count=10000
10000+0 records in
10000+0 records out
10000000 bytes (10 MB, 9.5 MiB) copied, 0.011041 s, 906 MB/s
real 0m0.014s
user 0m0.000s
sys 0m0.012s
O teste acima não é nem mesmo ler e escrever um dispositivo real: toda a diferença de tempo é a freqüência com que o sistema está pulando entre o userspace e o kernelspace.
Se o espaço do usuário não quiser ser retido, ele poderá usar a E / S sem bloqueio ou poderá usar uma chamada select()
para ver se há espaço para gravar no dispositivo ... e se houver não, pode despejar o restante em um buffer próprio e continuar processando. Evidentemente, isso complica as coisas, já que agora você tem um buffer que precisa liberar ... mas se você estiver usando o stdio, isso geralmente é verdade mesmo assim.