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