Шаги в переключении контекста - PullRequest
30 голосов
/ 16 сентября 2011

Меня просят описать этапы переключения контекста (1) между двумя разными процессами и (2) между двумя разными потоками в одном процессе.

  1. Во время переключения контекстаЯдро сохранит контекст старого процесса на своей печатной плате, а затем загрузит сохраненный контекст нового процесса, запланированного для запуска.
  2. Переключение контекста между двумя различными потоками в одном и том же процессе может быть запланировано операционной системой таккажется, что они выполняются параллельно и, следовательно, обычно быстрее, чем переключение контекста между двумя разными процессами.

Это слишком общее или что бы вы добавили, чтобы объяснить процесс более понятным?

Ответы [ 3 ]

51 голосов
/ 16 сентября 2011

Гораздо проще объяснить это в обратном порядке, потому что переключение процесса всегда включает переключение потока.

Типичное переключение контекста потока на одноядерном процессоре происходит следующим образом:

  1. Все переключатели контекста инициируются «прерыванием».Это может быть фактическое аппаратное прерывание, которое запускает драйвер (например, от сетевой карты, клавиатуры, оборудования для управления памятью или таймера), или программный вызов (системный вызов), который выполняет последовательность вызовов, подобную аппаратному прерыванию.войти в ОС.В случае прерывания драйвера ОС предоставляет точку входа, которую может вызвать драйвер, вместо выполнения «нормального» прямого возврата прерывания и, таким образом, позволяет драйверу выходить через планировщик ОС, если ему требуется ОС для установки потока.готов (например, он подал сигнал семафора).

  2. Нетривиальным системам придется инициировать изменение уровня защиты оборудования, чтобы войти в состояние ядра, чтобы можно было получить доступ к коду / данным ядра и т. Д.

  3. Состояние ядра для прерванного потока должно быть сохранено.В простой встроенной системе это может быть просто помещение всех регистров в стек потоков и сохранение указателя стека в его блоке управления потоками (TCB).

  4. Многие системы переключаются на OS-выделенный стек на этом этапе, чтобы основная часть требований к внутреннему стеку ОС не накладывалась на стек каждого потока.

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

  6. Водитель / системный вызов выполняется и может изменить набор готовых потоков, добавляя / удаляя TCB из внутренних очередей для различных приоритетов потоковнапримерДрайвер сетевой карты, возможно, установил событие или сигнализировал семафор, которого ожидал другой поток, так что поток будет добавлен в готовый набор, или работающий поток мог вызвать sleep () и таким образом выбрать удалить себя из готового набора,

  7. Алгоритм планировщика ОС запускается, чтобы решить, какой поток следует запустить следующим, обычно это готовый поток с наивысшим приоритетом, который находится в начале очереди для этого приоритета.Если следующий запускаемый поток принадлежит к другому процессу, отличному от ранее запущенного потока, здесь необходимо выполнить некоторые дополнительные операции (см. Далее).

  8. Сохраненный указатель стека изTCB для этого потока извлекается и загружается в указатель аппаратного стека.

  9. Состояние ядра для выбранного потока восстанавливается.В моей простой системе регистры будут извлечены из стека выбранного потока.Более сложные системы должны будут обрабатывать возврат к защите на уровне пользователя.

  10. Выполняется возврат-прерывание, поэтому передача выполнения выбранному потоку.

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

Типичное переключение контекста процесса происходит следующим образом:

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

  2. На приведенном выше шаге 5 планировщикрешает запустить поток, принадлежащий процессу, отличному от того, который принадлежал ранее запущенному потоку.

  3. Аппаратное обеспечение управления памятью должно быть загружено адресным пространством для новогопроцесс, т. е. любые селекторы / сегменты / флаги / все, что позволяет потоку / с нового процесса получать доступ к его памяти.

  4. Контекст любого оборудования FPU необходимо сохранять / восстанавливатьс печатной платы.

  5. Может быть другое оборудование, предназначенное для процессов, которое необходимо сохранить / восстановить.

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

