2017-10-24 6 views
-4

を、のJava - IOスレッドバインド - 1:以下のプログラムでは1スレッドモデル

//Producer - IO bound 

public class FileCrawler implements Runnable{ 
    private final BlockingQueue<File> fileQueue; 
    private final File root; 
    .... 
    public void run(){ 
     try{ 
      crawl(root); // IO bound 
     }catch(InterruptedException e){ 
      Thread.currentThread().interrupt(); 
     } 
    } 

    private void crawl(File root) throws InterruptedException{ 
     File[] entries = root.listFiles(fileFilter); 
     ... 
     for(File entry: entries){ 
     fileQueue.put(entry); 
     } 
    } 
} 

//Consumer - CPU bound 

public class Indexer implements Runnable{ 
    private final BlockingQueue<File> queue; 
    .... 
    public void run(){ 
     try{ 
      while(true){ 
      indexFile(queue.take()); // CPU bound 
      } 
     }catch(InterruptedException e){ 
     Thread.currentThread().interrupt(); 
     } 
    } 
} 

FileCrawler IOはcrawl(root)を実行する複数のスレッドに打ち上げます実行可能なタスクをバインドされていますIO機能。

Javaスレッドは内部的にネイティブスレッドにマッピングされています(pthread_create()に相当)。各pthreadはカーネル内の別のスレッドに対してmappedであり、カーネルはスレッドのスケジューリングを担当します。

したがって、各JavaスレッドはOSから見えます。それは特定のCPUコア上で動作します。

1:1スレッドモデルに従うOSでJava processが実行されているとします。


CPUコア上でIOを実行するJavaスレッド、

プロデューサースレッドがコンテキストにカーネルをトリガーIOを待っているんでは、Java processを切り替えてIOの準備ができるまで待ち状態にjavaプロセスを置きます処理されるか? Javaプロセスの他のスレッド(CPUバインド)がCPUタイムスライスを消費する可能性がありません。

+0

プログラムを実行して、それが真であるかどうかを確認してください。 –

+0

@ xiaofeng.liプログラムを実行する前に、これはパフォーマンスに影響するプラットフォームに依存するシナリオであることを理解する必要があります。再度私のクエリをお読みください – overexchange

+2

もちろん、それは1:1スレッドモデルの主要なポイントの1つです。これはあなたのオペレーティングシステムコースの宿題で、非常に具体的な質問があります(つまり、コードの詳細は問題ありません。プロデューサーがキューにロックしている間I/Oをブロックしない限り)。リンクした記事でも、プロセス全体をN:1(ユーザー空間スレッド)の欠点としてブロックしていると言われていますが、これは1:1ではなく、それにのみ適用されます。 –

答えて

0

Javaスレッドは、ネイティブスレッドに内部的にマップされています(pthread_create()に相当)。

どのJavaスレッドにマップするかは実装依存です。

各pthreadのはこれが単なるナンセンスであるカーネル

内の別のスレッドにマッピングされています。

スレッドをスケジューリングするのはカーネルです。

Javaスレッドがネイティブスレッドの場合は正しくなります。

したがって、各JavaスレッドはOSから見えます。

も同義語です。

特定のCPUコアで動作します。

必ずしもそうである必要はありません。

Javaプロセスが1:1スレッドモデルに従っているOSで実行されているものとします。

CPUコア上でIOを実行するJavaスレッド、

プロデューサースレッドがコンテキストにカーネルをトリガーIOを待っているんではJavaプロセスを切り替えてIOを処理する準備ができるまで待ち状態にjavaプロセスを置きます?

いいえ。他の実行可能スレッドがある場合、プロセスは実行可能なままです。

Javaプロセスの他のスレッド(CPUバインド)がCPUタイムスライスを消費する可能性はありません。

いいえ、他のスレッドは実行可能な場合でも実行できます。

これはすべて非常に混乱しており、いくつかの誤った実装固有の前提に基づいています。

+0

1:1スレッドモデルでは、*ユーザスレッド*についてのナンセンスは何ですか?*カーネルスレッド*へのマッピング? – overexchange

+0

何が正しいですか?あなたの証拠はどこですか?なぜ、あなたは3つのユーザースレッドとネイティブスレッドとカーネルスレッドを必要としますか? *はカーネルスレッドとは何ですか?あなたは何について話していますか? – EJP

+0

[ここ](https://superuser.com/a/455317/707088)については、ユーザースレッドとカーネルスレッドについて詳しく説明しています。 Wrtネイティブスレッド、私はJVMの観点から話していました。 – overexchange

関連する問題