Your SlideShare is downloading. ×

Costrutti linguistici

143

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
143
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. COSTRUTTI LINGUISTICICOSTRUTTI SPECIFICI PER LA CONCORRENZA S TRUTTURE D ATI DESCRITTORE PROCESSO Typedef struct{ PID nome; modalita_di_servizio servizio; tipo_contesto contensto; tipo_stato stato; PID padre; int N_figli; des_figlio prole[max_figli]; p_des successivo; } des_processo; PUNTATORE ALL’ELEMENTO SUCCESSIVO typedef des_processo * p_des; PI D typedef int PID; MODALITÀ DI SERVIZIO typedef struct { int priorita; int delta_t; } modalita_di_servizio; DESCRITTORE FIGLIO Typedef struct { PID figlio; boolean terminato; } CODA DI DESCRITTORI Typedef struct{ P_des primo, ultimo; } des_coda;
  • 2. F UNZIONID ISPONIBILI PID assegna_nome(); p_des descrittore(PID x); void inserimento(p_des pro, des_coda coda); p_des prelievo(des_coda coda);I MPLEMENTAZONEM O N O P R O C ES SO R ESALVATAGGIO STATO Void salvataggio_stato(){ P_des esec = processo_in_esecuzione; esec->contesto= //valori dei registri della CPU// }RIPRISTINO STATO Void Ripristino_stato(){ P_des esec = processo_in_esecuzione; //valori dei registri della CPU//=esec->contesto; }ASSEGNAZIONE CPU void assegnazione_cpu{ int k=0; p_des p; while (coda_processi_pronti[k].primo == null) k++; p=prelievo(coda_processi_pronti[k]); }PIE ( P R O C E S S O I N E S E C U Z I O N E ) PID PIE(){ PID nome_processo_in_esecuzione; p_des esec = processo_in_esecuzione; nome_processo_in_esecuzione = esec->nome; return nome_processo_in_esecuzione; }
  • 3. ATTIVA Void attiva(p_des proc){ P_des esec = processo_in_esecuzione; int pri_esec = esec->servizio.priorita; int pri_proc = proc->servizio.priorita; proc->stato = //PROCESSO ATTIVO//; if(pri_esec>pri_proc){ inserimento(esec,coda_processi_pronti[pri_esec]); processo_in_esecuzione = proc; } else { Inserimento(proc,coda_processi_pronti[pri_proc]); } }FORK Risultato fork(des_processo inizializzazione){ P_des p; int NF; p_des esec = processo_in_esecuzione; if (descrittori_liberi.primo == null){ return eccezione; } else { p=prelievo(descrittori_liberi); *p=inizializzazione; p->nome = assegna_nome(); p->padre = esec->nome; esec->N_figli++; NF=esec->N_figli; esec->prole[NF].figlio=p->nome; esec->prole[NF].terminato=false; attiva(p); return ok; } }JOIN Void join(PID nome_figlio){ p_des esec = processo_in_esecuzione; int k = indice_figlio(esec,nome_figlio); if(esec->prole[k].terminato == false){ esec->stato = //SOSPESO IN ATTESA DEL FIGLIO// Assegnazione_CPU(); } }QUIT Void quit(){ P_des esec = processo_in_esecuzione; PID nome_padre = esec->padre; p_des p_padre = descrittore(nome_padre);
  • 4. int k = indice_figlio(p_padre, esec->nome); p_padre->prole[k].terminato=true; inserimento(esec, descrittori_liberi); if(p_padre->stato==//attende che il figlio termini//){ int pri = p_padre -> servizio.priorita; inserimento(p_padre, coda_processi_pronti[pri]); p_padre->stato = //processo attivo//; } Assegnazione_cpu(); }INTERRUZIONE TEMPORIZ ZAZIONE (TIME SLICE) Void interruzione_temporizzazione(){ P_des esec = processo_in_esecuzione; int k; k = esec->servizio.priorita; inserimento(esec, coda_processi_pronti[k]); assegnazione_cpu(); }M UL T I P R O C E SSO R EIl codice rimane sostanzilmente identico. Tranne per il fatto che l’accesso acoda_processori_liberi e descrittori_liberi deve essere esclusivo. Inoltre processo inesecuzione dovrà essere un array.

×