lesson_03.md 4.4 KB

Piattaforme e Software per la rete - lezione 3

William Fornaciari

23 March 2016

Cosa sono i thread

I thread sono nati per alleggerire il parallelismo su macchine lente Non sempre i thread sono vantaggiosi, se usati troppo sono svantaggiosi rispetto ai processi tradizionali. Un processo contiene

  • Risorse
  • Contesto di esecuzione

I thread dello stesso processo condividono tutte le risorse aperte, con le dovute problematiche di concorrenza e sincronizzazione. Per questo sono stati introdotti i meccanismi di mutex tipici dei processi, anche per i thread. L'esempio classico sono i server, in cui posso creare tanti thread e all'occorrenza risvegliarli, inoltre su sistemi multicore posso dividere i thread sui vari core, per gestire il carico.

Vantaggi

L'overhead di creazione/distruzione di thread era di un fattore 10 rispetto ai processi nei primi sistemi linux che lo implementavano.

Capostipite dei thread sono i solaris thread, che venivano usati da Solaris (girava su SPARC) Su windows sono venuti sfruttati bene da windows NT. I threads vennero introdotti da una libreria thread scritta da uno studente di Berkley e consistevano in una esecuzione di diverse funzioni in modo trasparente al kernel.

Quindi i thread possono essere sia kernel che utente

Team model

Utile per partizionare un applicazione Si utilizza un thread diverso per ogni funzione, ad esempio si dedica un thread alla sola interazione utente, in modo da avere una maggiore reattività agli input.

La prima applicazione dei thread è stata un foglio elettronico, in cui abbiamo un thread per input, uno per video e uno per il calcolo.

Non è detto che un problema si riesca a mappare bene su un'architettura multicore, ad esempio perchè la complessità dei thread è sbilanciata, es: thread input o display sono molto più leggeri del thread computing. Vantaggio principale è dare reattività all'esperienza utente.

Architettura a dispatcher

Un thread detto dispatcher riceve richieste di servizio e le invia ai vari thread. Si mappa molto bene su architetture a cluster, in cui abbiamo un core principale(dispatcher) e dei worker core con memoria condivisa a cui viene inviato il lavoro. Questa architettura presenta dei vantaggi per il risparmio energetico perchè posso tenere spenti i worker core finchè non arriva del lavoro da assegnargli.

Architettura a pipeline

Costituito da elementi con ingresso e uscita (es: bash pipe) In questo caso il secondo elemento ha un buffer di dati in ingresso e può elaborare senza dover scrivere/leggere da memoria. Vantaggiosa per effettuare delle ricerche, in quanto non serve elaborare tutti i dati per trovare un risultato.

User thread package

Viene implementato uno strato di supporto runtime a livello utente per gestire i thread Il supporto si occupa dello scheduling dei thread attivi di un processo. Simile a co-routine nella programmazione. Difficile sfruttare i sistemi multicore Facile da implementare

Kernel thread package

Se un thread è bloccato non blocca l'intero processo come nel caso utente. Serve implementare delle specifiche chiamate di sistema e modificare il kernel.

Relazione tra thread e processi

  • Many-to-one: un solo processo gestisce tutti i thread
  • One-to-one: user-level thread viene mappato su kernel thread

Comunicazione e sincronizzazione

Le principali soluzioni per far comunicare i thread sono:

  • Semafori: Contatore che viene incrementato e decrementato, i processi possono essere eseguiti quando è non negativo
  • Mutex: Versione binaria del semaforo
  • Condition Variable:
  • Monitor e scambio messaggi

Parallelismo

  • Processo realizza il concetto di macchina virutale e ha un forte isolamento
  • Thread utile per processi leggeri, in caso di errore può far fallire gli altri thread dello stesso processo o il processo stesso. I thread inoltre sono molto efficienti nel parallelismo e concorrenza rispetto ai processi.

Concorrenza nel caso di parallelismo reale può portare ad eseguire insieme i due processi In un sistema monoprocessore i due processi verranno eseguiti sequenzialmente ma non si sa in quale ordine

POSIX è un modo per standardizzare le interfacce dei sistemi operativi, per migliorare la portabilità del codice.

Scheduling for uniprocessor systems

RIPASSARE Il carico dei processi di solito avviene a burst, seguiti dall'attesa per l'I/O Lo scheduler preemptive è più difficile da gestire rispetto ad uno normale