Переключение контекста

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:51, 24 августа 2017.

Переключение контекста (англ. context switch) - это процесс записи и восстановления состояния процесса или потока таким образом, чтобы в дальнейшем продолжить его выполнение с прерванного места. Этот механизм позволяет нескольким процессам разделить между собой ресурсы одного центрального процессора. Является особенностью многозадачных ОС[Источник 1].

Процесс переключения контекста

Точное значение термина "переключение контекста" сильно зависит от области применения, чаще всего он означает "переключение потока или переключение процесса" или "только переключение процесса". Более точно можно выделить переключение потоков (переключение между двумя потоками в рамках данного процесса), переключение процесса (переключение между двумя процессами), переключение режима (переключение домена: между пользовательским режимом и режимом ядра в заданном потоке), переключение регистра и переключение адресного пространства (переключение между виртуальной и физической памятью). Затраты ресурсов сильно варьируются в зависимости от того, что за собой влечет переключение контекста, от вызова подпрограммы для выполнения небольших пользовательских задач до запуска требовательного к ресурсам процесса.

В процесс переключения входит процедура планирования задачи - принятие решения, какой задаче передать управление.

Описание

При переключении контекста происходит сохранение и восстановление следующей информации[Источник 2]:

  • Регистровый контекст регистров общего назначения (в том числе флаговый регистр)
  • Контекст состояния сопроцессора с плавающей точкой
  • Состояние регистров MMX/SSE (x86)
  • Состояние сегментных регистров (x86)
  • Состояние некоторых управляющих регистров (например, регистр CR3, отвечающий за страничное отображение памяти процесса) (x86)

В ядре ОС с каждым потоком связаны следующие структуры:

  • Общая информация pid, tid, uid, gid, euid, egid и т. д.
  • Состояние процесса/потока
  • Права доступа
  • Используемые потоком ресурсы и блокировки
  • Счетчики использования ресурсов (например, таймеры использованного процессорного времени)
  • Регионы памяти, выделенные процессу

Затраты

Переключение контекста обычно требует больших вычислительных затрат, и основной этап при проектировании операционной системы заключается в оптимизации использования переключения контекста. Переход от одного процесса к другому требует определенного времени для сохранения состояния регистров, обновления различных таблиц и списков и т.д. Например, в ядре Linux переключение контекста включает в себя переключение регистров, указателя стека, счетчика команд, но не включает в себя переключение адресного пространства.

Причины для переключения контекста

Выделяется три ситуации для переключения контекста:

  • Истек квант времени.
  • Поток с более высоким приоритетом стал готовым исполнить код.
  • Запущенный поток должен ждать.

Шаги

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

Состояние процесса включает в себя все регистры, которые процесс может использовать, особенно счетчик команд (регистр, хранящий адрес текущей выполняемой команды), а также любые другие специфичные для операционной системы данные, которые могут быть необходимы. Эта информация хранится в структуре данных, называемой блоком управления процессом (англ. process control block, PCB).

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

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

Производительность

Сам процесс переключения контекста занимает процессорное время из-за работы планировщика задач, использования буфера ассоциативной трансляции (англ. translation lookaside buffer, TLB) и косвенно из-за необходимости распределения кэш памяти между несколькими задачами. Переключение между потоками внутри одного процесса может происходить быстрее, чем между двумя отдельными процессами, так как потоки используют общую виртуальную память вследствие этого буфер ассоциативной памяти не используется.

Аппаратная и программная реализация

Переключение контекста можно обеспечить аппаратными или программными средствами. Некоторые процессоры, такие как Intel 80386 и его производные[1], имеют аппаратную поддержку для переключения контекста, используя специальный раздел данных, предназначенный для сегментов состояния задачи TSS (англ. task state segment). TSS содержит информацию о процессах и позволяет проводить диспетчеризацию задач. Переключение задачи может быть явно вызвано с помощью инструкций CALL или JUMP, предназначенных для TSS дескриптора в глобальной таблице дескрипторов (англ. Global Descriptor Table, GDT). Переключение может происходить неявно при прерывании или исключении задачи, при условии, что она находится в таблице векторов прерываний (англ. Interrupt Descriptor Table, IDT). Когда происходит переключение задачи CPU может автоматически загружать новое состояние из TSS. Как и в случае с другими задачами, выполняемыми на аппаратном уровне, можно ожидать, что аппаратное переключение будет довольно быстрым. Однако основные операционные системы, включая Windows и Linux, не используют данную функцию. Это объясняется следующими причинами:

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

