Все ли системные вызовы блокируются?
-
16-10-2019 - |
Вопрос
Я читал статья это описывает переключение между пользовательским пространством и пространством ядра, которое происходит при системном вызове.В статье говорится
Приложение ожидает завершения системного вызова, прежде чем возобновить выполнение в пользовательском режиме.
Так вот, до сих пор я предполагал, что некоторые системные вызовы являются blocking
, в то время как другие являются non-blocking
.С приведенным выше комментарием я теперь в замешательстве.Означает ли это, что все системные вызовы блокируются, или я неправильно понял концепцию?
Решение
Кажется, вы перегружаете термин "блокировка".
При любом переключении контекста, которое вы производите в ядре, вам приходится ждать, пока оно снова переключится в пользовательский режим, прежде чем ваше приложение сможет продолжить работу.Это не то, что обычно называют "блокировкой".
В текущей конструкции ядра блокирующие вызовы - это вызовы, при которых ядро возвращает результат только после завершения запроса (или возникновения ошибки).Эти вызовы обычно занимают больше времени и обычно приводят к тому, что ваш процесс не выполняется по расписанию.Например, многие вызовы ввода-вывода блокируются.
Существует системный вызов, который обеспечивает асинхронный ввод-вывод и они неблокирующие.Обратите внимание, что здесь все еще происходит переключение контекста, только приложение должно позаботиться об асинхронном характере вызова.
Статья, похоже, направлена на то, чтобы покончить с этим переключением контекста взад и вперед (системные вызовы без исключений) и попытаться сделать все вызовы асинхронными.