I/O多重化の理解

2516 ワード

JAva nioはI/O多重というプログラミングモデルを提供していますが、I/O多重とは何でしょうか.I/O多重化とは、文字通り、複数のI/Oオペレーション(書き込み、読み取り、リクエスト)があり、これらの複数のI/Oオペレーションが1つの論理ストリームを共有することである.多重化が何であるかを明らかにするためには,まず論理ストリームの概念を説明しなければならない.論理ストリームは何ですか?ここでの論理フローとオペレーティングシステムでは、「スレッドはプロセスの論理フロー」という意味です.次は論理フローです.
{
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多重化!!!