Обеспечивается ли привязка процессора к системным вызовам? - PullRequest
1 голос
/ 15 апреля 2020

Итак, если я установлю привязку ЦП процесса с помощью:

sched_setaffinity()

и затем выполню какой-либо другой системный вызов с использованием этого процесса, будет ли этот системный вызов ТАКЖЕ выполняться на том же ЦП, принудительно установленном sched_setaffinity ?

По сути, я пытаюсь обеспечить выполнение процесса и выполняемых им системных вызовов на одном ядре. Очевидно, что я могу использовать sched_setaffinity() для принудительного выполнения кода пользовательского пространства только на одном процессоре, но может ли тот же системный вызов обеспечить выполнение кода пространства ядра в этом контексте процесса на том же ядре?

Спасибо!

1 Ответ

1 голос
/ 15 апреля 2020

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

Задача может быть прервана планировщиком и перемещена на другой ЦП. , и это может произойти в середине обычного кода режима пользователя или даже в середине системного вызова.

Установив привязку задачи к одному ЦП с помощью sched_setaffinity(), вы удаляете эту возможность, поскольку даже если если задача прервана, у планировщика нет другого выбора, кроме как оставить его работающим на том же процессоре (он, конечно, может изменить текущую задачу, но когда ваша задача возобновится, он все равно будет на том же процессоре).

Итак, чтобы ответить на ваш вопрос:

обеспечивает ли тот же системный вызов принудительное выполнение кода пространства ядра в этом контексте процесса на том же ядре?

Да, это так.


Теперь, чтобы обратиться к комментарию @ Barmar : в случае системных вызовов, которые могут "спать", это не означает, что задача может Я изменю ЦП, если сходство не позволяет.

Что происходит, когда системный вызов спит, просто то, что код системного вызова сообщает планировщику: «эй, я чего-то жду, просто запустите другую задачу, пока я подожди и разбуди меня позже ". Когда системный вызов возобновляется, он проверяет, доступен ли запрошенный ресурс (он может даже точно сообщить ядру , когда он хочет разбудить), и если нет, он либо ждет снова, либо возвращается к пользовательскому коду, говоря " извини, ничего не получил, попробуй еще раз ". Разумеется, ресурс может быть сделан доступным по некоторому прерыванию, которое заставляет обработчик прерываний работать на другом процессоре, но это другая история, и это не имеет значения. Проще говоря: код прерывания вообще не запускается в контексте процесса. Что касается задачи, выполняющей системный вызов, ресурс просто волшебным образом появляется, когда выполнение возобновляется.

...