13 голосов
/ 27 октября 2016

Надеюсь, что смогу предоставить более подробную / четкую картину.

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

  1. Планировщик должен быть вызван. Есть три основных сценария:

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

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

  4. Первым действием, которое выполняет ядро, является сохранение содержимого регистров ЦП, которое ядро ​​будет использовать для своих собственных задач. Обычно ядро ​​использует только регистры ЦП общего назначения и сохраняет их, помещая в стек.
  5. Затем ядро ​​обрабатывает первичный запрос - обрабатывает прерывание или подготавливает запрос на чтение файла или выполняет настройку таймера.
  6. В какой-то момент обработки запроса ядро ​​выполняет действие, которое либо влияет на состояние текущего потока (решив, что в этом потоке ничего не нужно делать, и мы должны чего-то ждать), либо воздействует на состояние другого потока (-ов). (новый поток стал работоспособным в результате получения прерывания или из-за освобождения мьютекса и т. д.).
  7. Ядро вызывает диспетчер. Планировщик должен принять два решения. Первый из них о том, что делать с текущим потоком. Должен ли он быть заблокирован? Если так, в какую очередь ожидания это должно быть помещено? Если поток переключается непроизвольно, он помещается в конец очереди выполнения, если поток блокируется, потому что он ожидает чего-то меньшего, он помещается в один из очередей ожидания. Второе решение о том, какой поток следует запустить следующим.
  8. Как только оба решения приняты, scheduller выполняет переключение контекста, передавая ему два параметра - блок управления потоком текущего и следующего потоков.
  9. Сам переключатель контекста состоит из трех основных этапов. На первом этапе ядро ​​выясняет, какие потоки регистров ЦП фактически используют, и сохраняет их содержимое либо в стеке, либо в TCB исходящего потока. Если поток не использует регистры FPU и SSE (например, для платформы IA-32), их содержимое не будет сохранено.
  10. Второй шаг - это сердце переключения контекста. Ядро выталкивает указатель текущей инструкции в стек, а значение указателя стека сохраняется в TCB исходящего потока. Затем он загружает в процессор новый указатель стека из TCB входящего потока и выскакивает указатель инструкции из его верхней части. Это! Новый активный стек означает новый активный поток. Начиная с этого момента, остальная часть системы будет думать, что она работает в контексте входящего потока.
  11. На третьем шаге ядро ​​выясняет, какие регистры фактически используются входящим потоком, и загружает их ранее сохраненный контент (см. Шаг 1) обратно в ЦП.
  12. Затем ядро ​​проверяет, принадлежат ли оба потока (входящий и исходящий) одному и тому же процессу или нет. Если они принадлежат разным процессам (случай, который люди называют переключением процессов), ядро ​​сбрасывает текущее адресное пространство, указывая MMU на новый набор таблиц преобразования виртуальных адресов в физические. В рамках этого процесса ЦП сбрасывает Translate Lookaside Buffer (TLB), который кэширует правила преобразования виртуальных адресов в физические. Новое виртуальное адресное пространство означает, что ранее кэшированные правила теперь неверны. Обратите внимание, что это единственный шаг во всем наборе действий переключения контекста, которые заботятся о процессах!
  13. Ядро подготавливает локальное хранилище потока для входящего потока. Например, сопоставление соответствующих страниц памяти с указанными адресами или, например, на IA-32 общий подход заключается в загрузке нового сегмента, который указывает на данные TLS входящего потока.
  14. Наконец, ядро ​​загружается в адрес процессора части ядра входящего потока. После этого каждый новый вызов ядра будет использовать часть ядра стека входящих потоков и не будет повреждать данные, хранящиеся в стеке исходящих потоков.
  15. Еще один шаг, который может выполнить ядро, - перепрограммирование системного таймера. При этом ядро ​​просит таймер позвонить и передать управление ядру через некоторое время. Этот период времени называется квантом времени потока.
  16. Наконец, ядрам нравится собирать статистику во время переключений контекста, включая информацию о том, сколько потоков процессорного времени потребляется, как переключение контекста происходит в системе в единицах реального времени, сколько раз были вызваны потоки, сколько раз они имеют выпущенный ЦП добровольно и невольно, сколько раз их выбегало из них квантовых. Часть этой статистики затем используется планировщиком, который пытается принимать более оптимальные решения. Другая цель статистики - доставка системным администраторам и пользователям, чтобы показать им, что происходит под капотом системы.
  17. На этом этапе переключение потоков можно считать выполненным, и ядро ​​продолжает ранее прерванные действия системы. Например, поток, который ожидал чтения файла, проверяет результат чтения в памяти и обрабатывает его. Или поток, заблокированный мьютексом в середине какой-то большой системной активности, продолжает эту деятельность.
  18. Наконец, позже или раньше поток завершает свою системную деятельность и хочет вернуться в пользовательский режим, чтобы продолжить свою основную задачу, для которой он был первоначально использован. В этот момент ядро ​​извлекается из содержимого стека ядра регистров общего назначения, которое ранее было сохранено при входе в ядро, и просит ЦП выполнить возврат в пользовательский режим.
  19. CPU фиксирует значения указателя инструкций и указателя стека, которые ранее были сохранены при входе в режим ядра, и восстанавливает их. Делая это, он также переключает поток обратно из части ядра своего стека в пользовательскую часть стека. Наконец, CPU сбрасывает права доступа к коду, которые будут выполняться, в более ограниченный набор (например, запрещает использование специальных системных инструкций или запрещает доступ к керел-коду и данным). Наконец ЦП передает управление обратно в точку, где поток был изначально прерван. В случае системного вызова поток будет продолжаться в той точке, где был вызван системный вызов, путем захвата и обработки его результата. В случае вытеснения прерыванием поток продолжит свое выполнение точно в той же точке, в которой он был, когда произошло прерывание. В этом случае он даже не узнает, что его прервали.

