The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Релиз языка программирования PHP 7.3"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Подсказка: Ссылки "<<" и ">>" открывают первые и последние 10 сообщений.
. "Релиз языка программирования PHP 7.3" +/
Сообщение от Онаним (?), 08-Дек-18, 01:09 
Для обхода конкуренции с ридерами и предотвращения рейсов сделана хитрость: лок-файл отдельный, и никогда не лочится как LOCK_SH, в отличие от файла кэша.

Как живут писатели:

Для проверки кэша мы лочим сам файл кэша (.info) как LOCK_SH, но только на время чтения-валидации. Зачем - чуть ниже. Если кэш не валиден, то мы берём LOCK_EX на локфайл (.lock). Как только мы взяли LOCK_EX для локфайла - никто больше, кроме нас, права обновлять кэш не имеет. Другие считавшие невалидный кэш и возжелавшие его обновить - встанут в очередь на пресловутый LOCK_EX для локфайла.

Для чего вторая проверка. Мы может быть таким же возжелавшим в очереди. То есть кто-то до нас взял LOCK_EX на локфайл и обновляет кэш, а мы его ждём. Как только обновляющий закончит работу - мы (ну или кто-то до нас) сможем взять LOCK_EX на локфайл. Взяв LOCK_EX на локфайл, мы проверяем кэш на предмет того, а не стал ли он валидным (не было ли кого до нас с LOCK_EX на локфайл). Если кэш валиден - значит его обновили, и мы сразу же сбрасываем LOCK_EX, потому что это contention point, и нас таких стоящих в очереди на LOCK_EX только чтобы убедиться, что кэш уже обновили, может быть много. После чего возвращаем содержимое кэша вызывающей стороне, работа закончена.

Если же кэш валидным не стал, значит мы были первым желающим его обновить. Не отпуская локфайла, гоняем процесс обновления - новые читатели превращаются в желающих обновить кэш и встают в очередь за LOCK_EX. Впрочем, обновлять они ничего не будут, как раз из-за второй проверки. Закончив процесс обновления, лочим сам кэш на LOCK_EX - это второй contention point, тут мы конкурируем с теми, кто валидирует кэш прямо сейчас. Пишем, отпускаем LOCK_EX на кэш, давая возможность новым читателям уже не вставать в очередь на LOCK_EX для локфайла, далее сразу же отпускаем LOCK_EX на локфайл, давая возможность уже вставшим в очередь на локфайл убедиться, что мы кэш обновили, и благополучно отвалить, не обновляясь.

---

Как живут читатели:

Первый - валидация кэша. Когда мы валидируем и читаем кэш - мы лочим сам файл кэша на LOCK_SH. Для чего: чтобы не считать полузаписанные данные, если активен писатель. Желающий записать кэш писатель контендится с валидирующими читателями, ему нужен LOCK_EX на файл кэша.

Второй - мы не боремся ни с другими читателями (потому что LOCK_SH), ни с уже вставшими в очередь на LOCK_EX на локфайл для обновления кэша. Если первая валидация не удалась - мы сами превращаемся в таковых вставших в очередь. Если же мы попали в момент записи кэша писателем - сразу же, как только писатель закончит и отдаст LOCK_EX - мы считаем уже валидный кэш. Это уменьшает общий contention: вставшие в очередь желающие LOCK_EX на локфайл ещё будут продолжать драться между собой за этот лок, только чтобы свалидировать кэш во второй раз и отвалить с новым содержимым, однако новые читатели в очередь вставать перестанут сразу после записи кэша писателем.

---

Если сомневаетесь - можете даже диаграмму порисовать :), она тривиальна.

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Релиз языка программирования PHP 7.3, opennews, 06-Дек-18, 22:17  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру