В чем разница между безопасным / небезопасным dict itereator и его реализацией? - PullRequest
1 голос
/ 10 февраля 2012

Я только что прочитал файл исходного кода dict.c реализации dict.Я получил буквальное различие между безопасным / небезопасным итератором dict, но пока не понимаю, зачем вводить новую концепцию небезопасного итератора.

Google говорит, что «новый итератор может выполнять менее бесполезную COW». Но я не могу понять, как это работает , поэтому обратитесь за помощью.

Благодарим за любую помощь, объяснение с примером будет лучше.

1 Ответ

1 голос
/ 10 февраля 2012

Целью безопасных / небезопасных итераторов является четкое определение того, происходит ли итерация в изменяемой или неизменной структуре данных.В реализации dict он предотвращает выполнение некоторых операций (например, перефразирование) со словарем, когда происходит безопасная итерация.

Теперь у безопасных итераторов есть обратная сторона: они должны увеличивать счетчик ссылок всам итеративный объект, так что объект знает, происходит ли безопасная итерация или нет.

Redis использует механизм копирования-записи-записи ОС (COW) для обработки фонового дампа.Когда происходит дамп, вызывается fork для клонирования экземпляра Redis и создания второго процесса.Этот процесс будет перебирать все данные, чтобы сериализовать все в файл дампа.Благодаря механизму COW большинство страниц совместно используются двумя процессами, поэтому Redis не занимает вдвое больше оперативной памяти при сбрасывании данных.

Теперь страницы доступны только в том случае, если они доступны только для чтения.Режим.Когда один из двух процессов записывает что-то в память, соответствующая страница автоматически дублируется ОС.

Если для итераций по всем словарям систематически использовался безопасный итератор, большое количество страниц дублировалось бы (из-заобновления счетчика ссылок).В клонированном процессе данные считаются неизменными, поэтому использование небезопасного итератора имеет смысл уменьшить активность COW.Это особенно актуально, когда в Redis много объектов set / hash / zset.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...