6
Страница в кеше
2
число
обращений
+1
хеш-таблица
буфер
закреплен
Рассмотрим случай, когда необходимая страница находится в кеше.
Буферный кеш и хеш-таблица находятся в общей памяти, и доступ
к ним есть у всех процессов сервера. Поэтому одновременный,
конкурентный доступ к этим структурам необходимо упорядочивать.
Вычислив хеш-код, процесс блокирует необходимый фрагмент хеш-
таблицы в разделяемом режиме (только для чтения) с помощью так
называемой «легкой блокировки», и уже затем находит буфер,
содержащий нужную страницу.
Сервер управляет блокировками данных в разделяемой памяти
полностью автоматически. Разработчики PostgreSQL прилагают много
усилий к тому, чтобы эти блокировки работали эффективно. Например,
чтобы не блокировать всю хеш-таблицу сразу, она разделена на
несколько (128) фрагментов, каждый из которых может работать
независимо от других. Тем не менее надо понимать, что, хотя доступ
к кешу быстрее, чем к диску, он все же не бесплатен.
Дальше процесс «закрепляет» буфер, увеличивая счетчик pin count
в заголовке страницы. Пока буфер закреплен (значение pin count
больше нуля), считается, что буфер используется и его содержимое
не должно «радикально» измениться. Например, в странице может
появиться новая версия строки — обычно это не помешает другим
процессам благодаря многоверсионности и правилам видимости.
Но в закрепленный буфер не может быть прочитана другая страница.
Процесс также увеличивает счетчик обращений к странице (usage
count). Счетчик используется для того, чтобы понимать, какие страницы
используются часто, а какие нет.