From abd333c9bd3134345ede358b8ad335f6acac701b Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sat, 12 Oct 2024 12:38:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D1=8D=D1=88=20=D0=BF=D1=80=D0=BE=D1=86?= =?UTF-8?q?=D0=B5=D1=81=D1=81=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/algorithm/Adaptive Replacement Cache.md | 6 +-- dev/algorithm/Last Frequently Used.md | 4 +- dev/algorithm/Least Recently Used.md | 4 +- dev/algorithm/Most Recently Used.md | 4 +- ...мы вытеснения.md => Алгоритм вытеснения кэша.md} | 10 +++- dev/algorithm/Псевдо-LRU.md | 4 +- dev/architecture/highload/Инвалидация кэша.md | 4 +- dev/fundamental/Cache coherence.md | 34 ++++++++++++++ dev/fundamental/MESI.md | 31 ++++++++++++ dev/fundamental/Non-Uniform Memory Access.md | 30 ++++++++++++ dev/fundamental/Атомарная операция.md | 28 +++++++++++ dev/fundamental/Кэш процессора.md | 47 +++++++++++++++++++ dev/fundamental/Принцип локальности.md | 1 + dev/fundamental/Центральный процессор.md | 5 +- meta/zero/00 Алгоритм.md | 2 +- 15 files changed, 196 insertions(+), 18 deletions(-) rename dev/algorithm/{Алгоритмы вытеснения.md => Алгоритм вытеснения кэша.md} (56%) create mode 100644 dev/fundamental/Cache coherence.md create mode 100644 dev/fundamental/MESI.md create mode 100644 dev/fundamental/Non-Uniform Memory Access.md create mode 100644 dev/fundamental/Атомарная операция.md create mode 100644 dev/fundamental/Кэш процессора.md diff --git a/dev/algorithm/Adaptive Replacement Cache.md b/dev/algorithm/Adaptive Replacement Cache.md index ec41c3fa..dcf3a9f4 100644 --- a/dev/algorithm/Adaptive Replacement Cache.md +++ b/dev/algorithm/Adaptive Replacement Cache.md @@ -7,8 +7,8 @@ date: zero-link: - "[[../../meta/zero/00 Алгоритм|00 Алгоритм]]" parents: - - "[[Алгоритмы вытеснения]]" -linked: + - "[[Алгоритм вытеснения кэша]]" +linked: --- Объединяет преимущества: [Last Frequently Used](Last%20Frequently%20Used.md) и [Least Recently Used](Least%20Recently%20Used.md). @@ -18,7 +18,7 @@ linked: *** ## Мета информация **Область**:: [[../../meta/zero/00 Алгоритм|00 Алгоритм]] -**Родитель**:: [[Алгоритмы вытеснения]] +**Родитель**:: [[Алгоритм вытеснения кэша]] **Источник**:: **Автор**:: **Создана**:: [[2024-06-17]] diff --git a/dev/algorithm/Last Frequently Used.md b/dev/algorithm/Last Frequently Used.md index bf8ed3bb..79687c35 100644 --- a/dev/algorithm/Last Frequently Used.md +++ b/dev/algorithm/Last Frequently Used.md @@ -8,7 +8,7 @@ date: zero-link: - "[[../../meta/zero/00 Алгоритм|00 Алгоритм]]" parents: - - "[[Алгоритмы вытеснения]]" + - "[[Алгоритм вытеснения кэша]]" linked: - "[[Most Recently Used]]" --- @@ -16,7 +16,7 @@ linked: *** ## Мета информация **Область**:: [[../../meta/zero/00 Алгоритм|00 Алгоритм]] -**Родитель**:: [[Алгоритмы вытеснения]] +**Родитель**:: [[Алгоритм вытеснения кэша]] **Источник**:: **Автор**:: **Создана**:: [[2024-06-17]] diff --git a/dev/algorithm/Least Recently Used.md b/dev/algorithm/Least Recently Used.md index ccf55aeb..83b283e9 100644 --- a/dev/algorithm/Least Recently Used.md +++ b/dev/algorithm/Least Recently Used.md @@ -8,7 +8,7 @@ date: zero-link: - "[[../../meta/zero/00 Алгоритм|00 Алгоритм]]" parents: - - "[[Алгоритмы вытеснения]]" + - "[[Алгоритм вытеснения кэша]]" linked: - "[[Most Recently Used]]" - "[[Псевдо-LRU]]" @@ -34,7 +34,7 @@ Least Recently Used (LRU) — это алгоритм управления кэ *** ## Мета информация **Область**:: [[../../meta/zero/00 Алгоритм|00 Алгоритм]] -**Родитель**:: [[Алгоритмы вытеснения]] +**Родитель**:: [[Алгоритм вытеснения кэша]] **Источник**:: **Автор**:: **Создана**:: [[2024-05-24]] diff --git a/dev/algorithm/Most Recently Used.md b/dev/algorithm/Most Recently Used.md index 35445ecf..78fd7c69 100644 --- a/dev/algorithm/Most Recently Used.md +++ b/dev/algorithm/Most Recently Used.md @@ -8,7 +8,7 @@ date: zero-link: - "[[../../meta/zero/00 Алгоритм|00 Алгоритм]]" parents: - - "[[Алгоритмы вытеснения]]" + - "[[Алгоритм вытеснения кэша]]" linked: - "[[Least Recently Used]]" --- @@ -24,7 +24,7 @@ linked: *** ## Мета информация **Область**:: [[../../meta/zero/00 Алгоритм|00 Алгоритм]] -**Родитель**:: [[Алгоритмы вытеснения]] +**Родитель**:: [[Алгоритм вытеснения кэша]] **Источник**:: **Автор**:: **Создана**:: [[2024-06-17]] diff --git a/dev/algorithm/Алгоритмы вытеснения.md b/dev/algorithm/Алгоритм вытеснения кэша.md similarity index 56% rename from dev/algorithm/Алгоритмы вытеснения.md rename to dev/algorithm/Алгоритм вытеснения кэша.md index 703455bc..b5d1d185 100644 --- a/dev/algorithm/Алгоритмы вытеснения.md +++ b/dev/algorithm/Алгоритм вытеснения кэша.md @@ -1,5 +1,8 @@ --- -aliases: +aliases: + - алгоритмы замещения кэша + - Алгоритмы вытеснения + - алгоритмов замещения tags: - maturity/🌱 date: 2024-09-11 @@ -9,12 +12,15 @@ parents: - "[[../architecture/highload/Инвалидация кэша|Инвалидация кэша]]" linked: --- +Алгоритмы вытеснения кэша определяют, какие данные должны быть удалены из кэша, когда он заполняется. + - Алгоритм Белади. Несуществующий идеальный алгоритм. Храним только нужную информацию, не нужную не храним. -- [Least Recently Used](Least%20Recently%20Used.md) +- [Least Recently Used](Least%20Recently%20Used.md). Один из наиболее популярных. Отслеживает, какие данные использовались недавно, и удаляет те, которые не использовались дольше всего - [Псевдо-LRU](Псевдо-LRU.md) - [Most Recently Used](Most%20Recently%20Used.md) - [Last Frequently Used](Last%20Frequently%20Used.md) - [Adaptive Replacement Cache](Adaptive%20Replacement%20Cache.md) +- **FIFO (First In, First Out)** работает по принципу "первым пришел — первым ушел", удаляя данные в том порядке, в котором они были загружены в кэш. Хотя этот алгоритм проще, он не всегда эффективен, так как не учитывает, что старые данные могут по-прежнему быть востребованными. *** ## Мета информация **Область**:: [[../../meta/zero/00 Алгоритм|00 Алгоритм]] diff --git a/dev/algorithm/Псевдо-LRU.md b/dev/algorithm/Псевдо-LRU.md index b8802e38..9255f603 100644 --- a/dev/algorithm/Псевдо-LRU.md +++ b/dev/algorithm/Псевдо-LRU.md @@ -7,7 +7,7 @@ date: zero-link: - "[[../../meta/zero/00 Алгоритм|00 Алгоритм]]" parents: - - "[[Алгоритмы вытеснения]]" + - "[[Алгоритм вытеснения кэша]]" linked: - "[[Least Recently Used]]" --- @@ -21,7 +21,7 @@ linked: *** ## Мета информация **Область**:: [[../../meta/zero/00 Алгоритм|00 Алгоритм]] -**Родитель**:: [[Алгоритмы вытеснения]] +**Родитель**:: [[Алгоритм вытеснения кэша]] **Источник**:: **Автор**:: **Создана**:: [[2024-06-18]] diff --git a/dev/architecture/highload/Инвалидация кэша.md b/dev/architecture/highload/Инвалидация кэша.md index d27cfc80..20893592 100644 --- a/dev/architecture/highload/Инвалидация кэша.md +++ b/dev/architecture/highload/Инвалидация кэша.md @@ -20,7 +20,7 @@ linked: - При большом TTL данные могут быть не консистентны - Инвалидация по событию - Опасно из-за риска мгновенной инвалидации и сопутствующей [[Перестройка кэша|перестройки кэша]] -- Использование [[../../algorithm/Алгоритмы вытеснения|алгоритмов вытеснения]] +- Использование [[../../algorithm/Алгоритм вытеснения кэша|алгоритмов вытеснения]] Дополнительно для работы со статическими файлами можно отменить [[../Fingerprint|Fingerprint]]. @@ -59,7 +59,7 @@ return value; ### Дочерние заметки -- [[Алгоритмы вытеснения]] - [[Fingerprint]] +- [[Алгоритм вытеснения кэша]] diff --git a/dev/fundamental/Cache coherence.md b/dev/fundamental/Cache coherence.md new file mode 100644 index 00000000..5fdb7478 --- /dev/null +++ b/dev/fundamental/Cache coherence.md @@ -0,0 +1,34 @@ +--- +aliases: + - кэш-кохерентность + - кэш-кохерентности + - кэш-кохерентностью +tags: + - maturity/🌱 +date: 2024-10-12 +zero-link: +parents: +linked: +--- +Когда [[Центральный процессор|процессор]] имеет несколько [[Ядро процессора|ядер]], каждое из них может иметь собственный [[Кэш процессора|кэш процессора]], что приводит к проблеме кэш-кохерентности. Она возникает, когда одно ядро изменяет данные, находящиеся в его кэше, а другие ядра продолжают использовать устаревшую версию этих данных из своего кэша. В результате возникает рассинхронизация, что может привести к некорректной работе программ, особенно в многозадачных системах. + +Для решения этой проблемы используются протоколы кэш-кохерентности: +- [[MESI]]. Один из наиболее распространенных. +- MOESI +- MESIF +*** +## Мета информация +**Область**:: +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-10-12]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + +- [[MESI]] + + diff --git a/dev/fundamental/MESI.md b/dev/fundamental/MESI.md new file mode 100644 index 00000000..349c4eeb --- /dev/null +++ b/dev/fundamental/MESI.md @@ -0,0 +1,31 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-10-12 +zero-link: +parents: +linked: +--- +Название MESI происходит от четырех состояний, в которых могут находиться данные в [[Кэш процессора|кэше процессора]]: + +- **M (Modified)** — данные изменены в кэше ядра и не синхронизированы с оперативной памятью. +- **E (Exclusive)** — данные находятся только в кэше этого ядра и соответствуют содержимому памяти. +- **S (Shared)** — данные разделены между несколькими ядрами, и их копии синхронизированы с памятью. +- **I (Invalid)** — данные в кэше недействительны, потому что они были изменены другим ядром или сброшены. + +==Когда одно ядро изменяет данные в своем кэше, протокол MESI уведомляет другие ядра о том, что их копии этих данных больше не актуальны==. Это позволяет поддерживать согласованность данных между ядрами и предотвращает возможные ошибки. + +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Архитектура ЭВМ|00 Архитектура ЭВМ]] +**Родитель**:: [[Cache coherence]] +**Источник**:: +**Создана**:: [[2024-10-12]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/fundamental/Non-Uniform Memory Access.md b/dev/fundamental/Non-Uniform Memory Access.md new file mode 100644 index 00000000..52c69e9e --- /dev/null +++ b/dev/fundamental/Non-Uniform Memory Access.md @@ -0,0 +1,30 @@ +--- +aliases: + - NUMA +tags: + - maturity/🌱 +date: 2024-10-12 +zero-link: +parents: +linked: +--- +**NUMA (Non-Uniform Memory Access)** — это архитектура памяти, используемая в многопроцессорных системах, где время доступа к оперативной памяти зависит от физического расположения [[Центральный процессор|процессора]] и модулей памяти. + +В традиционной архитектуре **UMA (Uniform Memory Access)**, время доступа ко всей памяти одинаково для всех процессоров, что ограничивает масштабируемость. В NUMA же каждый процессор имеет собственную локальную память, к которой он получает доступ быстрее, чем к памяти, расположенной у другого процессора. + +NUMA может существенно влиять на работу [[Кэш процессора|кэш-памяти]]. Поскольку кэш каждого процессора хранит данные, связанные с его локальной памятью, доступ к удаленной памяти требует дополнительной синхронизации и согласования данных. В многоядерных системах это приводит к более сложным задачам по управлению [[Cache coherence|кэш-кохерентностью]], чтобы предотвратить несогласованность данных между ядрами, особенно при частом доступе к удаленным данным. + +В системах с NUMA также важно правильно распределять задачи между ядрами, чтобы минимизировать обращения к удаленной памяти и максимально использовать локальную память и кэш. Программисты могут оптимизировать производительность таких систем с помощью NUMA-aware алгоритмов, распределяя данные и задачи таким образом, чтобы кэш эффективно использовался в пределах каждого процессора и минимизировался доступ к удаленной памяти. +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Архитектура ЭВМ|00 Архитектура ЭВМ]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-10-12]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/fundamental/Атомарная операция.md b/dev/fundamental/Атомарная операция.md new file mode 100644 index 00000000..3035d4ba --- /dev/null +++ b/dev/fundamental/Атомарная операция.md @@ -0,0 +1,28 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-10-12 +zero-link: +parents: +linked: +--- +Операция атомарная, если невозможно наблюдать частичный результат ее выполнения. Любой наблюдатель видит либо состояние системы до атомарной операции, либо после + +В Java: +- Запись в поле типа boolean, byte, short, char, int, Object всегда атомарна +- Запись в поле типа long/double: атомарна запись старших и младших 32 бит +- Запись в поле типа long/double, объявленное volatile, атомарна +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-10-12]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/fundamental/Кэш процессора.md b/dev/fundamental/Кэш процессора.md new file mode 100644 index 00000000..0fd6213c --- /dev/null +++ b/dev/fundamental/Кэш процессора.md @@ -0,0 +1,47 @@ +--- +aliases: + - кэше процессора + - кэш-памяти + - кэш-память +tags: + - maturity/🌱 +date: 2024-10-12 +zero-link: +parents: +linked: +--- +Кэш — это небольшая и очень быстрая память, встроенная в [[Центральный процессор|процессор]], предназначенная для временного хранения данных, к которым процессор обращается чаще всего. Основная задача кэша — ускорение работы процессора за счет минимизации времени доступа к этим данным. + +Процессор работает значительно быстрее, чем [[../../../../knowledge/dev/pc/Оперативная память|оперативная память]] (RAM), поэтому при прямом обращении к оперативной памяти возникали бы значительные задержки. Кэш решает эту проблему, храня наиболее востребованные данные и инструкции ближе к процессору. Когда процессор выполняет операцию, он сначала проверяет кэш. ==Если нужная информация находится в кэше, она загружается практически мгновенно==. В противном случае процессору приходится обращаться к более медленной оперативной памяти, что увеличивает время ожидания. + +Кэш-память процессора делится на два типа: кэш для данных и кэш для инструкций. Такое разделение позволяет повысить производительность процессора за счет оптимизации доступа к различным видам информации. + +Кэш инструкций хранит машинный код программ, который процессор должен выполнить, а кэш данных содержит фактические данные, с которыми работают программы. Это разделение позволяет процессору одновременно загружать инструкции для выполнения и данные для обработки, минимизируя задержки. + +Когда кэш заполняется, процессор должен решить, какие данные удалить, чтобы освободить место для новых. Эта задача решается с помощью специальных алгоритмов замещения. + +Когда процессор имеет несколько ядер, каждое из них может иметь собственный кэш, что приводит к проблеме [[Cache coherence|кэш-кохерентности]]. +## Уровни кэша +Кэш процессора разделен на несколько уровней: L1, L2 и L3. Каждый уровень отличается по объему, скорости и месту в архитектуре процессора. + +**L1-кэш** — самый быстрый и ближайший к ядру процессора уровень кэша. Он имеет небольшой объем, обычно от нескольких десятков до сотни килобайт, и разделяется на две части: для инструкций и для данных. Это позволяет ускорять как выполнение команд, так и работу с информацией. + +**L2-кэш** находится на следующем уровне и имеет больший объем, чем L1, но его скорость ниже. Обычно L2-кэш выделяется для каждого ядра процессора отдельно, что позволяет ядрам работать автономно и быстро получать доступ к своим данным. + +**L3-кэш** — самый медленный, но и самый большой по объему уровень кэша. Он общий для всех ядер процессора и позволяет ядрам обмениваться данными через этот уровень. Несмотря на то что L3 медленнее, чем L1 и L2, он все равно значительно быстрее оперативной памяти. + +## Кэш-линия +Кэш-линия — это минимальная единица данных, с которой работает кэш-память. Когда процессор загружает данные из оперативной памяти в кэш, он перемещает не один байт, а целую кэш-линию, которая содержит группу смежных данных. Использование кэш-линий позволяет более эффективно задействовать кэш, так как высока вероятность того, что процессору понадобятся соседние данные, что объясняется [[Принцип локальности|принципом локальности]]. +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Архитектура ЭВМ|00 Архитектура ЭВМ]] +**Родитель**:: [[Центральный процессор]] +**Источник**:: +**Создана**:: [[2024-10-12]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/fundamental/Принцип локальности.md b/dev/fundamental/Принцип локальности.md index 2dac4f80..d397ea96 100644 --- a/dev/fundamental/Принцип локальности.md +++ b/dev/fundamental/Принцип локальности.md @@ -1,6 +1,7 @@ --- aliases: - принципе локальности + - принципом локальности tags: - maturity/🌱 date: diff --git a/dev/fundamental/Центральный процессор.md b/dev/fundamental/Центральный процессор.md index 261454eb..1b9c77c6 100644 --- a/dev/fundamental/Центральный процессор.md +++ b/dev/fundamental/Центральный процессор.md @@ -7,6 +7,7 @@ aliases: - процессору - процессоре - процессора + - процессор tags: - maturity/🌱 date: @@ -32,7 +33,7 @@ linked: Первые процессоры могли одновременно выполнять только одну программу. В какой-то момент появились процессоры, которые содержат несколько [процессорных ядер](Ядро%20процессора.md). Каждое процессорное ядро может работать независимо от другого, что увеличивает производительность процессора, если ПО поддерживает работу в многоядерной системе. *** ## Мета информация -**Область**:: [[../../meta/zero/00 Архитектура ЭВМ|Архитектура ЭВМ]] +**Область**:: [[../../meta/zero/00 Архитектура ЭВМ|00 Архитектура ЭВМ]] **Родитель**:: **Источник**:: **Автор**:: @@ -42,6 +43,6 @@ linked: ### Дочерние заметки -- [[Ядро процессора]] - [[Многозадачность]] +- [[Ядро процессора]] diff --git a/meta/zero/00 Алгоритм.md b/meta/zero/00 Алгоритм.md index 5b4448ad..65f26606 100644 --- a/meta/zero/00 Алгоритм.md +++ b/meta/zero/00 Алгоритм.md @@ -5,5 +5,5 @@ parents: - "[[00 Разработка]]" title: Алгоритм --- -- [[../../dev/algorithm/Алгоритмы вытеснения|Алгоритмы вытеснения]] +- [[../../dev/algorithm/Алгоритм вытеснения кэша|Алгоритмы вытеснения]] - [Бинарный поиск на Java](../../dev/java/Бинарный%20поиск%20на%20Java.md) \ No newline at end of file