Что сохраняется в переключении контекста?
Что именно сохраняется и восстанавливается в контексте переключения между двумя потоками
- в том же процессе
- между двумя процессами
4 ответа
Это довольно сложный вопрос, так как ответ (ы) зависят от многих вещей:
- Процессор в вопросе
- Он может значительно различаться даже в пределах одного семейства, например, дополнительные регистры, добавленные для операций SSE/MMX.
- Операционная система, поскольку она управляет обработчиками, которые запускают переключение контекста и решают, используется ли аппаратное обеспечение ЦП (если оно есть) для помощи в переключении контекста или нет.
- Например, Windows не использует аппаратное обеспечение Intel, которое может сделать большую часть хранилища переключателей контекста, поскольку оно не хранит регистры с плавающей запятой.
- Любая оптимизация, обеспечиваемая программой, знающей свои собственные требования и способной информировать ОС об этом
- Возможно, чтобы указать, что он не использует регистры FP, так что не беспокойтесь о них
- В архитектурах с большими размерами файлов регистров, как в большинстве проектов RISC, есть существенное преимущество, если вы знаете, что вам нужно только меньшее подмножество этих регистров.
Как минимум, должны быть сохранены используемые регистры общего назначения и регистр счетчика программ (при условии, что общая конструкция большинства современных процессоров общего назначения в стиле CISC/RISC).
Обратите внимание, что попытка сделать только минимальное количество усилий в связи с переключением контекста является предметом некоторого академического интереса
Очевидно, что в Linux есть больше информации об этом в открытом доступе, хотя мои ссылки могут быть немного устаревшими.
Существует "task_struct", которая содержит большое количество полей, относящихся к состоянию задачи, а также к процессу, для которого предназначена задача.
Одним из них является 'thread_struct'
/* CPU-специфическое состояние этой задачи * /
- struct thread_struct thread;
содержит информацию о дескрипторах кеша TLS, регистрах отладки,
информация о сбое, с плавающей запятой, виртуальный 86 режим или разрешения ввода-вывода.
Каждая архитектура определяет свою собственную thread_struct, которая идентифицирует регистры и другие значения, сохраненные на коммутаторе.
Это дополнительно осложняется наличием регистров переименования, которые допускают множественные инструкции полета (либо через суперскалярные, либо связанные с конвейером архитектурные проекты). Фаза восстановления контекстного перехода, вероятно, будет зависеть от восстановления конвейера ЦП в изначально пустом состоянии, так что инструкции, которые еще не были удалены в конвейере, не имеют никакого эффекта и, следовательно, могут игнорироваться. Это делает дизайн процессора намного сложнее.
Разница между процессом и потоком заключается в том, что переключателю процесса (который всегда означает переключение потока во всех операционных системах основного потока) потребуется обновить информацию о трансляции памяти, информацию, связанную с IO, и структуры, связанные с разрешениями.
Они будут главным образом указателями на более богатые структуры данных, поэтому не будут иметь значительных затрат по отношению к переключению контекста потока.
Когда переключение контекста происходит между потоками одного и того же процесса, все энергонезависимые регистры общего назначения текущего потока сохраняются, а регистры нового потока восстанавливаются; энергозависимые регистры должны быть сохранены, только если текущее выполнение потока было прервано прерыванием. Регистры любого сопроцессора, используемого потоками (например, процессор с плавающей запятой), также должны быть сохранены и восстановлены, если переключение происходит между потоками двух процессов, в дополнение к тому, что необходимо для обычного переключения контекста, управления памятью и ввода-вывода изменения также должны быть сделаны; Например, защита памяти, необходимая процессам, достигается с помощью таблиц страниц и таблиц каталогов страниц, и каждый процесс имеет уникальный адрес таблицы каталогов страниц, который должен быть изменен при изменении процесса.
Это зависит от используемой вами ОС, но вам наверняка придется сохранить содержимое всех регистров (включая счетчик команд) и загрузить регистры потока, на который вы переключаетесь.
Единственное отличие, которое приходит мне на ум в отношении переключения между двумя потоками в одном и том же процессе, заключается в том, что вы не теряете содержимое кэша L1 и MMU.
Я не уверен, но если я правильно помню, также переключается набор рабочей памяти.