Come i processi multipli sono archiviati nella memoria principale, capisco che ogni processo sarà diviso in pagine di uguale dimensione e sarà archiviato nei frame della memoria principale. se tutta la memoria principale è suddivisa nelle pagine, allora come sono le aree dello stack, l'area dell'heap, la sezione del codice data al processo?
La mia comprensione è che c'è un'area di stack e un'area heap comuni.
la prossima domanda è: - quando un metodo viene eseguito, viene allocato nell'area dello stack e un record di attivazione viene inserito nello stack.
Sto anche considerando qui il cambio di contesto. ad esempio:
---------------
| process: p1 |
---------------
fun(int a)
{
if (a=0)
return 0;
fun(a--);
}
main()
{
fun(5);
}
---------------
| process: p2 |
---------------
NoFun(int a)
{
if (a=0);
return 0;
NoFun(a--);
}
main()
{
fun(3)
}
ora i processi p1 e p2 saranno caricati nella memoria principale, ora supponiamo che p1 abbia iniziato la sua esecuzione in modo che venga chiamato il suo primo metodo main e i suoi record di attivazione saranno inseriti nello stack ora chiamate main metodo fun () ed è iniziato eseguendo e dopo qualche tempo questo processo viene anticipato e avviene il cambio di contesto (il puntatore dello stack di p1 salverà l'indirizzo di p1.fun (3)). quindi le chiamate avranno un aspetto simile a questo: -
p1.main () - > p1.fun (5) - > p1.fun (4) - > p1.fun (3)
quindi main è nella parte inferiore dello stack e fun (3) è in cima allo stack, ora p2 ha la possibilità di eseguire l'operazione, quindi il metodo principale del processo p2 verrà eseguito e verrà inserito nella parte superiore del stack cioè sulla parte superiore del record di attivazione di fun (3). così ora sarà simile a questo
p1.main () - > p1.fun (5) - > p1.fun (4) - > p1.fun (3) - > p2.main ()
il suo tempo per p2 per essere preventivato, P1 ottiene di nuovo CPU e avvia l'esecuzione ora p1 riprende il suo contesto e va all'indirizzo del puntatore dello stack e inizia l'esecuzione del codice rimanente.
quindi dopo l'esecuzione di p1, lo stack sarà simile a questo: -
p1.main () - > p1.fun (5) - > p1.fun (4) - > p1.fun (3) - > p2.main () - > p1.fun (2) - > fun (1) - > divertimento (0)
ora p1 avvierà i record di popping: -
p1.fun (0) viene estratto. p1.main () - > p1.fun (5) - > p1.fun (4) - > p1.fun (3) - > p2.main () - > p1.fun (2) - > fun (1)
p1.fun (1) viene estratto. p1.main () - > p1.fun (5) - > p1.fun (4) - > p1.fun (3) - > p2.main () - > p1.fun (2)
p1.fun (2) viene estratto. p1.main () - > p1.fun (5) - > p1.fun (4) - > p1.fun (3) - > p2.main ()
ora p1 è nella CPU e non sarà in grado di eseguirlo perché lo stack top è del processo 2.
So che la mia comprensione è sbagliata, per favore correggimi e dona qualche rifrazione.