213

Redisの基本を理解しようとすると、興味深いブログ投稿に出くわしました。

著者は次のように述べています。

Redisはepoll/kqueueでシングルスレッド化されており、I/Oの同時実行性に関して無期限にスケーリングします。

私はこのステートメントが不可解であると思うので、私は確かにスレッドのこと全体を誤解しています。プログラムがシングルスレッドの場合、どのようにして同時に何かを実行しますか?サーバーがとにかくシングルスレッドである場合、Redis操作がアトミックであることがなぜそれほど素晴らしいのですか?

誰かがこの問題に光を当ててくれませんか?

4

2 に答える 2

413

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

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

たとえば、バーテンダーは一度に1つの飲み物しか準備できないのに、複数の顧客の面倒を見ることができます。したがって、彼は並列処理なしで並行性を提供できます。

この質問はここで議論されています: 並行性と並列性の違いは何ですか?

RobPikeによるこのプレゼンテーションも参照してください。

シングルスレッドプログラムは、I / O(逆)多重化メカニズムとイベントループ(Redisが行うこと)を使用することにより、I/Oレベルで確実に同時実行性を提供できます。

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

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

于 2012-05-08T08:51:51.943 に答える
24

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

並行」には、ネットワークイベントをソケットステートマシンに配布することが含まれる場合があります。これはシングルスレッドであり、(ユーザーレベルで)1つのコアで実行されるため、これを同時実行とは呼びません。その他は異なります。

I/Oの同時実行性に関して無期限にスケールする」というのは、真実をもって経済的であるということです。「クライアントが多くを要求しない限り、クライアントごとに1スレッドよりも拡張性が高い」と言った場合、彼らはより多くの信念を得るかもしれませんが、他の非同期ソリューションによる重い負荷で吹き飛ばされるように追加する義務があると感じるかもしれません。ユーザーレベルですべてのコアを使用します。

于 2012-05-07T21:34:27.970 に答える