Используют ли аргументы командной строки и файловый ввод-вывод процессорное время?

Двойные кавычки делают «подстановку команд» одним единственным аргументом. Попробуйте без:

$ for i in $( printf 'abc\nxyz\n123 456\n'); do   echo "????";   echo "$i"; done
????
abc
????
xyz
????
123 456

Кроме того, ваш IFSустановлен в строку, содержащую два символа "\" и "n". Например,. bash, вы можете попробовать $'\n'.

1
14.03.2021, 19:40
1 ответ

Да (для разумных реализаций и разумных определений)

Очевидно, что если у вас есть такая команда, как cat /etc/passwd, то процесс будет выполнять вызовы open(2), чтобы открыть файл.

Чуть менее очевидно, что если у вас есть такая команда, как cat < /etc/passwd, стоимость открытия файла также будет изменена на этот процесс, по крайней мере, для типичных реализаций оболочки. Оболочка обработает эту команду следующим образом.

  1. Он увидит, что catне является встроенной командой. Поэтому он создаст новый процесс для его запуска. Традиционно для этого используется системный вызов fork (2 ), но в наши дни в зависимости от системы могут использоваться системные вызовы vfork, clone или spawn.
  2. Исходный процесс вызовет некоторую версию системного вызова ожидания, поскольку команда не заканчивалась на &.
  3. Новый процесс по-прежнему выполняет оболочку. Он вызовет open, чтобы открыть файл, и сделает так, чтобы открытый файл находился в файловом дескрипторе 0. Есть по крайней мере несколько способов сделать это, но дело в том, что этот новый процесс вызывает open.
  4. Затем новый процесс преобразуется в catс помощью некоторой версии системного вызова exec.
  5. В конце концов catзавершит работу, и исходная оболочка вернется из своего вызова wait.

Таким образом, в этом случае новый процесс также потребует затрат на настройку потока ввода-вывода. Конечно, затраты на настройку ввода-вывода обычно невелики по сравнению с реальным вводом-выводом.

С закрытием дела обстоят немного сложнее. Среда выполнения, связанная с программой, обычно очищает все буферы и закрывает открытые файлы. Время, затраченное на это, засчитывается в процессе. Когда процесс завершается, все оставшиеся открытые файлы закрываются. Стоимость выполнения этого может или не может быть учтена в процессе.

Если у вас есть что-то вроде FUSE, где другой процесс предоставляет файловую систему, то время, затраченное другим процессом на открытие, будет начисляться этому процессу, а не процессу, выполнившему вызов открытия.

0
18.03.2021, 22:25

Теги

Похожие вопросы