Linuxネットワークプログラミングの5つのIOモデル-理解しやすいブロッキングIOとノンブロッキングIO(実際の例を含む)[初心者に推奨]

はじめに:ソートする前にソケットプログラミングを学んだときに多重化を確認しました。関連情報を検索し、多重化にも限界があることを学びました。キャセロールの質問を最後まで壊すという精神で、ついにIOモデルに関する知識のポイントを見つけました。

I.概要

「UnixNetworkProgramming」という本には、ブロッキングIO、ノンブロッキングIO、多重化IO、信号駆動IO、非同期IOの5つのIOモデルが記載されています。

ここでは、これら5つのモデルを紹介して実装します。紹介する前に、特定の比喩を引用させてください

IOをブロックし、女神にあなたを探しているというテキストメッセージを送信し、静かに女神が階下に来るのを待ちます。この間、スペアタイヤであるあなたを待つ以外のことは何もしません。練習。

ノンブロッキングIO、返信がない場合は女神にテキストメッセージを送信し、もう一度送信して、女神が階下に来るまで送信します。この期間中は、テキストメッセージ以外のことはせず、待ちます。これは専用の練習です。

IO多重化は、階下に行く女の子を監視するのに役立つ叔母を見つけることです。この期間中は、他のことを行うことができます。たとえば、他の女の子を見たり、栄光の王様を演じたり、トイレに行ったりすることができます。 .IO Reuseには、select、poll、epollモードも含まれていますが、これらの違いは何ですか?

  • 1)おばさんセレクトすべての女の子が階下に行き、これがあなたの女神かどうかわからない、おばさんセレクトは一人ずつ尋ねる必要が
    あり、おばさんセレクトの能力はまだ限られており、最大で1024人の女の子を一度に監視できます
  • 2)ポルおばさんは、寮のドアを通り過ぎる女の子である限り、見つめる女の子の数を制限しません。彼女はあなたがそれがあなたの女神であるかどうか尋ねるのを手伝います。
  • 3)エポールおばさんは見つめる女の子の数に制限がなく、一人ずつ尋ねる必要がないので、どうすればいいですか?エポールおばさんは、寮に入るすべての女の子の顔に大きなメモを書きます、そしてその上に女の子自身を書いてください女の子が階下に行く限り、叔母のエポールはこれがあなたの女神であるかどうかを知り、それから叔母はあなたに通知します上記の同期IOには共通点が1つあります寮のドア、あなたはすでに寮のドアに立っています女神を待っています、今あなたはブロックされた状態にあります

次は非同期IOの場合です。
あなたは私が来ることを女神に伝え、次に女神が階下に来るまでゲームをプレイし、彼女があなたを見ることができないことを発見すると、女神はあなたに電話してあなたに知らせますそして、私は階下にいると言います、あなたはどこにいますか?それからあなたは寮のドアに来ました。これは反撃のアプローチです

2つ、ブロッキングIOと非ブロッキングIO

Linuxシステムプログラミングでは、概念に関する章でブロッキングの概念を紹介しました。そうすれば、ブロッキングIOと非ブロッキングIOが何であるかを簡単に理解できます。写真を直接見てください

1.IOのブロック

最も伝統的なIOモデルは、データの読み取りと書き込みのプロセスでブロッキングが発生するというものです。

ユーザースレッドがIO要求を発行すると、カーネルはデータの準備ができているかどうかを確認し、準備ができていない場合はデータの準備ができるのを待ち、ユーザースレッドはブロック状態になり、ユーザースレッドはCPUを引き渡します。データの準備ができると、カーネルはデータをユーザースレッドにコピーし、結果をユーザースレッドに返し、ユーザースレッドはブロック状態を解放します。
ここに画像の説明を挿入
コードは次のように表示されます。

	printf("Calling recv(). \n");
	ret =  recv(socket, recv_buf, sizeof(recv_buf), 0); 
	printf("Had called recv(). \n");

マルチスレッド+ブロッキングIOを使用して効率の問題を解決できると言う人もいるかもしれませんが、マルチスレッド+ブロッキングIOでは、各ソケットがスレッドに対応しているため、特に長い接続の場合、多くのリソースが占有されます。つまり、スレッドリソースが解放されることはありません。将来、接続が多いと、パフォーマンスのボトルネックが発生します。

2.ノンブロッキングIO

ユーザースレッドがIO操作を開始すると、待機する必要はありませんが、すぐに結果が得られます。結果がエラーの場合、データの準備ができていないことがわかっているため、IO操作を再度送信できます。カーネル内のデータの準備が整い、ユーザースレッドからの要求を再度受信すると、すぐにデータをユーザースレッドにコピーして、戻ります。

ノンブロッキングIOモデルでは、ユーザースレッドは、カーネルデータの準備ができているかどうかを常に確認する必要があります。つまり、ノンブロッキングIOはCPUを引き渡しませんが、常にCPUを占有します。

ノンブロッキングIOの場合、非常に深刻な問題があります。whileループでは、カーネルデータの準備ができているかどうかを常に確認する必要があります。これにより、CPU使用率が非常に高くなるため、通常、whileループが使用されることはめったにありません。データを読み取ります。

ここに画像の説明を挿入
コードは次のように表示されます。

while(1)
{
    
    
	printf("Calling recv(). \n");
	ret =  recv(socket, recv_buf, sizeof(recv_buf), 0); 
	if (EAGAIN == ret) {
    
    continue;}
    else if(ret > -1) {
    
     break;}
	printf("Had called recv(), retry.\n");
}

編集者は私自身のlinuxC / C ++言語技術交換グループを推奨しています:[ 1106675687 ]グループファイルで共有する方が良いと思う学習本とビデオ資料をいくつかまとめました。必要に応じて追加できます。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_50662680/article/details/113184748