Местность ссылки, как упоминается в статье в Википедии, - это наблюдение, что когда к некоторым данным обращаются (на диске, в памяти и т. Д.), К другим данным рядом с этим местоположением также часто обращаются. Это наблюдение имеет смысл, поскольку разработчики, как правило, группируют сходные данные. Поскольку данные связаны, они часто обрабатываются вместе. В частности, это называется пространственной локализацией.
В качестве слабого примера представьте, что вы вычисляете сумму массива или умножаете матрицу. Данные, представляющие массив или матрицу, обычно хранятся в непрерывных ячейках памяти, и для этого примера, как только вы получите доступ к одному конкретному местоположению в памяти, вы также получите доступ к другим близким к нему.
Компьютерная архитектура учитывает местность ссылок. Операционные системы имеют понятие «страниц», которые представляют собой (примерно) 4 КБ порции данных, которые можно выгружать и выгружать по отдельности (перемещать между физической памятью и диском). Когда вы дотрагиваетесь до некоторой памяти, которая не является резидентной (не физически в ОЗУ), ОС переносит всю страницу данных с диска в память. Причиной этого является местность: вы, скорее всего, будете касаться других данных вокруг того, что вы только что затронули.
Кроме того, в процессорах есть концепция кеширования. Например, ЦП может иметь кэш L1 (уровень 1), который на самом деле является просто большим блоком данных на ЦП, к которым ЦП может обращаться быстрее, чем ОЗУ. Если значение находится в кэше L1, ЦП будет использовать его вместо выхода в ОЗУ. Следуя принципу локальности ссылок, когда ЦП получает доступ к некоторому значению в основной памяти, он переносит это значение и все значения рядом с ним в кэш L1. Этот набор значений известен как строка кэша. Строки кэша различаются по размеру, но дело в том, что при доступе к первому значению массива ЦП может потребоваться получить его из ОЗУ, но последующий доступ (близость) будет быстрее, поскольку ЦП принес весь пакет значения в кэш L1 при первом доступе.
Итак, чтобы ответить на ваш вопрос: если вы представляете синхронный процесс, вычисляющий сумму очень большого массива, он будет касаться областей памяти по порядку один за другим. В этом случае ваша местность хорошая. Однако в асинхронном случае у вас может быть n
потоков, каждый из которых берет часть массива (размером 1/n
) и вычисляет подсумму. Каждый поток затрагивает потенциально очень разные места в памяти (так как массив большой), и поскольку каждый поток может быть включен и выключен, фактический шаблон доступа к данным с точки зрения ОС или ЦП является плохим. Кэш-память L1 в ЦП является конечной, поэтому, если поток 1 вводит строку кэша (из-за доступа), это может привести к удалению строки кэша потока 2. Затем, когда поток 2 переходит к доступу к значению своего массива, он должен перейдите к ОЗУ, которое снова введет в свою строку кеша и потенциально изгонит строку кеша потока 1 и так далее. В зависимости от системных ресурсов и использования в целом, этот шаблон может происходить и на уровне ОС / страницы.