ルートからの高性能と高い同時実行性を理解する(2):オペレーティングシステムを深め、I / Oとゼロコピーテクノロジーを理解する

1.シリーズの紹介

1.1記事の目的

インスタントメッセージング技術の開発者として、高いパフォーマンスと同時実行に関連する技術的な概念は長い間明らかにされている。どのようなスレッドプールなど、ゼロコピー、多重化、イベント駆動型、ファイルディスクリプタ、多分、あなたの指先にすべてのあなたのある使い慣れJavaのNetty、Phpの職人、Goのngetなどの技術的特性を備えた技術フレームワークを備えていますしかし、対面または技術的な実践に関しては、未解決の疑問に遭遇したとき、あなたはあなたが持っているのはただの肌であることを知っています。

基本に戻り、本質に戻ります。これらの技術的機能の背後にある基本的な原則は何ですか?これらのテクノロジーの背後にある原理をわかりやすく簡単に理解する方法は、一連の記事「ルートからの高性能と高い並行性の理解」がまさに共有するものです。

1.2記事の出所

初期のオープンソースIMフレームワークMobileIMSDKから古典的なネットワークプログラミングの傑作「TCP / IP詳細説明」のオンラインバージョン、IMまで、IMやメッセージプッシュなどのインスタントメッセージングテクノロジに関連する多くのリソースと記事をまとめました。開発プログラムによる記事「一つのエントリは初心者のために十分である:最初からモバイルIMの開発」、および「ネットワークプログラミングのレイジー入門」「はじめに脳障害者ネットワークプログラミング」、「高性能ネットワークプログラミング」、「既知のネットワークプログラミングのためではありません「一連の記事。

知識を深めるほど、インスタントメッセージングテクノロジについての知識が少なすぎると感じます。その後、開発者が基本的な通信技術の観点からネットワーク(特にモバイルネットワーク)の特性をよりよく理解できるようにするために、「ゼロの概要-基本的な通信技術の概要」に関する一連の高レベルの記事を収集してまとめました。 IM開発者"分野を超えてこの一連の記事は、通常のインスタントメッセージング開発者にとってすでにネットワーク通信技術の知識の境界です。以前のこれらのネットワークプログラミング資料では、基本的にネットワーク通信の知識の盲点を解決するのに十分です。

IMなどのインスタントメッセージングシステムの開発では、ネットワーク通信の知識は確かに非常に重要ですが、スレッドプール、ゼロコピー、多重化、多重化など、ネットワーク通信自体のこれらの技術的特性を実現するための技術の本質に戻ります。上記のイベント駆動型など、その性質は何ですか?根本的な原則は何ですか?これがこのシリーズの記事を整理する目的です。お役に立てば幸いです。

1.3記事のディレクトリ

1.4この記事の概要

前回の記事「コンピューターの奥深く、スレッドとスレッドプールを理解する」に続き、この記事は一連の高性能と高い同時実行性の2番目の記事であり、ここではI / Oのトピックに進みます。ファイルI / OおよびネットワークI / O操作を実行すると、コンピューターの下部で何が起こるのか疑問に思ったことはありませんか。I / Oはコンピュータにとって非常に重要であり、この記事ではこの質問に対する答えを提供します。

2.この記事の著者

著者の要請により、本名や個人の写真は提供されません。

著者は主にインターネットバックエンド、高性能並行サーバー、検索エンジン技術の技術的方向性であり、画面名は「コードファーマーズキャスタウェイ」、公開番号は「コードファーマーズキャスタウェイです彼の無私の共有のために作者に感謝します。

3. I / Oを実行できないコンピューターは何ですか?

I / O操作は、次のようなプログラマーにとって最も馴染み深いものだと思います。

  • 1)C言語でprintfを使用する場合、C ++で「<<」、Pythonで印刷、JavaでSystem.out.printlnなどを使用します。
  • 2)ファイルの読み取りと書き込みにさまざまな言語を使用する場合;
  • 3)TCP / IPを介してネットワークと通信する場合。
  • 4)マウスを使って飛んだり踊ったりするとき。
  • 5)キーボードを手に取ってコメント領域にポインタを置くか、バグを作成するために一生懸命努力するとき。
  • 6)画面などに美しいグラフィカルインターフェイスが表示されたとき。

上記はすべてI / Oです!

考えてみてください。I / Oコンピュータがない場合、それは退屈なデバイスになります。映画を見たり、ゲームをしたり、インターネットをサーフィンしたりすることはできません。このようなコンピュータはせいぜい大きな電卓です。

I / Oは非常に重要なので、I / Oとは正確には何ですか?

4. I / Oとは何ですか?

I / Oは単純なデータコピーであり、それ以上のものではありません。

