Так что в последнее время я немного занимаюсь сборкой, и я новичок, поэтому мне было интересно, может ли кто-нибудь что-то прояснить. Я так понимаю, у каждого процесса есть собственный набор регистров, и каждый поток может изменять эти регистры, правильно? Как тогда несколько потоков используют одни и те же регистры, не вызывая конфликтов? Или у каждого потока свой набор регистров?
регистры сборки новичок
Ответы (6)
Переключение контекста потока включает в себя сохранение регистров текущего контекста выполнения и загрузку регистров с сохраненными значениями из контекста выполнения. (среди прочего). Таким образом, каждый поток фактически имеет свой собственный набор регистров. Также свой стек, поскольку ESP - это один из регистров.
Один из способов подумать об этом состоит в том, что вы получаете потоки, сохраняя текущее состояние регистров и загружая регистры с новым состоянием. Если этого не происходит, значит, это не переключатель потока. Если вы также переключаетесь на другой набор таблиц виртуальных адресов, то у вас есть переключатель процесса, а не переключатель потока.
ты говоришь:
Я так понимаю, у каждого процесса есть собственный набор регистров, и каждый поток может изменять эти регистры, верно?
Но это не совсем так. Каждое ядро ЦП имеет один набор регистров. Эти регистры изменяются всякий раз, когда ОС переключается на другой поток. Но в каждый момент времени в ядре ЦП выполняется только один поток. У процессов на самом деле нет собственных регистров, они обрабатывают собственные потоки (или хотя бы один поток), а потоки имеют регистры или, скорее, место для хранения значений регистров, пока поток ожидает, пока ядро ЦП будет доступно для запускать на.
pushad
может быть тем, что вы сделали бы для сопрограмм, а не для многозадачности с упреждающей операцией.)
- person Peter Cordes; 03.12.2019
В аппаратном обеспечении для каждого ядра процессора используется только один набор регистров. Из-за этого только один поток одновременно может использовать регистры. Несколько потоков выполняются одновременно на одном ядре за счет быстрого переключения с одного потока на другой. Планирование того, какой поток запускается, когда это задание операционной системы.
При переключении с одного потока на другой содержимое регистров сохраняется в специальной области памяти, а регистры для следующего потока копируются обратно в процессор. Сюда входит указатель инструкции, поэтому поток знает, где продолжить выполнение, когда он получит управление обратно. Этот процесс называется переключением контекста.
Поскольку планировщик операционной системы находится в еще одном потоке, он может планировать процессы только тогда, когда он запущен. Это означает, что для управления переключениями контекста необходима специальная аппаратная функция - прерывание. Только операционная система может планировать прерывания переключения контекста.
Поток выполняется ядром или ОС, поэтому программе это не нужно. Если ядро или ОС недоступны, вам необходимо реализовать это самостоятельно. для этого вам понадобятся:
- функция, которая сохранит состояние всех регистров вашего ЦП (SP: указатель стека, значение внутреннего регистра, ПК: счетчик программ и т. д.) в другом пространстве памяти для переключения на новый поток.
- функция для загрузки среды потока в среду ЦП, восстановления ранее сохраненного значения внутреннего регистра в регистр ЦП.
у вас есть
- набор процессов вашей операционной системы,
- у каждого процесса есть область памяти, содержащая динамически выделяемую память, статические данные и сборку кода,
- у каждого процесса есть список потоков
- каждый поток имеет свой набор регистров, счетчик программ и стек.
с помощью переключателя контекста ваш планировщик меняет местами данные потока, чтобы передать выполнение другому.
Обычно процесс тяжелее, чем поток, и существуют различные подходы к планированию:
- выполнение переключений контекста только внутри (зеленые потоки) для вашей программы (ваша ОС будет просто рассматривать это как отдельный процесс, поэтому: жесткая многоядерная технология)
- вы можете назначить несколько реальных процессов для гибридного подхода, позволяющего легко оптимизировать многоядерность.
В зависимости от процессора существует только один набор регистров. Не один набор на поток.
Есть способы сохранить состояние всех регистров, чтобы поток мог продолжить работу с того места, где он остановился.
Некоторые процессоры способствуют этому.
Каждый поток имеет свой собственный контекст, который включает набор регистров, флаги ЦП, стек и т. Д.