Скачать презентацию Операционные системы Взаимодействие параллельных процессов Задачи синхронизации ОС Скачать презентацию Операционные системы Взаимодействие параллельных процессов Задачи синхронизации ОС

4-Synchronization.ppt

  • Количество слайдов: 55

Операционные системы Взаимодействие параллельных процессов. Задачи синхронизации. ОС. (с) Кафедра ИСТ, Маракасов Ф. В. Операционные системы Взаимодействие параллельных процессов. Задачи синхронизации. ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 1

Процессы и синхронизация n Состояние q n Действие q n Значение переменных программы в Процессы и синхронизация n Состояние q n Действие q n Значение переменных программы в некоторый момент времени Неделимое действие: изменяет состояние неделимым образом История (трасса) q Конкретное выполнение программы ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 2

Независимость параллельных процессов (1) n n n R = {r} – множество переменных, которые Независимость параллельных процессов (1) n n n R = {r} – множество переменных, которые читает процесс Pi W = {w} – множество переменных, которые пишет процесс Pi RVi – множество ссылок процесса – множество переменных, которые встречаются в утверждениях доказательства корректности процесса Pi ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 3

Независимость параллельных процессов (2) n Два процесса независимы, если множество записи переменных одного процесса Независимость параллельных процессов (2) n Два процесса независимы, если множество записи переменных одного процесса (Pi) не пересекается с множеством ссылок другого процесса (Pj). ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 4

Разделяемый и критический ресурс Разделяемый ресурс Критический ресурс (для процессов Pi и Pj) ОС. Разделяемый и критический ресурс Разделяемый ресурс Критический ресурс (для процессов Pi и Pj) ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 5

Параллельные процессы. Пример. (1) char chin, chout; void echo() { chin = getchar(); chout Параллельные процессы. Пример. (1) char chin, chout; void echo() { chin = getchar(); chout = chin; putchar(chout); } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 6

Параллельные процессы. Пример. (2) Process P 1. chin = getchar(); . chout = chin; Параллельные процессы. Пример. (2) Process P 1. chin = getchar(); . chout = chin; putchar(chout); . . Process P 2. . chin = getchar(); chout = chin; . putchar(chout); . ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 7

Параллельные процессы n n Вывод: работа программы зависит от скорости развития процессов, что приводит Параллельные процессы n n Вывод: работа программы зависит от скорости развития процессов, что приводит к состоянию состязания за ресурсы ( «состояние гонки» - Race Condition) В общем случае для программы, содержащей n процессов, где каждый из процессов выполняет m неделимых действий число различных трасс процесса ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 8

Синхронизация n Цель синхронизации – предотвратить нежелательные истории. q q Взаимное исключение – объединение Синхронизация n Цель синхронизации – предотвратить нежелательные истории. q q Взаимное исключение – объединение мелкомодульных неделимых операторов в крупномодульные Условная синхронизация – задержка выполнения процесса до достижения программой состояния, удовлетворяющего некоторому предикату. ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 9

Мелкомодульная неделимость n n Действие, реализуемое непосредственно аппаратным обеспечением. Характеристики машины q q Значения Мелкомодульная неделимость n n Действие, реализуемое непосредственно аппаратным обеспечением. Характеристики машины q q Значения базовых типов хранятся в элементах памяти, которые считываются и записываются неделимыми действиями Значения обрабатываются так: их помещают в регистры, там применяют операции и затем записывают результаты в память Каждый процесс (поток) обладает своим контекстом (своим набором регистров) Любые промежуточные результаты вычислений сохраняются в памяти принадлежащей процессу (потоку), например, в стеке. ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 10

Условие «не больше одного» (1) Оператор присваивания x=e удовлетворяет условию «не больше одного» , Условие «не больше одного» (1) Оператор присваивания x=e удовлетворяет условию «не больше одного» , если либо выражение е содержит не больше одного критического ресурса, а переменная х не является разделяемой, либо выражение е не содержит критических переменных, а другие процессы могут считывать переменную х ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 11

Условие «не больше одного» (2) 1) int x = 0, y=0; P 1: x=y+1; Условие «не больше одного» (2) 1) int x = 0, y=0; P 1: x=y+1; P 2: y=y+1 2) int x = 0, y=0; P 1: x=x+1; P 2: y=y+1 3) int x = 0, y=0; P 1: x=y+1; P 2: y=x+1 ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 12

