BCPL ha scritto:
Ciao a tutti , avrei una domanda da porre ai più esperti o forse più di una . Per quanto ne so , un processo "Programma" in esecuzione che in un istante...
Quella è una architettura tipica Intel con segmenti a 32 bit, non sono tutte fatte così.
Comunque...
Tra l'altro, pure su x86 i segmenti possono essere riordinati in modo diverso a seconda del sistema operativo.
il nuovo processo , viene posto subito dopo lo spazio in memoria del processo precedente ? oppure no ?
Supponendo di non usare memoria virtuale:
- Nella versione più semplice (allocazione contigua) il loader si occupa di trovare un "buco" in ram grande abbastanza da contenere tutto il programma (seguendo una strategia a scelta tra first-fit, best-fit o eventualmente worst-fit);
- Complicando leggermente le cose, è possibile allocare frammenti del programma (che non sono necessariamente i segmenti in stile x86) separatamente, e registrare in una tabella dei segmenti l'associazione tra la parte alta dell'indirizzo logico e le "coordinate" del segmento in memoria (ad esempio parte alta dell'indirizzo iniziale e lunghezza);
- Dalla versione precedente deriva la memoria paginata, dove i frammenti allocati hanno dimensioni multiple della dimensione di una pagina e al posto della tabella dei segmenti hai una tabella delle pagine che associa la parte alta dell'indirizzo logico alla parte alta degli indirizzi fisici di una pagina (in questo caso non serve conoscere la lunghezza); dal momento che la tabella delle pagine può essere molto grande (molto più di quella dei segmenti) di solito si usa un Translation Lookaside Buffer, che è sostanzialmente una piccola cache ottimizzata per effettuare questa conversione; inoltre, per ridurre le dimensioni della tabella delle pagine, solitamente la si organizza su due o più livelli, ottenendo nel caso più generale un unclustered prefix B-tree, oppure si usano altri metodi, come una tabella di hash;
Se invece si suppone di usare memoria virtuale, nella tabella delle pagine è presente un bit di validità che indica se quella pagina è presente in ram o deve essere prelevata dal disco. Il loader in questo caso può usare varie strategie per caricare il programma, che vanno dal caricare una singola pagina contenente il codice di startup a caricare tutto il programma finché c'è spazio. Inoltre, il numero minimo di pagine che devono stare in ram per poter garantire l'esecuzione del programma dipendono dall'architettura (in alcuni casi servono almeno 17 pagine (a meno che il programma non sia più breve)).
Una volta avviata l'esecuzione, lo swapper si occupa di gestire lo spostamento delle pagine tra ram e disco, e anche qui possono essere usate una marea di strategie diverse, per cercare di ottenere il miglior compromesso tra hit-ratio e numero di processi eseguibili contemporaneamente.