Как компьютер использует только несколько регистров?
Я немного разбираюсь в сборке и что есть 4 или 8 регистров общего назначения. Как все программы на компьютере работают с таким количеством регистров, особенно при многопоточности и всего?
Ответы
Ответ 1
Многопоточность сама по себе не влияет на количество используемых регистров. Когда поток выгружается, он обычно имеет свои регистры, сохраненные в памяти, а следующий поток для запуска имеет те регистры, загруженные из предыдущего сохранения.
Примером является система, имеющая структуру блока управления потоком (TCB). Эта структура будет содержать (пока поток не был запущен), сохраненный указатель инструкции, указатель стека, регистры общего назначения, регистры с плавающей запятой, статистика потоков и т.д. Короче говоря, все необходимое для полного восстановления потока в состоянии, в котором оно было, когда оно было заменено для запуска другого потока.
И не все, что происходит на компьютере, выполняется в регистрах. Современные компиляторы могут оптимизировать код, чтобы наиболее часто используемые элементы данных хранились в регистрах, но подавляющее большинство данных хранилось в памяти и только при необходимости покупалось в регистрах.
Лучшая книга, которую я когда-либо читал по этому вопросу, Tanenbaum's "Структурированная компьютерная организация" , в которой рассматриваются компьютеры с точки зрения уровней, от уровня цифровой логики до уровня операционной системы, причем каждый уровень построен на предыдущем.
/p >
Кроме того: моя мечта - однажды написать книгу, подобную этой, которая охватывает все, от уровня кварка до Emacs: -)
Ответ 2
Другие переменные и стеки потоков обычно хранятся в защищенной памяти, где они могут быть вызваны в регистры, когда это необходимо.
Вы можете проверить книгу Элементы вычислительных систем для хорошего понимания того, как работает ваш компьютер. Книга создана как серия проектов, в которых вы работаете с NAND-сервером на CPU, ассемблер, простой компилятор и на небольшую операционную систему. Это бесценно в понимании того, как все части вашего компьютера подходят друг к другу.
Ответ 3
Каждый раз, когда поток (или процесс) сворачивается, все регистры помещаются в стек ядром операционной системы в структуру данных, обычно называемую блоком управления процессом. Затем, когда поток/процесс возвращается обратно, данные регистра считываются с печатной платы и выгружаются из стека в регистры.
Существуют также внутренние регистры и таблица сопоставления, в которой x86 имеет внутреннюю настройку таблицы виртуального регистра, чтобы сохранить архитектуру набора команд IA32, имея большую гибкость для разработки суперскалярных архитектур и сложных алгоритмов планирования инструкций.
Кроме того, наборы инструкций обычно имеют команду загрузки и хранения, которая используется вместе с указателями на память, что позволяет хранить данные из регистров в память. В этом случае возникает термин "устройство загрузки-хранения", то есть компьютер, на котором нет инструкций, которые работают непосредственно в памяти.
На некоторых компьютерах есть инструкции, которые работают с памятью; некоторые из них основаны на стеке. Это зависит от дизайнеров и ограничений, связанных с оборудованием.
Ответ 4
вы должны понять, что тысячи и миллионы инструкций по сборке выполняются даже для простых вещей. Эти регистры часто меняют свои ценности.
Ответ 5
На самом деле довольно интересно, как компьютер способен использовать так мало регистров для выполнения всего, что он делает.
Это действительно умное программирование на уровне сборки (как правило, из-за ужасно умных компиляторов), которые позволяют так мало использовать регистры, которые будут использоваться так эффективно.
Если проблему невозможно выполнить только с несколькими зарегистрированными регистрами, программа, как правило, "проливает" свои регистры в стек основной памяти. Помня, где в стеке мы помещаем наши пролитые регистры, мы можем легко вернуть их обратно.
Когда нам не хватает регистров, нам нужно просто сохранить их в стеке, что дает нам FAR больше места, чем большинство из нас нуждается в наших программах.
В конкретном случае многопоточности мы просто сохраняем все наши регистры в памяти, тогда у нас есть чистый сланец для других потоков.
Ответ 6
Это одна из вещей, которые другое хранилище компьютера, в частности ОЗУ, используется для: сохранения и восстановления бит данных в и из регистров.
Когда нить отключается, чтобы запустить другой поток. первое состояние регистра нитей сохраняется где-то (в стеке или какой-либо другой структуре данных), а состояние состояния секундных потоков восстанавливается из того места, где оно было сохранено ранее. ОЗУ достаточно быстра, что тысячи этих переключателей могут произойти за секунду, но занимает достаточно времени, чтобы, если вы меняете потоки без необходимости, это может повлиять на производительность.
Другим очень распространенным явлением является локальные переменные - если локальная переменная используется в течение достаточно короткого периода времени, она никогда не может существовать вне регистра. однако во многих случаях локальная переменная, возможно, потребуется сохранить из регистра в ячейку памяти, чтобы какое-то другое значение могло быть загружено и обработано в регистре. То же самое происходит практически для любых переменных, а не только для локальных пользователей (но гораздо более вероятно, чтобы локальный сервер никогда не имел существования в памяти).
Ответ 7
Это довольно сложный вопрос, и ответ зависит от вашей архитектуры процессора.
В добрые времена вы были правы - действительно, было всего несколько регистров общего назначения. В настоящее время процессор и компилятор играют в игру три карты-монте с вашими реестрами общего назначения с помощью таких методов, как зарегистрировать переименование.
Хотя на простых архитектурах верно, что регистры копируются в [кеш-память] при переключении контекста, такие как SMT "дурачить" ОС, думая, что на них больше ядер, чем на самом деле.
Но самый общий ответ на ваш вопрос заключается в том, что данные часто перемещаются в регистры и из них. И поэтому многие инструкции, которые вы видите в любой заданной программе сборки, являются инструкциями "MOV". Разработчики процессоров и компиляторов тратят много времени и денег на оптимизацию своих проектов, так что вы не переводите данные из основной памяти (медленные) в регистры - они стараются как можно больше кэшировать данные. Это большое количество инструкций "MOV" заключается в том, что латентность памяти и скорость шины настолько важны для производительности всего компьютера.