Задача критической секции (КС) n Взаимное исключение q n Отсутствие взаимной блокировки q n Задача критической секции (КС) n Взаимное исключение q n Отсутствие взаимной блокировки q n Если несколько процессов пытаются войти в КС, хотя бы один это осуществит Отсутствие излишних задержек q n В любой момент только один процесс выполняет КС Решение о вхождении в КС принимается за конечное время Возможность входа q Процесс, который пытается войти в КС, когда-нибудь это сделает ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 13

Алгоритм «Проверить-Установить» Test and Set (1) bool TS(bool& locked) { < bool init = Алгоритм «Проверить-Установить» Test and Set (1) bool TS(bool& locked) { < bool init = locked; locked = true; return init; > } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 14

Алгоритм «Проверить-установить» Test and Set (2) bool lock = false; process A { while(true){ Алгоритм «Проверить-установить» Test and Set (2) bool lock = false; process A { while(true){ // Вход в критическую секцию while (TS(lock)); // Критическая секция lock = false; //Некритическая секция } } process B { while(true){ // Вход в критическую секцию while (TS(lock)); // Критическая секция lock = false; //Некритическая секция } } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 15

Алгоритм «Проверить-проверитьустановить» - Test-test and Set (1) // Проверить-установить bool TS(bool& locked) { < Алгоритм «Проверить-проверитьустановить» - Test-test and Set (1) // Проверить-установить bool TS(bool& locked) { < bool init = locked; locked = true; return init; > } // Проверить-проверить-установить bool TTS(bool& locked) { while(locked); while(TS(locked)) { while(locked); } } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 16

Реализация взаимоисключения: аппаратная поддержка n Отключение прерываний q q q n Повышение уровня IRQL Реализация взаимоисключения: аппаратная поддержка n Отключение прерываний q q q n Повышение уровня IRQL q q q n Легко реализовать Система теряет контроль над исполнением Не работает на многопроцессорных системах Легко реализовать Важные прерывания маскируются Не работает на многопроцессорных системах Специальные инструкции микропроцессора q q Легко реализовать Применим в многопроцессорных системах ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 17

Реализация «Проверить-установить» на x 86 __declspec (naked) bool TS(bool& locked) { __asm { // Реализация «Проверить-установить» на x 86 __declspec (naked) bool TS(bool& locked) { __asm { // получить адрес locked mov ebx, dword ptr [esp+4] // Реализация атомарной операции // mov eax, 1 lock xchg eax, [ebx] // Выход из функции. Результат возвращается через eax ret } } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 18

Спин-блокировки в Windows Используются только в режиме ядра. Обеспечивают взаимное исключение на многопроцессорных системах. Спин-блокировки в Windows Используются только в режиме ядра. Обеспечивают взаимное исключение на многопроцессорных системах. n n Ke. Acuire. Spin. Lock(PKSPIN_LOCK p. Spin. Lock, PKIRQL p. Old. Irql); Ke. Release. Spin. Lock(PKSPIN_LOCK p. Spin. Lock, PKIRQL p. New. Irql); ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 19

Критические секции: решение со справедливой стратегией n Алгоритм разрыва узла (Питерсона) q n Алгоритм Критические секции: решение со справедливой стратегией n Алгоритм разрыва узла (Питерсона) q n Алгоритм билета q n Дополнительная переменная (last) с номером процесса, последнего запросившего вход в КС. Процесс входит в КС, если его номер не совпадает с last. При запросе входа в КС процесс получает свой номер, заведомо больший любого из ранее выданных другим процессам. Процессы обслуживаются в порядке увеличения номера. Алгоритм поликлиники q Реализация алгоритма билета без использования специальных инструкций микропроцессора. ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 20

Семафоры Дейкстра n Семафор - вспомогательная критическая целочисленная переменная, для которой определены три операции: Семафоры Дейкстра n Семафор - вспомогательная критическая целочисленная переменная, для которой определены три операции: 1. 2. 3. Инициализация неотрицательным значением Операция wait уменьшает значение семафора. Если значение становится отрицательным, процесс, выполняющий операцию wait блокируется Операция signal увеличивает значение семафора. Если это значение положительно, то заблокированный операцией wait процесс деблокируется ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 21

Семафоры ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 22 Семафоры ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 22

Бинарный семафор - Mutex ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Бинарный семафор - Mutex ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 23

Использование семафора ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 24 Использование семафора ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 24

ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 25 ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 25

Реализация семафора средствами Win 32 (1) /* Простая реализация семафорного механизма */ #include <queue> Реализация семафора средствами Win 32 (1) /* Простая реализация семафорного механизма */ #include // Семафор typedef struct _CS { _CS(): locked(0), count(0){} // Число свободных ресурсов long count; // Спин-блокировка для реализации взаимоисключения в реализации семафора long locked; // {0 - свободна, 1 - занята} // Очередь ожидающих семафор потоков std: : queue tqueue; } CS, *LPCS; ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 26

Реализация семафора средствами Win 32 (2) // Инициализация семафора значением доступных ресурсов void inline Реализация семафора средствами Win 32 (2) // Инициализация семафора значением доступных ресурсов void inline Initialize. Semaphore(LPCS cs, long count = 1) { cs->count = count; } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 27

Реализация семафора средствами Win 32 (3) // Захват семафора void Wait(LPCS cs) { // Реализация семафора средствами Win 32 (3) // Захват семафора void Wait(LPCS cs) { // Захватываем спин-блокировку long& l = cs->locked; while (Interlocked. Exchange(&l, 1)) ; //Interlocked. Exchange – реализация алг. TS } // Захват семафора // Если все уже ресурсы заняты, поместить описатель текущего потока в // очередь ожидающих ресурс потоков и приостановить выполнение потока if (--cs->count < 0) { // Получем описатель потока, помещаем в очередь и приостанавливаем поток HANDLE t = Open. Thread(THREAD_SUSPEND_RESUME, FALSE, Get. Current. Thread. Id()); if (t) { cs->tqueue. push(t); // Освобождаем спин-блокировку l = 0; Suspend. Thread(t); } } else // Освобождаем спин-блокировку l = 0; ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 28

Реализация семафора средствами Win 32 (4) // Освобождение семафора void Signal(LPCS cs) { // Реализация семафора средствами Win 32 (4) // Освобождение семафора void Signal(LPCS cs) { // Захватываем спин-блокировку long& l = cs->locked; while (Interlocked. Exchange(&l, 1)); // Если есть свободный ресурс if (++cs->count <= 0 ) { // Активируем поток из начала очереди ожидающих HANDLE t = cs->tqueue. front(); cs->tqueue. pop(); // Освобождаем спин-блокировку l = 0; Resume. Thread(t); Close. Handle(t); } else { // Освобождаем спин-блокировку l = 0; } } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 29

Реализация семафора средствами Win 32 (5) CS cs; DWORD __stdcall Loop(LPVOID) { while(1) { Реализация семафора средствами Win 32 (5) CS cs; DWORD __stdcall Loop(LPVOID) { while(1) { wait(&cs) // критическая секция signal(&cs) } } int main() { Initialize. Sepaphore(&cs, 1); Create. Thread(NULL, 0, Loop, NULL, 0, NULL); … } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 30

Семафорные примитивы в Win 32 n Критическая секция q q q n Мьютекс q Семафорные примитивы в Win 32 n Критическая секция q q q n Мьютекс q q q n HANDLE Create. Mutex(LPSECURITY_ATTRIBUTE lpsa, BOOL b. Owner, LPCTSTR sz. Name) Wait-функции BOOL Release. Mutex(HANDLE h. Mutex) Семафор q q q n VOID Initialize. Critical. Section(LPCRITICAL_SECTION lpcs) VOID Enter. Critical. Section(LPCRITICAL_SECTION lpcs) VOID Leave. Critical. Section(LPCRITICAL_SECTION lpcs) HANDLE Create. Semaphore (LPSECURITY_ATTRIBUTE lpsa, LONG c. Sem. Initial, LONG c. Sem. Max, LPSTR lpsz. Sem. Name) Wait-функции BOOL Release. Semaphore(HANDLE h. Sem, LONG c. Release, LPLONG lp. Prev); События q q HANDLE Create. Event(LPSECURITY_ATTRIBUTE lpsa, BOOL f. Manual, BOOL f. State, LPSTR sz. Name) Wait-функции BOOL Set. Event(HANDLE h. Event) BOOL Reset. Event(HANDLE h. Event) ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 31

Критические секции в Win 32 // Критический ресурс volatile int i=0; // Вспомогательный критический Критические секции в Win 32 // Критический ресурс volatile int i=0; // Вспомогательный критический ресурс - Критическая секция. // Важно! cs видна из всех потоков, требующих синхронизации CRITICAL_SECTION cs; DWORD __stdcall Inc. Thread(LPVOID) { for (; ; ) { // Вход в критическую секцию Enter. Critical. Section(&cs); i+=10; Sleep(0); i-=10; Sleep(0); printf("%d ", i); // Выход из критической секции Leave. Critical. Section(&cs); } return 0; } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 32

Критические секции в Win 32 int _tmain(int argc, _TCHAR* argv[]) { HANDLE h[2]; // Критические секции в Win 32 int _tmain(int argc, _TCHAR* argv[]) { HANDLE h[2]; // Перед использованием требуется инициализировать критическую секцию Initialize. Critical. Section(&cs); h[0] = Create. Thread(NULL, 0, Inc. Thread, NULL, 0, NULL); h[1] = Create. Thread(NULL, 0, Inc. Thread, NULL, 0, NULL); Wait. For. Multiple. Objects(2, h, TRUE, 2000); Terminate. Thread(h[0], 0); Terminate. Thread(h[1], 0); Close. Handle(h[0]); Close. Handle(h[1]); // Удаление критической секции после использования Delete. Critical. Section(&cs); return 0; } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 33

Мьютексы в Win 32 volatile int i = 0; // Глобальная переменная, которой пользуются Мьютексы в Win 32 volatile int i = 0; // Глобальная переменная, которой пользуются оба потока. /* создание объекта “мьютекс”. Он должен быть видимым из обоих потоков, т. е. глобальным*/ static HANDLE h. Mutex = Create. Mutex(NULL, FALSE, NULL); /* Пара функций Wait. For. Single. Object Release. Mutex выполняют те же функции, что и Enter. Leave. Critical. Section с использованием КС */ DWORD __stdcall Inc. Thread(LPVOID) { for (; ; ) { Wait. For. Single. Object(h. Mutex, INFINITE); i+=10; Sleep(0); i-=10; Sleep(0); printf("%d ", i); Release. Mutex(h. Mutex); } return 0; } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 34

Семафоры в Win 32 // Количество экземпляров книги в читальном зале. #define N 3 Семафоры в Win 32 // Количество экземпляров книги в читальном зале. #define N 3 // Число посетителей библиотеки. #define CLIENT_COUNT 5 // Создаём семафор static HANDLE h. Sem = Create. Semaphore(NULL, N, N, NULL); // Функция для использования книги читателем. DWORD __stdcall Use. The. Book(LPVOID) { for (; ; ) { // Получаем книгу в читальном зале // Если книги кончились, то ждём бесконечно долго. Wait. For. Single. Object(h. Sem, INFINITE); // Используем книгу Sleep(2000); // Отдаём книгу Release. Semaphore(h. Sem, 1, NULL); // Осмысливаем материал дома Sleep(5000); } return 0; } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 35

События в Win 32 // Количество элементов в массиве #define LENGTH 100 // Массив События в Win 32 // Количество элементов в массиве #define LENGTH 100 // Массив для сортировки static DWORD g_dw. Numbers[LENGTH]; // Создаём событие со сбросом вручную в занятом состоянии static HANDLE h. Fill. Done. Event = Create. Event(NULL, FALSE, NULL); // Заполнение случайными значениями массива DWORD __stdcall Fill(LPVOID lp. Param) { srand((UINT)time(NULL)); for (int i=0; i

События в Win 32 DWORD __stdcall Sort(LPVOID lp. Param) { // Ждём освобождения события События в Win 32 DWORD __stdcall Sort(LPVOID lp. Param) { // Ждём освобождения события заполнения // массива Wait. For. Single. Object(h. Fill. Done. Event, INFINITE); /* Сортируем массив */ return 0; } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 37

Задача производитель/потребитель n n n Один или несколько процессовпроизводителей помещают данные в общий буфер. Задача производитель/потребитель n n n Один или несколько процессовпроизводителей помещают данные в общий буфер. Процесс-потребитель извлекает данные из буфера Должна выполнятся задача критической секции при доступе к буферу со стороны производителей и потребителей ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 38

Производитель producer: while (true) { /* produce item v */ b[in] = v; in++; Производитель producer: while (true) { /* produce item v */ b[in] = v; in++; } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 39

Потребитель consumer: while (true) { while (in <= out) /*do nothing */; w = Потребитель consumer: while (true) { while (in <= out) /*do nothing */; w = b[out]; out++; /* consume item w */ } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 40

Задача производителя/потребителя ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 41 Задача производителя/потребителя ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 41

Производитель с кольцевым буфером producer: while (true) /* produce while ((in do nothing b[in] Производитель с кольцевым буфером producer: while (true) /* produce while ((in do nothing b[in] = v; in = (in + } { item v */ + 1) % n == out) */; /* 1) % n ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 42

Потребитель с круговым буфером consumer: while (true) { while (in == out) /* do Потребитель с круговым буфером consumer: while (true) { while (in == out) /* do nothing */; w = b[out]; out = (out + 1) % n; /* consume item w */ } ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 43

Конечный кольцевой буфер в задаче ПП ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, Конечный кольцевой буфер в задаче ПП ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 44

ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 45 ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 45

ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 46 ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 46

ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 47 ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 47

ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 48 ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 48

Здесь анимация «Производитель/Потребитель» n Производитель/Потребитель ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Здесь анимация «Производитель/Потребитель» n Производитель/Потребитель ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 49

Задача «читатели/писатели» n n n Несколько процессов могут одновременно читать данные из общей области Задача «читатели/писатели» n n n Несколько процессов могут одновременно читать данные из общей области памяти. Только один процесс в каждый момент времени может писать в общую область памяти. Процессы-читатели не могут читать данные, если происходит запись в общую область памяти. ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 50

ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 51 ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 51

ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 52 ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 52

Здесь анимация «Читатели/писатели» n Читатели / писатели ОС. (с) Кафедра ИСТ, Маракасов Ф. В. Здесь анимация «Читатели/писатели» n Читатели / писатели ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 53

Задача «Обедающие философы» ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс Задача «Обедающие философы» ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 54

Список литературы 1. 2. 3. 4. Столлингс, Вильям. Операционные системы, 4 -е издание. «Вильямс» Список литературы 1. 2. 3. 4. Столлингс, Вильям. Операционные системы, 4 -е издание. «Вильямс» , 2002. Эндрюс Р. , Грегори Основы многопоточного, параллельного и распределённого программирования. «Вильямс» , 2003. Соломон Д. , Руссинович М. Внутреннее устройство Microsoft Windows 2000. СПб. : Питер, «Русская Редакция» , 2001. Солдатов В. П. Программирование драйверов Windows. Бином, 2004. ОС. (с) Кафедра ИСТ, Маракасов Ф. В. 2005, (с) Вильям Столлингс 55