mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 09:10:10 +00:00
Корректировка конспектов лекций (#131)
* Корректировки конспектов лекций * Корректировка конспекта лекции 5 * Корректировка конспекта лекции 8 * Корректировка конспекта лекции 9 * Корректировка конспекта лекции 10 * Корректировка конспекта лекции 11 * Корректировка конспекта лекции 12 * Корректировка конспекта лекции 13 * Корректировка конспекта лекции 12 * Корректировка конспекта лекции 14 * Корректировка конспекта лекции 16 * Корректировка конспекта лекции 17 * Корректировка конспекта лекции * Корректировка конспекта лекции 20 * Корректировка конспекта лекции 21 * Корректировка конспекта лекции 22 * Корректировка конспекта лекции 23 * Корректировка конспекта лекции 13 * Корректировка конспекта лекции 12 * Корректировка конспекта лекции 20
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
|
||||

|
||||
|
||||
Еще одной важной темой, которую мы затронули, пыли числа с фиксированной и плавающей запятой. Числа с фиксированной запятой фактически не отличаются от целых чисел. Их недостаток в том, что если после запятой оставить много знаков, то будет проблематично записать большое число. А если оставлять мало чисел после запятой, то наоборот. Проблему частично решают числа с плавающей точкой (запятой).
|
||||
Еще одной важной темой, которую мы затронули, были числа с фиксированной и плавающей запятой. Числа с фиксированной запятой фактически не отличаются от целых чисел. Их недостаток в том, что если после запятой оставить много знаков, то будет проблематично записать большое число. А если оставлять мало чисел после запятой, то наоборот. Проблему частично решают числа с плавающей точкой (запятой).
|
||||
|
||||
Общепринятым стандартом являются числа закодированные по стандарту IEEE754. 32-битный формат таких чисел называют float, а 64-битный называют — double. Такой формат является экспоненциальной записью двоичного числа и содержит три поля Sign (Знак, 1 — если число отрицательное), Exponent (Показатель степени) и Mantissa, а число представляется как мантисса умноженная на 2 в степени экспоненты. При этом экспонента сохраняется в смещённом формате, то есть из ее закодированного значения надо предварительно вычесть 127. Мантисса же записывается так, чтобы точка в числе стояла сразу после первой значащей цифры. При этом эта единица в поле Mantissa не записывается. Она называется подразумеваемой единицей.
|
||||
|
||||
|
@@ -20,7 +20,7 @@
|
||||
|
||||

|
||||
|
||||
Кроме этого поговорили про синхронизацию в цифровых устройствах, основной вывод таков — чем короче комбинационная схема, тем выше частота работы. Так же скорость работы цифровых устройств зависит от временных особенностей регистров, используемых в этом устройстве. Триггерам, в составе регистров, требуется чтобы сигнал был устоявшимся в течении некоторого времени перед фронтом синхроимпульса (tsetup), плюс, требуется время для того, чтобы на выходе регистра сформировался установившийся сигнал (tpcq).
|
||||
Кроме этого поговорили про синхронизацию в цифровых устройствах, основной вывод таков — чем короче комбинационная схема, тем выше частота работы. Так же скорость работы цифровых устройств зависит от временных особенностей регистров, используемых в этом устройстве. Триггерам, в составе регистров, требуется, чтобы сигнал был устоявшимся в течении некоторого времени перед фронтом синхроимпульса (tsetup), плюс, требуется время для того, чтобы на выходе регистра сформировался установившийся сигнал (tpcq).
|
||||
|
||||

|
||||
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||

|
||||
|
||||
Ввиду своей простоты, в первую очередь был разработан процессор с однотактной микроархитектурой с архитектурой RISC-V. Тракт данных процессора состоит из счетчика команд (регистр PC — program counter), памяти инструкций (Instruction Memory), регистрового файла (Register File), арифметико-логического устройства (ALU), памяти данных (Data Memory) и основного дешифратора (Main Decoder). На входе PC располагается схема вычисления адреса следующей инструкции. Выход PC подключен к адресному входу памяти инструкций, тем самым выбирая инструкцию для исполнения. Часть битов считанной инструкции отправляются в основной дешифратор, который в зависимости от поля opcode, funst3 и funct7 формирует управляющие сигналы для всех блоков процессора.
|
||||
Ввиду своей простоты, в первую очередь был разработан процессор с однотактной микроархитектурой с архитектурой RISC-V. Тракт данных процессора состоит из счетчика команд (регистр PC — program counter), памяти инструкций (Instruction Memory), регистрового файла (Register File), арифметико-логического устройства (ALU), памяти данных (Data Memory) и основного дешифратора (Main Decoder). На входе PC располагается схема вычисления адреса следующей инструкции. Выход PC подключен к адресному входу памяти инструкций, тем самым выбирая инструкцию для исполнения. Часть битов считанной инструкции отправляются в основной дешифратор, который в зависимости от поля opcode, funct3 и funct7 формирует управляющие сигналы для всех блоков процессора.
|
||||
|
||||

|
||||
|
||||
|
@@ -31,7 +31,7 @@
|
||||
|
||||
Такой подход позволяет значительно уменьшить управляющую память, за счет чего она получится быстрее. Однако, микроинструкции ветвления, при таком подходе, требуют дополнительного такта на обработку (когда признак равен 1 нет операционной части).
|
||||
|
||||
Когда управляющая память хранит значения всех сигналов процессора в естественной форме, это называется *горизонтальным микропрограммированием*. Это значит, что, если устройство управления должно формировать, например, 50 управляющих сигналов для всех блогов процессора, то каждая микроинструкция будет включать в себя операционную часть длинной в 50 бит, то есть отдельный бит для каждого управляющего сигнала.
|
||||
Когда управляющая память хранит значения всех сигналов процессора в естественной форме, это называется *горизонтальным микропрограммированием*. Это значит, что, если устройство управления должно формировать, например, 50 управляющих сигналов для всех блоков процессора, то каждая микроинструкция будет включать в себя операционную часть длинной в 50 бит, то есть отдельный бит для каждого управляющего сигнала.
|
||||
|
||||
Горизонтальное микропрограммирование не требует наличие дешифратора на выходе УМУ, однако, для хранения всех значений сигнала потребуется относительно большая память, что повлияет на скорость ее работы. Альтернативой является *вертикальное микропрограммирование*, в котором каждой длинной последовательности сигналов (например, 50 в нашем примере) ставится в соответствие более короткая последовательность (например, из 10 бит). В таком случае на выходе УМУ требуется расположить дешифратор, который будет преобразовывать короткий код в длинный.
|
||||
|
||||
|
@@ -34,7 +34,7 @@
|
||||
- По данным (вызванные зависимостью по данным между несколькими соседними инструкциями). Существует три типа конфликтов по данным:
|
||||
- RAW (read after write — чтение после записи, при котором новая инструкция пытается получить значение из памяти, которая предыдущая инструкция еще не успела туда записать). Разрешается, переброской результата или методом пузырька (приостановкой конвейера)
|
||||
- WAR (write after read — запись после чтения, при котором новая инструкция пытается разместить данные в памяти до того, как старая инструкция успела их оттуда считать). Конфликт возникает в системах с внеочередным исполнением команд, то есть в таких, где заданная программистом последовательность инструкций может быть изменена с целью увеличения производительности. Разрешается конфликт, например, методом пузырька или переименовыванием регистров
|
||||
- WAW (write after write — запись после записи, при котором более ранняя инструкция размещает значение в памяти позже, чем более поздняя инструкция, тем самым нарушая порядок записи в память). Разрешается конфликт так же как и в конфликтах типа WAR.
|
||||
- WAW (write after write — запись после записи, при котором более ранняя инструкция размещает значение в памяти позже, чем более поздняя инструкция, тем самым нарушая порядок записи в память). Разрешается конфликт так же, как и в конфликтах типа WAR.
|
||||
- По управлению (вызванный неоднозначностью того, какая инструкция должна быть загружена после инструкции условного перехода, так как результат перехода будет известен только на стадии Execute, а загружать новую инструкцию надо уже, когда команда условного перехода будет на стадии Decode). Конфликт разрешается методом пузырька, либо предположением о том, произойдет переход или нет. В случае успешного предсказания потери производительности не происходит. В случае неверного предсказания, ступени конвейера, в которые были загружены неправильные команды должны очиститься.
|
||||
|
||||
В среднем, каждая 7 инструкция в программе является инструкцией условного перехода. Поэтому конфликты по управлению сильнее всего влияют на производительность конвейерного процессора.
|
||||
|
@@ -48,7 +48,7 @@
|
||||
|
||||
Обычно статические методы используются в связке с динамическими, которые собирают статистику переходов в реальном времени и на основе этой статистики делают предположение о переходе. В основе динамических методов лежат несколько подходов к накоплению информации (статистики) о совершенных переходах.
|
||||
|
||||
PHT (pattern hystory table) — специальная память, состоящая из двухбитных ячеек памяти, доступ к которым происходит по некоторому паттерну. Если условный переход происходит, то значение ячейки памяти из PHT закреплённой за этим условным переходом, увеличивается на 1 (но не больше максимального значения 11). Если переход не происходит, то уменьшается на 1 (но не меньше минимального значения 00). Предсказанием является старший из этих двух бит, если он 1, то делается предсказание, что переход произойдёт, если он равен 0, то делается предположение, что он не произойдёт.
|
||||
PHT (pattern history table) — специальная память, состоящая из двухбитных ячеек памяти, доступ к которым происходит по некоторому паттерну. Если условный переход происходит, то значение ячейки памяти из PHT закреплённой за этим условным переходом, увеличивается на 1 (но не больше максимального значения 11). Если переход не происходит, то уменьшается на 1 (но не меньше минимального значения 00). Предсказанием является старший из этих двух бит, если он 1, то делается предсказание, что переход произойдёт, если он равен 0, то делается предположение, что он не произойдёт.
|
||||
|
||||
GHR (global history register) — регистр глобальной истории, являющийся сдвиговым регистром некоторой длинны, сдвигающий данные каждый раз, когда поступает на исполнение инструкция условного перехода, при этом в регистр задвигается 1, если переход произошёл, и 0, если нет. Таким образом регистр хранит историю результатов переходов последних n (разрядность регистра) инструкций условного перехода.
|
||||
|
||||
|
@@ -19,9 +19,9 @@
|
||||
|
||||
В последних лекциях разрабатывалось три микроархитектуры:
|
||||
|
||||
- **Однотактный процессор** - каждая инструкция выполняется за один такт, относительно простая для понимания архитектура, но тк каждая инструкция выполняется в течение одного такта нужно ориентироваться на инструкцию с наибольшим критическим путем, поэтому данное решение не является оптимальным.
|
||||
- **Однотактный процессор** - каждая инструкция выполняется за один такт, относительно простая для понимания архитектура, но так как каждая инструкция выполняется в течение одного такта, нужно ориентироваться на инструкцию с наибольшим критическим путем, поэтому данное решение не является оптимальным.
|
||||
|
||||
- **Многотактный процессор** - одна инструкция выполняется за несколько тактов, причем такты более короткие, тк меньше критический путь, но из всех архитектур является самой не производительной.
|
||||
- **Многотактный процессор** - одна инструкция выполняется за несколько тактов, причем такты более короткие, так как меньше критический путь, но из всех архитектур является самой не производительной.
|
||||
|
||||
- **Конвейерный процессор** - может обрабатывать несколько инструкций одновременно, имеет короткий критический путь, по сравнению с однотактной архитектурой, но страдает от конфликтов, которые были разобраны подробно в предыдущих лекциях.
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
|
||||
**Буфер восстановления последовательности** (БВП) — это универсальный инструмент для поддержания правильной последовательности исполнения команд в случае нескольких параллельно работающих функциональных блоков.
|
||||
|
||||
БВП представляет собой кольцевой буфер с указателями головной и хвостовой части. Указатель головной части содержит адрес, следующего свободного входа. Команды заносятся в БВП в порядке, определяемом программой. Каждая выданная команда помещается в следующую свободную ячейку буфера (говорят, что команде выделен очередной свободным вход БВП.), причем выделение ячеек идет с соблюдением последовательности выдачи команд. Каждый занятый вход содержит также информацию о состоянии хранимой в нем команды: команда только выдана (i), находится в стадии исполнения (х) или уже завершена (f). Указатель хвостовой части показывает па команду, подлежащую удалению из БВП прежде других. Удаление команды разрешено, только если она завершена и предшествующие ей команды уже удалены из буфера. Этот механизм гарантирует что команды покидают БВП строго по порядку. Очередность выполнения команд программы сохраняется благодаря тому, что заносить свои результаты в память или регистры разрешается лишь тем командам, которые покинули БВП.
|
||||
БВП представляет собой кольцевой буфер с указателями головной и хвостовой части. Указатель головной части содержит адрес, следующего свободного входа. Команды заносятся в БВП в порядке, определяемом программой. Каждая выданная команда помещается в следующую свободную ячейку буфера (говорят, что команде выделен очередной свободным вход БВП.), причем выделение ячеек идет с соблюдением последовательности выдачи команд. Каждый занятый вход содержит также информацию о состоянии хранимой в нем команды: команда только выдана (i), находится в стадии исполнения (х) или уже завершена (f). Указатель хвостовой части показывает на команду, подлежащую удалению из БВП прежде других. Удаление команды разрешено, только если она завершена и предшествующие ей команды уже удалены из буфера. Этот механизм гарантирует что команды покидают БВП строго по порядку. Очередность выполнения команд программы сохраняется благодаря тому, что заносить свои результаты в память или регистры разрешается лишь тем командам, которые покинули БВП.
|
||||
|
||||
Название буфера подчеркивает его основную задачу — поддержание строгой последовательности завершения команд путем переупорядочивания тех из них, которые исполнялись с нарушением этой последовательности. Однако БВП более универсален - с равным успехом он годится и для переименования регистров, и для распределения декодированных команд по накопителям (схемам резервирования).
|
||||
|
||||
@@ -139,6 +139,6 @@
|
||||
- MISD (multiple instruction single data)
|
||||
- MIMD (multiple instruction multiple data)
|
||||
|
||||
### Основные материалы лекции
|
||||
## Основные материалы лекции
|
||||
|
||||
1. [Ссылка](https://www.youtube.com/watch?v=deTK5ZjFWaw) на видеозапись лекции
|
||||
|
@@ -47,7 +47,7 @@ _Строгое определение:_
|
||||
Load/store архитектура представляет собой архитектуру набора команд, которая делит инструкции на две категории: доступ к памяти (загрузка и сохранение между памятью и регистрами) и операции ALU (которые происходят только между регистрами).
|
||||
|
||||
- **Мостовая архитектура**
|
||||
В мостовой архитектуре существует "мост" в основную память, благодаря чему в качестве операндов могут использоваться как значения из регистрового файла так и значения из основной памяти.
|
||||
В мостовой архитектуре существует "мост" в основную память, благодаря чему в качестве операндов могут использоваться как значения из регистрового файла, так и значения из основной памяти.
|
||||
|
||||
- **Стековая архитектура**
|
||||
В вычислительных машинах, где реализована архитектура на базе стека, операнды выбираются из двух верхних ячеек стековой памяти. Результат операции заносится в вершину стека.
|
||||
@@ -143,6 +143,6 @@ _Строгое определение:_
|
||||
- 1 - один операнд
|
||||
- 2 - два операнда
|
||||
|
||||
### Основные материалы лекции
|
||||
## Основные материалы лекции
|
||||
|
||||
1. [Ссылка](https://www.youtube.com/watch?v=w4KbkQSDJLU) на видеозапись лекции
|
||||
|
@@ -114,7 +114,7 @@ _Пример_: Перемещение мыши. Если бы не было п
|
||||
|
||||
- **Цепочечная схема**
|
||||
|
||||
От процессора идет сигнал подтверждения `ПДТ`, который приходит только тогда, когда процессор готов обработать какое-то прерывание (см. рис. 5.). Этот сигнал приходит на вход первого устройства, которое, в случае необходимости, выдаёт процессору сигнал на прерывание и вектор прерывания. Если же в прерывании от первого устройства нет необходимости, то сигнал подтверждения передаётся на следующее устройство и т.д. Цепочечная схема проста в реализации, но очень медленная. К тому же в этой схеме некоторые устройства имеют приоритет на другими в очерёдности обработки запроса на прерывание. Также существует вероятность, что до последних устройств никогда не дойдёт сигнал подтверждения, и процессор не обработает их запрос на прерывание.
|
||||
От процессора идет сигнал подтверждения `ПДТ`, который приходит только тогда, когда процессор готов обработать какое-то прерывание (см. рис. 5.). Этот сигнал приходит на вход первого устройства, которое, в случае необходимости, выдаёт процессору сигнал на прерывание и вектор прерывания. Если же в прерывании от первого устройства нет необходимости, то сигнал подтверждения передаётся на следующее устройство и т.д. Цепочечная схема проста в реализации, но очень медленная. К тому же в этой схеме некоторые устройства имеют приоритет над другими в очерёдности обработки запроса на прерывание. Также существует вероятность, что до последних устройств никогда не дойдёт сигнал подтверждения, и процессор не обработает их запрос на прерывание.
|
||||
|
||||

|
||||
|
||||
@@ -122,7 +122,7 @@ _Пример_: Перемещение мыши. Если бы не было п
|
||||
|
||||
- **Схема с циклическим опросом**
|
||||
|
||||
Каждый раз, когда в счётчик `СТ` приходит сигнал `C` (тактирование), он увеличивает своё значение (см рис. 6). Затем это значение подаётся на вход дешифратору `DC`, который только на одном выходе выдаёт 1. И каждый такт меняется номер выхода от 0 до N. Если во время обхода всех выходов появится сигнал на прерывание, то этот сигнал отправится на RS триггер, который затем отправит `interrupt` сигнал процессору. А на вход `C` счётчика `CT` будет отправлен 0. В таком случае счётчик перестанет суммировать, и он будет иметь значение кода номера прерывания.
|
||||
Каждый раз, когда в счётчик `СТ` приходит сигнал `C` (тактирование), он увеличивает своё значение (см. рис. 6). Затем это значение подаётся на вход дешифратору `DC`, который только на одном выходе выдаёт 1. И каждый такт меняется номер выхода от 0 до N. Если во время обхода всех выходов появится сигнал на прерывание, то этот сигнал отправится на RS триггер, который затем отправит `interrupt` сигнал процессору. А на вход `C` счётчика `CT` будет отправлен 0. В таком случае счётчик перестанет суммировать, и он будет иметь значение кода номера прерывания.
|
||||
|
||||

|
||||
|
||||
@@ -151,19 +151,19 @@ _Пример_: Перемещение мыши. Если бы не было п
|
||||
|
||||
| Номер | Привилегия | Имя | Описание |
|
||||
|:------------|:-----------|:----------|:-----------------------------------------------------------|
|
||||
| Ox304 | MRW | mie | Регистр маски |
|
||||
| Ox305 | MRW | mtvec | Регистр вектора прерывания |
|
||||
| Ox340 | MRW | mscratch | Регистр указателя на стек прерывания |
|
||||
| Ox341 | MRW | mepc | Регистр адреса инструкции, на котором случилось прерывание |
|
||||
| Ox342 | MRW | mcause | Регистр причины (кода) прерывания |
|
||||
| 0x304 | MRW | mie | Регистр маски |
|
||||
| 0x305 | MRW | mtvec | Регистр вектора прерывания |
|
||||
| 0x340 | MRW | mscratch | Регистр указателя на стек прерывания |
|
||||
| 0x341 | MRW | mepc | Регистр адреса инструкции, на котором случилось прерывание |
|
||||
| 0x342 | MRW | mcause | Регистр причины (кода) прерывания |
|
||||
|
||||
Инструкции для работы с CSR:
|
||||
|
||||
| Opcode | func3 | Тип | Инструкция | Описание | Операция |
|
||||
|:----------|:------|:-----|:--------------------|:--------------------------|:------------------------|
|
||||
| 1110011 | 000 | I | mret | Возврат и прерывание | PC=merc |
|
||||
| 1110011 | 000 | I | mret | Возврат и прерывание | PC=mepc |
|
||||
| 1110011 | 001 | I | csrrw rd, csr, rs1 | Чтение/запись CSR | rd = csr, csr=rs1 |
|
||||
| 1110011 | 010 | I | csrrs rd, csr, rs1 | Чтение/установка бит CSR | rd = csr, csr=rs1\|rs1 |
|
||||
| 1110011 | 010 | I | csrrs rd, csr, rs1 | Чтение/установка бит CSR | rd = csr, csr=csr\|rs1 |
|
||||
| 1110011 | 011 | I | csrrc rd, csr, rs1 | Чтение/очистка бит CSR | rd=csr, csr=csr&~rs1 |
|
||||
|
||||
## Подсистема прерываний для RISC-V
|
||||
|
@@ -30,7 +30,7 @@
|
||||
*Рис. 1. Изменение в производительности процессоров и памяти с 80-х годов.*
|
||||
|
||||
**Что такое кэш-память?**
|
||||
**Кэш-память** — это небольшой сегмент высокоскоростной памяти, обычно на базе **SRAM** ([**Static Random-Access Memory**](./15.%20Memory.md#статическая-и-динамическая-память), расположенный непосредственно на процессоре или рядом с ним. Её главная функция — временное хранение тех данных, к которым процессор часто обращается. Основная цель такой памяти — уменьшить задержку доступа к данным, служа мостом между процессором и основной оперативной памятью.
|
||||
**Кэш-память** — это небольшой сегмент высокоскоростной памяти, обычно на базе **SRAM** ([**Static Random-Access Memory**](./15.%20Memory.md#статическая-и-динамическая-память)), расположенный непосредственно на процессоре или рядом с ним. Её главная функция — временное хранение тех данных, к которым процессор часто обращается. Основная цель такой памяти — уменьшить задержку доступа к данным, служа мостом между процессором и основной оперативной памятью.
|
||||
|
||||
**Для чего нужна кэш-память?**
|
||||
Основное **предназначение кэш-памяти** — ускорение доступа процессора к часто используемым данным и командам, минимизируя зависимость от более медленной основной памяти. Благодаря этому, время реакции системы сокращается, делая её более отзывчивой и эффективной.
|
||||
@@ -112,7 +112,7 @@
|
||||
|
||||
*AMAT* = 1 + 0.1 *(100) = 11
|
||||
Какой должен быть MR, чтобы снизить AMAT до 1.5 тактов?
|
||||
1 + m* (100) = 1.5 -> m = 0.005%
|
||||
1 + m* (100) = 1.5 -> m = 0.5%
|
||||
|
||||
## Кэш прямого отображения
|
||||
|
||||
@@ -132,8 +132,8 @@
|
||||
|
||||
где
|
||||
Первые 2 бита (**Byte Offset**) — смещение внутри слова
|
||||
Следующие три бита (**Set**) указывают, на какой набор претендует ячейка памяти.
|
||||
Оставшиеся 10 бит представляют собой **Tag**, с помощью которого определяется, находится ли ячейка в кэш-памяти или нет.
|
||||
Следующие 3 бита (**Set**) указывают, на какой набор претендует ячейка памяти.
|
||||
Оставшиеся 27 бит представляют собой **Tag**, с помощью которого определяется, находится ли ячейка в кэш-памяти или нет.
|
||||
|
||||
**Пример:**
|
||||
|
||||
@@ -214,7 +214,7 @@ done:
|
||||
|
||||
*Рис. 11. Схематическое представление деления адреса в контексте длины строки (или блока) кэша.*
|
||||
|
||||
Здесь *(рис. 11)* у нас адрес делится на чуть большее количество секций, байтовое смещение (**Bite Offsets**) для байта внутри одного слова, смещение блока (**Block Offsets**) т.е. смещение внутри строки, бит для выбора набора (**Set**) и 27 бит под **Tag**.
|
||||
Здесь *(рис. 11)* у нас адрес делится на чуть большее количество секций, байтовое смещение (**Byte Offset**) для байта внутри одного слова, смещение блока (**Block Offset**) т.е. смещение внутри строки, бит для выбора набора (**Set**) и 27 бит под **Tag**.
|
||||
|
||||
**Плюсы**:
|
||||
При обращении к одной инструкции из кэша автоматически загружаются и следующие три инструкции, что обеспечивает быстрый доступ к большому объему данных.
|
||||
@@ -242,7 +242,7 @@ done:
|
||||
|
||||
И теперь мы получим более низкий MR:
|
||||
|
||||

|
||||

|
||||
|
||||
## Алгоритмы замещения данных
|
||||
|
||||
|
@@ -238,8 +238,8 @@ LRU вытесняет страницы, которые не использов
|
||||
Вместо одной огромной таблицы страниц, которая бы отображала каждую возможную страницу виртуальной памяти на страницу физической памяти, многоуровневые таблицы разбивают эту информацию на несколько меньших таблиц *(рис. 14)*, что более рационально для многозадачных операционных систем
|
||||
|
||||
Каждый виртуальный адрес представляется тремя частями:
|
||||
**Page Tales Number** — запись в основной таблице, где мы найдем нашу вторую побочную таблицу.
|
||||
**Page Tales Offset** — указывают на строку во второй таблице.
|
||||
**Page Table Number** — запись в основной таблице, где мы найдем нашу вторую побочную таблицу.
|
||||
**Page Table Offset** — указывают на строку во второй таблице.
|
||||
**Page Offset** — смещение, указывает на конкретную ячейку памяти внутри соответствующей таблицы.
|
||||
|
||||

|
||||
@@ -355,6 +355,6 @@ LRU вытесняет страницы, которые не использов
|
||||
|
||||
Как только запрос, ожидающий процесса, удовлетворен (например, когда ресурс становится доступным), процесс переходит обратно в состояние **"готовности"**. Теперь он готов к выполнению и ожидает своей очереди.
|
||||
|
||||
### Основные материалы лекции
|
||||
## Основные материалы лекции
|
||||
|
||||
1. [Ссылка](https://www.youtube.com/watch?v=Q0XINgDHCZE) на видеозапись лекции
|
||||
|
@@ -54,16 +54,16 @@
|
||||
|
||||
### Коммуникационные модели
|
||||
|
||||
В коммуникационной моделью с общей памятью есть:
|
||||
В коммуникационной модели с общей памятью есть:
|
||||
|
||||
- есть единое адресное пространство для потоков;
|
||||
- единое адресное пространство для потоков;
|
||||
- общение между потоками происходит через неявную связь с помощью загрузки и сохранения в память.
|
||||
|
||||

|
||||
|
||||
*Рис. 1. Коммуникационная модель с общей памятью.*
|
||||
|
||||
В коммуникационной моделью с обменом сообщениями присутствуют:
|
||||
В коммуникационной модели с обменом сообщениями присутствуют:
|
||||
|
||||
- разделенное адресное пространство (у каждого из процессоров своя память);
|
||||
- общение между потоками происходит явной связи путем отправки и получения сообщений.
|
||||
@@ -87,11 +87,11 @@
|
||||
|
||||
Рассмотрим ситуацию, когда процесс порождает два параллельных потока `P₁` и `P₂` и впоследствии использует результаты их вычислений. После создания, процесс сможет продолжить дальнейшее выполнение только когда будут выполнены оба потока, а значит есть необходимость их синхронизировать.
|
||||
|
||||
- Проиводитель-потребитель (producer-consumer): потребительский процесс должен ждать, пока процесс производителя не произведет данные (то есть потребитель не может продолжать выполнение, пока производитель не произведёт какие-то данные).
|
||||
- Производитель-потребитель (producer-consumer): потребительский процесс должен ждать, пока процесс производителя не произведет данные (то есть потребитель не может продолжать выполнение, пока производитель не произведёт какие-то данные).
|
||||
|
||||

|
||||
|
||||
*Рис. 4. Способ синхронизации параллельных процессов "Проиводитель-потребитель" (producer-consumer).
|
||||
*Рис. 4. Способ синхронизации параллельных процессов "Проиводитель-потребитель" (producer-consumer).*
|
||||
|
||||
- **Взаимное исключение**: операционная система должна гарантировать, что ресурс используется только одним процессом в данный момент времени (например, два процесса не могут одновременно обращаться к одной ячейке памяти).
|
||||
|
||||
@@ -109,17 +109,17 @@
|
||||
|
||||

|
||||
|
||||
*Рис. 5. Пример программы с синхронной связью.
|
||||
*Рис. 5. Пример программы с синхронной связью.*
|
||||
|
||||
Метка `loop` указывает на последовательность инструкций xxxᵢ, которые генерируют данные `с`. После этого производитель оправляет эти данные для потребителя и потом возвращается к началу цикла и так далее. В свою очередь потребитель получает данные (receive) от производителя, выполняет над ними нужные операции и снова возвращается к началу цикла.
|
||||
Метка `loop` указывает на последовательность инструкций `xxxᵢ`, которые генерируют данные `с`. После этого производитель оправляет эти данные для потребителя и потом возвращается к началу цикла и так далее. В свою очередь потребитель получает данные (receive) от производителя, выполняет над ними нужные операции и снова возвращается к началу цикла.
|
||||
|
||||
**Приоритет очерёдности** `a`⩽`b`,`a` предшествует `b`:
|
||||
|
||||
- Потребитель не может использовать данные до их получения (событие sendᵢ должно происходить раньше или в тот же момент времени, когда происходит `rcvᵢ` (получение) этих данных);
|
||||
- Потребитель не может использовать данные до их получения (событие `sendᵢ` должно происходить раньше или в тот же момент времени, когда происходит `rcvᵢ` (получение) этих данных);
|
||||
|
||||

|
||||
|
||||
*Рис. 6. Пример программы с синхронной связью c учётом приоритета очерёдности.
|
||||
*Рис. 6. Пример программы с синхронной связью c учётом приоритета очерёдности.*
|
||||
|
||||
- Производитель не может перезаписать данные до их использования потребителем (получение данных должно происходить раньше, чем их перезапишет следующая `i+1` посылка).
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
|
||||

|
||||
|
||||
*Рис. 7. Пример буфера FIFO без ограничений приоритета.
|
||||
*Рис. 7. Пример буфера FIFO без ограничений приоритета.*
|
||||
|
||||
Буфер FIFO ослабляет ограничения, связанные с синхронизацией. Производитель может опередить потребителя на `N` значений (где N — глубина данного буфера).
|
||||
|
||||
@@ -137,7 +137,7 @@
|
||||
|
||||

|
||||
|
||||
*Рис. 8. Пример кольцевого буфера без ограничений приоритета с указателями на начало и конец очереди.
|
||||
*Рис. 8. Пример кольцевого буфера без ограничений приоритета с указателями на начало и конец очереди.*
|
||||
|
||||
У нас есть буфер на 3 элемента (очередь) и два указателя: один указывает на место, куда мы будем писать (`write_ptr`), а другой указывает на место, откуда мы будем читать (`read_ptr`). В очередной момент времени происходит генерация новых данных (`send c₀`) — они записываются в место, куда указывает `write_ptr`. После этого данный указатель сдвигается на одну ячейку вправо (`i+1`). Далее мы снимаем данные с первой ячейки (`rcv()`) c₀ и указатель `read_ptr` сдвигается на следующую ячейку (`c₁`) и так далее.
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
|
||||

|
||||
|
||||
*Рис. 9. Пример программы буфера FIFO с общей памятью без ограничений приоритета.
|
||||
*Рис. 9. Пример программы буфера FIFO с общей памятью без ограничений приоритета.*
|
||||
|
||||
Данный буфер **не применяет никаких ограничений приоритета** (*например, `rcv()` может быть вызван до любой отправки*) и поэтому работает неправильно. Чтобы устранить эту проблему, нам поможет концепция *семафоров*.
|
||||
|
||||
@@ -172,7 +172,7 @@ Semaphore — это тип данных, число ≥ 0.
|
||||
|
||||

|
||||
|
||||
*Рис. 10. Потоки `А` и `B` .
|
||||
*Рис. 10. Потоки `А` и `B` .*
|
||||
|
||||
Решение:
|
||||
|
||||
@@ -182,7 +182,7 @@ Semaphore — это тип данных, число ≥ 0.
|
||||
|
||||

|
||||
|
||||
*Рис. 11. Потоки `A` и `B` с семафорами для приоритета.
|
||||
*Рис. 11. Потоки `A` и `B` с семафорами для приоритета.*
|
||||
|
||||
Если мы в потоке B придём раньше до `B₄`, то `s` по умолчанию = 0 и мы застрянем на инструкции `wait(s)`. В это время первый поток А доходит до `signal(s)`, то есть увеличивает `s` на 1, соответственно внутри `wait` `s` тоже увеличилось на 1. Мы прошли этот `wait` и семафор снова стал нулём.Таким образом, мы получили синхронизацию, которую хотели.
|
||||
|
||||
@@ -208,16 +208,16 @@ Semaphore — это тип данных, число ≥ 0.
|
||||
|
||||

|
||||
|
||||
*Рис. 12. Пример программы буфера FIFO с семафорами.
|
||||
*Рис. 12. Пример программы буфера FIFO с семафорами.*
|
||||
|
||||
- выполняется приоритет, управляемый семафором `sendᵢ` ≤ `revᵢ`;
|
||||
- выполняется приоритет, управляемый семафором `sendᵢ` ≤ `rcvᵢ`;
|
||||
- здесь есть один ресурс, управляемый семафором: количество символов в буфере;
|
||||
- всё ещё некорректная ситуация, так как производитель может переполнить буфер;
|
||||
- должны применять требование `rcvᵢ` ≤ `sendᵢ₊₁>`.
|
||||
- должны применять требование `rcvᵢ` ≤ `sendᵢ₊₁`.
|
||||
|
||||

|
||||
|
||||
*Рис. 13. Пример программы буфера FIFO с семафорами с применением требования `rcvᵢ` ≤ `sendᵢ₊₁.`
|
||||
*Рис. 13. Пример программы буфера FIFO с семафорами с применением требования `rcvᵢ` ≤ `sendᵢ₊₁.`*
|
||||
|
||||
Ресурсы, управляемые семафорами: символы в FIFO, свободное место в FIFO.
|
||||
Работает с одним производителем и потребителем.
|
||||
@@ -228,7 +228,7 @@ Semaphore — это тип данных, число ≥ 0.
|
||||
|
||||

|
||||
|
||||
*Рис. 14. Код к конкретной задаче.
|
||||
*Рис. 14. Код к конкретной задаче.*
|
||||
|
||||
Результат: у вас есть 200 рублей и баланс счёта уменьшился на 200 рублей.
|
||||
|
||||
@@ -236,7 +236,7 @@ Semaphore — это тип данных, число ≥ 0.
|
||||
|
||||

|
||||
|
||||
*Рис. 15. Перекрытие потоков.
|
||||
*Рис. 15. Перекрытие потоков.*
|
||||
|
||||
Результат: у вас есть 200 рублей, а баланс счёта уменьшился на 100 рублей.
|
||||
|
||||
@@ -244,13 +244,13 @@ Semaphore — это тип данных, число ≥ 0.
|
||||
Для некоторых сегментов кода, называемых критическими секциями (**critical sections**) мы хотели бы убедиться, что никакие два выполнения не перекрываются.
|
||||
Это ограничение называется взаимным исключением (**mutual exclusion**).
|
||||
|
||||
**Решение**: внедрить в критические секции обёртки, которые гарантируют **атомарность**, то есть делают их похожими но отдельные мгновенные операции.
|
||||
**Решение**: внедрить в критические секции обёртки, которые гарантируют **атомарность**, то есть делают их похожими на отдельные мгновенные операции.
|
||||
|
||||
### Семафоры для взаимных исключений
|
||||
|
||||

|
||||
|
||||
*Рис. 16. Функция из предыдущего примера.
|
||||
*Рис. 16. Функция из предыдущего примера.*
|
||||
|
||||
Нам нужно гарантировать, что двойной вызов функции `debit` не пересекается. То есть либо `a` предшествует `b`, либо `b` предшествует `a` (они не пересекаются!).
|
||||
|
||||
@@ -262,7 +262,7 @@ Semaphore — это тип данных, число ≥ 0.
|
||||
|
||||

|
||||
|
||||
*Рис. 17. Итоговая функция с семафором для взаимных исключений.
|
||||
*Рис. 17. Итоговая функция с семафором для взаимных исключений.*
|
||||
|
||||
### Проблемы атомарности
|
||||
|
||||
@@ -271,13 +271,13 @@ Semaphore — это тип данных, число ≥ 0.
|
||||
|
||||

|
||||
|
||||
*Рис. 18. Потоки производители для нашего примера.
|
||||
*Рис. 18. Потоки производители для нашего примера.*
|
||||
|
||||
Справиться с этим помогут наши блокировки:
|
||||
|
||||

|
||||
|
||||
*Рис. 19. Программа буфера FIFO с блокировками.
|
||||
*Рис. 19. Программа буфера FIFO с блокировками.*
|
||||
|
||||
### Мощность семафора
|
||||
|
||||
@@ -293,7 +293,7 @@ Semaphore — это тип данных, число ≥ 0.
|
||||
|
||||

|
||||
|
||||
*Рис. 20. Итоговая программа буфера FIFO с блокировками для защиты переменных `in` и `out`.
|
||||
*Рис. 20. Итоговая программа буфера FIFO с блокировками для защиты переменных `in` и `out`.*
|
||||
|
||||
### Реализация семафоров
|
||||
|
||||
@@ -310,20 +310,21 @@ Semaphore — это тип данных, число ≥ 0.
|
||||
|
||||

|
||||
|
||||
*Рис. 21. Пересылка одинаковой суммой денег с одного счёта на другой.
|
||||
*Рис. 21. Пересылка одинаковой суммой денег с одного счёта на другой.*
|
||||
|
||||

|
||||
|
||||
*Рис. 22. Функция пересылки денег.
|
||||
*Рис. 22. Функция пересылки денег.*
|
||||
|
||||
Что же может пойти не так?
|
||||
|
||||
Thread 1: wait (lock [0903]); (поток 1 блокирует 0903)
|
||||
|
||||
Thread 2: wait (lock [1103]); (поток 2 параллельно блокирует 1103)
|
||||
|
||||
Thread 1: wait (lock [1103]); //не завершиться, пока не произойдёт signal 2 потока (заблокирован, потому что предыдущий поток его уже заблокировал, кончился ресурс)
|
||||
|
||||
Thread 1: wait (lock [0903]); //не завершиться, пока не произойдёт signal 1 потока.
|
||||
Thread 2: wait (lock [0903]); //не завершиться, пока не произойдёт signal 1 потока.
|
||||
|
||||
Ни один поток не может добиться прогресса - это называется **Тупик** или **Deadlock**.
|
||||
**Deadlock** — ситуация, при которой несколько процессов находятся в состоянии ожидания ресурсов, занятых друг другом, и ни один из них не может продолжать свое выполнение.
|
||||
@@ -332,9 +333,9 @@ Thread 1: wait (lock [0903]); //не завершиться, пока не пр
|
||||
|
||||

|
||||
|
||||
*Рис. 23. Карикатура обедающих философов за столом.
|
||||
*Рис. 23. Карикатура обедающих философов за столом.*
|
||||
|
||||
Философы мыслят глубокими мыслями, но имеют простые мирские потребности. Когда вы голодны, группа из `N` философов будет сидеть вокруг стола с N палочками для еды, разбросанными между ними. Еда подаётся, и каждый философ наслаждается неторопливой едой, используя палочки для еды с обеих сторон.
|
||||
Философы мыслят глубокими мыслями, но имеют простые мирские потребности. Когда вы голодны, группа из `N` философов будет сидеть вокруг стола с `N` палочками для еды, разбросанными между ними. Еда подаётся, и каждый философ наслаждается неторопливой едой, используя палочки для еды с обеих сторон.
|
||||
Они очень вежливы и терпеливы, и каждый соблюдает обеденный протокол.
|
||||
Алгоритмы философа:
|
||||
|
||||
@@ -364,7 +365,7 @@ Thread 1: wait (lock [0903]); //не завершиться, пока не пр
|
||||
|
||||

|
||||
|
||||
*Рис. 24. Решение проблемы обедающих философов.
|
||||
*Рис. 24. Решение проблемы обедающих философов.*
|
||||
|
||||
Доказательство: `Deadlock` означает, что каждый философ ждёт ресурса, которым владеет какой-то другой философ. Но философ, держащий самую большую палочку для еды не может ждать какого-либо другого философа.
|
||||
|
||||
@@ -372,13 +373,13 @@ Thread 1: wait (lock [0903]); //не завершиться, пока не пр
|
||||
|
||||

|
||||
|
||||
*Рис. 25. Исправленный метод передачи денежной суммы.
|
||||
*Рис. 25. Исправленный метод передачи денежной суммы.*
|
||||
|
||||
## Многоядерность
|
||||
|
||||

|
||||
|
||||
*Рис. 26. Многоядерность.
|
||||
*Рис. 26. Многоядерность.*
|
||||
|
||||
1. Современные процессоры обычно имеют от 2 до 8 ядер, где каждое ядро имеет собственный кэш для повышения производительности.
|
||||
2. Ядро могут использоваться совместно для ускорения работы приложения.
|
||||
@@ -392,7 +393,7 @@ Thread 1: wait (lock [0903]); //не завершиться, пока не пр
|
||||
|
||||

|
||||
|
||||
*Рис. 27. Проблема многоядерности.
|
||||
*Рис. 27. Проблема многоядерности.*
|
||||
|
||||
1) Ядро 0 загружает данные из памяти по адресу `A` число два.
|
||||
2) Ядро 2 выгружает в память по адресу `A` число три.
|
||||
@@ -418,7 +419,7 @@ Thread 1: wait (lock [0903]); //не завершиться, пока не пр
|
||||
Протоколы когерентности должны обеспечивать соблюдение двух правил:
|
||||
|
||||
- распространяющаяся запись (**Write propagation**): записи в конечном итоге становятся видимыми для всех процессоров (если кто-то из процессоров пишет куда-то, то нужно однозначно остальным об этом сообщить);
|
||||
сериализация записи (**Write serialization**): записи в одно и то же место сериализуются (все процессоры видят их в том же порядке).
|
||||
- сериализация записи (**Write serialization**): записи в одно и то же место сериализуются (все процессоры видят их в том же порядке).
|
||||
|
||||
Как обеспечить распространение записи:
|
||||
|
||||
@@ -436,7 +437,7 @@ Thread 1: wait (lock [0903]); //не завершиться, пока не пр
|
||||
|
||||

|
||||
|
||||
*Рис. 28. Процессоры со `Snoopy Cache`, которые подключены к основной памяти.
|
||||
*Рис. 28. Процессоры со `Snoopy Cache`, которые подключены к основной памяти.*
|
||||
|
||||
То есть каждый раз, когда процессор обращается к кэш памяти, он выставляет информацию на общую шину. И все кэши видят когда кто-то на эту шину выставляет информацию.
|
||||
|
||||
@@ -452,7 +453,7 @@ Snoopy кэш отличается от обычного кэша наличие
|
||||
|
||||

|
||||
|
||||
*Рис. 29. Упрощенная форма `Snoopy Cache`.
|
||||
*Рис. 29. Упрощенная форма `Snoopy Cache`.*
|
||||
|
||||
**Snoopy протокол (FSM)** — это конечный автомат, который зависит от того что происходит на шине и обновляет значения состояния.
|
||||
|
||||
@@ -465,14 +466,14 @@ Snoopy кэш отличается от обычного кэша наличие
|
||||
|
||||

|
||||
|
||||
*Рис. 30. Протокол `VI`.
|
||||
*Рис. 30. Протокол `VI`.*
|
||||
|
||||
Когда мы находимся в состоянии `Invalid`, и какое-то ядро запрашивает данные, то происходит `Processor Read` (PrRd). Затем он получает данные в свой кэш и выставляет эти данные как `Valid`.
|
||||
В какой-то момент это ядро видит, что какое-то ядро записало по этому адресу (то есть на шине произошла запись `Bus Write`), тогда оно сразу меняет состояние этой ячейки на `Invalid`, потому что в этот момент времени у него неактуальные данные.
|
||||
|
||||

|
||||
|
||||
*Рис. 31. Основные действия для данного протокола.
|
||||
*Рис. 31. Основные действия для данного протокола.*
|
||||
|
||||
Таким образом, если мы читаем данные, то мы переходим в состояние `Valid`.Если мы видим, что какое-то ядро записывает по этому адресу, то переходим в состояние `Invalid`.
|
||||
|
||||
@@ -480,17 +481,17 @@ Snoopy кэш отличается от обычного кэша наличие
|
||||
|
||||

|
||||
|
||||
*Рис. 32. Пример применения протокола `Valid/Invalid`.
|
||||
*Рис. 32. Пример применения протокола `Valid/Invalid`.*
|
||||
|
||||
1) Допустим, ядро 0 сначала загружаю по адресу `A`. На шине запрашивается чтение, в кэш попадает запись с состоянием `Valid`.
|
||||
2) Затем загружается второе ядро по адресу `A`, теперь там тоже запись `Valid`.
|
||||
3) Теперь происходит запись числа в память, кэш видит это и делает `Invalidate` данных (обнуляет их).
|
||||
4) Когда произойдёт очередной `load`, он увидит, что мы находимся в состоянии `Invalidate`.
|
||||
5) Теперь просто зачитаем обновленные данные.
|
||||
1) Допустим, ядро 0 сначала загружает по адресу `A` число 2. На шине запрашивается чтение, в кэш попадает запись с состоянием `Valid`.
|
||||
2) Затем загружает ядро 1 по адресу `A` число 2, теперь там тоже запись `Valid`.
|
||||
3) Теперь происходит запись числа 3 в память через ядро 0, кэш ядра 1 видит это и делает `Invalidate` данных (обнуляет их).
|
||||
4) Когда произойдёт очередной `load` на ядре 1, он увидит, что данные находятся в состоянии `Invalidate`.
|
||||
5) Теперь просто зачитаем обновленные данные из основной памяти.
|
||||
|
||||

|
||||
|
||||
*Рис. 33. Пример применения протокола `Valid/Invalid` с пояснениями.
|
||||
*Рис. 33. Пример применения протокола `Valid/Invalid` с пояснениями.*
|
||||
|
||||
Проблемы `VI`:
|
||||
|
||||
@@ -501,9 +502,9 @@ Snoopy кэш отличается от обычного кэша наличие
|
||||
|
||||
Каждая строка в каждом кэше поддерживает `MSI` состояния:
|
||||
|
||||
- `I`-кэш не содержит адреса;
|
||||
- `S`-кэш содержит адрес, но он так же может находится в других кэшах, следовательно он может быть только прочитан;
|
||||
- `M`-кэш содержит этот адрес, следовательно он может быть и прочитан и записан — любой другой кэш имевший этот адрес будет признан недействительным (то есть как только запишется по этому адресу все остальные аннулируют информацию об этом).
|
||||
- `I`- кэш не содержит адреса;
|
||||
- `S`- кэш содержит адрес, но он так же может находится в других кэшах, следовательно он может быть только прочитан;
|
||||
- `M`- только этот кэш содержит этот адрес, следовательно он может быть и прочитан и записан — любой другой кэш, имевший этот адрес, будет признан недействительным (то есть как только запишется по этому адресу, все остальные аннулируют информацию об этом).
|
||||
|
||||
### MSI протокол FSM
|
||||
|
||||
@@ -515,22 +516,22 @@ Snoopy кэш отличается от обычного кэша наличие
|
||||
|
||||

