Urmăriți precizările din pagina de reguli.
Puteți participa la un singur examen final.
Datele de examen de SO pentru sesiunea iunie 2017 sunt:
Datele de examen de SO pentru sesiunea septembrie 2017 sunt:
Detalii despre examen găsiți în secțiunea aferentă din pagina de reguli.
exec sleep 10
? Dar după executarea comenzii sleep 10
?exec sleep 10
, imaginea shell-ului este înlocuită cu imaginea executabilului sleep
. Adică shell-ul nu mai există ca proces. La încheierea procesului sleep
, acesta își încheie execuția, iar shell-ul nu mai există. În cazul execuției comenzii sleep 10
se creează un nou proces care folosește imaginea executabilului sleep
. Procesul shell așteaptă încheierea procesului sleep
și apoi își continuă execuția.RUNNING
.RUNNING
în momentul în care:WAITING
;READY
;READY
;READY
.fork()
care creează o clonă / un duplicat al procesului părinte. Pentru un proces cu imagine de executabil nouă se folosește apelul exec()
după apelul fork()
. În Windows procesele sunt create cu apelul CreateProcess
care primește imaginea de executabil, ca o unificare a apelurilor fork()
și exec()
din UNIX.ls > a.txt
.ls > a.txt
shell-ul apelează fork()
și creează o clonă a sa. În clonă folosește open()
și dup()/dup2()
pentru a înlocui ieșirea standard cu fișierul a.txt
. Ulterior apelează o funcție din familia exec()
pentru a înlocui imaginea de executabil a clonei cu executabilul /bin/ls
aferent comenzii ls
.fork
și fork + exec
?fork()
se creează un proces clonă, copie aproape identică a procesului părinte. Procesul copil și procesul părinte execută același cod. În urma fork() + exec()
imaginea (codul executabil) aferentă procesului copil este înlocuită cu imaginea de executabil transmisă ca argument funcției exec()
rezultând într-un cod diferit pentru procesul copil.fwrite
și write
atunci când scriem într-un fișier?write()
este un apel de sistem unbuffered, în vreme ce funcția fwrite()
este un apel de bibliotecă buffered. Atunci când apelăm write()
se execută apel de sistem care va transfera datele din user space în kernel space. În cazul apelului fwrite()
datele sunt transferate într-un buffer intern al bibliotecii standard C urmând ca apelul de sistem efectiv (și flush-ul datelor) să aibă loc la un moment ulterior (de exemplu la newline sau când se umple buffer-ul intern). Apelul fwrite()
consumă mai multă memorie pentru bufer-ul intern cu avantajul reducerii overhead-ului cauzat de apeluri de sistem.read()
modifică cursorul de fișier. Dimensiunea nu este modificată pentru că nu ajunge să se scrie mai mult sau mai puțin. Operația write()
modifică cursorul de fișier și nu modifică dimensiunea dacă nu scrie peste dimensiunea curentă a fișierului. Operația lseek()
este definiția enunțului: doar modifică cursorul de fișier, fără alte acțiuni.RUNNING
la un moment dat în sistemul de operare?RUNNING
să găsește maxim un singur proces per procesor. Într-un sistem de operare avem maxim N procese în starea RUNNING
, unde N este numărul de procesoare.void lock (struct mutex* m){ while(atomic_cmpxchg(s->val,1,0)==0){ add_proc_to_mutex_waiting_list; scheduler(); } } void unlock(struct mutex* m){ atomic_set(s->val,1); mark_waiting_processes_as_ready; }
void sem_up (struct sem* s){ while(atomic_cmpxchg(s->mutex,1,0)==0); m->semval++; atomic_set(s->mutex,1) wake_up_waiting_processes; } void sem_down(struct sem* s){ while (1){ while(atomic_cmpxchg(s->mutex,1,0)==0); if (m->semval>0){ m->semval--; atomic_set(s->mutex,1); return; } else { Add_process_to_waiting_list_for_s; atomic_set(s->mutex,1); } } }