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