|
||||
|
||||
*Рис. 34. `MSI` протокол.
|
||||
*Рис. 34. `MSI` протокол.*
|
||||
|
||||

|
||||
|
||||
*Рис. 35. Основные действия для данного протокола.
|
||||
*Рис. 35. Основные действия для данного протокола.*
|
||||
|
||||
- Недостатки `VI`: каждая запись обновляет основную память, и каждая запись требует широковещательной передачи и слежки.
|
||||
- `MSI`: возможность реализации кэша с обратной записью (`writeback`) + удовлетворяет локальную запись.
|
||||
|
||||
### Оптимизация MSI: состояние E
|
||||
|
||||
Наблюдение: выполнение последовательной чтения-изменения-записи на частных данных является обычным делом.
|
||||
Наблюдение: выполнение последовательностей чтения-изменения-записи на частных данных является обычным делом.
|
||||
|
||||
В чём проблема `MSI`?
|
||||
|
||||
- Две данные транзакции для каждого чтения-изменения-записи частных данных.
|
||||
- Две шинные транзакции для каждого чтения-изменения-записи частных данных.
|
||||
|
||||
Решение: `Е-состояние` (`Exclusive`)
|
||||
|
||||
@@ -548,7 +549,7 @@ Snoopy кэш отличается от обычного кэша наличие
|
||||
|
||||

