Как компьютер использует всего несколько регистров?

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

14
задан Iron 4 August 2010 в 23:55
поделиться

7 ответов

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

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

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

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

alt text

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

11
ответ дан 1 December 2019 в 13:07
поделиться

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


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

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

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

2
ответ дан 1 December 2019 в 13:07
поделиться

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

1
ответ дан 1 December 2019 в 13:07
поделиться

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

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

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

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

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

1
ответ дан 1 December 2019 в 13:07
поделиться

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

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

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

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

0
ответ дан 1 December 2019 в 13:07
поделиться

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

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

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

0
ответ дан 1 December 2019 в 13:07
поделиться

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

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

5
ответ дан 1 December 2019 в 13:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: