,자바 - 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 코어에서 실행됩니다.
자바 process이 1:1 스레딩 모델을 따르는 OS에서 실행된다고 가정합니다. IO가 준비 될 때까지
는 IO를 기다리고 생산자 스레드 컨텍스트에 커널을 유발 하는가는 CPU 코어에 IO를 수행하는 자바 스레드
는 자바 process을 전환하고 대기 상태로 자바 프로세스를 넣어 처리 되나요? Java 프로세스의 다른 스레드 (CPU 바운드)가 CPU 시간 슬라이스를 사용할 기회를 얻지 못합니다.
프로그램을 실행하여 사실인지 확인하십시오. –
@ xiaofeng.li 프로그램을 실행하기 전에 플랫폼 의존적 인 시나리오가 성능에 영향을 미친다는 점을 이해해야합니다. 제 질문을 다시 읽어주세요 – overexchange
물론, 1 : 1 스레드 모델의 주요 포인트 중 하나입니다. 이것은 매우 구체적인 질문으로 위장한 운영체제 코스 숙제입니다 (즉, 코드의 세부 사항은 제작자가 대기열에 고정되어있는 동안 I/O를 차단하지 않는 한 중요하지 않습니다). 위키 링크 한 기사는 전체 프로세스를 1 : 1이 아닌 N : 1 (사용자 공간 스레드)의 단점으로 간주하는 것을 언급하기까지합니다. –