Anteprima
Vedrai una selezione di 10 pagine su 52
Sistemi operativi - Appunti Pag. 1 Sistemi operativi - Appunti Pag. 2
Anteprima di 10 pagg. su 52.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 6
Anteprima di 10 pagg. su 52.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 11
Anteprima di 10 pagg. su 52.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 16
Anteprima di 10 pagg. su 52.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 21
Anteprima di 10 pagg. su 52.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 26
Anteprima di 10 pagg. su 52.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 31
Anteprima di 10 pagg. su 52.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 36
Anteprima di 10 pagg. su 52.
Scarica il documento per vederlo tutto.
Sistemi operativi - Appunti Pag. 41
1 su 52
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

Sistemi Operativi

AA 2021/2022 UNIFI

Vittorio Sodini

Gestione I/O

  • Dispositivi
  • Interfaccia
  • Driver

I/O due tipi:

  • Sincrono
  • Asincrono

DMA Controller

Puntatori

  • Registri
  • Bus PCIe

DMA Request

  • Bufferizzazione
  • Clustering

Gestione Processi

Process Control Block (PCB)

Scheduling

  • A lungo termine
  • A breve termine
  • A medio termine

Thread

  • Pthread
  • In Java
  • Problematica

Variabili d'ambiente

Sincronizzazione

Concurrency

Sync Process

Monitor

  • Wait
  • Signal

Sezione critica

Semafori

Attesa limitata

Alte problemi

Struttura I/O

Un controllore di dispositivo ha buffer e regs.

  • Si occupa del data transfer tra periferica e buffer.
  • Per ogniuno c'è un driver che uniforma l'interfaccia.
  • A buffer carico, une interrupt avverte il driver, che passa il controllo al SO e restituisce dati e puntatori.
  • Adatto a piccoli dati.

DMA

  • Una volta impostati buffer, puntatori, contatori necessari, il controllore trasferisce in blocco i dati direttamente tra mem centrale e dispositivo (bypass CPU).

Architettura CPU

  • mono processore
  • multi processore:
    1. + veloci: n.b.: γ(n CPUs) ≠ γ(1 CPU) · n
    2. economia di scala: Se più programmi devono lavorare sugli stessi dati.
    3. + affidabili: comportamento migliore ai guasti (anche tolleranza).

Tipi multiprocessore

  • multielaborazione asimmetrica: es: 1 solo CPU = programma, gestore
  • multielaborazione simmetrica:
    • CPU può giocare qualunque parte
    • proprie set di reg e cache

CPU multicore

multiprocessore in un unico chip

  • + veloce risp a cpu separate
  • potenza richiesta

Appaiono come n processori ordinarii

Struttura del SO

  • Features

Computazione client-server

  • Tipi di server
    • server elaborativi (compute server): interfaccia a servizi
    • file server: esecutore di file
  • Peer-to-peer
    • cade distinzione client-server: tutti pari
    • per entrare a fare parte un nodo deve unirsi alla rete
      • con reg. centralizzato
        • un nodo iscrive il proprio servizio nel reg. autorizzato
        • c. contattato (iniziale) avviene tramite il registro
      • con protocolo di scoperta
        • ➔ ? reg; i nodi si provano volta in volta i servizi tramite p.d. scoperta

Protezione e sicurezza presuppongono conoscere ID user gruppi, ?st privilegiati

Progettazione di un SO

Preferibile perché altrimenti richiederebbe ricompilazione kernel ogni volta

Ricorda sis stratificato ma è + flessibile , + eff perché i moduli non devono invocare la funzionalità di trasmissione di messaggi .

Processi Java

  1. Il metodo exec() della classe Runtime permette di eseguire un proc
    • Es Windows:

      Process p = Runtime.getRuntime().exec("notepad.exe");

      System.out.println("attendo che finisca...")

      p.waitFor(); // attende che il processo generato finisca

      System.out.println("finito!");

Sempre meglio usare Thread (Cap succ.) con Java per portabilità

  1. Tramite obj Process si può usare
    • p.getInputStream
    • p.getOutputStream
    • p.getErrorStream
    • p.destroy

