Java-Encuadernación con IO-Modelo con enhebrado 1: 1
linux multithreading (1)
El hilo de Java se correlaciona internamente con el hilo nativo (equivalente a
pthread_create()
).
A qué se relacionan los hilos de Java depende de la implementación.
Cada pthread está mapeado a un hilo diferente en el kernel
Esto es solo una tontería.
y el kernel es responsable de programar los hilos.
Correcto, si los hilos de Java son hilos nativos.
Por lo tanto, cada subproceso Java es visible para el sistema operativo.
Correcto si ídem.
Se ejecuta en un núcleo de CPU específico.
No necesariamente.
Supongamos que el proceso de Java se está ejecutando en el sistema operativo que sigue el modelo de subprocesamiento 1: 1.
Un hilo de Java que ejecuta IO en un núcleo de CPU
¿El productor cadena de espera en IO dispara kernel al contexto, cambia el proceso java y pone el proceso java en espera hasta que el IO esté listo para ser procesado?
No. El proceso permanece ejecutable si tiene otros subprocesos ejecutables.
No tener la oportunidad de que otros subprocesos (CPU enlazados) del proceso Java consuman un segmento de tiempo de CPU.
No, los otros subprocesos aún se pueden ejecutar si son ejecutables.
Todo esto es muy confuso y se basa en una serie de suposiciones incorrectas o específicas de la implementación.
En el siguiente programa,
//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
es una tarea ejecutable vinculada a IO que se inicia en varios subprocesos que realizan la funcionalidad de IO de crawl(root)
.
El hilo de Java se correlaciona internamente con el hilo nativo (equivalente a pthread_create()
). Cada pthread se asigna a un hilo diferente en el kernel, y el kernel es responsable de programar los hilos.
Por lo tanto, cada subproceso Java es visible para el sistema operativo. Se ejecuta en un núcleo de CPU específico.
Supongamos que el proceso de Java se está ejecutando en el sistema operativo que sigue el modelo de subprocesamiento 1: 1 .
Un hilo de Java que ejecuta IO en un núcleo de CPU
¿El productor cadena de espera en IO dispara kernel al contexto, cambia el proceso java y pone el proceso java en espera hasta que el IO esté listo para ser procesado? No tener la oportunidad de que otros subprocesos (CPU enlazados) del proceso Java consuman un segmento de tiempo de CPU.