Что сохраняется в контекстном коммутаторе?

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

  • в том же процессе
  • между двумя процессами

Ответы

Ответ 1

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

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

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

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

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

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

Одним из них является 'thread_struct

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Где данные сохраняются при переключении контекста? это сохранить данные в стеке или в готовой очереди?