Централни теми при изграждане на ОС:
- многопрограмна работа;
- многопроцесорна работа;
- разпределени процеси
Конкуренция на процеси - 3 различни аспекта:
- много на брой активни приложения едновременно;
- структурирани приложения - за повишаване на ефективността някои приложения
се програмират като множества от конкурентни процеси;
- структурата на ОС - често като множество от конкурентни процеси.
void echo()
{ getchar(chin); ................ ................ chout = chin; putchar(chout); ................. } |
void echo()
{ ............... getchar(chin); chout = chin; ............... ............... putchar(chout); } |
// PROCESS P0
. . while (turn != 0) {nothing}; <critical section> turn = 1; . |
// PROCESS P1
. . while (turn != 1) {nothing}; <critical section> turn = 0; . |
// PROCESS P0
. . while (flag[1]) {nothing}; flag[0] = true; <critical section> flag[0] = false; . |
// PROCESS P1
. . while (flag[0]) {nothing}; flag[1] = true; <critical section> flag[1] = false; . |
// PROCESS P0
. . flag[0] = true; while (flag[1]) {nothing}; <critical section> flag[0] = false; . |
// PROCESS P1
. . flag[1] = true; while (flag[0]) {nothing}; <critical section> flag[1] = false; . |
// PROCESS P0
. . flag[0] = true; while (flag[1]) { flag[0] = false; <delay for a short time> flag[0] = true; } <critical section> flag[0] = false; . |
// PROCESS P1
. . flag[1] = true; while (flag[0]) { flag[1] = false; <delay for a short time> flag[1] = true; } <critical section> flag[1] = false; . |
void P0()
{ while (true) { flag[0] = true; while (flag [1]) if (turn == 1) { flag[0] = false; while (turn == 1) /* do nothing */; flag[0] = true; } /* critical section */; turn = 1; flag[0] = false; /* remainder */; } } |
void P1()
{ while (true) { flag [1] = true; while (flag[0]) if (turn == 0) { flag[1] = false; while (turn == 0) /* do nothing */; flag[1] = true; } /* critical section */; turn = 0; flag[1] = false; /* remainder */; } } |
void P0()
{ while (true) { flag[0] = true; turn = 1; while (flag[1] && turn == 1) /* do nothing */; /* critical section */; flag[0] = false; /* remainder */; } } |
void P1()
{ while (true) { flag[1] = true; turn = 0; while (flag[0] && turn == 0) /* do nothing */; /* critical section */; flag[1] = false; /* remainder */ } } |