Кэш процессора
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Struchkov Mark 2024-10-12 12:38:43 +03:00
parent 756ef88701
commit abd333c9bd
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
15 changed files with 196 additions and 18 deletions

View File

@ -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]]

View File

@ -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]]

View File

@ -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]]

View File

@ -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]]

View File

@ -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 Алгоритм]]

View File

@ -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]]

View File

@ -20,7 +20,7 @@ linked:
- При большом TTL данные могут быть не консистентны
- Инвалидация по событию
- Опасно из-за риска мгновенной инвалидации и сопутствующей [[Перестройка кэша|перестройки кэша]]
- Использование [[../../algorithm/Алгоритмы вытеснения|алгоритмов вытеснения]]
- Использование [[../../algorithm/Алгоритм вытеснения кэша|алгоритмов вытеснения]]
Дополнительно для работы со статическими файлами можно отменить [[../Fingerprint|Fingerprint]].
@ -59,7 +59,7 @@ return value;
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[Алгоритмы вытеснения]]
- [[Fingerprint]]
- [[Алгоритм вытеснения кэша]]
<!-- SerializedQuery END -->

View File

@ -0,0 +1,34 @@
---
aliases:
- кэш-кохерентность
- кэш-кохерентности
- кэш-кохерентностью
tags:
- maturity/🌱
date: 2024-10-12
zero-link:
parents:
linked:
---
Когда [[Центральный процессор|процессор]] имеет несколько [[Ядро процессора|ядер]], каждое из них может иметь собственный [[Кэш процессора|кэш процессора]], что приводит к проблеме кэш-кохерентности. Она возникает, когда одно ядро изменяет данные, находящиеся в его кэше, а другие ядра продолжают использовать устаревшую версию этих данных из своего кэша. В результате возникает рассинхронизация, что может привести к некорректной работе программ, особенно в многозадачных системах.
Для решения этой проблемы используются протоколы кэш-кохерентности:
- [[MESI]]. Один из наиболее распространенных.
- MOESI
- MESIF
***
## Мета информация
**Область**::
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-12]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[MESI]]
<!-- SerializedQuery END -->

31
dev/fundamental/MESI.md Normal file
View File

@ -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]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -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]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -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]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -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]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -1,6 +1,7 @@
---
aliases:
- принципе локальности
- принципом локальности
tags:
- maturity/🌱
date:

View File

@ -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:
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[Ядро процессора]]
- [[Многозадачность]]
- [[Ядро процессора]]
<!-- SerializedQuery END -->

View File

@ -5,5 +5,5 @@ parents:
- "[[00 Разработка]]"
title: Алгоритм
---
- [[../../dev/algorithm/Алгоритмы вытеснения|Алгоритмы вытеснения]]
- [[../../dev/algorithm/Алгоритм вытеснения кэша|Алгоритмы вытеснения]]
- [Бинарный поиск на Java](../../dev/java/Бинарный%20поиск%20на%20Java.md)