Documente Academic
Documente Profesional
Documente Cultură
Generalităţi
Subsistemul de fişiere
Subsistemul de procese
Controlul proceselor
File
Subsystem
process interprocess
communication
subsystem memory
character block management
device drivers
process table
main memory
sys call,
return
interrupt return
to user
interrupt,
interrupt return
Kernel
2 Running
exit preempt
9 7
reschedule
Zombie sleep process Preempted
fork
swap swap swap 8
out out in
Created
not enough memory
(swapping system only)
6 5
wakeup
Sisteme de Operare. Teorie şi Aplicaţii Sleep, Swapped 110.14 Ready to Run, Swapped Robert.Gyorodi@ul.ie
Controlul Proceselor
Apelul sistem fork creează un nou proces
Apelul exit termină execuţia unui proces
Apelul wait permite procesului părinte să-şi sincronizeze execuţia cu
terminarea unui proces fiu
Semnalele informează procesele despre evenimente asincrone
Apelul sistem exec permite proceselor lansarea în execuţie a unui nou
program, suprascriindu-se spaţiul de adrese al procesului cu imaginea
executabilă a unui fişier
Apelul sistem brk permite unui proces să aloce dinamic mai multă
memorie, similar, sistemul permite şi creşterea dinamică a stivei
utilizator
Shared
Inode
Text
Table
Child Process
sigcatcher() {
printf(“PID %d a primit un semnal.\n”, getpid()); /* afiseaza process id */
signal(SIGINT, sigcatcher);
}
main() {
int ppid;
signal(SIGINT, sigcatcher);
if (fork() == 0) {
sleep(5); /* permite ambelor procese sa se initializeze - functie de librarie pentru a astepta 5 secunde */
ppid = getppid(); /* preia id-ul parintelui */
for(;;)
if (kill(ppid, SIGINT) == -1)
exit();
}
/* micsoram prioritatea, astfel crescand sansa unei nedeterminari */
nice(10);
for(;;)
;
}
Sisteme de Operare. Teorie şi Aplicaţii 110.24 Robert.Gyorodi@ul.ie
Grupuri de Procese
Procesele din acelaşi grup de procese au acelaşi identificatori de
grup
Nucleul foloseşte identificatorul de grup al proceselor pentru a
identifica grupurile de procese care trebuie să primească un
semnal comun, pentru anumite evenimente
Apelul sistem setpgrp iniţializează identificatorul de grup al unui
proces şi îl setează egal cu valoarea identificatorului de proces
al procesului care l-a apelat
grp = setpgrp();
#include <signal.h>
main() {
register int i;
setpgrp();
for(i = 0; i < 10; i++) {
if (fork() == 0) {
/* proces fiu */
if (i & 1)
setpgrp();
printf("pid = %d pgrp = %d\n", getpid(), getpgrp());
pause(); /*apel sistem pentru suspendarea execuţiei */
}
}
sleep(10);
kill(0, SIGINT);
}
exit(status);
pid = wait(stat_addr);
#include <signal.h>
main(int argc, char *argv[])
{
int i, ret_pid, ret_code;
if (argc >= 1)
signal(SIGCLD, SIG_IGN); /* ignoră decesul fiilor */
for(i = 0; i < 15; i++)
if (fork() == 0) { /* procesul fiu */
printf("procesul fiu %x\n", getpid());
exit(i);
}
ret_pid = wait(&ret_code);
printf("wait ret_pid %d ret_code (hexa) %x\n", ret_pid, ret_code);
}
main()
{
int status;
if (fork() == 0)
execl("/bin/date", "date", 0);
wait(&status);
}
setuid(uid);
Un program setuid este un fişier executabil care are bitul setuid setat în câmpul
său de drepturi de acces.
Când un proces execută un program setuid, nucleul setează câmpul de ID
utilizator efectiv din tabela de procese şi din u_area la ID-ul proprietarului
fişierului
Pentru a distinge cele două câmpuri denumim câmpul din tabela de procese ID-ul utilizator salvat
(saved user ID - SID).
Dacă EID-ul procesului apelant este superuser, nucleul resetează RID-ul şi EID-ul din tabela de
procese şi u_area la uid
Dacă EID-ul procesului apelant nu este superuser, nucleul resetează EID-ul din u_area la uid dacă uid
are valoarea lui RID sau a lui SID
Altfel, apelul sistem întoarce o eroare
Sisteme de Operare. Teorie şi Aplicaţii 110.33 Robert.Gyorodi@ul.ie
Modificarea Dimensiunii unui Proces
Un proces poate să îşi mărească sau reducă dimensiunea
regiunii de date prin utilizarea apelului sistem brk
brk(endds);
O alternativă la această funcţie este funcţia sbrk
oldendds = sbrk(increment);
Nucleul verifică faptul ca noua dimensiune a procesului să fie
mai mică decât maximul sistemului şi ca noua regiune de date să
nu fie suprapusă peste o zonă virtuală deja asignată
Dacă procesul apelează brk pentru a elibera un spaţiu alocat
anterior, nucleul eliberează memoria respectivă
Dacă procesul accesează adrese virtuale din paginile eliberate, va
rezulta o eroare de acces la memorie (memory fault)
char *cp;
int callno;
int main() {
char *sbrk();
extern void catcher(int);
signal(SIGSEGV, catcher);
cp = sbrk(0);
printf(“Valoarea brk originala : %u\n”, cp);
for(;;)
*cp++ = 1;
}