Это показатель эффективности. ЦП работает намного быстрее, чем последовательный порт, что если бы ядро позволяло процессу пользовательского пространства запускаться каждый раз, когда в буфере оставалось немного места, оно в конечном итоге отправлялось бы в пользовательское пространство и обратно для каждого отдельного байта данных. Это очень расточительное время ЦП:
$ 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
Вышеупомянутый тест даже не считывает и не записывает реальное устройство: вся разница во времени заключается в том, как часто система переключается между пользовательским пространством и пространством ядра.
Если пользовательское пространство не хочет задерживаться, оно может использовать неблокирующий ввод-вывод или может проверить с помощью вызова select ()
, чтобы узнать, есть ли место для записи на устройство. ... а если нет, он может сбросить остаток в собственный буфер и продолжить обработку. По общему признанию, это действительно усложняет ситуацию, поскольку теперь у вас есть буфер, который вы должны очистить ... но если вы используете stdio, это в любом случае верно.
Вы можете использовать команду info
, чтобы узнать больше деталей о любой команде в coreutils.
Вот часть команды info ls
, объясняющая опцию -l
:
`-l'
`--format=long'
`--format=verbose'
In addition to the name of each file, print the file type, file
mode bits, number of hard links, owner name, group name, size, and
timestamp (*note Formatting file timestamps::), normally the
modification time. Print question marks for information that
cannot be determined.
........