Планирование процессов

Одной из составляющих переключения контекста является планирование процессов, т.е. назначение приоритетов процессам в очереди с приоритетами[Источник 3]. Существует два основных типа процедур планирования процессов - вытесняющие (preemptive) и невытесняющие (non-preemptive).

Non-preemptive multitasking - невытесняющая многозадачность - это способ планирования процессов, при котором активный процесс выполняется до тех пор, пока он сам, по собственной инициативе, не отдаст управление планировщику операционной системы для того, чтобы тот выбрал из очереди другой, готовый к выполнению процесс.

Preemptive multitasking - вытесняющая многозадачность - это такой способ, при котором решение о переключении процессора с выполнения одного процесса на выполнение другого процесса принимается планировщиком операционной системы, а не самой активной задачей.

Понятия preemptive и non-preemptive иногда отождествляются с понятиями приоритетных и бесприоритетных дисциплин, что совершенно неверно, а также с понятиями абсолютных и относительных приоритетов, что неверно отчасти. Вытесняющая и невытесняющая многозадачность - это более широкие понятия, чем типы приоритетности. Приоритеты задач могут как использоваться, так и не использоваться и при вытесняющих, и при невытесняющих способах планирования. Так в случае использования приоритетов дисциплина относительных приоритетов может быть отнесена к классу систем с невытесняющей многозадачностью, а дисциплина абсолютных приоритетов - к классу систем с вытесняющей многозадачностью. А бесприоритетная дисциплина планирования, основанная на выделении равных квантов времени для всех задач, относится к вытесняющим алгоритмам.

Основным различием между preemptive и non-preemptive вариантами многозадачности является степень централизации механизма планирования задач. При вытесняющей многозадачности механизм планирования задач целиком сосредоточен в операционной системе, и программист пишет свое приложение, не заботясь о том, что оно будет выполняться параллельно с другими задачами. При этом операционная система выполняет следующие функции: определяет момент снятия с выполнения активной задачи, запоминает ее контекст, выбирает из очереди готовых задач следующую и запускает ее на выполнение, загружая ее контекст.

При невытесняющей многозадачности механизм планирования распределен между системой и прикладными программами. Прикладная программа, получив управление от операционной системы, сама определяет момент завершения своей очередной итерации и передает управление ОС с помощью какого-либо системного вызова, а ОС формирует очереди задач и выбирает в соответствии с некоторым алгоритмом (например, с учетом приоритетов) следующую задачу на выполнение. Такой механизм создает проблемы как для пользователей, так и для разработчиков.

Примечания

  1. The Linux Information Project (LINFO) [Электронный ресурс] : Context Switch Definition / Дата обращения: 03.03.2017. Режим доступа: http://www.linfo.org/context_switch.html

Источники

  1. Context switch // Wikipedia. URL: https://en.wikipedia.org/wiki/Context_switch. [2001-2017] (дата обращения: 06.03.2017).
  2. Context Switching // OSDev Wiki Web Site. [2006-2017]. URL: http://wiki.osdev.org/Context_Switching (дата обращения: 08.03.2017).
  3. Таненбаум Э., Бос Х. Современные операционные системы. — 4-е изд. — СПб.: Питер, 2017. — 1120 с. — ISBN 978-5-496-01395-6.

Ссылки/литература

  • Руссинович М., Соломон Д. Внутреннее устройство Microsoft Windows, 6-е издание. Часть 1. — 6-е изд. — СПб.: Питер, 2013. — 800 с. — ISBN 978-5-496-00434-3.
  • Олифер В., Олифер Н. Сетевые операционные системы. — 2-е изд. — СПб.: Питер, 2009. — 672 с. — ISBN 978-5-91180-528-9.
  • Бовет Д., Чезати М. Ядро Linux. — 3-е изд. — СПб.: БХВ-Петербург, 2007. — 1104 с. — ISBN 978-5-94157-957-0.
  • Столлингс У. Операционные системы. — 4-е изд. — М.: Вильямс, 2004. — 848 с. — ISBN 5-8459-0310-6.
  • Levine J. Mac OS X and iOS Internals: To the Apple's Core. — New York: John Wiley & Sons, 2013. — 864 с. — ISBN 978-1-118-05765-0.