47
2002/2003 Pagani - Trentini Slide 1 Laboratorio di Sistemi Operativi LAB4 System call per gestione processi

LAB4 System call per gestione processi - homes.di.unimi.ithomes.di.unimi.it/sisop/lucidi/Lab4_SyscallProc_31-03-2003.pdf · Threads in Win 2000 •thread puo’ accedere a tutti gli

Embed Size (px)

Citation preview

2002/2003 Pagani - Trentini Slide 1

Laboratorio di Sistemi Operativi

LAB4

System call per gestione processi

2002/2003 Pagani - Trentini Slide 2

Agenda

• Linux– fork; exec; exit; wait; waitpid; nice (cenni);

gestione cloni in Linux

• Windows– CreateProcess; CreateThread; ExitProcess;

ExitThread; SetPriorityClass (cenni);SetThreadPriority (cenni)

2002/2003 Pagani - Trentini Slide 3

Segnalazioni

• The Unix Programming FAQ (su web)

• The Art of Unix Programming– Eric Steven Raymond

– (beta scaricabile)

• Man Pages via web– http://www.cs.princeton.edu/cgi-

bin/man2html?PAGENAME

2002/2003 Pagani - Trentini Slide 4

I problemi del multithreading

• Esempio Java...

0..* 1rompiballe

_vti_cnf

ThreadClient

-object:ProtectedObject

+Client+pause:void+run:void

ProtectedObject

-integers:int[]-sb:StringBuffer-pauses:boolean-clients:Vector

+ProtectedObject+longMethodThatModifiesObject:void+sum:int+toString:String+add:void+pause:void+pause:void+main:void

2002/2003 Pagani - Trentini Slide 5

- Unix -

2002/2003 Pagani - Trentini Slide 6

Booting Unix

cp

swapper

1) progr bootstrap esegueprocedura in partizione boote carica kernel

2) kernel crea ambiente perprocesso 0 e lo esegue (proc.livello kernel in modo kernel)

3) processo 0 crea processo 1 (proc. livello user in modo kernel)

2002/2003 Pagani - Trentini Slide 7

Processi in Unix

• processi identificati da PID (PPID, PGID)

• swapper: esegue algoritmo di swap in/out

• init: progenitore di tutti i processi nel sistema

• proc. utente: associati con un utente ad un terminale

• proc. kernel: erogano servizi a livello kernel, eseguono inkernel mode

• proc. daemon: esistono sempre, eseguono funzioni diamministrazione in user mode– es: printer daemon, mail daemon, cron per batch

2002/2003 Pagani - Trentini Slide 8

Gestione processi

• S.O. multi-utente time-sharing– scheduling round-robin con multi-level feedback

– priorita' positiva per proc. user, negativa per proc. kernel

– proc. si sospende quando: termina quanto, attende un evento, esisteproc. con priorita' "maggiore"

– S.O. mantiene info su processi per scheduling

• contesto kernel: u-area + (entry) process table

• u-area: kernel vede solo quella del proc. running

• process table: globale, ha una entry per ogni processoattivo nel sistema

2002/2003 Pagani - Trentini Slide 9

Gestione processi

• u-area– puntatore a entry

proc.table– real/effective UID– working directory– file descriptor table– campo errori syscall– valore ritorno syscall– array routine gestione

signal– valori registri

• process table entry– indirizzo u-area– stato del processo– contesto utente– real/effective UID e GID– PID, PPID– descrittore evento per cui

proc. e' sleeping– parametri scheduling– array flag signal ricevuti

ma non gestiti

2002/2003 Pagani - Trentini Slide 10

Unix scheduler

priorita' = base + nice + CPU_usage

per non penalizzare troppo proc. CPU-boundCPU-usage e'decrementato con iltempo

base dipende da ultimoevento atteso (favorisceI/O-bound)

code multiple, una per ogni livello di priorita'

2002/2003 Pagani - Trentini Slide 11

Process scheduling

• algoritmo a due livelli:– low: scelta proc. da eseguire tra quelli ready in memoria

– high: sposta processi tra memoria e disco

• proc. in modo kernel non fanno context switch

• quando si verifica evento vengono svegliati tutti i procs inattesa per esso

• kernel manda in exec il proc ready da piu' tempo tra quellicon "maggiore" priorita'

