2012-10-17 13 views
6

Queste domande mi sono venute in mente quando stavo studiando la pianificazione dei processi.In che modo il sistema operativo esegue file binari compilati?

In che modo il sistema operativo esegue e controlla l'esecuzione di file binari e compilati? Ho pensato che forse il sistema operativo copia una parte del file binario in qualche posizione di memoria, salta lì, ritorna dopo aver eseguito quel blocco ed esegue quello successivo. Ma allora non avrebbe alcun controllo su di esso (ad esempio il programma può fare un salto ovunque e non tornare indietro).

Nel caso JVM ha perfettamente senso, la VM sta interpretando ogni istruzione. Ma nel caso di file binari le istruzioni sono reali istruzioni eseguibili dalla CPU, quindi non penso che un sistema operativo agisca come una macchina virtuale.

+0

Sei consapevole di come una CPU esegue le istruzioni della CPU? – sll

+0

Sì, l'anno scorso ho progettato una CPU super semplice (un registro generale, registro per memorizzare istruzioni e PC e forse 5 istruzioni) e un design RISC un po 'più complesso all'università ora con Verilog. – Gediminas

risposta

4

Fa esattamente questo. Il sistema operativo, in un certo ordine,

  • crea una voce nella tabella dei processi
  • crea uno spazio di memoria virtuale per il processo di
  • carica il codice di programma nella memoria del processo
  • punti l'istruzione processo puntatore al punto di ingresso del processo
  • crea una voce nel programma di pianificazione e imposta il thread di processo pronto per l'esecuzione.

La concorrenza non viene gestita dal programma che viene suddiviso in blocchi. Il passaggio da una task all'altra avviene tramite interrupt: prima che a un processo venga assegnata la CPU, viene impostato un timer. Al termine del timer, la CPU registra un interrupt, spinge il puntatore dell'istruzione nello stack e salta al gestore di interrupt definito dal sistema operativo. Questo gestore memorizza lo stato della CPU in memoria, scambia una tabella di memoria virtuale e ripristina altri thread pronti per l'esecuzione. Lo stesso scambio si verifica se il thread deve sospendere per qualche altro motivo (in attesa di utente/disco/rete ...) o rendimento.
http://en.wikipedia.org/wiki/Multitasking#Preemptive_multitasking.2Ftime-sharing

Nota che basandosi sul processo cedendo la CPU è possibile, ma inaffidabile (il processo non può cedere, impedendo altri processi di esecuzione)
http://en.wikipedia.org/wiki/Multitasking#Cooperative_multitasking.2Ftime-sharing

sicurezza viene manipolato commutando la CPU in modalità protetta dove il codice dell'applicazione non può eseguire alcune istruzioni (quindi saltare in modo casuale è per lo più innocuo). Vedi the link provided by @SkPhilipp

Si noti che la JVM moderna non interpreta ogni istruzione (che sarebbe lenta). Invece si compila in codice nativo ed esegue il codice o (in caso di compilazione just-in-time) in un primo momento, ma compila gli "hot spot" (il codice che viene eseguito abbastanza spesso).