この点は非常に重要です!

データをコピーしているので、どこからコピーしますか?

データが外部デバイスからメモリにコピーされる場合、これは入力です。

データがメモリから外部デバイスにコピーされる場合、これは出力です。

メモリと外部デバイス間でデータを相互にコピーすることは、I / O(入力/出力)と呼ばれる入力と出力であり、それ以上のものではありません。

5、I/O与CPU

I / Oとは何かがわかったので、次のステップは重要な部分です。注意を払い、座ってください。

現在のCPUの主周波数は数GHzから始まることがわかっていますが、これはどういう意味ですか?

簡単に言うと、 CPUはナノ秒レベルでマシン命令を実行し、ディスク操作などの通常のI / Oでは、ディスクシークは約ミリ秒です。したがって、CPU速度を戦闘機と比較すると、I / O動作速度はKFCです。

つまり、プログラムを実行すると(CPUがマシン命令を実行する)、その速度はI / O速度よりもはるかに速くなります。次の質問は、2つの速度の差が非常に大きいということです。では、どのように設計し、システムリソースをより合理的かつ効率的に使用するのでしょうか。

速度差があり、I / O操作が完了するまでプロセスを進めることができないため、明らかに1つの方法しかなく、それは待機することです。

同じことが待っています。愚かな待機と呼ばれるスマートな待機と愚かな待機があります。では、スマートな待機と愚かな待機のどちらを選択する必要がありますか?

あなたが短気な人(CPU)で、重要なファイルを待つ必要があるとします。残念ながら、このファイルはエクスプレス(I / O)でしか配信できないため、現時点では何もしないことを選択し、愛情を込めて見てください。ドア。あなたを楽しみにしているハニのように、この宅配便を熱心に待っていますか?または、今のところ速達について心配する必要はありません。ゲームをプレイし、映画を見て、短いビデオを見て、速達が来るのを待ちますか?

明らかに、より良い方法は最初に他のことをすることです、そして急行が到着したときにそれについて話しましょう。

したがって、ここで重要なのは、速達の前に手元にあるものを一時停止し、他のタスクに切り替え、速達が到着したときに元に戻すことができるということです。

これを理解すると、I / O操作を実行するときに下部で何が起こるかを理解できます。

次に、このプロセスを説明する例として、ディスクファイルの読み取りを取り上げましょう。

6. I / Oが実行されると下部で何が起こるか

前回の記事「コンピューターの奥深く、スレッドとスレッドプールを理解する」では、プロセスとスレッドの概念を紹介しました。

スレッドをサポートするオペレーティングシステムでは、実際にはプロセスではなくスレッドがスケジュールされます。I/ Oプロセスをより明確に理解するために、オペレーティングシステムにはプロセスの概念しかないことを一時的に想定し、スレッドを最初に考慮しません。 。私たちの議論に影響を与えます。

これで、メモリにはプロセスAとプロセスBの2つのプロセスがあり、プロセスAが現在実行されています。

以下に示すように:

通常、データをロードするためのバフを定義する言語に関係なく、プロセスAでファイルを読み取り、readなどの関数を呼び出すコードのセクションがあります。

このような:

read(buff);

これは一般的なI / O操作です。CPUがこのコードを実行すると、読み取り要求がディスクに送信されます。

注: CPUが命令を実行する速度と比較して、I / O操作は非常に遅いため、オペレーティングシステムが貴重なCPUコンピューティングリソースを不必要な待機に浪費することは不可能です。現時点では、焦点は、支払いです。次への注意それがポイントです。

外部デバイスはI / O操作の実行が非常に遅いため、I / O操作が完了するまでプロセスを進めることはできません。これはいわゆるブロッキングであり、一般にブロックと呼ばれます。

オペレーティングシステムは、プロセスがI / Oデバイスへの要求を開始したことを検出すると、プロセスの操作を一時停止します。操作を一時停止するにはどうすればよいですか。非常に簡単です。現在のプロセスの実行ステータスを記録し、CPUのPCレジスタに他のプロセスの命令を指示するだけです。

プロセスが一時停止されても実行を継続するため、オペレーティングシステムは一時停止されたプロセスを保存してから実行する必要があります。明らかに、キューを使用して一時停止されたプロセスを保存できます。

次の図に示すように、プロセスAは実行のために一時停止され、ブロッキングキューに配置されます(注:オペレーティングシステムが異なれば実装も異なり、各I / Oデバイスには対応するブロッキングキューがある場合がありますが、この実装の詳細には違いはありません。私たちの議論に影響を与えます)。

