2012-03-27 12 views
5

Ho appena iniziato la programmazione con Java in caso di thread Linux, so che il kernel li programma (poiché sono le entità unità pianificate) ma i programmi java vengono eseguiti su JVM che nel mio sistema (RHEL 6.1) è implementato come un programma che viene eseguito come un'istanza di spazio utente. Quindi, senza che il kernel sia a conoscenza dei thread Java, come mai il multitasking preemptive viene eseguito in JVM? sarà utile se l'intero meccanismo di interazione JVM e kernel nel fare questa cosa è dato Permesso del PLZ citare le possibili fonti di informazioniCome sono programmati i thread java?

+1

Non sicuro, ma ogni thread Java è gestito da un thread del sistema operativo dedicato. Quindi il tuo sistema operativo non ha bisogno di essere a conoscenza di JVM ecc. –

risposta

2

Leggi Distinguish Java threads and OS threads? Come ho detto nelle discussioni commento Java sono normali discussioni OS solo in esecuzione il codice JVM

+0

sì, ma capisco come l'interpretazione del codice Java da parte dell'interprete JVM è fatta in questo ambiente multithreading – Tanay

+0

Tranne che per le azioni di sincronizzazione ogni thread interpreta il codice Java in modo indipendente come se fosse l'unico thread Quando viene creato un nuovo thread, viene detto cosa deve interpretare il codice java. –

1

jvm è solo un processo normale che inizia con un thread e può generare tutti i thread che gli piacciono in seguito. La pianificazione viene eseguita su due livelli: tra i processi e tra i thread all'interno dei processi. Tutto questo è fatto dal sistema operativo (tramite libs) - il jvm si aggancia. Discussioni di Google posix per maggiori dettagli - ecco cosa viene esposto (API) alla jvm.

Questo va un po 'nei dettagli: http://www.ibm.com/developerworks/java/library/j-rtj3/

3

discussioni nelle mappe java/processo JVM ad una discussione nativa e si può vedere sia l'ID Java e l'ID nativo in una discarica stack trace thread. Prendi il thread stack di tutti i thread Java utilizzando il tuo strumento preferito:

  • comando segnale di linea, come Ctrl + pausa (Windows) o Ctrl + \ linux) nella console dove il programma Java è in esecuzione
  • strumento a riga di comando (uccidere -quit o jstack dal JDK)
  • vm visiva nel JDK e/o JMX ecc

Esempio estratto dalla prima riga di un tale discarica filo: ... tid = 0x0000002adaba9c00 nid = 0x754c ...

  • tid = filo java id

  • nid = id nativo (solo l'ID OS)

Utilizzare gli strumenti del sistema operativo per saperne di più il filo con l'id nativo (si è in esadecimale).

All'interno del codice Java devi ThreadMXBean per recuperare ulteriori informazioni filo programatically se si vuole http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

0

", ma i programmi Java vengono eseguiti su JVM, che nel mio sistema (RHEL 6.1) è attuato come un programma che viene eseguito come uno spazio utente instance.So, senza il nocciolo essere consapevoli dei fili java ..."

Questa affermazione non è corretta per tutte le moderne JVM che utilizzano thread nativi. Penso che sia stato il default da Java 1.2. L'implementazione di un thread nativo da una JVM significa che ogni volta che un thread crea un'istanza/una thread in codice Java, la JVM chiede al sistema operativo di creare il thread. Poiché questi sono thread nativi, il kernel li conosce e li tratta di conseguenza.Inoltre, Linux supporta/implementa i thread POSIX, e come tale su un sistema basato su Linux si ottiene un comportamento pthread per i thread delle proprie applicazioni Java

Problemi correlati