Самые большие "издержки" в unusesd использование операторов понимают Ваш код:)
Удаляющие неиспользованные делает Ваш код более опрятным и легче для кого-то еще считать и поддержать.
Во время ожидания read ()
или write ()
в / из возврата файлового дескриптора, процесс будет помещен в специальный вид сон, известный как «D» или «Disk Sleep». Это особенное, потому что процесс не может быть остановлен или прерван в таком состоянии. Процесс, ожидающий возврата от ioctl (), также будет переведен в спящий режим таким образом.
Исключением является случай, когда файл (например, терминал или другое символьное устройство) открывается в O_NONBLOCK
], пройденный, когда предполагается, что устройству (например, модему) потребуется время для инициализации. Однако в своем вопросе вы указали блочные устройства. Кроме того, я никогда не пробовал использовать ioctl ()
, который может блокировать fd, открытый в неблокирующем режиме (по крайней мере, неосознанно).
Выбор другого процесса полностью зависит от планировщика, который вы используете, а также от того, что другие процессы могли сделать для изменения своих весов в этом планировщике.
Некоторые программы пользовательского пространства при определенных обстоятельствах, как известно, остаются в это состояние навсегда, до перезагрузки. Обычно они сгруппированы вместе с другими «зомби», но этот термин не будет правильным, поскольку технически они не прекратили свое существование.
Процесс, выполняющий ввод-вывод, будет переведен в состояние D (непрерывный спящий режим) , что освобождает ЦП до тех пор, пока не произойдет аппаратное прерывание, которое сообщает ЦП вернуться в выполнение программы. Для получения информации о других состояниях процесса см. man ps
.
В зависимости от вашего ядра существует планировщик процессов , который отслеживает очередь выполнения процессов, готовых к выполнению. Вместе с алгоритмом планирования он сообщает ядру, какой процесс назначить какому процессору. Следует учитывать процессы ядра и пользовательские процессы. Каждому процессу выделяется временной интервал, который представляет собой кусок процессорного времени, который ему разрешено использовать. Как только процесс использует весь свой временной интервал, он помечается как просроченный и получает более низкий приоритет в алгоритме планирования.
В ядре 2.6 , есть O (1) планировщик временной сложности , поэтому независимо от того, сколько процессов у вас запущено, он будет назначать процессоры в постоянное время. Однако это сложнее, поскольку 2.6 представила приоритетное прерывание и балансировка нагрузки ЦП - непростой алгоритм. В любом случае это эффективно, и процессоры не будут простаивать, пока вы ждете ввода-вывода.
Да, задача блокируется в системном вызове read (). Выполняется другая задача, которая готова, или, если другие задачи не готовы, запускается задача бездействия (для этого ЦП).
Обычное, блокирующее чтение с диска приводит к тому, что задача переходит в состояние «D» (как отмечали другие) . Такие задачи влияют на среднюю нагрузку, даже если они не используют ЦП.
Некоторые другие типы операций ввода-вывода, особенно ttys и сеть, ведут себя иначе - процесс завершается в состоянии «S» и может прерываться и не учитывается при средней нагрузке.
Предполагая, что ваш процесс является одним потоком и вы используете блокирующий ввод-вывод, ваш процесс будет блокироваться в ожидании завершения ввода-вывода. Ядро тем временем выберет другой процесс для запуска в зависимости от удобства, приоритета, времени последнего выполнения и т. Д. Если других запускаемых процессов нет, ядро не будет запускать их; вместо этого он сообщит оборудованию, что машина простаивает (что приведет к снижению энергопотребления).
Процессы, ожидающие завершения ввода-вывода, обычно появляются в состоянии D, например, в ps
и вверху
.
Да, задачи, ожидающие ввода-вывода, блокируются, а другие задачи выполняются. Выбор следующей задачи выполняется планировщиком Linux .
Обычно процесс блокируется. Если операция чтения выполняется для файлового дескриптора, помеченного как неблокирующий, или если процесс использует асинхронный ввод-вывод, он не будет блокироваться. Также, если у процесса есть другие потоки, которые не заблокированы, они могут продолжить работу.
Решение о том, какой процесс запускается следующим, принимает планировщик в ядре.