Как вы, кажется, в основном понимаете, первая версия выполняет одно чтение из 1024 байтов, а затем записывает, сколько бы байтов вернулось из чтения, в то время как вторая версия выполняет 1024 чтения и записи по одному байту каждый.
При копировании обычных файлов больший размер блока (что приводит к меньшему количеству операций ввода-вывода) может быть несколько более эффективным. Это, вероятно, верно и для /dev/urandom
.
Но вы должны быть осторожны при использовании dd
на специальных файлах (то есть на устройствах).
Например,
dd if=(whatever input) of=(a magnetic tape device) bs=1024 count=1
запишет один ленточный блок размером 1024 байта; dd … bs=1 count=1024
запишет 1024 блока по одному байту каждый.
Это не одно и то же; 1024 маленьких блока занимают больше места на ленте, чем один большой блок, из-за промежутков между записями, и могут вызвать проблемы с чтением ленты.
Более подходящим для вашего вопроса, если вы прочитаете (if=
) из /dev/random
, он вернет только столько байтов с высокой энтропией, сколько доступно.
Итак, в первой версии вы можете получить менее 1024 байтов.
Но если вы попытаетесь прочитать один байт, а пул энтропии будет пустым, чтение заблокирует (т. Е. Дождется), пока данные не станут доступны, поэтому вторая версия гарантированно получит 1024 байта (хотя это может занять произвольно долгое время).
Для увеличения по поводу ленточного накопителя:
dd if=(appropriate input) of=(a magnetic tape device) bs=512 count=2
напишу два ленточных блока по 512 байт. Последующий
dd if=(magnetic tape device) of=(whatever) bs=1024 count=1
может прочитать только первый блок; т.е. первые 512 байт.
И (именованные) каналы могут демонстрировать ту же проблему, что и /dev/random
- большое чтение вернет только те байты, которые доступны; так что, опять же, в первой версии вы можете получить менее 1024 байтов.
Но если вы попытаетесь читать по одному байту за раз, чтение будет ждать до тех пор, пока данные не станут доступны, поэтому вторая версия гарантированно получит вам 1024 байта (или, по крайней мере, чтение до EOF).