Send/receive sincrona, assumendo che la condivisione avvenga mediante riferimenti logici coincidenti, invece che con capability.

Documenti analoghi
Sottoprogrammi: astrazione procedurale

CAPITOLO 7 - SCAMBIO DI MESSAGGI

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Comunicazione. La comunicazione point to point e' la funzionalita' di comunicazione fondamentale disponibile in MPI

GESTIONE INFORMATICA DEI DATI AZIENDALI

Modello a scambio di messaggi

ESERCIZIO 1 1. Traccia 1. Analisi 2. Codifica programma 7. frame nel seguente modo: il primo byte dice la lunghezza complessiva del frame,

Corso di Sistemi Operativi Ingegneria Elettronica e Informatica prof. Rocco Aversa. Raccolta prove scritte. Prova scritta

Struttura a record. File ad accesso diretto. Modalità di apertura. Modalità di apertura

Sistemi Operativi. Lez. 13: primitive per la concorrenza monitor e messaggi

= 0, 098 ms. Da cui si ricava t 2 medio

Sistema operativo: Gestione della memoria

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Traccia di soluzione dell esercizio del 25/1/2005

Tecniche di traduzione da C ad assembly Note generali

Algoritmi di Ricerca. Esempi di programmi Java

Il costrutto monitor [Hoare 74]

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. D. Talia - UNICAL. Sistemi Operativi 9.1

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

Blue s One CTI Enterpris Blue s Attendant Pro/Enterprise SDK - plugin creating tools

Quinto Homework. Indicare il tempo necessario all'esecuzione del programma in caso di avvio e ritiro fuori ordine.

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Giornale di Cassa e regolarizzazione dei sospesi

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Appunti di Sistemi Operativi. Enzo Mumolo address web address :

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

FOXWave Gestione gare ARDF IZ1FAL Secco Marco Sezione ARI BIELLA

Testi di Esercizi e Quesiti 1

CALCOLATORI ELETTRONICI A cura di Luca Orrù. Lezione n.7. Il moltiplicatore binario e il ciclo di base di una CPU

LABORATORIO DI SISTEMI

Il problema del produttore e del consumatore. Cooperazione tra processi

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. Implementazione del File System. Struttura del File System. Implementazione

Esempio produttori consumatori. Primitive asincrone

COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO e PARAMETRI2015

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Monitor. Introduzione. Struttura di un TDA Monitor

La selezione binaria

Introduzione ai Metodi Formali

Il descrittore di processo (PCB)

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Elementi di Architettura e Sistemi Operativi

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

CREAZIONE ARCHIVI 2014

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

FPf per Windows 3.1. Guida all uso

Esercitazione finale per il corso di Sistemi Operativi (A.A. 2004/2005)

Architettura (10/9/2003) Pag. 1/6. Cognome e Nome (in stampatello):

SISTEMI OPERATIVI. Sincronizzazione dei processi. Domande di verifica. Luca Orrù Centro Multimediale Montiferru 30/05/2007

Capitolo Quarto...2 Le direttive di assemblaggio di ASM Premessa Program Location Counter e direttiva ORG

MANUALE PARCELLA FACILE PLUS INDICE

Configurazione account di posta elettronica certificata per Qualcomm Eudora

Allocazione dinamica della memoria - riepilogo

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

dall argomento argomento della malloc()

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

Il memory manager. Gestione della memoria centrale

Sistemi Operativi GESTIONE DELLA MEMORIA CENTRALE. D. Talia - UNICAL. Sistemi Operativi 6.1

Cosa è un foglio elettronico

Il costrutto monitor [Hoare 74]

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Sistemi Operativi Esercizi Sincronizzazione

Breve riepilogo della puntata precedente:

IPC System V. Code di messaggi

MODELLO AD AMBIENTE GLOBALE

Funzioni matlab per la gestione dei file. Informatica B Prof. Morzenti

Coordinazione Distribuita

MULTIPROGRAMMAZIONE E PROTEZIONE. G. Frosini Multiprogrammazione e Protezione Slide 1

CPU. Maurizio Palesi

Hazard sul controllo. Sommario

Gestione Risorse Umane Web

1) GESTIONE DELLE POSTAZIONI REMOTE

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Dipartimento per le Libertà Civili e l Immigrazione

DMA Accesso Diretto alla Memoria

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Dipartimento per le Libertà Civili e l Immigrazione

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Progetto Lauree Scientifiche Liceo Classico L.Ariosto, Ferrara Dipartimento di Matematica Università di Ferrara 24 Gennaio 2012

costruttori e distruttori

TEST: Hardware e Software

Arduino: Programmazione

Esercizi. Assembly. Alessandro A. Nacci ACSO 2014/2014

memoria virtuale protezione

Il tipo di dato astratto Pila

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008

Il programmatore che c e in noi Lezione 12 Statements

Architettura di un sistema di calcolo

Express Import system

puntatori Lab. Calc. AA 2007/08 1

La struttura dati ad albero binario

Programmazione dinamica

Matlab: Gestione avanzata dei file

Transcript:

Implementazione delle primitive di comunicazione Send/receive sincrona, assumendo che la condivisione avvenga mediante riferimenti logici coincidenti, invece che con capability. Struttura dati canale { boolean wait; // registra che un partner della comunicazione è in attesa boolean vuoto; // registra che il buffer sia vuoto (inizializzato a true) int len; // lunghezza del messaggio (sizeof(t)) PTR pcb; // indirizzo del PCB del processo partner in attesa PTR indvtg; // indirizzo della variabile targa T buffer; // spazio per la memorizzazione del messaggio // (T è il tipo del canale) Codice ad alto livello send(ch, msg) { if(wait) { // il destinatario ha già cominciato la receive ed è in attesa // pcb contiene il puntatore al suo PCB per la sveglia // vtg contiene l indirizzo della variabile targa wait = false; copia(msg,indvtg); // msg -> (msgvtg) vuoto = true; sveglia(pcb); else { // buffer libero, il destinatario non ha ancora invocato la receive // posso copiare il messaggio nel buffer e mettermi in attesa wait = true; copia(msg,buffer); // msg -> buffer vuoto = false; commutacontesto(); receive(ch, vtg) { if(vuoto) { // registro pcb, indirizzo vtg e mi blocco wait = true; pcb = miopcb(); indvtg = indirizzo(vtg); commutacontesto(); else { // c e già un messaggio nel canale e il mittente è in attesa wait = false; vtg = buffer; vuoto = true; sveglia(pcb); In questo caso, assumiamo che la copia dal mittente al destinatario avvenga mediante passaggio nel buffer di canale quando il mittente esegue la send prima della receive:

Speditore S E N D msg Canale Ricevitore msg R E C V e che la copia avvenga direttamente dal mittente alla variabile targa del destinatario quando la receive viene invocata prima della send: Ricevitore Speditore @vtg Canale @vtg R E C V S E N D msg VTG

Implementazione in ASM D-RISC Strutture dati utilizzate tabella dei canali: Vettore di maxchan posizioni con base RbaseTabChan. La posizione i contiene lʼindirizzo del canale i-esimo canale: offset 0: wait (0 è false, 1 è true) offset 1: vuoto (0 è false, 1 è true) offset 2: len (lunghezza in parole del messaggio) offset 3: pcb (indice nella tabella dei PCB per il PCB del processo in attesa) offset 4: indvtg (indirizzo logico della variabile targa) offset 5 e seguenti: buffer (buffer per il messaggio) tabella dei PCB: vettore di indirizzi di PCB la posizione i contiene lʼindirizzo del PCB del processo di identificatore i Send send: DI LD RbasePcb, #offsettabch, RbaseTabChan // indirizzo base della tabella canali LD RbaseTabChan, Rchan, RbaseChan // mi procuro lʼindirizzo del canale LD RbaseChan, #0, Rwait // flag wait IF=0 Rwait, else // se!wait, ramo else (false = 0) then: ST RbaseChan, #0, R0 // wait = false (0!) LD RbaseChan, #4, Rvtg // indirizzo della vtg dal canale LD RbaseChan, #2, Rlen // copia del messaggio da msg a vtg CLEAR Ri // inizializzazione i e N loop: LD Rmsg, Ri, Rtemp // lettura parola del messaggio ST Rvtg, Ri, RTemp // scrittura parola nella vtg INC Ri // i++ IF< Ri, Rlen, loop // se <N cicla ADD R0, #1, Rtemp // true ST RbaseChan, #1, Rtemp // vuoto = true LD RbaseChan, #3, RinPcbSveglia // parametro della sveglia processo CALL Rsveglia, RretSend // chiama sveglia processo

GOTO cont // fine ramo then else: CLEAR Ri // variabile di iterazione LD RbaseChan, #5, Rbuffer // indirizzo buffer LD RbaseChan, #2, Rlen // parole da trasferire loop1:ld Rmsg, Ri, Rtemp // copia msg -> ST Rbuffer, Ri, Rtemp // -> buffer INC Ri // i++ IF< Ri, Rlen, loop1 // continua ST RbaseChan, #3, Rpcb // memorizza indirizzo PCB ADD R0, #1, Rtemp // true ST RbaseChan, #0, Rtemp // wait = true ST RbaseChan, #1, R0 // vuoto = false CALL Rcommuta_contesto, Rret1 // commuta contesto cont: GOTO Rret, EI // ritorna al chiamante Receive receive: DI LD RbasePcb, #offsettabch, RbaseTabChan // indirizzo base della tabella canali LD RbaseTabChan, Rchan, RbaseChan // mi procuro lʼindirizzo del canale LD RbaseChan, #1, Rvuoto // flag vuoto IF=0 Rvuoto, else // se!wait, ramo else (false = 0) then: ADD R0, #1, Rtrue ST RbaseChan, #0, Rtrue // wait = true ST RbaseChan, #3, Rpcb // pcb = miopcb ST RbaseChan, #4, Rvtg // indvtg = indirizzo(vtg) CALL commuta_contesto, Rret1 // commuta_contesto(); // salva Rret1 come IC per ripristino // questo è il punto dove la sveglia processo mi fa ritornare GOTO cont else: ST RbaseChan, #0, R0 // wait = false // copia messaggio da buffer a variabile targa CLEAR Ri LD RbaseChan, #2, Rlen LD RbaseChan, #5, Rbuffer loop: LD Rbuffer, Ri, Rtemp

ST Rbuffer, Ri, Rtemp INC Ri IF< Ri, Rlen, loop ST RbaseChan, #1, Rtrue // vuoto = true LD RbaseChan, #3, RinPcbSveglia // pcb processo da svegliare CALL RsvegliaProcesso, Rret1 // sveglia(pcb); cont: GOTO Rret, EI // ritorna controllo al chiamante

Commuta contesto La commuta contesto deve: 1) salvare lo stato del processo corrente nellʼarea dedicata nel suo PCB 2) salvare in tale area il valore corretto del PC di ritorno 3) accedere alla testa della lista dei pronti 4) trovare il PCB del processo da mandare in esecuzione, 5) modificare la testa della lista dei processi pronti 6) trovare lʼindirizzo della tabril, mediante il PCB 7) ripristinare i registri dal PCB appena trovato 8) saltare alla istruzione puntata dal PC trovato nel PCB con la start process Assumiamo che la lista dei processi pronti sia implementata mediante un campo del PCB che contiene il puntatore al prossimo PCB della lista. Una locazione PRONTI, accessibile perchè il puntatore logico è presente in tutti i PCB permette di recuperare il primo PCB della lista dei pronti. Un puntatore pari a 0 ha significato di fine lista (NULL) PCB identificatore di processo indirizzo del prossimo pcb nella lista dei pronti (o NULL=0) puntatore alla lista dei pronti puntatore alla tabella dei canali puntatore alla tabella dei PCB puntatore alla tabella di rilocazione area salvataggio registri generali (comprende una locazione per il PC, che non è un registro generale, ma che serve per/durante la commutazione di contesto) Assumiamo che una entry per la tab ril contenga (assumiamo che le pagine siano da 4K, e che quindi il numero di pagina (logio o fisico) richieda 32-12 = 20 bit per la sua rappresentazione): 20 11 1 IPF Bit Prot P