• Linux: scheduling basato su thread, classificati in– real-time FIFO, real-time round-robin, time-sharing

2002/2003 Pagani - Trentini Slide 12

int nice(int priority_change)

• aggiunge priority_change alla priorita' del proc.– incremento tra 0 e 39

– torna nuova priorita' - 20, o -1 se errore

– usa libreria unistd.h

• proc. puo' modificare solo la propria priorita'

• solo kernel puo' "aumentare" priorita' di un processo– es. quando accede a regione critica, esegue routine gestione

interrupt o syscall

• proc. in background/batch: nice con max. valore– comando (re)nice di shell

2002/2003 Pagani - Trentini Slide 13

System Calls for Process Management

s is an error code; pid is a process IDresidual is the remaining time from the previous alarm

2002/2003 Pagani - Trentini Slide 14

pid_t fork(void)

• genera figlio proc corrente, che ne eredita:

• figlio ha proprio PID, e PPID il PID del padre• figlio non ha signal pendenti• torna 0 al figlio e PID figlio al padre• usa unistd.h

UID / EUID GID / EGID PGID

ambiente descrittori file gestione segnali

valore nice working dir limite taglia file

2002/2003 Pagani - Trentini Slide 15

fork• memoria: si incrementa #riferimenti a region

– set bit copy-on-write in page table

– se uno dei due proc. modifica la pagina, a quel puntokernel esegue replicazione

• figlio dovrebbe chiudere descrittori file inutili

2002/2003 Pagani - Trentini Slide 16

void exit (int status)

• richiamata automaticamente a terminazione processo– se termina per errore, status ne ricorda la causa

• kernel disabilita i signal, chiude i file aperti, libera region

• se e' proc di ctrl di terminale: inviato segnale diterminazione a tutti i processi in foreground attivi nelterminale

• kernel salva info sulla terminazione in entry process table

• kernel manda notifica terminazione a proc genitore

• eventuali procs figli diventano figli di init

2002/2003 Pagani - Trentini Slide 17

ESERCIZIO

• scrivere un programma C t.c. il processo crea unfiglio. Nel padre stampa il PID del figlio, attende10 sec. e poi termina. Nel figlio stampa che e' ilfiglio, attende 15 secondi e poi termina. Con ps -efmonitorare l'esistenza dei due processi.

2002/2003 Pagani - Trentini Slide 18

int execv (const char *path, char * const argv[])

• fork: figlio ha stesso contesto (e codice) del padre

• exec modifica contesto cosi' che figlio esegua progr. nelfile path con gli argomenti elencati in argv

• esistono varianti– execve specifica anche ambiente

– execvp prende pointer a stringa contenente file eseguibile

– execl specifica lista argomenti

– execle specifica anche ambiente

– execlp prende pointer a stringa contenente file eseguibile

– tutte fanno riferimento a syscall exec

2002/2003 Pagani - Trentini Slide 19

exec• contesto padre non piu'

accessibile

• file descriptor tablerimane invariata

• PID, PPID invariati

• UID, GID invariati

• EUID, EGID dipendonoda file eseguito

