2012-02-10 12 views
1

私はちょうどdict実装の 'dict.c'ソースコードファイルを読んでいます。私は安全/非安全なディクテーション反復子の間に文字通りの違いを持っ​​ていますが、なぜ非安全イテレータの新しいコンセプトを導入するのかという意図を理解していません。redisのdict実装で安全/非安全dict itereatorの違いは何ですか?

は、新しいイテレータがあまり役に立たないCOWを行うことができる」ことをGoogleが言われています。 しかし、私はそれがどのように動作するのか分かりません。ですので、ここで助けを求めてください。

何か助けていただければ幸いです。

答えて

1

安全/非安全なイテレータの目的は明確に繰り返しが可変または不変のデータ構造で発生するかどうかを確立することです。ディクテーションの実装では、安全な反復が進行中のときに、辞書上で実行されるいくつかの操作(再ハッシングなど)を防止します。

今、安全なイテレータは欠点を持っている:彼らは、オブジェクトが安全で反復が発生しているか否かを知っているように、反復オブジェクト自体に参照カウンタをインクリメントする必要があります。

Redisのは、バックグラウンド・ダンプに対処するためのOSコピー・オン・ライト(COW)メカニズムを活用しています。ダンプが発生すると、Redisインスタンスを複製して2番目のプロセスを作成するためにforkが呼び出されます。このプロセスはデータ全体を繰り返し処理し、すべてをダンプファイルにシリアライズします。 COWメカニズムのおかげで、ほとんどのページは2つのプロセスで共有されるため、Redisはデータをダンプしている間に2倍のRAMを消費しません。これらは読み取り専用モードでアクセスしている場合

は今のページがのみ共有されています。 2つのプロセスのいずれかがメモリに何かを書き込むと、対応するページがOSによって自動的に複製されます。

安全なイテレータを体系的にすべての辞書に反復するために使用された場合は、ページの多くは、(理由は参照カウンタの更新の)複製されます。クローンされたプロセスでは、データは不変であるとみなされるため、安全でないイテレーターを使用するとCOW活動を減らすことができます。これは、Redisに多くのset/hash/zsetオブジェクトがある場合に最も適切です。

関連する問題