Problematiche Programmazione Multithread

  1. Ambiguità fork()

    Se un thread invoca fork() il nuovo process potrebbe contenere un duplicato di tutti i thread. Su Linux duplica solo chiamante, ma può generare errori in quanto gli altri thread possono lasciare memoria del nuovo processo in stato inconsistente e generare problemi se si tenta exec (prog) sostituisce l'intero process, inclusi i thread, col prog specificato.

  2. Cancellazione dei thread (più specifiche in fondo)

    Terminare un thread prima che completi il suo compito. Def Thread bersaglio: quello da cancellare. Può avvenire in 2 modi:

    • cancellazione immediata
    • cancellazione differita
  3. Dati specifici dei Threads (TLS)

    Thread e e stesso process condividono i dati. Tuttavia ogni thread può ospitare una copia per alcuni dati - TLS - visibili attraverso tutte le chiamate (≠ da var locali). Sono tipo var globali limitate al singolo thread (o static). Alcuni SO già forniscono un'area.

Linux Threads

Linux non distingue tra processi e thread — task. Con clone() è possibile generare un nuovo 'thread': riceve come parametro un insieme di flags al fine di stabilire qualcosa risorse del task genetore dobbiamo essere condivise col figlio (e.g.: CLONE_FS: info su file sys,, CLONE_FILES info su file aperti ... ). Se nessun flag e impostato non si fa condivisione e otteniamo una funzionalità simile a fork().

Quando si usa fork() si crea un nuovo task contenente una copia di tutte le str dati usate dal genitore clone i puntatori alle str dati, a seconda dei flags.

PThreads

API standard POSIX per la creazione e la sync di threads. È una specifica del comportamento dei thread, i progetisti di OS devono implementarlo come meglio credono.

pthread_create() crea un nuovo thread associato ad una funzione e lo esegue.

#include <pthread.h> pthread_t tid; // ID del task pthread_attr_t attr; // attr per la creazione pthread_attr_init (&attr); // inizia con alcuni di default int r = pthread_create (&tid, &attr, thread_function, param); // ret 0 se OK

pthread_join() attende la terminazione di un thread e permette di ottenere il val ritornato dalla funzione associata al thread. pthread_join(tid, &ret_val) // posso anche solo aspettare cancellazione con NULL.

Uso dei semafori

Si distingue tra:

Semafori contatore

Usati per controlli dell'accesso a una data risorsa, presente in un # finito di esemplari.

Il semaforo è una impostazione di una risorsa: implementa il processo, dichiarano avanzamento:

wait (s) semaforo S... - I processi che restituiscono una risorsa inviano signal ( ) su S, ov. S++.

Quando S = 0 - unit (che r.1 e r2 sono occupate, e può che m.endev.

L'uso dovrammi bloccarci fino a che non torni positivo.

I semafori sono utilizzabili da risorse così come per sincronizzare i processi:

Problemi:

  • A) garantire che i due proc. non possano eseguire signal e wait sullo stesso S contemporaneamente.
  • B) wait() effettua comunque una busy waiting - occupa CPU inutilmente -

Per risolvere A) si va su hardware paravt

B) si fa in modo che la wait divenute s=0 alazione viendiere sempre CPU

‘blocchi’ il process- da exec a waiting - con “block()” - e si onca coda d’attesa asocial aI semaforo

Un processo bloccato sarà rinvolta con o . wakeup ( ,) - de lo nimuale dalla coda d’attesa -

=> Ready Que

Realizzazione:

typedef struct {

  • int value ;
  • struct process * list ;

} semafore ; lista proc. in attesa al semaforo

segnal preleva da questa lista e ie ua

Implement. di wait()

wait ( semaphor * S) { S - value -= ; if ( S - value < = 0 ) block() ;}

Implementazione di wakeup()

signal ( semaphore * S) { S - value + += ; if ( S - value > 0 ) wakeup(); /* rim. processo P da S-list */}

Stallo (o deadlock)

: due e più processi operativano indefinitivamente un evento che può esere

generato solo da uno dov. e dei processi in attesa.

Attesa indefinitiva (o starvation)

: un processo non puÒ’ mavi essere rimosso della coda di un semaforo daz e‘

sospeso (es: LIFO) mai a lui )

Inversione delle priorità

problema ch sima versi queand un proc a alta priorità deve mod.dati il kernelt

utilizçando un fe muyo, a bassa priorità. Tipicamente provetro da Prior -> =

Tiama deve allendere Pz. la sitación si compica se che rl’azione .

Per ris, si avvia protocollo di ereditarietà delle prionate que trasf a P2 a la priorità di Pz

Dettagli
Publisher
A.A. 2021-2022
52 pagine
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher aztepeng di informazioni apprese con la frequenza delle lezioni di Sistemi operativi e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Firenze o del prof Bellini Pierfrancesco.