Вопрос

Я читал статья это описывает переключение между пользовательским пространством и пространством ядра, которое происходит при системном вызове.В статье говорится

Приложение ожидает завершения системного вызова, прежде чем возобновить выполнение в пользовательском режиме.

Так вот, до сих пор я предполагал, что некоторые системные вызовы являются blocking, в то время как другие являются non-blocking.С приведенным выше комментарием я теперь в замешательстве.Означает ли это, что все системные вызовы блокируются, или я неправильно понял концепцию?

Это было полезно?

Решение

Кажется, вы перегружаете термин "блокировка".

При любом переключении контекста, которое вы производите в ядре, вам приходится ждать, пока оно снова переключится в пользовательский режим, прежде чем ваше приложение сможет продолжить работу.Это не то, что обычно называют "блокировкой".

В текущей конструкции ядра блокирующие вызовы - это вызовы, при которых ядро возвращает результат только после завершения запроса (или возникновения ошибки).Эти вызовы обычно занимают больше времени и обычно приводят к тому, что ваш процесс не выполняется по расписанию.Например, многие вызовы ввода-вывода блокируются.

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

Статья, похоже, направлена на то, чтобы покончить с этим переключением контекста взад и вперед (системные вызовы без исключений) и попытаться сделать все вызовы асинхронными.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top