commuta_contesto: // parametri Rpcb indirizzo del PCB -> wait // Rret indirizzo di ritorno della procedura (!) // salvataggio stato LD Rpcb, #offsetareasalvataggio, Rsalva ST Rsalva, #1, R1 ST Rsalva, #2, R2... ST Rsalva,#59, R59 // assumendo che gli altri reg siano gestiti a parte // cioè inizializzati con i puntatori giusti una volta // per tutte nellʼarea di salvataggio registri del PCB // salvataggio IC nellʼarea relativa al salvataggio registri ST Rsalva, #offsetic, Rret // è stata chiamata con param Rpcb e Rret // PCB del processo da mandare in esecuzione dalla lista dei pronti // se la lista è con puntatori logici al prossimo pcb, la variabile pronti è // già il puntatore al PCB del processo da mandare in esecuzione LD Rpcb, #offsetpronti, Rpronti // testa della lista dei pronti LD Rpcb, #offsetlistapronti, Rpcb // assumiamo che non sia mai vuota // eventualmente cʼè il processo vuoto // aggiustamento della testa della lista dei processi pronti LD Rpcb, #offsetnextlistapronti, RnuovaTestaPronti ST Rpronti, #0, RnuovaTestaPronti // indirizzo della tabril del nuovo processo da comunicare alla MMU // mediante una START_PROCESS LD Rpcb, #offestindlogtabril, Rtabril // indirizzo tabril da PCB del nuovo proc // trovo indirizzo fisico da mandare a MMU SHR 12, Rtabril, Rtemp // shift a ds di 12 pos, risultato in Rtemp LD Rtabril, Rtemp, RentryTabRil SHR 12, RentryTabRil, RentryTabRil // questi due shift SHL 12, RentryTabRil, Rtabril2MMU // cancellano i bit bassi della entry // lasciando nel reg lʼindirizzo fisico // (si assume che sia allineato alla pagina!) // ripristino registri LD Rpcb, #offsetareasalvataggio, Rsalva // indirizzo area salvataggio LD Rsalva, #1, R1 LD Rsalva, #2, R2... LD Rsalva, #62, R62 // recupera il valore corretto di IC LD Rsalva, #offsetic, Ric // registro cui si salta alla fine per riprendere lʼesecuzione LD Rsalva,#63, R63 // Rsalva sarà R63 così è scritto quando non serve più // fai ripartire il processo START_PROCESS Rtabril2MMU, Ric

