- •Курсовая работа
- •1 Теоретический вопрос «Процессы в ос Windows и ос Unix» 4
- •2 Решение задачи «Об обедающих философах» 10
- •3 Список использованных источников 17
- •1 Теоретический вопрос «Процессы в ос Windows и ос Unix» 4
- •2 Решение задачи «Об обедающих философах» 10
- •3 Список использованных источников 17
- •Теоретический вопрос «Процессы в ос Windows и ос Unix»
- •Процессы и потоки в ос Windows
- •Порождение процессов
- •Взаимодействие процессов
- •Завершение процессов
- •Потоки в операционных системах Windows
- •Процессы и потоки в ос unix
- •Порождение процессов
- •Взаимодействие процессов
- •Завершение процессов
- •Потоки в операционных системах unix
- •Выводы по процессам и потокам ос Windows и ос Unix
- •Решение задачи «Об обедающих философах»
- •Постановка задачи
- •Построение сетевой модели задачи
- •Листинг процедур решения задачи
- •Результат выполнения программы решения задачи
- •Список использованных источников
Листинг процедур решения задачи
DWORD WINAPI thPh(LPVOID arg)
{
const int leftFork = phNumber, rightFork = phNumber+1;
SetEvent(iterCtrl); // Этот event возвращает управление другому потоку после получения номера итератора.
while(true) {
Sleep(minWaitTime + rand()%(maxWaitTime-minWaitTime)); // Задержка
ThreadsSqn.push_back(leftFork);
// Цикл правильной последовательности входа в критическую секцию
while(true) {
if (ThreadsSqn.front() == leftFork) {
ThreadsSqn.pop_back();
break;
}
}
EnterCriticalSection(&phControl); // Разрешение критической ситуации (зависания философов) вход
if (WaitForSingleObject(alreadyUsed[leftFork], 1000) == WAIT_TIMEOUT) {
if (WaitForSingleObject(alreadyUsed[rightFork], 1000) == WAIT_TIMEOUT) {
sprintf(tmp, "Философ #%i хочет есть. Обе вилки – на месте.\n", leftFork);
richadd();
SetEvent(alreadyUsed[leftFork]);
SetEvent(alreadyUsed[rightFork]);
LeaveCriticalSection(&phControl);
pseudopause();
sprintf(tmp, "Философ #%i начал есть.\n", leftFork);
richadd();
pseudopause(); //задержка
ResetEvent(alreadyUsed[leftFork]);
ResetEvent(alreadyUsed[rightFork]);
sprintf(tmp, "Философ #%i закончил есть.\n", leftFork);
richadd();
pseudopause();
}
else if (WaitForSingleObject(alreadyUsed[rightFork], 1000) == WAIT_OBJECT_0) {
sprintf(tmp, "Философ #%i хочет есть. Правая вилка – занята!\n", leftFork);
richadd();
pseudopause();
}
}
else if (WaitForSingleObject(alreadyUsed[leftFork], 1000) == WAIT_OBJECT_0) {
sprintf(tmp, "Философ #%i хочет есть. Левая вилка – занята!\n", leftFork);
richadd();
pseudopause();
}
else if (WaitForSingleObject(alreadyUsed[rightFork], 1000) == WAIT_OBJECT_0) {
sprintf(tmp, "Философ #%i хочет есть. Правая вилка – занята!\n", leftFork);
richadd();
pseudopause();
}
else if ((WaitForSingleObject(alreadyUsed[rightFork], 1000) == WAIT_OBJECT_0) & (WaitForSingleObject(alreadyUsed[leftFork], 1000) == WAIT_OBJECT_0)) {
sprintf(tmp, "Философ #%i хочет есть. Обе вилки заняты!\n", leftFork);
richadd();
pseudopause();
}
LeaveCriticalSection(&phControl); // Разрешение критической ситуации (зависания философов) (выход)
Sleep(minWaitTime + rand()%(maxWaitTime-minWaitTime)); // Задержка
sprintf(tmp, "Философ #%i думает...\n", leftFork);
richadd();
pseudopause();
}
}
Результат выполнения программы решения задачи
Результат выполнения программы показан на рисунке 5. Из данного рисунка видно, что программа корректно решает поставленную задачу.
Рисунок 5 – Результат выполнения программы.
Список использованных источников
Взаимодействие между процессами. [Электронный ресурс].
Режим доступа: http://www.moodle.ipm.kstu.ru/mod/page/view.php?id=50
Дата доступа: 12.01.2013
Многозадачность в Windows. [Электронный ресурс].
Режим доступа: http://www.rsdn.ru/article/baseserv/mt.xml#E6
Дата доступа: 13.01.2013
Процессы и потоки в Windows. [Электронный ресурс].
Режим доступа:
http://av239.wordpress.com/2011/06/20/%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D1%8B-%D0%B8-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8-%D0%B2-windows/
Дата доступа: 13.01.2013
Э. Таненбаум, Современные операционные системы, 3-е изд., – СПб.: Питер, 2010. – 1120 с.
