Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Corsi di Laurea










ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.    Accetto l'uso dei cookie
-->
Foto

Argomenti per esame integrativo - triennale 3 CFU


  • Effettua l'accesso per rispondere
Questa discussione ha avuto 10 risposta/e

#1
Blackjack

Blackjack

    Moderatore globale

  • Moderatore
  • 2542 Messaggi:
Gli argomenti da studiare sono:

- Allocazione della memoria del Kernel (paragrafo 9.8 Silberchatz)
- Sistemi multiprocessore: architetture (parafrafo 8.1.1 Tanenbaum) e scheduling (paragrafo 5.5 Silberchatz e paragrafo 8.1.4 Tanenbaum), in particolare i 3 algoritmi di scheduling (timesharing, spacesharing, gang scheduling)
- Sincronizzazione dei processi: tutto il cap. 6 del Silberchatz, senza entrare troppo nel dettaglio del codice della parte riguardante i monitor (ma vuole comunque sapere cos'è un monitor, quali sono le motivazioni, ecc.)
- Gestione degli stalli: tutto il cap. 7 del Silberchatz
- Le chiamate di sistema: fork(), exec(), exit(), wait(), signal(), kill(), block(), wakeup() (trattate nel dettaglio sulle slides)

Oltre a questi argomenti, il prof. Ritrovato si aspetta anche che si sappiano altre cose. In primo luogo è consigliabile fare una lettura generale dei capitoli 3 e 8 del Silberchatz, specialmente la parte in cui si decrivono le problematiche di allocazione della memoria che poi portano ad adottare la soluzione della paginazione.

Una cosa che è stata chiesta a tutti è una domanda riguardante la struttura dati usata per memorizzare i segmenti buddy nell'allocazione buddy system di linux: non si è trovato alcun accenno a questa cosa nè sul Silberchatz nè sul Tanenbaum, tuttavia dovrebbe essere descritta sulle slides. In ogni caso un piccolo accenno di risposta a questa domanda è stata data dallo stesso prof: si mantiene un array di liste composto da 11 posizioni, dove la i-esima lista contiene gli indirizzi di memoria dei buddy system di dimensione $2^i$.

E' stata anche fatta una domanda, in merito alla sincronizzazione dei processi, riguardante la libreria Pthreads: è consigliabile dargli una lettura (sul Silberchatz).

Un altro argomento da vedere è il criterio in base al quale, in linux, viene assegnato un nuovo PID ad un processo appena creato (dovrebbe stare sulle slides a detta del prof.).

A volte il prof. chiede di fare un esercizio riguardante la fork(). Quello che è capitato a me è questo:

[codice-c:2vadzgoy]if (fork() && fork())
exec('B');
else
exec('C');[/codice-c]

Il prof. voleva sapere quante istanze di B vengono create e quante istanze di C. La risposta è: un'istanza di B e due istanze di C. Questo avviene perchè, supponendo un processo padre P che per la prima volta entra in questa sezione di codice, entrerà nell'if ed eseguirà la prima fork, che genera un processo figlio, per cui restituisce un valore intero > 0 (considerato TRUE in linguaggio C); dopodichè eseguirà la seconda fork generando un altro figlio. Essendo tutte e due le "condizioni" TRUE, viene eseguito exec('B'), pertanto abbiamo un'istanza di B.
Per quanto riguarda il primo figlio generato con la prima fork, il nuovo processo riprende l'esecuzione esattamente da quel punto: poichè in questo caso la prima fork ha restituito 0 (FALSE in linguaggio C), la seconda condizione dell' if non viene valutata e si va nel ramo else: abbiamo un'istanza di C.
Per il secondo figlio abbiamo lo stesso, perciò abbiamo un totale di un'istanza di B (il processo padre) e due di C (i due figli).

Un altro esercizio è il seguente:

[codice-c:2vadzgoy]for(i=0;i<10;i++)
i=fork();[/codice-c]

Cosa succede se si ipotizza un iniziale PID=100?

Vengono creati infiniti processi, dove il nuovo processo è il figlio del precedente. Si parta da un ipotetico processo padre, con PID = 100, che entri per la prima volta in questa sezione di codice. Poichè i è inizializzato a 0, si entra una sola volta nel ciclo for, perchè la fork restituirà un valore (che è il PID del processo figlio) > 100. Il processo padre esce quindi dal ciclo e prosegue; tuttavia, il processo figlio vedrà restituito dalla fork il valore 0, pertanto ripete il ciclo ed esegue nuovamente una fork, creando un nuovo figlio e poi uscendo dal ciclo, e così via...


Immagine inviata
Immagine inviata
Immagine inviata

"L'amore è la capacità di avvertire il simile nel dissimile"

#2
Flower

Flower

    Advanced Member

  • Utente
  • StellaStellaStella
  • 155 Messaggi:
Grazie Jack per questa panoramica!

Per quanto riguarda il primo esercizio in C, ho capito il ragionamento però non so se c'è qualche errore.
Ho letto che quando un processo esegue una fork() viene generato un nuovo processo figlio copia del genitore, se però, subito dopo c'è una exec possiamo sovrascrivere lo spazio degli indirizzi del processo figlio con un nuovo programma o nuova funziona, insomma con nuovo codice da eseguire come spesso si fa.
Se il padre esegue la prima exec, riceve un valore positivo e ci siamo, quando esegue la seconda accade lo stesso. la condizione dell'if è vera quindi si va sul ramo if,
e si esegue exec(B). Ora per quanto ho capito io, questa istruzione dovrebbe prendere lo spazio di indirizzi dell'ultimo (credo) processo figlio generato e sostituirlo con il programma B. Ora mi chiedo, se questo è vero, cosa succede al processo figlio con codice uguale alla funzionalità B?

Per quanto riguarda il secondo esercizio sei sicuro di questa soluzione? perchè io ho letto che il processo figlio che viene generato dalla fork() non riceve sempre 0, o meglio sui testi fanno l'esempio di 0 sempre però in realta è specificato che processo padre e processo figlio si scambiano i PID per poter ricordare il loro grado di parentela.

quindi se il padre ha inizialmente 100, e il figlio diciamo che gli verrà assegnato 101, penso che il figlio dalla fork vedrà 100 e quindi anch'esso uscira dal ciclo for.
---->Flower<----

#3
Blackjack

Blackjack

    Moderatore globale

  • Moderatore
  • 2542 Messaggi:

Ora per quanto ho capito io, questa istruzione dovrebbe prendere lo spazio di indirizzi dell'ultimo (credo) processo figlio generato e sostituirlo con il programma B. Ora mi chiedo, se questo è vero, cosa succede al processo figlio con codice uguale alla funzionalità B?

No, la exec() sostituisce lo spazio degli indirizzi del processo che l'ha richiamata, non del processo figlio.

perchè io ho letto che il processo figlio che viene generato dalla fork() non riceve sempre 0, o meglio sui testi fanno l'esempio di 0 sempre però in realta è specificato che processo padre e processo figlio si scambiano i PID per poter ricordare il loro grado di parentela.
quindi se il padre ha inizialmente 100, e il figlio diciamo che gli verrà assegnato 101, penso che il figlio dalla fork vedrà 100 e quindi anch'esso uscira dal ciclo for.

No, la fork() restituisce un intero:
< 0 se si sono verificati errori
= 0 al processo figlio
> 0 al processo padre, questo intero rappresenta il PID del processo figlio appena generato.

E' solo questo l'unico modo per capire se un processo è figlio o padre, perchè immagina un processo che viene appena creato con la fork, un figlio, che riceve come intero il valore 100, mentre il padre riceve 101. Come fa un processo a capire se è il padre o se è il figlio? Entrambi sono dei PID validi, e non di certo si può andare a vedere chi è il padre e chi è il figlio sulla base di chi ha il PID minore.
Immagine inviata
Immagine inviata
Immagine inviata

"L'amore è la capacità di avvertire il simile nel dissimile"

#4
|system88|

|system88|

    Moderatore globale

  • Moderatore
  • 4133 Messaggi:
Io non sono tanto d'accordo sul primo codice, ma forse mi sbaglio.. ora vado ad esporvi il mio dubbio...
Sul libro dice che

entrambi i processi (genitore e figlio) continuano l'esecuzione all'istruzione successiva alla fork


In base a ciò a me viene da pensare che le istanze di B sono 3 (nel caso in cui i figli sono stati creati correttamente) mentre le istanze di C possono essere 1 o 2 a seconda che almeno un figlio sia stato generato o meno...

Cosa c'è di sbagliato nel mio ragionamento?
Esistono solo due modi per scrivere un programma senza errori.
Ma e' solo il terzo modo quello che funziona realmente.

#5
Raf90

Raf90

    Advanced Member

  • Utente
  • StellaStellaStella
  • 122 Messaggi:

Io non sono tanto d'accordo sul primo codice, ma forse mi sbaglio.. ora vado ad esporvi il mio dubbio...
Sul libro dice che


entrambi i processi (genitore e figlio) continuano l'esecuzione all'istruzione successiva alla fork


In base a ciò a me viene da pensare che le istanze di B sono 3 (nel caso in cui i figli sono stati creati correttamente) mentre le istanze di C possono essere 1 o 2 a seconda che almeno un figlio sia stato generato o meno...

Cosa c'è di sbagliato nel mio ragionamento?

Anche io ho ragionato così...... :scratch:,ma :desert: è giusto? :zip:
...::: Scripta manent,verba volant :::...

#6
|system88|

|system88|

    Moderatore globale

  • Moderatore
  • 4133 Messaggi:
sinceramente non so.. blackjack non è l'unico ad aver fatto quel ragionamento... si tratta di capire se è corretto dire che anche i figli entrano nell'if o ci entra solo il padre...
Esistono solo due modi per scrivere un programma senza errori.
Ma e' solo il terzo modo quello che funziona realmente.

#7
Blackjack

Blackjack

    Moderatore globale

  • Moderatore
  • 2542 Messaggi:
system quel codice mi è stato chiesto personalmente e ti assicuro che la soluzione è quella!
Immagine inviata
Immagine inviata
Immagine inviata

"L'amore è la capacità di avvertire il simile nel dissimile"

#8
dante88

dante88

    Member

  • Utente
  • StellaStella
  • 22 Messaggi:

Gli argomenti da studiare sono:
- Sincronizzazione dei processi: tutto il cap. 6 del Silberchatz, senza entrare troppo nel dettaglio del codice della parte riguardante i monitor (ma vuole comunque sapere cos'è un monitor, quali sono le motivazioni, ecc.)


quando dici tutto il capitolo 6 intendi proprio tutto? anche la parte relativa agli esempi di Solaris, Windows, Linux, Pthreads e la parte relativa alle transazioni atomiche?

#9
dante88

dante88

    Member

  • Utente
  • StellaStella
  • 22 Messaggi:

Gli argomenti da studiare sono:
- Sincronizzazione dei processi: tutto il cap. 6 del Silberchatz, senza entrare troppo nel dettaglio del codice della parte riguardante i monitor (ma vuole comunque sapere cos'è un monitor, quali sono le motivazioni, ecc.)


quando dici tutto il capitolo 6 intendi proprio tutto? anche la parte relativa agli esempi di Solaris, Windows, Linux, Pthreads e la parte relativa alle transazioni atomiche?


up!!!

#10
Blackjack

Blackjack

    Moderatore globale

  • Moderatore
  • 2542 Messaggi:
Onestamente non mi ricordo, sorry :ggg:
Immagine inviata
Immagine inviata
Immagine inviata

"L'amore è la capacità di avvertire il simile nel dissimile"

#11
dante88

dante88

    Member

  • Utente
  • StellaStella
  • 22 Messaggi:
Scusa ma hai detto che le system call fork, exec etc. sono trattate in dettaglio sulle slide, ma io non ho trovato neanche una parola su quelle che ci sono scaricabili da rox... :oops:




Leggono questa discussione 0 utenti

0 utenti, 0 ospiti, 0 utenti anonimi