I/O多重化の理解
JAva nioはI/O多重というプログラミングモデルを提供していますが、I/O多重とは何でしょうか.I/O多重化とは、文字通り、複数のI/Oオペレーション(書き込み、読み取り、リクエスト)があり、これらの複数のI/Oオペレーションが1つの論理ストリームを共有することである.多重化が何であるかを明らかにするためには,まず論理ストリームの概念を説明しなければならない.論理ストリームは何ですか?ここでの論理フローとオペレーティングシステムでは、「スレッドはプロセスの論理フロー」という意味です.次は論理フローです.
次は論理フローです.
1つのプロセスでスレッドがない場合、プログラムは順次実行され、すべてのコードは論理ストリームに属します.たとえば、上の両端のコードは、プロセスに結合されている場合、このような構造に違いありません.
または
すなわち、それらは必ず論理ストリーム(シーケンス構造)に属します.これを理解すると、I/O多重化とは、1つの論理ストリームで複数のI/Oイベントを処理することを意味する!!!どうやって?Selectorマルチプレクサを使用して、ポーリングして各I/Oをリスニングし、I/Oイベントが発生したら処理し、そうでなければプログラムがブロックされます.プログラムを見て理解を深めます
これはネットワークI/Oを傍受する多重化プログラムで、javaではネットワークI/Oしか傍受できず、標準入出力などのI/Oを傍受できない(ただしこれらはlinuxでも可能).このプログラムの原理は、ネットワークI/Oクラス、ServerSocketChannelを開き、Selector(セレクタ)に登録し、セレクタがポーリングを開始することであることを発見した.I/Oイベントが発見されるまで、最初のwhileサイクルに入って処理します.そうしないと、select()>0でブロックされます.これは極めて粗末なプログラムですが、多重化の本当の内包を明らかにしました.つまり、1つの論理ストリームで傍受し、複数のI/Oを処理します(ただし、プロセッサは実際にマルチスレッドを開くことができます.つまり、最初のwhileサイクルの部分を指します).これがI/O多重化!!!
{
int a = 5;
int b a*a;
double c = a/b;
}
次は論理フローです.
{
long b = 5;
int c = b+3;
}
1つのプロセスでスレッドがない場合、プログラムは順次実行され、すべてのコードは論理ストリームに属します.たとえば、上の両端のコードは、プロセスに結合されている場合、このような構造に違いありません.
{
int a = 5;
int b a*a;
double c = a/b;
}
....
{
long b = 5;
int c = b+3;
}
または
{
long b = 5;
int c = b+3;
}
....
{
int a = 5;
int b a*a;
double c = a/b;
}
すなわち、それらは必ず論理ストリーム(シーケンス構造)に属します.これを理解すると、I/O多重化とは、1つの論理ストリームで複数のI/Oイベントを処理することを意味する!!!どうやって?Selectorマルチプレクサを使用して、ポーリングして各I/Oをリスニングし、I/Oイベントが発生したら処理し、そうでなければプログラムがブロックされます.プログラムを見て理解を深めます
package qiuqi.filedownloadtest;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.*;
import java.util.Iterator;
public class FileServer {
public static void main(String[] args) throws IOException {
startServer();
}
public static void startServer() throws IOException {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (selector.select() > 0)
{
Iterator iterator = selector.selectedKeys().iterator();
while (iterator.hasNext())
{
SelectionKey key = iterator.next();
iterator.remove();
if(key.isAcceptable())
{
System.out.println(" I/O ");
catch (IOException e){e.printStackTrace();}
}
}
}
}
}
これはネットワークI/Oを傍受する多重化プログラムで、javaではネットワークI/Oしか傍受できず、標準入出力などのI/Oを傍受できない(ただしこれらはlinuxでも可能).このプログラムの原理は、ネットワークI/Oクラス、ServerSocketChannelを開き、Selector(セレクタ)に登録し、セレクタがポーリングを開始することであることを発見した.I/Oイベントが発見されるまで、最初のwhileサイクルに入って処理します.そうしないと、select()>0でブロックされます.これは極めて粗末なプログラムですが、多重化の本当の内包を明らかにしました.つまり、1つの論理ストリームで傍受し、複数のI/Oを処理します(ただし、プロセッサは実際にマルチスレッドを開くことができます.つまり、最初のwhileサイクルの部分を指します).これがI/O多重化!!!