регистры сборки новичок

Так что в последнее время я немного занимаюсь сборкой, и я новичок, поэтому мне было интересно, может ли кто-нибудь что-то прояснить. Я так понимаю, у каждого процесса есть собственный набор регистров, и каждый поток может изменять эти регистры, правильно? Как тогда несколько потоков используют одни и те же регистры, не вызывая конфликтов? Или у каждого потока свой набор регистров?


person Dnaiel    schedule 09.03.2010    source источник


Ответы (6)


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

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

ты говоришь:

Я так понимаю, у каждого процесса есть собственный набор регистров, и каждый поток может изменять эти регистры, верно?

Но это не совсем так. Каждое ядро ​​ЦП имеет один набор регистров. Эти регистры изменяются всякий раз, когда ОС переключается на другой поток. Но в каждый момент времени в ядре ЦП выполняется только один поток. У процессов на самом деле нет собственных регистров, они обрабатывают собственные потоки (или хотя бы один поток), а потоки имеют регистры или, скорее, место для хранения значений регистров, пока поток ожидает, пока ядро ​​ЦП будет доступно для запускать на.

person John Knoeller    schedule 09.03.2010
comment
хорошая информация спасибо! так в значительной степени перед переключением контекста текущий поток будет pushfd и pushad? Затем после того, как он вернется и уйдет? - person Dnaiel; 09.03.2010
comment
@Dnaiel: Я не знаю, действительно ли они используют эти инструкции, но это основная идея, да. - person John Knoeller; 09.03.2010
comment
Можно сказать, что каждый поток имеет свой собственный регистр state, который загружается в архитектурные регистры при переключении контекста на этот процесс. Это включает счетчик программ; после восстановления всех остальных регистров вы переходите (или возвращаетесь в пространство пользователя) на сохраненный компьютер, возобновляя выполнение. (@Dnaiel: да, это включает в себя специальные регистры, такие как EFLAGS, но он также включает сам указатель стека. Сохранение всех регистров с pushad может быть тем, что вы сделали бы для сопрограмм, а не для многозадачности с упреждающей операцией.) - person Peter Cordes; 03.12.2019

В аппаратном обеспечении для каждого ядра процессора используется только один набор регистров. Из-за этого только один поток одновременно может использовать регистры. Несколько потоков выполняются одновременно на одном ядре за счет быстрого переключения с одного потока на другой. Планирование того, какой поток запускается, когда это задание операционной системы.

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

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

person Jeffrey L Whitledge    schedule 09.03.2010

Поток выполняется ядром или ОС, поэтому программе это не нужно. Если ядро ​​или ОС недоступны, вам необходимо реализовать это самостоятельно. для этого вам понадобятся:

  • функция, которая сохранит состояние всех регистров вашего ЦП (SP: указатель стека, значение внутреннего регистра, ПК: счетчик программ и т. д.) в другом пространстве памяти для переключения на новый поток.
  • функция для загрузки среды потока в среду ЦП, восстановления ранее сохраненного значения внутреннего регистра в регистр ЦП.
person Phong    schedule 09.03.2010

у вас есть

  • набор процессов вашей операционной системы,
  • у каждого процесса есть область памяти, содержащая динамически выделяемую память, статические данные и сборку кода,
  • у каждого процесса есть список потоков
  • каждый поток имеет свой набор регистров, счетчик программ и стек.

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

Обычно процесс тяжелее, чем поток, и существуют различные подходы к планированию:

  • выполнение переключений контекста только внутри (зеленые потоки) для вашей программы (ваша ОС будет просто рассматривать это как отдельный процесс, поэтому: жесткая многоядерная технология)
  • вы можете назначить несколько реальных процессов для гибридного подхода, позволяющего легко оптимизировать многоядерность.
person Jack    schedule 09.03.2010

В зависимости от процессора существует только один набор регистров. Не один набор на поток.

Есть способы сохранить состояние всех регистров, чтобы поток мог продолжить работу с того места, где он остановился.

Некоторые процессоры способствуют этому.

person Peter K.    schedule 09.03.2010

Каждый поток имеет свой собственный контекст, который включает набор регистров, флаги ЦП, стек и т. Д.

person code ex machina    schedule 09.03.2010