2017-10-24 11 views
-4

,자바 - 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()과 동일). 각 스레드는 커널의 다른 스레드에 대해 mapped이고 커널은 스레드를 예약합니다.

그래서 각 Java 스레드는 OS에서 볼 수 있습니다. 그것은 특정 CPU 코어에서 실행됩니다.

자바 process1:1 스레딩 모델을 따르는 OS에서 실행된다고 가정합니다. IO가 준비 될 때까지

는 IO를 기다리고 생산자 스레드 컨텍스트에 커널을 유발 하는가

는 CPU 코어에 IO를 수행하는 자바 스레드

는 자바 process을 전환하고 대기 상태로 자바 프로세스를 넣어 처리 되나요? Java 프로세스의 다른 스레드 (CPU 바운드)가 CPU 시간 슬라이스를 사용할 기회를 얻지 못합니다.

+0

프로그램을 실행하여 사실인지 확인하십시오. –

+0

@ xiaofeng.li 프로그램을 실행하기 전에 플랫폼 의존적 인 시나리오가 성능에 영향을 미친다는 점을 이해해야합니다. 제 질문을 다시 읽어주세요 – overexchange

+2

물론, 1 : 1 스레드 모델의 주요 포인트 중 하나입니다. 이것은 매우 구체적인 질문으로 위장한 운영체제 코스 숙제입니다 (즉, 코드의 세부 사항은 제작자가 대기열에 고정되어있는 동안 I/O를 차단하지 않는 한 중요하지 않습니다). 위키 링크 한 기사는 전체 프로세스를 1 : 1이 아닌 N : 1 (사용자 공간 스레드)의 단점으로 간주하는 것을 언급하기까지합니다. –

답변

0

Java 스레드는 내부 스레드에 내부적으로 매핑됩니다 (pthread_create()과 동일).

매핑 할 Java 스레드는 구현에 따라 다릅니다.

각 pthread와는 커널

이 그냥 말도에서 다른 스레드에 매핑됩니다.

이며 커널이 스레드 스케줄링을 담당합니다.

Java 스레드가 원시 스레드 인 경우 수정합니다.

그래서 각 Java 스레드는 OS에서 볼 수 있습니다.

해당하는 경우 수정하십시오.

특정 CPU 코어에서 실행됩니다.

반드시 그렇지는 않습니다.

Java 프로세스가 1 : 1 스레딩 모델을 따르는 OS에서 실행된다고 가정합니다.

는 CPU 코어에 IO를 수행하는 자바 스레드

,

는 IO를 기다리고 생산자 쓰레드 IO를 처리 할 준비가 될 때까지 컨텍스트에 커널이 자바 과정을 전환하고 대기 상태로 자바 프로세스를 넣어 트리거를합니까 ?

아니요. 다른 실행 가능한 스레드가있는 경우 프로세스가 실행 가능 상태로 유지됩니다.

Java 프로세스의 다른 스레드 (CPU 바운드)가 CPU 시간 슬라이스를 사용하지 못할 가능성이 없습니다.

아니요, 다른 스레드는 실행 가능한 경우 계속 실행될 수 있습니다.

이것은 모두 매우 혼란스럽고 여러 가지 잘못된 또는 구현 관련 가정에 의존합니다.

+0

1 : 1 스레딩 모델에서 * 사용자 스레드 * 커널 스레드 *에 매핑에 대한 말도 안되는 것은 무엇입니까? – overexchange

+0

그게 옳은가? 증거가 어딨어? 왜 사용자 스레드와 네이티브 스레드와 커널 스레드를 모두 필요로할까요? * 커널 스레드 란 무엇입니까? 너 무슨 소리 야? – EJP

+0

[여기] (https://superuser.com/a/455317/707088)에서 사용자 스레드와 커널 스레드에 대해 더 자세히 설명합니다. Wrt 네이티브 스레드, JVM 관점에서 얘기했다. – overexchange