2

Рассмотрим следующие две команды, которые создают тупой файл размером 1 КБ

dd if=/dev/urandom of=test.file bs=1024 count=1

dd if=/dev/urandom of=test.file bs=1 count=1024

Первая команда использует размер блока 1024 байта и количество блоков 1, вторая - наоборот.

Я предполагаю, что нет никакой разницы, и ограничение размера блока является проблемой, связанной с ОЗУ: размер блока не может быть больше доступной памяти.

Существуют ли какие-либо особые случаи, когда я хотел бы использовать первый случай вместо второго? И наоборот?

1 ответ1

7

Как вы, кажется, в основном понимаете, первая версия выполняет одно чтение из 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).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .