Вопрос

Что именно сохраняется и восстанавливается при переключении контекста между двумя потоками

  • в том же процессе
  • между двумя процессами
Это было полезно?

Решение

Это довольно сложный вопрос, поскольку ответ(ы) зависят от многих вещей:

  1. Процессор, о котором идет речь
    • Он может значительно различаться даже в пределах одного семейства, например, дополнительные регистры, добавленные для операций SSE/MMX.
  2. Операционная система, поскольку она управляет обработчиками, которые срабатывают при переключении контекста, и решает, используется ли оборудование ЦП (если таковое имеется) для помощи в переключении контекста или нет.
    • Например, Windows не использует оборудование Intel, которое может выполнять большую часть хранилища для переключения контекста, поскольку оно не хранит регистры с плавающей запятой.
  3. Любые оптимизации, выполняемые программой, осознающей свои собственные требования и способной информировать об этом ОС.
    • Возможно, чтобы указать, что он не использует регистры FP, поэтому не беспокойтесь о них.
    • В архитектурах с большими файлами регистров, таких как большинство RISC-проектов, есть значительная польза от знания того, что вам нужно только меньшее подмножество этих регистров.

Как минимум, необходимо сохранить используемые регистры общего назначения и регистр счетчика программ (при условии, что большинство современных ЦП общего назначения в стиле CISC/RISC имеют общую конструкцию).

Обратите внимание, что попытка приложить лишь минимальное усилие при переключении контекста является ошибкой. тема, представляющая некоторый академический интерес

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

Существует «task_struct», которая содержит большое количество полей, относящихся к состоянию задачи, а также к процессу, для которого предназначена задача.

Одним из них является «thread_struct».

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

Каждая архитектура определяет свою собственную структуру thread_struct, которая идентифицирует регистры и другие значения, сохраненные на коммутаторе.

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

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

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

Другие советы

Когда переключение контекста происходит между потоками одного и того же процесса, все энергонезависимые регистры общего назначения текущего потока сохраняются, а регистры нового потока восстанавливаются;энергозависимые регистры необходимо сохранять только в том случае, если выполнение текущего потока было прервано прерыванием.Регистры любого сопроцессора, используемого потоками (например.Процессор с плавающей запятой) также должен быть сохранен и восстановлен, если переключение находится между потоками из 2 процессов, в дополнение к тому, что необходимо для нормального переключателя контекста, также следует выполнять изменения, связанные с управлением памятью и IO;например,Защита памяти, необходимая процессам, достигается с помощью таблиц страниц и таблиц каталогов страниц, и каждый процесс имеет уникальный адрес таблицы каталогов страниц, который необходимо изменить при изменении процесса.

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

Единственное отличие, которое мне приходит на ум при переключении между двумя потоками одного и того же процесса, заключается в том, что вы не теряете содержимое кэша L1 и MMU.

Я не уверен, но если я правильно помню, также переключается набор рабочей памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top