• pagine nuovo programmacaricate quando occorre

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>main(){ int child_pid = 0; child_pid = fork(); sleep(15); if (child_pid != 0) printf("P: ID figlio %d

\n",child_pid); else execl("/bin/date","date",0);exit(0);}

2002/2003 Pagani - Trentini Slide 20

Threads in Unix

• principali syscall definite da standard Posix

• non specificato se devono essere implementati in spaziokernel o utente

– es. problema: se in user space, thread bloccato bloccaanche tutti gli altri thread dello stesso processo

– def. syscall t.c. sono implementabili in entrambi i modi• se in kernel space: sono syscall

• se in user space: sono funzioni di libreria

• synchro usando mutex (~ semafori binari) o variabilicondizione

2002/2003 Pagani - Trentini Slide 21

Threads in POSIX

2002/2003 Pagani - Trentini Slide 22

Threads e syscall

• comportamento S.O. deve restare consistente– fork: bisogna ri-generare tutti i thread del processo?– I/O: se thread bloccato nel proc. padre in attesa input,

quale deve essere lo stato del thread nel figlio?• se non bloccato, cosa deve fare?

– condivisione file: se un thread nel padre e' bloccato sulettura da file, e un altro nel figlio chiude il file?

– errori: se errore che dovrebbe causare terminazionesingle-threaded process si verifica in un thread?

• implementazioni diverse possono avere differenticomportamenti

2002/2003 Pagani - Trentini Slide 23

Linux threads (cenni)• Linux supporta thread in kernel space• thread creato con clone() specificando:

– da quale funzione deve iniziare esecuzione– gli argomenti passati alla funzione– il puntatore al proprio stack privato– flag che ne determinano le caratteristiche di

condivisione risorse (non supportati da altri Unix)

2002/2003 Pagani - Trentini Slide 24

- Windows -

2002/2003 Pagani - Trentini Slide 25

Jobs, Processes ...

•quote job: max.#procs , CPU time disponibile per proc e globale, max. uso memoria per proc. e globale•proc: 4GB memoria; negli ultimi 2 GB c’e’ sistema operativo

•S.O. non associa stato a processi; li identifica con ID•thread: entita’ schedulate (hanno stato associato)

•kernel mantiene: thread ID, user e kernel stack, access token, area memoria per variabili locali

2002/2003 Pagani - Trentini Slide 26

Threads in Win 2000

• thread puo’ accedere a tutti gli oggetti del processo• kernel ha daemon threads per gestione sistema• scheduling a livello thread: kernel non ricorda a quale

processo un thread appartiene• fiber: thread “leggero” schedulato a livello user

– quando fiber si blocca, e’ schedulato un altro fiber dellostesso thread

• proc contiene almeno un thread, che contiene almeno unfiber

2002/2003 Pagani - Trentini Slide 27

Processes and Threads

2002/2003 Pagani - Trentini Slide 28

Job, Process, Thread & Fiber Mgmt. API Calls

2002/2003 Pagani - Trentini Slide 29

API: CreateProcessBOOL CreateProcess( LPCTSTR lpApplicationName, // pointer to name of executable module LPTSTR lpCommandLine, // pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes BOOL bInheritHandles, // flag eredita’ handles del creatore DWORD dwCreationFlags, // creation flags (priority, debugging, consoles) LPVOID lpEnvironment, // pointer to new environment block LPCTSTR lpCurrentDirectory, // pointer to current directory name LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation // ptr to PROCESS_INFORMATION );

• diverso approccio da UNIX (fork e’ senza parametri) ...– sicurezza: http://www.insecure.org/sploits/NT.syscalls.vulnerability.html

• gerarchia: non esplicita, ma def. da “chi” possiede handle

2002/2003 Pagani - Trentini Slide 30

FunzionamentoCreateProcess

Per dettagli:http://www.microsoft.com/mspress/books/sampchap/4354a.asp

ctrl tipo file, NTCreateSession per mapping file in memoria <user mode>

NTCreateProcess: creato PCB <kernel mode>

NTCreateThread: creato thread suspended e suoi due stack

2002/2003 Pagani - Trentini Slide 31

CreateThread• 6 parametri

– descrittore permessi per security; taglia iniziale stack; indirizzodi partenza; stato iniziale del thread; thread ID; parametridefiniti dall’utente

• thread possono comunicare via– pipe: byte o messaggi

– named pipe: anche per IPC in rete

– mailslot: anche per broadcast, inaffidabili

– socket, shared memory

• synchro: semafori, mutex, regioni critiche, eventi

2002/2003 Pagani - Trentini Slide 32

Esempio di uso#include <iostream.h>#include <windows.h>

void main(void){ STARTUPINFO startupInfo; PROCESS_INFORMATION procInfo; // contiene handle a processo creato BOOL success;

GetStartupInfo(&startupInfo); success = CreateProcess (NULL, "notepad", NULL, NULL, FALSE, CREATE_NEW_CONSOLE,

NULL, NULL, &startupInfo, &procInfo);

if (! success)cerr << "Couldn't create process: " << GetLastError() << endl;

else { WaitForSingleObject (procInfo.hProcess, INFINITE); cout << “Notepad Terminated” << endl; }}

2002/2003 Pagani - Trentini Slide 33

Scheduling• Non esiste un thread scheduler, ma e’ il thread

attivo che va ad eseguire il codice in modalita’kernel, quando necessario:– si blocca su un Dispatcher Object (semaforo, I/O, event,

Process,...)• salva proprio contesto, esegue codice scheduler per scegliere

prossimo, carica contesto nuovo thread

– fa una signal su un Object• ctrl che thread risvegliato non abbia priorita’ maggiore della

propria

– esaurisce il suo quanto• esegue scheduler: potrebbe essere riscelto lui

2002/2003 Pagani - Trentini Slide 34

gestiti dal kernel...

Possibilidispatcher object

Win2K fully preemptive:thread puo’ dover sospendereesecuzione in qualsiasimomento perche’ diventaready thread con priorita’maggore

2002/2003 Pagani - Trentini Slide 35

Stati dei thread in WinNT

next thread to execute:per sistemi multiprocessorcon processori preferiti

2002/2003 Pagani - Trentini Slide 36

Scheduling (2)

• Ci sono altri due casi cui il codice dello schedulerdeve essere eseguito:– fine di una operazione di I/O

– scatto di un timer

• lo scheduler non viene eseguito pero’ durante lagestione dell’interrupt ma tramite una DPC...– garantisce che dispatching non avvenga in un momento

critico

2002/2003 Pagani - Trentini Slide 37

Dispatch (Deferred) Delayed Call

2002/2003 Pagani - Trentini Slide 38

Scheduling

Windows 2000 supports 32 priorities for threads

2002/2003 Pagani - Trentini Slide 39

Win32 priorities -> Win2000

SetPriorityClass per priorita’ processoSetThreadPriority per priorita’ threadpriorita’ = valore base + valore corrente

2002/2003 Pagani - Trentini Slide 40

Vista alternativa dellepriorita`

le classi di priorita’ sonoparzialmente sovrapposte

2002/2003 Pagani - Trentini Slide 41

Priority Boosts

• Esistono quattro casi in cui viene incrementatoautomaticamente il livello di priorita`– Quando viene completata una operazione di I/O (entita’

incremento dipende da tipo periferica)– Dopo avere atteso su un evento o semaforo (entita’ dipende se e’ il

processo che e’ in finestra foreground )– Quando un GUI thread si sveglia per qualche attivita’– Quando un processo pronto non viene schedulato da parecchio

tempo (anti-starvation: portata a 15 per 2 quanti…)

• realtime thread non sono soggetti a boost– sono solo i thread di sistema (priorita’ 16 – 31)

• non si puo’ superare 15 con il boost

2002/2003 Pagani - Trentini Slide 42

Boost e decay delle priorita’

2002/2003 Pagani - Trentini Slide 43

Priority Inversion

il thread a priorita` 8 blocca indirettamente quello a priorita` 12...

Produttore

Consumatore

2002/2003 Pagani - Trentini Slide 44

Il quanto di tempo

• clock ogni 10 msec. per monoprocessor e ogni 15msec. per multiprocessor

• statico– 6 per Win2000 Professional– 36 per Win2000 Server

• ogni clock viene decrementato di 3– viene decrementato di 1 ogni volta che esce da una wait...

• dinamico– i thread in foreground hanno un boost nel quanto di

tempo...

2002/2003 Pagani - Trentini Slide 45

Casi in cui non si resetta il quanto• Quando ci sospende su un Object

– a meno di non essere un thread a priorita` maggiore di 14

• Quando si viene preempted– in questo caso si viene lasciati in cima alla coda di thread a

pari priorita`

2002/2003 Pagani - Trentini Slide 46

Emulazione MS-DOS

• ntvdm per emulazione ambiente DOS(Virtual Dos Machine)– istruisce Win2K di rimandargli le syscall

invocate dal programma

– cerca di capire quale fosse lo scopo e emula

– vecchi programmi accedevano direttamente ahw: e’ generato un trap a ntvdm che invocaappropriata API o uccide programma

2002/2003 Pagani - Trentini Slide 47

Win2K: processo boot

• caricamento master boot record• lettura settore boot a indirizzo indicato da MBR• esecuzione file Ntldr: configurazione in accordo a info

contenute in Boot.ini– caricamento hal.dll, ntoskrnl.exe, driver indicati in registry

• esecuzione ntoskrnl.exe: inizializzazione sistema– call a componenti executive per loro inizializzazione

• creazione 1o processo: session mngr (smss.exe)– start environment subsystem e login daemon– creazione servizi, user daemons, authentication mngr

• dopo login: load profilo utente da registry