この時点で、オペレーティングシステムはディスクにI / O要求を送信したため、ディスクドライバーはディスクからプロセスAのバフへのデータのコピーを開始します。この時点でプロセスAの実行は中断されていますが、これによってディスクがデータをメモリにコピーすることは妨げられません。

注:最近のディスクは、データをメモリにコピーするときにCPUの助けを必要としません。これはいわゆるDMA(ダイレクトメモリアクセス)です。

このプロセスを次の図に示します。

最初にディスクにデータをコピーさせてください。引き続き話し合います。

実際:ブロッキングキューに加えて、オペレーティングシステムにはレディキューもあります。いわゆるレディキューとは、キュー内のプロセスがCPUによって実行される準備ができていることを意味します。

直接実行するための準備ができたキューがないのはなぜですか?答えは簡単です。お粥が多すぎます。コアが1つしかないマシンでは、何千ものプロセスを作成できます。CPUは、同時に多くのプロセスを実行することはできません。したがって、すべてがそうであるとしても、そのようなプロセスが必要です。また、コンピューティングリソースに割り当てることもできず、そのようなプロセスは準備完了キューに配置されます。

これで、プロセスBは準備完了キューに入れられ、すべての準備が整い、CPUのみに支払う義務があります。

以下に示すように:

プロセスAの実行が一時停止されている場合、レディキューにフィードされるのを待機しているプロセスBがまだあるため、CPUをアイドル状態にすることはできません。この時点で、オペレーティングシステムはレディキューで次の実行可能プロセスの検索を開始します。ここではプロセスBです。

このとき、オペレーティングシステムはプロセスBをレディキューから取り出し、プロセスBが一時停止されたときに実行されたマシン命令の場所を見つけ、CPUのPCレジスタをこの場所にポイントして、プロセスがBが実行を開始します。

以下に示すように:

注:次の段落が重要です。

上の図に注意してください。この時点で、プロセスBはCPUによって実行されており、ディスクはプロセスAのメモリスペースにデータをコピーしています。わかりますか?誰もがビジーで、誰もアイドル状態ではなく、データコピーオペレーティングシステムのスケジューリングの下で​​、CPUとディスクが完全に使用されます。ここにプログラマーの知恵があります。

これで、オペレーティングシステムが非常に重要である理由を理解する必要があります。

その後、ディスクは最終的にすべてのデータをプロセスAのメモリにコピーしました。この時点で、ディスクはオペレーティングシステムにタスクが完了したことを通知します。通知方法を尋ねることができますか?これは中断です。

オペレーティングシステムはディスク割り込みを受信すると、データコピーが完了したことを検出し、プロセスAは実行を継続するための資格を取り戻します。このとき、オペレーティングシステムはプロセスAをブロッキングキューからレディキューに慎重に配置します。

以下に示すように:

注:準備完了状態に関する前の説明から、オペレーティングシステムはプロセスAを直接実行しないことがわかっています。プロセスAは、待機するために準備完了キューに配置する必要があります。これは誰にとっても公平です。

その後、プロセスBは実行を継続し、プロセスAは待機を継続します。プロセスBがしばらく実行された後、オペレーティングシステムはプロセスBの実行時間が十分に長いと判断し、プロセスBをレディキューは、プロセスAを取り出し、実行を継続します。

注:オペレーティングシステムはプロセスBを準備完了キューに入れるため、プロセスBは、I / O要求の開始によってブロックされたためではなく、タイムスライスがアップしたためにのみ中断されます。

以下に示すように:

プロセスAは実行を継続します。この時点で、バフは必要なデータで満たされます。プロセスAは、中断されたことがないかのように正常に実行されます。プロセスは、それ自体が中断されていることを認識しません。これがオペレーティングシステムの魔法です。

これで、I / Oがどのようなプロセスであるかを理解する必要があります。

プロセスがI / O操作を実行するこの方法は、ブロックされ、実行の一時停止はブロックI / O、ブロックI / Oと呼ばれます。これは、最も一般的で理解しやすいI / O方法でもあります。ブロックI / Oと非ブロッキングI / Oの場合、当面はこの方法を検討しません。

このセクションの冒頭で、当面はスレッドではなくプロセスのみを考慮すると述べましたが、今はこの条件を緩和します。実際には非常に単純です。前の図でスケジュールされたプロセスをスレッドに変更するだけで済みます。ここでの議論はスレッドについても同じです。確立されました。

7.ゼロコピー

最後に注意すべき点は次のとおりです。上記の説明では、ディスクデータをプロセススペースに直接コピーしましたが、通常、I / Oデータは最初にオペレーティングシステムにコピーされ、次にオペレーティングシステムがプロセスにコピーされます。スペース。。

