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

Поделись знанием:
Перейти к: навигация, поиск

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

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





Описание

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

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

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

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

Переключение контекста и производительность

Кроме того, что очень важно, при переключении контекста происходят следующие программно-незаметные аппаратные действия, влияющие на производительность:

  • Происходит очистка конвейера команд и данных процессора
  • Очищается TLB, отвечающий за страничное отображение линейных адресов на физические.

Кроме того, следует учесть следующие факты, влияющие на состояние системы:

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

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

С точки зрения прикладного уровня переключение контекста можно разделить на добровольное (voluntary) и принудительное (non-voluntary): выполняющийся процесс/поток может сам передать управление другому потоку либо ядро может насильно отобрать у него управление.

  1. Ядро ОС может отобрать управление у выполняющегося процесса/потока при истечении кванта времени, выделенного на выполнение. С точки зрения программиста это означает, что управление могло уйти от потока в «самый неподходящий» момент времени, когда структуры данных могут находиться в противоречивом состоянии из-за того, что их изменение не было завершено.
  2. Выполнение блокирующего системного вызова. Когда приложение производит ввод-вывод, ядро может решить, что можно отдать управление другому потоку/процессу в ожидании, пока запрошенный данным потоком дисковый либо сетевой ввод-вывод будет выполнен. Данный вариант является самым производительным.
  3. Синхронизирующие примитивы ядра. Мьютексы, Семафоры и т. д. Это и есть основной источник проблем с производительностью. Недостаточно продуманная работа с синхронизирующими примитивами может приводить к десяткам тысяч, а в особо запущенных случаях - и к сотням тысяч переключений контекста в секунду. К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3503 дня]
  4. Системный вызов, явно ожидающий наступления события (select, poll, epoll, pause, wait,…) либо момента времени (sleep, nanosleep,..). Данный вариант является относительно производительным, так как ядро ОС имеет информацию об ожидающих процессах.

Особенности процедуры планировщика

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

Реализации переключения контекста в современных ОС

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

Методы уменьшения количества переключений контекста:

  • Существует возможность конфигурирования выделяемого потоку кванта процессорного времени. При сборке ядра Linux возможно указать Server/Desktop/Low-Latency Desktop. Для серверных конфигураций этот квант больше.

Методы снижения ресурсоемкости переключения контекста:

  • При переключении контекста между потоками, разделяющими одно адресное пространство в пределах одного процесса, ядро не трогает регистр CR3, тем самым сохраняя TLB
  • Во многих случаях ядро располагается в том же адресном пространстве, что и пользовательский процесс. При переключении контекста между user-space и kernel-space (и обратно), что, например, происходит при выполнении системных вызовов, ядро не трогает регистр CR3, тем самым сохраняя TLB
  • Производя планирование, ядро старается минимизировать перемещение процесса между вычислительными ядрами в SMP-системе, тем самым улучшая эффективность работы кэша второго уровня.
  • Реальное сохранение/восстановление контекста регистров сопроцессора плавающей точки и MMX/SSE контекста происходит при первом обращении нового потока, что оптимизировано под случай, когда большинство потоков производит только операции с регистрами общего назначения.

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

Замечания о терминологии

Напишите отзыв о статье "Переключение контекста"

Ссылки

  • whatis.techtarget.com/definition/context-switch
  • www.linfo.org/context_switch.html
  • wiki.osdev.org/Context_Switching
  • www.cs.rochester.edu/u/cli/research/switch.pdf (2007)
  • www.eecs.harvard.edu/~margo/cs161/notes/context-switching.pdf

Отрывок, характеризующий Переключение контекста

