Что касается планирования ЦП или прерывания, завершит ли ЦП выполнение своей текущей инструкции? - PullRequest
5 голосов
/ 21 апреля 2011

Как мы знаем, одна высокоуровневая языковая инструкция, такая как "counter ++" в C ++, будет переведена в несколько инструкций языка ассемблера.

Мой вопрос: как насчет одной инструкции на языке ассемблера?Правда ли, что некоторые инструкции на ассемблере будут также переведены в несколько машинных инструкций, которые аппаратные средства могут непосредственно считывать?

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

Например, одна сборкаязыковая инструкция A может быть переведена в машинную инструкцию a1, a2, a3.Может ли контекстное переключение происходить между a2, a3?

соответствующими машинными инструкциями одной инструкции языка ассемблера A:

a1 (выполняется) a2 (выполняется ..) <--- следующий переключатель контекстадолжно произойти a3 (еще не выполнено) <--- Могу ли я выполнить до следующего переключения контекста? </p>

Я предполагаю, что a3 не будет выполняться, потому что оборудование знает только свои машинные инструкции и имеетнет понятия ассемблера.Таким образом, каждая инструкция выполняется отдельно.Я прав?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

На самом деле, на довольно многих машинах counter++ будет переводиться в одну инструкцию (например, inc counter).

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

Некоторые процессоры (x86) имеют микрокодирование, поэтому то, что вы вводите как отдельную инструкцию, фактически выполняется как серия микроопераций. Точное сопоставление инструкций с микрооперациями обычно не документируется (например, Intel делала это в течение периода времени Pentium Pro / Pentium II, но в основном этого не делает).

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

1 голос
/ 21 апреля 2011

Иногда во время сборки ассемблер может проникнуть в NOP, чтобы дополнить или сохранить выравнивание.Зависит от процессоров и всяких вещей.Но в значительной степени инструкции по сборке переводят 1: 1 в машинные инструкции.

Как правило, ЦПУ завершает выполнение своей текущей инструкции и затем реагирует на прерывание.Моя единственная оговорка в том, что в некоторых процессорах есть некоторые инструкции, которые на самом деле могут занимать довольно много времени.Например, у Z80 есть инструкция перемещения блока, которая может занимать «долгое» время, особенно в терминах ЦП, а у x86 есть векторные инструкции и т. Д. Поэтому я не знаю, останавливаются ли эти инструкции в середине и перезапускаются позжеили если процессор ожидает их завершения.

Но что касается прерываний в целом, то да, они происходят "между" машинными инструкциями.

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