Некоторые краткие заметки:

  1. Ядро планирует и выполняет только потоки, а не процессы. Из-за этого контекста между потоками происходит переворот.
  2. Процедура переключения контекста между протекторами, принадлежащими разным процессам, по сути, такая же, как между потоками, принадлежащими одному и тому же процессу.В первом случае есть только один дополнительный шаг - загрузка нового виртуального адресного пространства (что приводит к сбросу TLB).
  3. Контекст потоков хранится либо в части ядра стека потока, либо врезьба TCB (не в PCB!).
  4. Переключение потоков приводит к снижению производительности.Существует значительная прямая стоимость переключения потоков.И даже намного большие прямые затраты, вызванные загрязнением кэша и сбросом TLB (если виртуальное адресное пространство было перезагружено во время переключения).
3 голосов
/ 05 марта 2017
  1. В коммутаторе состояние выполняемого в данный момент процесса должно быть каким-то образом сохранено, чтобы при перепланировании его можно было восстановить.
  2. Состояние процесса включает в себя все регистры, которые этот процессможет использовать, особенно программный счетчик, а также любые другие специфические данные операционной системы, которые могут быть необходимы.Обычно это хранится в структуре данных, называемой блок управления процессом (PCB) или switchframe.
  3. PCB может храниться в стеке каждого процесса в памяти ядра (в отличие отстек вызовов пользовательского режима), или для этой информации может быть определенная структура данных, определенная операционной системой.Дескриптор PCB добавляется в очередь процессов, готовых к запуску, часто называемую готовой очередью.
  4. Поскольку операционная система фактически приостановила выполнение одного процесса, она может затем переключить контекст, выбравпроцесс из очереди готовности и восстановление его печатной платы.При этом счетчик программ с печатной платы загружается, и, таким образом, выполнение может продолжаться в выбранном процессе.Приоритет процесса и потока может влиять на то, какой процесс выбран из очереди готовности (т. Е. Это может быть очередь приоритета).

Context Switch

(Источник: Переключение контекста )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...