La parte bordata è relativa al recupero dellʼindirizzo fisico della tabella di rilocazione da mandare alla MMU mediante la START_PROCESS, nellʼipotesi che la MMU riceva appunto un indirizzo fisico. In questo caso si è assunto che le tabril dei vari processi siano condivise, come la tabella dei canali o dei PCB, e pertanto, conoscendone lʼindirizzo logico, possiamo accedervi anche se in quel momento è in uso la tabella di rilocazioni di un altro processo. Se invece volessimo utilizzare nella START_PROCESS un indirizzo logico, questo codice potrebbe essere sostituito dal seguente codice: // mi procuro lʼindirizzo logico della Tabril del nuovo processo // da passare con la START_PROCESS alla MMU LD Rpcb, #offestindlogtabril, Rtabril2MMU

Sveglia processo Parametri della sveglia processo: Rpcb: indirizzo del PCB del processo da svegliare Rret: indirizzo di ritorno della procedura Assunzione: nella lista dei pronti cʼeʼ un id (indice del PCB nella tabella dei processi) lʼid è accessibile da PCB (è un campo del PCB) Sorrimento della lista dei pronti per trovare lʼultima posizione punt = pronti; while(pronti!= NULL) { punt = pronti; pronti = next(pronti); sveglia:ld Rpcb, #offsetlistapronti, Rpronti // testa lista pronti // si scorre la lista fino a che non si arriva in fondo // punt=pronti; while(pronti!= 0) { punt = pronti; pronti = pronti.next; MOV Rpronti, Rpunt loop: IF=0 Rpronti, cont MOV Rpronti, Rpunt LD Rpronti, #offsetnextlistapronti, Rpronti goto loop cont: // link del PCB alla lista ST Rpcb, #offsetnextlistapronti, R0 // puntatore null, sono lʼultimo ST Rpunt, #offsetnextlistapronti, Rpcb // metto il PCB in lista // adesso ho finito posso restituire il controllo al chiamante GOTO Rret