Унтер офицер с решительным видом не отвечал на эти слова, сел верхом и поехал с быстро собравшимся Грековым. Они скрылись в лесу. Граф Орлов, пожимаясь от свежести начинавшего брезжить утра, взволнованный тем, что им затеяно на свою ответственность, проводив Грекова, вышел из леса и стал оглядывать неприятельский лагерь, видневшийся теперь обманчиво в свете начинавшегося утра и догоравших костров. Справа от графа Орлова Денисова, по открытому склону, должны были показаться наши колонны. Граф Орлов глядел туда; но несмотря на то, что издалека они были бы заметны, колонн этих не было видно. Во французском лагере, как показалось графу Орлову Денисову, и в особенности по словам его очень зоркого адъютанта, начинали шевелиться.
– Ах, право, поздно, – сказал граф Орлов, поглядев на лагерь. Ему вдруг, как это часто бывает, после того как человека, которому мы поверим, нет больше перед глазами, ему вдруг совершенно ясно и очевидно стало, что унтер офицер этот обманщик, что он наврал и только испортит все дело атаки отсутствием этих двух полков, которых он заведет бог знает куда. Можно ли из такой массы войск выхватить главнокомандующего?
– Право, он врет, этот шельма, – сказал граф.
– Можно воротить, – сказал один из свиты, который почувствовал так же, как и граф Орлов Денисов, недоверие к предприятию, когда посмотрел на лагерь.
– А? Право?.. как вы думаете, или оставить? Или нет?
– Прикажете воротить?
– Воротить, воротить! – вдруг решительно сказал граф Орлов, глядя на часы, – поздно будет, совсем светло.
И адъютант поскакал лесом за Грековым. Когда Греков вернулся, граф Орлов Денисов, взволнованный и этой отмененной попыткой, и тщетным ожиданием пехотных колонн, которые все не показывались, и близостью неприятеля (все люди его отряда испытывали то же), решил наступать.
Шепотом прокомандовал он: «Садись!» Распределились, перекрестились…
– С богом!
«Урааааа!» – зашумело по лесу, и, одна сотня за другой, как из мешка высыпаясь, полетели весело казаки с своими дротиками наперевес, через ручей к лагерю.
Один отчаянный, испуганный крик первого увидавшего казаков француза – и все, что было в лагере, неодетое, спросонков бросило пушки, ружья, лошадей и побежало куда попало.
Ежели бы казаки преследовали французов, не обращая внимания на то, что было позади и вокруг них, они взяли бы и Мюрата, и все, что тут было. Начальники и хотели этого. Но нельзя было сдвинуть с места казаков, когда они добрались до добычи и пленных. Команды никто не слушал. Взято было тут же тысяча пятьсот человек пленных, тридцать восемь орудий, знамена и, что важнее всего для казаков, лошади, седла, одеяла и различные предметы. Со всем этим надо было обойтись, прибрать к рукам пленных, пушки, поделить добычу, покричать, даже подраться между собой: всем этим занялись казаки.
Французы, не преследуемые более, стали понемногу опоминаться, собрались командами и принялись стрелять. Орлов Денисов ожидал все колонны и не наступал дальше.
Между тем по диспозиции: «die erste Colonne marschiert» [первая колонна идет (нем.) ] и т. д., пехотные войска опоздавших колонн, которыми командовал Бенигсен и управлял Толь, выступили как следует и, как всегда бывает, пришли куда то, но только не туда, куда им было назначено. Как и всегда бывает, люди, вышедшие весело, стали останавливаться; послышалось неудовольствие, сознание путаницы, двинулись куда то назад. Проскакавшие адъютанты и генералы кричали, сердились, ссорились, говорили, что совсем не туда и опоздали, кого то бранили и т. д., и наконец, все махнули рукой и пошли только с тем, чтобы идти куда нибудь. «Куда нибудь да придем!» И действительно, пришли, но не туда, а некоторые туда, но опоздали так, что пришли без всякой пользы, только для того, чтобы в них стреляли. Толь, который в этом сражении играл роль Вейротера в Аустерлицком, старательно скакал из места в место и везде находил все навыворот. Так он наскакал на корпус Багговута в лесу, когда уже было совсем светло, а корпус этот давно уже должен был быть там, с Орловым Денисовым. Взволнованный, огорченный неудачей и полагая, что кто нибудь виноват в этом, Толь подскакал к корпусному командиру и строго стал упрекать его, говоря, что за это расстрелять следует. Багговут, старый, боевой, спокойный генерал, тоже измученный всеми остановками, путаницами, противоречиями, к удивлению всех, совершенно противно своему характеру, пришел в бешенство и наговорил неприятных вещей Толю.
– Я уроков принимать ни от кого не хочу, а умирать с своими солдатами умею не хуже другого, – сказал он и с одной дивизией пошел вперед.
Выйдя на поле под французские выстрелы, взволнованный и храбрый Багговут, не соображая того, полезно или бесполезно его вступление в дело теперь, и с одной дивизией, пошел прямо и повел свои войска под выстрелы. Опасность, ядра, пули были то самое, что нужно ему было в его гневном настроении. Одна из первых пуль убила его, следующие пули убили многих солдат. И дивизия его постояла несколько времени без пользы под огнем.


Между тем с фронта другая колонна должна была напасть на французов, но при этой колонне был Кутузов. Он знал хорошо, что ничего, кроме путаницы, не выйдет из этого против его воли начатого сражения, и, насколько то было в его власти, удерживал войска. Он не двигался.
Кутузов молча ехал на своей серенькой лошадке, лениво отвечая на предложения атаковать.
– У вас все на языке атаковать, а не видите, что мы не умеем делать сложных маневров, – сказал он Милорадовичу, просившемуся вперед.
– Не умели утром взять живьем Мюрата и прийти вовремя на место: теперь нечего делать! – отвечал он другому.
Когда Кутузову доложили, что в тылу французов, где, по донесениям казаков, прежде никого не было, теперь было два батальона поляков, он покосился назад на Ермолова (он с ним не говорил еще со вчерашнего дня).
– Вот просят наступления, предлагают разные проекты, а чуть приступишь к делу, ничего не готово, и предупрежденный неприятель берет свои меры.
Ермолов прищурил глаза и слегка улыбнулся, услыхав эти слова. Он понял, что для него гроза прошла и что Кутузов ограничится этим намеком.
– Это он на мой счет забавляется, – тихо сказал Ермолов, толкнув коленкой Раевского, стоявшего подле него.
Вскоре после этого Ермолов выдвинулся вперед к Кутузову и почтительно доложил:
– Время не упущено, ваша светлость, неприятель не ушел. Если прикажете наступать? А то гвардия и дыма не увидит.