javaBIOの動作メカニズム

BIOについて説明する前に、同期と非同期、ブロッキングと非ブロッキングなど、いくつかの単語のセマンティクスについて説明します。次に、これらの単語はどういう意味ですか?

同期:同期とは、確立された順序で、整然とした作業を行うことです。

非同期:非同期とは、実行されている限り、順序なしで実行することを意味します。

たとえば、食べてから教室に行って読む場合、同期とは、最初に食べてから本を読む必要があることを意味します。非同期とは、たくさんの人が列に並んでいるのを見て、最初に勉強して、列に並んでいる人が少ないときに来て食べることを意味します。待ち行列に入れて読んでいます。

では、ブロッキングと非ブロッキングとは何ですか?

別の例として、WeChatで友達とチャットしているときにメッセージを送信し、友達があなたに返信しない、何もしていない、返信を待っている場合、これはブロックされます。友達があなたに返信しない場合は、最初に学習します。アイドル状態で待機しているだけでなく、これは非ブロッキングです。

同期と非同期、ブロッキングと非ブロッキングについて説明した後、BIOについて説明しましょう。

BIO:ブロッキングI /O。これは同期ブロッキングI / Oに変換されます。つまり、各スレッドはタスクを実行するときにのみ独自のタスクを実行でき、相手が応答しなくなるまで待機します。定義の観点からすると、効率が低すぎます。そのようなプログラマーであれば、会社は解雇されたと推定されます。

では、動作メカニズムは何ですか?

次に、データがどのように送信されるかを確認します。サーバーとクライアントが通信リンクを確立すると、それらはすべてSocketを介して行われます。サーバーとクライアントが接続を確立している場合は、各SocketインスタンスにSocketインスタンスがあります。 inputStreamとoutputStreamがあり、Socketオブジェクトが作成されると、オペレーティングシステムはバッファ領域をinputStreamとoutputStreamに割り当て、サーバーとクライアントはバッファ領域を介して情報を渡します。


書き込み側は、outputStreamのSendQキューにデータを書き込みます。SendQがいっぱいになると、データはもう一方の端のinputStreamのRecvQに転送されます。これがinputStreamのRecvQがいっぱいの場合、outputStreamのwriteメソッドブロックされ、RecvQに十分なスペースがある場合、送信されたデータを受信し続けることができるため、キャッシュスペースのサイズは非常に重要です。キャッシュスペースのサイズと書き込みおよび読み取りの速度は、通信リンクに影響します。効率性、および両端が同時にデータを送信する場合、デッドロックが発生する可能性があります。

同期ブロッキングとは、クライアントがリクエストにアクセスし、サーバーが処理のためにスレッドを開くことを意味します。このスレッドは、他のリクエストを処理する前にのみリクエストを処理できます。複数のリクエストを同時に処理するために、複数のスレッドのみを開くことができ、各リクエストは1つのタスクを処理します。 、1対1の対応、処理されたスレッドはスレッドを破棄しています。ただし、スレッドの開始と破棄のコストは大きいため、スレッドプールを作成することで、スレッドの作成と回復のコストを削減できます。

図に示すように、スレッドプールはBIOの問題の一部を解決するために使用されますが、一部のシナリオではBIOにまだ問題があります。NIOの出現により、BIOに起因する多くの問題が解決されました。ただし、NIOの作業方法は次回まで待たなければなりません。はい、それが好きな友達のように。

おすすめ

転載: blog.csdn.net/wzs535131/article/details/103724171