Необходимо понимать, что контекст потока / процесса состоит из нескольких частей, одна из которых непосредственно связана с выполнением и хранится в ЦП и некоторых системных таблицах в памяти, которую использует ЦП (например, таблицы страниц), а другая - необходим для ОС, для бухгалтерии (подумайте о различных идентификаторах, дескрипторах, специальных разрешениях для конкретной ОС, сетевых подключениях и т. п.).
Полное переключение контекста потребовало бы замены обоих, старый текущий поток / процесс на некоторое время исчезает, а новый текущий поток на некоторое время входит. В этом суть планирования потоков / процессов.
Теперь системные вызовы очень разные. друг друга.
Рассмотрим что-нибудь простое, например, системный вызов для запроса текущей даты и времени. Процессор переключается из режима пользователя в режим ядра, сохраняя значения регистров режима пользователя, выполняет некоторый код ядра для получения необходимых данных, сохраняет их либо в памяти, либо в регистрах, к которым может обращаться вызывающий абонент, восстанавливает значения регистров режима пользователя и возвращается. Здесь не так много переключений контекста, только то, что нужно для перехода между режимами, пользователем и ядром.
Рассмотрим теперь системный вызов, который включает блокировку вызывающего абонента до некоторого события или доступности данных. Управление мьютексами и чтение файлов были бы примерами таких системных вызовов. В этом случае ядро вынуждено сохранить полный контекст вызывающей стороны, пометить его как заблокированный, чтобы планировщик не мог запустить его до тех пор, пока не поступит это событие или данные, и загрузить контекст другого готового потока / процесса, чтобы он мог выполнить .
Вот как системные вызовы связаны с переключением контекста.
Ядро, выполняемое в контексте пользователя или процесса, означает, что всякий раз, когда ядро работает от имени определенного процесса или пользователя, оно должно учитывать контекст этого пользователя / процесса, например, текущий процесс / поток / идентификатор пользователя, текущий каталог, локаль, права доступа для различных ресурсов (например, файлов), все эти вещи, которые могут различаться для разных процессов / потоков / пользователей.
Если процессы имеют отдельные адресные пространства, адресные пространства также являются частью контекста процесса. Таким образом, когда ядру необходимо получить доступ к памяти процесса (для чтения / записи данных файла или сетевых пакетов), оно должно иметь доступ к адресному пространству процесса, а значит, оно должно находиться в его контексте (оно не означает, однако, что ядро должно загрузить полный контекст только для доступа к памяти в определенном адресном пространстве).
Это полезно?