|
||||
|
||||
*Рис. 36. Протокол `MESI`: усовершенствованный.
|
||||
*Рис. 36. Протокол `MESI`: усовершенствованный.*
|
||||
|
||||
### Когерентность кэш и ложное совместное использование
|
||||
|
||||
@@ -556,15 +557,19 @@ Snoopy кэш отличается от обычного кэша наличие
|
||||
|
||||

|
||||
|
||||
*Рис. 37. Строка кэша.
|
||||
*Рис. 37. Строка кэша.*
|
||||
|
||||
Предположим `P₁` записывает `wordᵢ` и `P₂` записывает `wordₖ` и оба слова имеют один и тот же адрес строки.
|
||||
Что может произойти?
|
||||
|
||||
Из-за того что присутствуют алгоритмы когерентности, будет происходить *пинг-понг*.
|
||||
Из-за того, что присутствуют алгоритмы когерентности, будет происходить *пинг-понг*.
|
||||
Строка может быть недействительной (*пинг-понг*) много раз без необходимости, потому что адреса находятся в одной строке.
|
||||
|
||||
### Основные материалы лекции
|
||||
## Основные материалы лекции
|
||||
|
||||
1. [Ссылка](https://www.youtube.com/watch?v=wr7KuOSPP5I&list=PL0def37HEo5KHPjwK7A5bd4RJGg4djPVf&index=26) на видеозапись лекции
|
||||
2. [Ссылка](https://onedrive.live.com/?authkey=!AIXUSz0MyutL6hs&id=1FF28DEC684C2C56!81692&cid=1FF28DEC684C2C56) на лекцию в формате Power Point
|
||||
|
||||
## Дополнительные материалы к лекции для саморазвития
|
||||
|
||||
1. [Демонстрация протокола MESI](https://www.scss.tcd.ie/jeremy.jones/vivio/caches/MESIHelp.htm)
|
||||
|
@@ -83,7 +83,7 @@
|
||||
|
||||
*Рис. 5. Системы с совмещенным (совместным) адресным пространством.*
|
||||
|
||||
В совместном адресном пространстве есть только один набор адресов. Обращаясь по одним адресам мы попадаем в память, а по другим в управляющие регистры, которые ассоциированы с периферийными устройствами (т.е устройствами ввода-вывода, те которые подключаются к системе и связывают её с внешним миром).
|
||||
В совместном адресном пространстве есть только один набор адресов. Обращаясь по одним адресам мы попадаем в память, а по другим в управляющие регистры, которые ассоциированы с периферийными устройствами (т.е устройствами ввода-вывода, которые подключаются к системе и связывают её с внешним миром).
|
||||
|
||||
Пример системы с совместным адресным пространством приведен на рис. 3.
|
||||
|
||||
@@ -107,9 +107,9 @@
|
||||
|
||||
*Рис. 7. Периферийное устройство.*
|
||||
|
||||
Периферийное устройство как-то взаимодействует с внешней средой. (Например датчик температуры. На преобразователь приходит температура, каким-то образом преобразуется и отправляется в буферную память в виде нолики и единички, которые характеризуют среду.)
|
||||
Периферийное устройство как-то взаимодействует с внешней средой. (Например датчик температуры. На преобразователь приходит температура, каким-то образом преобразуется и отправляется в буферную память в виде ноликов и единичек, которые характеризуют среду.)
|
||||
|
||||
Буферная память и логика управления связана с модулями ввода-вывода условными сигналами (условные так как для связи с модулями ввода-вывода используется 'малый' интерфейс).
|
||||
Буферная память и логика управления связана с модулями ввода-вывода условными сигналами (условные, так как для связи с модулями ввода-вывода используется 'малый' интерфейс).
|
||||
|
||||
Модуль ввода-вывода по данному интерфейсу генерирует различные сигналы управления для периферийного устройства, 'говоря' что нужно делать, и при этом собирает сигналы состояния, чтобы понимать в каком состоянии находится устройство (может быть у него какие-то проблемы или ошибки, закончило ли оно преобразование информации (например можно узнать храниться ли что-то в буферной памяти и можно ли это забирать)).
|
||||
|
||||
@@ -149,13 +149,13 @@
|
||||
|
||||
### Ввод-вывод с прерываниями
|
||||
|
||||
- Плюсы: процессор не ждет периферия сгенерирует новую информации.
|
||||
- Плюсы: процессор не ждет, пока периферия сгенерирует новую информациию.
|
||||
- Минусы: процессору приходится перекидывать информацию в основную память через себя.
|
||||
|
||||
Метод состоит из двух частей:
|
||||
|
||||
- Инициализация прерывания (сообщить модулю ввода-вывода, что мы ждем информацию от какого-то периферийного устройства, после чего разрешаем прерывания от этого модуля ввода-вывода).
|
||||
- Обработка прерывания (процесс просыпается и начинает читать из регистра состояний модули ввода-вывода).
|
||||
- Обработка прерывания (процесс реагирует и начинает читать из регистра состояний модули ввода-вывода).
|
||||
|
||||

|
||||
|
||||
@@ -195,9 +195,9 @@
|
||||
|
||||
DMA могут работать в разных режимах (режимы отличаются тем, насколько долго захватывают шину, то есть останавливают передачу информации между другими блоками системы):
|
||||
|
||||
- Взрывной режим (Burst mod) — контроллер захватывает шину пока не закончит свои дела;
|
||||
- Прозрачный режим — контроллер осуществляет пересылку информации только тогда, когда никто другой не занимает шину;
|
||||
- Делать по одно посылке за раз и отпускать шину на арбитраж.
|
||||
- Взрывной режим (Burst mode) — контроллер захватывает шину пока не закончит свои дела;
|
||||
- Прозрачный режим (Transparent mode) — контроллер осуществляет пересылку информации только тогда, когда никто другой не занимает шину;
|
||||
- Режим перехвата цикла (Cycle stealing mode) - контроллер делает по одной посылке за раз и отпускать шину на арбитраж.
|
||||
|
||||
## Конфигурации ПДП(DMA)
|
||||
|
||||
@@ -217,7 +217,7 @@ DMA могут работать в разных режимах (режимы о
|
||||
|
||||
*Рис. 13. Схема канальной системы ввода вывода.*
|
||||
|
||||
Канал(процессор) ввода-вывода — это контроллер прямого доступа к памяти, выполненный в виде специализированного процессора, которому можно давать сложные запросы и эти запросы будут обрабатываться программно.
|
||||
Канал (процессор) ввода-вывода — это контроллер прямого доступа к памяти, выполненный в виде специализированного процессора, которому можно давать сложные запросы и эти запросы будут обрабатываться программно.
|
||||
|
||||
Канал ввода-вывода имеет свою локальную память. Процессор ввода-вывода обращается за своими программами, которые осуществляют ввод-вывод, в основную память.
|
||||
|
||||
@@ -282,7 +282,7 @@ Shift Register — один из триггеров сдвигового рег
|
||||
|
||||

|
||||
|
||||
*Рис. 20. FSM (Finit State Machine) — конечный автомат (автомат состояний).*
|
||||
*Рис. 20. FSM (Finite State Machine) — конечный автомат (автомат состояний).*
|
||||
|
||||
где DR — Data Register, IR — Instruction Register
|
||||
|
||||
|
@@ -30,7 +30,7 @@
|
||||
- 16-битные. Они используются для более сложных задач, чем 8-битные, где нужна большая точность (например, для управления каким-то двигателем);
|
||||
- 32-битные контроллеры выполняют какие-либо вычисления: решают алгоритмы, проводят анализ сигналов.
|
||||
|
||||
Чтобы проверить подходит ли данный контроллер для устройства можно купить его и самому проверить, а можно купить отладочный комплект (starter kit или учебный комплект).
|
||||
Чтобы проверить, подходит ли данный контроллер для устройства, можно купить его и самому проверить, а можно купить отладочный комплект (starter kit или учебный комплект).
|
||||
|
||||
## Микроконтроллеры на примере PIC
|
||||
|
||||
@@ -187,7 +187,7 @@ ARM7 — это классический представитель ядер д
|
||||
|
||||
В него входят:
|
||||
|
||||
- Регистрового файла;
|
||||
- Регистровый файл;
|
||||
- Множество мультиплексоров, которые выбирают откуда и что пойдет на АЛУ;
|
||||
- АЛУ;
|
||||
- Shifter.
|
||||
@@ -203,7 +203,7 @@ Cortex-A9 — более современное, чем ARM7 и ARM9, ядро.
|
||||
- Кэш команд;
|
||||
- Блок предсказания переходов:
|
||||
- Глобальный буфер истории (Global history register);
|
||||
- Кэш конечных адресов перехода (Branch target buffer). В нем кэшируется адрес, куда будет произведен;
|
||||
- Кэш конечных адресов перехода (Branch target buffer). В нем кэшируется адрес, куда будет произведен переход;
|
||||
- Стек адресов возврата;
|
||||
- Блок переименования регистров(переименование нужно для суперскалярности, устранения конфликтов read-after-write, write-after-write);
|
||||
- Окно диспетчеризации (очередь команд общая и она диспетчеризует куда пойдет следующая инструкция);
|
||||
@@ -219,7 +219,7 @@ Cortex-A9 — более современное, чем ARM7 и ARM9, ядро.
|
||||
|
||||
*Рис. 16. Cortex-A7 и Cortex-A15.*
|
||||
|
||||
При использовании двух ядер, одно может быть мене производительным чем другое, но при этом потреблять меньше энергии и использоваться в сценариях, где не нужна высокая эффективность. Переключения между ядрами позволяет балансировать между затратами на энергию и производительностью.
|
||||
При использовании двух ядер, одно может быть менее производительным чем другое, но при этом потреблять меньше энергии и использоваться в сценариях, где не нужна высокая эффективность. Переключения между ядрами позволяет балансировать между затратами на энергию и производительностью.
|
||||
|
||||
## Основные материалы лекции
|
||||
|
||||
|
@@ -90,7 +90,7 @@
|
||||
- инструкция вычисления результата условия
|
||||
- инструкция прыжка в зависимости от результата условия
|
||||
|
||||
Таким образом, каждый такой переход накладывает на процессор штраф в одну дополнительную инструкцию. При создании новых процессоров уже невозможно избавиться от этого штрафа через изменение существующей ISA x86 (из-за проблем с обратной совместимостью программ), именно поэтому и был создан данный блок[\4\]](https://arxiv.org/pdf/1607.02318.pdf).
|
||||
Таким образом, каждый такой переход накладывает на процессор штраф в одну дополнительную инструкцию. При создании новых процессоров уже невозможно избавиться от этого штрафа через изменение существующей ISA x86 (из-за проблем с обратной совместимостью программ), именно поэтому и был создан данный блок[\[4\]](https://arxiv.org/pdf/1607.02318.pdf).
|
||||
|
||||
Из **Instruction Queue** выходит 5 макро-инструкций (с учётом того, что две из шести инструкций могли быть объединены), и попадают в **5-Way Decode** (**пятисекционный дешифратор**).
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
### Execution Engine
|
||||
|
||||
**ReOrder Buffer** получает инструкции и переименовывает используемые ими регистры, чтобы избежать конфликтов (чтение после записи, попытка записи в один регистр и т.д.). Переименовывание означает использование теневых регистров из **RAT - Register Alias Table** (дополнительных регистров), они необходимы для того, чтобы не нарушать порядок записи в одну ячейку и записать результат в теневой регистр. Из блока **ReOrder Buffer** выходят микро инструкции с известными адресами куда они будут сохранены, переименованными регистрами и т.д. Они попадают в **Scheduler Unified Reservation Station**
|
||||
**ReOrder Buffer** получает инструкции и переименовывает используемые ими регистры, чтобы избежать конфликтов (чтение после записи, попытка записи в один регистр и т.д.). Переименовывание означает использование теневых регистров из **RAT - Register Alias Table** (дополнительных регистров), они необходимы для того, чтобы не нарушать порядок записи в одну ячейку и записать результат в теневой регистр. Из блока **ReOrder Buffer** выходят микро инструкции с известными адресами, куда они будут сохранены, переименованными регистрами и т.д. Они попадают в **Scheduler Unified Reservation Station**
|
||||
|
||||
В **Scheduler Unified Reservation Station (планировщик)** происходит диспетчеризация, то есть микро инструкции раздаются на различные порты. **Планировщик** имеет два файла регистров для целых чисел и векторов. Именно в этих файлах регистров хранятся выходные данные операндов. На выходе каждого порта стоят функциональные блоки (**EUs - Execution Units**). Планировщик удерживает микро-операции, пока они ожидают выполнения. Микро-операция может ожидать операнда, который еще не прибыл (например, выбран из памяти или в настоящее время вычисляется из других микро-операций) или потому, что необходимый ему исполнительный блок занят. Как только микро-операция готова, она отправляется через назначенный порт. Планировщик будет отправлять самую старую готовую инструкцию для выполнения на каждом из восьми портов в каждом цикле. Каждый из этих портов выполняет свои задачи - целочисленное ALU, целочисленное деление, векторные операции и т.п. Некоторые из этих блоков подключены к подсистеме памяти (**Memory Subsystem**).
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
|
||||
## Из чего состоит компьютер?
|
||||
|
||||
Выйдем на уровень системы. Ранее мы рассматривали только Центральный Процессор (ЦП)**. Сейчас же мы разберём из чего в целом состоит компьютер:
|
||||
Выйдем на уровень системы. Ранее мы рассматривали только **Центральный Процессор (ЦП)**. Сейчас же мы разберём из чего в целом состоит компьютер:
|
||||
|
||||
- **Центральный процессор**
|
||||
- **Генератор тактовых импульсов**
|
||||
|
@@ -34,7 +34,7 @@
|
||||
|
||||
### По особенностям назначения
|
||||
|
||||
- **Системы высокой надежности** – к ним относятся различные системы (например банковские), для которых надёжность является один из главных факторов. Такие системы являются избыточными, так как им необходима горячая замена различных ресурсов (элементов памяти, процессоров и т.п.), в случае если что-то выйдет из строя.
|
||||
- **Системы высокой надежности** – к ним относятся различные системы (например банковские), для которых надёжность является одним из главных факторов. Такие системы являются избыточными, так как им необходима горячая замена различных ресурсов (элементов памяти, процессоров и т.п.), в случае если что-то выйдет из строя.
|
||||
|
||||
- **Системы высокопроизводительных вычислений** – название говорит само за себя, это процессоры нацеленные на высокопроизводительные вычисления.
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
- **Системы с конвейерной и векторной обработкой** – похоже на работу **SIMD**, но использующие векторные системы.
|
||||
|
||||
- **SIMD-системы** – такие системы с процессорными элементы, которыми управляет один процессор.
|
||||
- **SIMD-системы** – такие системы с процессорными элементами, которыми управляет один процессор.
|
||||
|
||||
- **MIMD-системы**
|
||||
- Сильносвязнные (с общей памятью) – если программа лежит в общей памяти.
|
||||
@@ -140,7 +140,7 @@
|
||||
|
||||
## Кластерные вычислительные системы (ВС)
|
||||
|
||||
**Кластеры** – объединений гетерогенных структур для решения общей задачи под единым программным обеспечением.
|
||||
**Кластеры** – объединения гетерогенных структур для решения общей задачи под единым программным обеспечением.
|
||||
|
||||
Преимущества кластерных вычислительных систем:
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
|
||||
## Систолические вычислительные системы
|
||||
|
||||
Систолические вычислительные системы – системы класса **SIMD**, основным принципом которых является то, что все данные регулярно и ритмически проходящие через массив, используются многократно. Она состоит из цепочки процессорных элементов, которые поэтапно взаимодействуют между собой. Важное отличие, что здесь не происходит обращение к памяти.
|
||||
Систолические вычислительные системы – системы класса **SIMD**, основным принципом которых является то, что все данные, регулярно и ритмически проходящие через массив, используются многократно. Она состоит из цепочки процессорных элементов, которые поэтапно взаимодействуют между собой. Важное отличие, что здесь не происходит обращение к памяти.
|
||||
|
||||

|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
|
||||
## Системы, управляемые потоками данных
|
||||
|
||||
Мы привыкли, что обычно машина управляется потоком команд — пришла команда и она выполняется. Но сейчас мы рассмотрим другой подход.
|
||||
Мы привыкли, что обычно машина управляется потоком команд — пришла команда, и она выполняется. Но сейчас мы рассмотрим другой подход.
|
||||
|
||||
Идея **систем, управляемых потоком данных** заключается в том, что не новая инструкция порождает новые вычисления, а готовые данные порождают новые вычисления.
|
||||
|
||||
@@ -218,7 +218,7 @@
|
||||
|
||||
*Рис. 19. Цикл.*
|
||||
|
||||
Пример реализации такой системы представлен на рисунке 20. Она состоит из группы коммутаторов, блоков памяти и процессорных элементов. Одно прохождение по этому кругов данных соответствует одной линии, которая была представлена на рисунке 18.
|
||||
Пример реализации такой системы представлен на рисунке 20. Она состоит из группы коммутаторов, блоков памяти и процессорных элементов. Одно прохождение по этому кругов данных соответствует одной горизонтальной линии, которая была представлена на рисунке 18.
|
||||
|
||||

|
||||
|
||||
|
Reference in New Issue
Block a user