2012-05-07 4 views
106

レディスの基本を掴もうとすると、私は面白いblog postに出くわしました。Redisはシングルスレッドですが、同時I/Oはどのように動作しますか?

著者の状態:

Redisのは、ファイルディスクリプタ/たkqueueとシングルスレッドおよびI/Oの並行性の点で無限にスケールです。

私はこのステートメントが困惑しているので、確かに糸通しのもの全体を誤解しています。プログラムがシングルスレッドの場合、どのように同時に処理するのですか?とにかくサーバーがシングルスレッドの場合、Redisの操作はアトミックなのはなぜ大変ですか?

問題に誰かが気をつけてください。

答えて

206

これは、並行性をどのように定義するかによって異なります。

サーバー側のソフトウェアでは、並行性と並列性はしばしば異なる概念とみなされます。サーバでは、同時I/Oをサポートすることにより、サーバは、1つの計算ユニットだけでそれらのクライアントに対応するいくつかのフローを実行することによって複数のクライアントにサービスを提供できることを意味します。このコンテキストでは、並列処理は、サーバが複数の演算ユニットを同時に使用して複数の処理を同時に実行できることを意味します。

例えば、バーテンダーは、一度に1つの飲み物しか用意できない間に、複数の顧客を見ることができます。したがって、彼は並列性を持たずに並行性を提供することができます。

この質問は、ここで議論されてきた: Concurrency vs Parallelism - What is the difference?

はロブ・パイクからもthis presentation参照してください。

シングルスレッドプログラムは、I/O(デ)多重化メカニズムとイベントループ(Redisの機能)を使用して、I/Oレベルで並行性を提供できます。

並列処理にはコストがかかります。現代のハードウェアで見つけることのできる複数のソケット/複数のコアでは、スレッド間の同期には非常にコストがかかります。一方、Redisのような効率的なストレージエンジンのボトルネックは、CPUのかなり前のネットワークであることがよくあります。したがって、独立したイベントループ(同期を必要としない)は、効率的でスケーラブルなサーバーを構築するための優れた設計と見なされます。

Redis操作がアトミックであるという事実は、単純にシングルスレッドイベントループの結果です。興味深い点は、追加コストなしで原子性が提供されることです(同期は必要ありません)。同期オーバーヘッドを支払うことなく、楽観的なロックや他のパターンを実装するために、ユーザーが悪用する可能性があります。

+72

ニースのバーテンダーの類推:) –

+0

これは、多くのおかげで助けになりました! –

+0

シンプルでクリアな、ありがとう。 – harsha

11

OK、RedisはユーザーレベルのOTOHでシングルスレッド化されています。すべての非同期I/Oは、カーネルスレッドプールおよび/またはスプリットレベルドライバでサポートされています。

'同時、'には、ネットワークイベントをソケットの状態マシンに配信することが含まれます。これはシングルスレッドで、1つのコア(ユーザーレベル)で実行されるため、これを同時に実行することはしません。他は異なります..

'スケールは無期限にI/O並行性の面では'は真実で経済的です。彼らは他の非同期ソリューションによって重い負荷を吹き飛ばすことを余儀なくされているかもしれないが、「クライアントが1つ1つのスレッドよりも優れていると言うならば、ユーザーレベルですべてのコアを使用します。

関連する問題