したがって、実際にはオペレーティングシステム全体にコピーのレイヤーがあることがわかります。パフォーマンス要件が高いシナリオでは、実際にはオペレーティングシステムをバイパスして、データコピーを直接実行できます。これは、この記事で説明するシナリオでもあります。これはオペレーティングシステムを直接バイパスします。データコピーのテクノロジはゼロコピーと呼ばれ、同時実行性とパフォーマンスの高いシナリオで一般的に使用されるテクノロジです。原理は非常に単純です。

PS:インスタントメッセージング開発に従事するJavaプログラマーの場合、有名な高性能ネットワークフレームワークNettyはゼロコピーテクノロジーを使用します。詳細については、記事NIO Framework Explained:Netty'sHigh-PerformanceWay」のセクション12を参照してください。興味はあるがNettyフレームワークを理解していない場合は、次の2つの記事から始めることができます:「初心者:これまでで最も徹底的なNettyの高性能原則とフレームワーク分析」、「歴史上最も人気のあるNettyエントリ:基本はじめに、環境構築、実地戦闘」。

8.この記事の要約

この記事では、プログラマーが一般的に使用するI / O(いわゆるネットワークI / Oを含む)について説明します。一般的に、プログラマーとしては気にする必要はありませんが、I / Oの背後にある基本原則を理解することはIMのような高性能と高性能を設計するために重要です。コンカレントシステムは非常に便利です。この記事がI / Oの理解を深めるのに役立つことを願っています。

次の記事「根本からの高性能と高い同時実行性の理解(3):オペレーティングシステムを深く掘り下げ、I / O多重化を完全に理解する」は、まさにそのおかげで、I / Oテクノロジのブレークスルーを共有します。高同時実行ネットワーク通信のC10K問題を解決しました(「高性能ネットワークプログラミング(2):過去10年間の有名なC10K同時接続問題」を参照)。ご期待ください

付録:より高性能で同時実行性の高い記事

高性能ネットワークプログラミング(1):単一サーバーが持つことができる同時TCP接続の数

高性能ネットワークプログラミング(2):過去10年間の有名なC10K同時接続問題

高性能ネットワークプログラミング(3):今後10年間で、C10Mの同時実行性を検討する時が来ました

高性能ネットワークプログラミング(4):C10KからC10Mまでの高性能ネットワークアプリケーションの理論的調査

高性能ネットワークプログラミング(5):高性能ネットワークプログラミングのI / Oモデルを1つの記事で読む

高性能ネットワークプログラミング(6):高性能ネットワークプログラミングのスレッドモデルを1つの記事で理解する

高性能ネットワークプログラミング(7):高い同時実行性とは何ですか?一文で理解!

リアルタイム通信の技術的課題を理解するための例として、オンラインゲームサーバーのネットワークアクセス層の設計を取り上げてください。

テクノロジーの共有を知る:数千万の同時実行性を備えた高性能の長距離接続ゲートウェイテクノロジーの実践を知る

淘宝網技術共有:ハンド淘宝網10億レベルのモバイルアクセスレイヤーゲートウェイの技術進化の道

大規模なオンラインユーザー向けのモバイルIMアーキテクチャ設計プラクティス共有のセット(詳細なグラフィックとテキストを含む)

オリジナルの分散型インスタントメッセージング(IM)システムの理論的アーキテクチャ計画

大量のデータのコールドおよびホット階層アーキテクチャ設計プラクティスの時系列に基づくWeChatの背景

WeChatテクニカルディレクターがアーキテクチャについて語る:WeChatの方法-Dao Zhi Jian(フルスピーチ)

「「アーキテクチャについて語るWeChatテクニカルディレクター:WeChatの方法-シンプルへの道」の解釈方法

RapidFission:WeChatの強力なバックエンドアーキテクチャが0から1に進化するのを目撃してください(1)

17年間の実践:Tencentの大規模製品の技術的方法論

Tencentのシニアアーキテクトドライグッズの概要:大規模分散システム設計のすべての側面を理解するための記事

Weiboアプリケーションシナリオを例として取り上げて、大規模な社会システムのアーキテクチャ設計ステップを要約します

はじめに:大規模分散アーキテクチャの進化の歴史、技術原則、およびベストプラクティスのゼロ基本的な理解

初心者から建築家まで、1つのピースで十分です。1億から1000万の高い同時実行性へのアーキテクチャの進化

この記事は、「インスタントメッセージングテクノロジーサークル」の公式アカウントにも同時に掲載されています。

▲公式アカウントでのこの記事のリンクは次のとおりです。ここをクリックして入力してください同期公開リンクは次のとおりです。http//www.52im.net/thread-3280-1-1.html

おすすめ

転載: blog.csdn.net/hellojackjiang2011/article/details/111866439