を、の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タイムスライスを消費する可能性がありません。
プログラムを実行して、それが真であるかどうかを確認してください。 –
@ xiaofeng.liプログラムを実行する前に、これはパフォーマンスに影響するプラットフォームに依存するシナリオであることを理解する必要があります。再度私のクエリをお読みください – overexchange
もちろん、それは1:1スレッドモデルの主要なポイントの1つです。これはあなたのオペレーティングシステムコースの宿題で、非常に具体的な質問があります(つまり、コードの詳細は問題ありません。プロデューサーがキューにロックしている間I/Oをブロックしない限り)。リンクした記事でも、プロセス全体をN:1(ユーザー空間スレッド)の欠点としてブロックしていると言われていますが、これは1:1ではなく、それにのみ適用されます。 –