Как компьютер использует только несколько регистров? - PullRequest
14 голосов
/ 05 августа 2010

Я немного знаю о сборке и о том, что есть 4 или 8 или около того регистров общего назначения.Как все программы на компьютере работают с таким количеством регистров, особенно с многопоточностью и всем остальным?

Ответы [ 7 ]

11 голосов
/ 05 августа 2010

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

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

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

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

альтернативный текст http://ecx.images -amazon.com / images / I / 51PAGENX36L._SL500_AA300_.jpg

В стороне: моя мечта - этов один прекрасный день напишите такую ​​же книгу, которая охватывает все , от уровня кварков до Emacs: -)

5 голосов
/ 05 августа 2010

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

Вы можете проверить книгу Элементы вычислительных систем , чтобы лучше понять, как работает процессор вашего компьютера. Книга представляет собой серию проектов, в которых вы работаете от шлюза NAND до процессора, ассемблера, простого компилятора и небольшой операционной системы. Это неоценимо для понимания того, как все части вашего компьютера сочетаются друг с другом.

2 голосов
/ 05 августа 2010

Каждый раз, когда поток (или процесс) выгружается, все регистры помещаются в стек ядром операционной системы в структуру данных, обычно называемую блоком управления процессом.Затем, когда поток / процесс переключается обратно, данные регистра считываются с печатной платы и передаются из стека в регистры.


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

Кроме того, в наборах команд обычно есть инструкция load и store , которая используется вместе с указателями на память, позволяя сохранять данные из регистров в памяти.Отсюда и термин «компьютер с загрузкой», т. Е. Компьютер, на котором нет инструкций, которые работают непосредственно с памятью.

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

1 голос
/ 05 августа 2010

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

Это действительно умное программирование на уровне сборки (как правило, благодаря невероятно умным компиляторам), которое позволяет так мало регистров использоваться так эффективно.

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

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

В конкретном случае многопоточности мы просто сохраняем все наши регистры в памяти, а затем у нас есть чистый лист для других потоков.

1 голос
/ 05 августа 2010

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

0 голосов
/ 05 августа 2010

Это довольно сложный вопрос, и ответ зависит от архитектуры вашего процессора.

В старые добрые времена вы были правы - действительно было всего несколько регистров общего назначения.В настоящее время процессор и компилятор играют в игру " three-monte " с вашими регистрами общего назначения с помощью таких методов, как переименование регистров .

Хотя на простых архитектурах это правда, что регистры копируются в [кэш] память, когда происходит переключение контекста, такие методы, как SMT , «обманывают» ОС, заставляя думать, что ядер больше, чемони на самом деле.

Но самый общий ответ на ваш вопрос заключается в том, что данные перемещаются в регистры и из них много .И именно поэтому большая часть инструкций, которые вы видите в любой программе сборки, - это инструкции "MOV".Разработчики ЦП и компиляторов тратят много времени и денег на оптимизацию своих проектов, чтобы вы не перемещали данные из основной памяти (медленно) в регистры - они стараются максимально кэшировать данные.Это большое количество инструкций «MOV» объясняет, почему задержка памяти и скорость шины так важны для производительности всего компьютера.

0 голосов
/ 05 августа 2010

Это одна из вещей, для которой используется другое хранилище компьютера, в частности ОЗУ: для сохранения и восстановления битов данных в и из регистров.

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

...