Системные вызовы на самом деле просто переключение вашего кода процесса из режима пользователя в режим ядра. Запускаемая задача вообще не меняется, она просто временно переходит в режим ядра для выполнения системного вызова, а затем возвращается обратно в пользовательский режим.
Задача может быть вытеснена планировщиком и перемещена на другой ЦП, и это может произойти в середине кода обычного пользовательского режима или даже в середине системного вызова.
Установив привязку задачи к одному процессору с помощью sched_setaffinity()
, вы устраните эту возможность, поскольку даже если задача будет вытеснена, у планировщика нет другого выбора, кроме как оставить ее на том же процессоре (конечно, он может изменить текущую выполняемую задачу, но когда ваша задача возобновится, она все равно будет на том же процессоре).
Итак, чтобы ответить на ваш вопрос:
Применяет ли тот же системный вызов код пространства ядра в этом контексте процесса, который также будет выполняться на том же ядре?
Да, это так.
Теперь, чтобы обратиться к комментарию @Barmar: в случае системных вызовов, которые могут "спать", это не означает, что задача может изменить ЦП, если сходство не позволяет этого.
Что происходит, когда системный вызов спит, так это то, что код системного вызова сообщает планировщику: «Эй, я чего-то жду, просто запусти другую задачу, пока я жду, и разбуди меня позже». Когда системный вызов возобновляется, он проверяет, доступен ли запрошенный ресурс (он может даже точно сообщить ядру, когда его нужно разбудить), и если нет, то либо ждет снова, либо возвращается к пользовательскому коду, говоря: "Извините, у меня ничего не получилось, попробуйте еще раз". Ресурс, конечно, может быть сделан доступным некоторым прерыванием, которое заставляет обработчик прерывания работать на другом процессоре, но это другая история, и это не имеет большого значения. Проще говоря: код прерывания вообще не запускается в контексте процесса. Что касается задачи, выполняющей системный вызов, ресурс просто волшебным образом появляется, когда выполнение возобновляется.
person
Marco Bonelli
schedule
15.04.2020