Заказать курсовые, контрольные, рефераты...
Образовательные работы на заказ. Недорого!

Разработка приложения моделирующего возникновения взаимоблокировок и восстановление после них

Курсовая Купить готовую Узнать стоимостьмоей работы

Самый лучший способ восстановить заблокированную «экономику»; Послать сигнал самому максимальному потоку, что его ограбили. Рестарт найденного потока и (если есть) блокирующего его. Задача этого потока — устранять взаимные блокировки. Break; //Если команда от Killer «прекратить», то прекратить. Sleep (random (9000)+1000); //Счастливо обладать захваченным. Найти поток, занявший больше всего… Читать ещё >

Содержание

  • 1. ПОСТАНОВКА ЗАДАЧИ
  • 2. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ ЗАДАНИЯ
  • 3. ОПИСАНИЕ ИСПОЛЬЗУЕМЫХ МЕТОДОВ РЕШЕНИЯ
  • 4. БЛОК-СХЕМЫ ОСНОВНЫХ ПРОЦЕДУР
  • 5. ИНТЕРФЕЙС
  • ПРИЛОЖЕНИЯ
  • 6. ИСХОДНЫЙ ТЕСТ
  • 7. ВЫВОДЫ
  • СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

Разработка приложения моделирующего возникновения взаимоблокировок и восстановление после них (реферат, курсовая, диплом, контрольная)

=Self).

{.

Lock (r, Self); //Свои бы не ухватить.

LastLocked++;

if (*State<0).

break; //Если команда от Killer «прекратить», то прекратить.

}.

};

//После получения всех ресурсов — сделать еще паузу и освободить их.

if (*State>=0).

{.

char MM[25];

MM[sprintf_s (MM," процесс %d набрал", Self)]=0;

Log (MM);

Sleep (random (9000)+1000); //Счастливо обладать захваченным.

}.

*State = Self; //И снова получать.

for (int k=0; k<N; k++).

if (Locked[k]==Self) Unlock (k);

LastLocked = -1;

//Повторить процесс.

}.

return 0;

}.

//********* Диспетчер потоков *******.

//Задача этого потока — устранять взаимные блокировки.

//Самый лучший способ восстановить заблокированную «экономику» ;

//это убить самого жадного.

DWORD Killer (int * NoData).

{.

//Обновить данные в окне (статистику).

while (true) {.

PrintLocks ();

Sleep (1000);

//Определить, есть ли стагнация.

bool Stagnation = true;

for (int m=0; m<M; m++) //Для всех процессов.

if (Want[m]<0) {Stagnation = false; break;}.

if (!Stagnation) continue;

//Если есть — найти главного.

//То есть для каждого потока определить, сколько ресурсов он заблокировал.

//Кто больше — тот и нехороший человек.

int worse = -1; //Самый худший.

int worseN = -1; //Его количество.

for (int m=0; m<M; m++) //Для всех потоков.

{.

int s=0;

for (int n=0; n<N; n++).

if (Locked[n]==m) s++;

if (s>worseN) {.

worse = m;

worseN = s;

}.

}.

//и лишить его возможности грабить дальше.

//Послать сигнал самому максимальному потоку, что его ограбили.

*Data[worse] = -1; //Сигнал «умри» .

//То же самое проделать с потоком, который блокировал максимального.

int want = Want[worse];

int locker = Locked[want];

//Найти этот поток.

if (locker>=0).

*Data[locker] = -1;

//освободить ресурс, при помощи которого максимальный поток остановлен.

Unlock (want);

char MM[25];

if (locker>=0).

MM[sprintf_s (MM," Убиты %d и %d", worse, locker)]=0;

else.

MM[sprintf_s (MM," Убит %d", worse)]=0;

Log (MM);

};

}.

//******** Вывод данных ******.

//Вывести информацию о блокировках в буфер

int T = 0;

// 1 234 567 890 123 456 824 475 648.

void PrintLocks ().

{.

if (DialogWindow==0) return;

//Сформировать данные.

//Для каждого процесса написать список занятых + чего хочет (если хочет).

int p=sprintf_s (&Buffer[0], 10 000," Шаг %d;rn" ,++T);

for (int m=0; m<M; m++).

{.

p+=sprintf_s (&Buffer[p], 10 000," Процесс %d захватил: «, m);

for (int n=0; n<N; n++).

if (Locked[n]==m).

p+=sprintf_s (&Buffer[p], 10 000," %d «, n);

if (Want[m]>=0) p+=sprintf_s (&Buffer[p], 10 000," и хочет %d «, Want[m]);

p+=sprintf_s (&Buffer[p], 10 000," rn");

}.

p+=sprintf_s (&Buffer[p], 10 000," rn%srn", LastMessage1);

p+=sprintf_s (&Buffer[p], 10 000," %srn", LastMessage2);

p+=sprintf_s (&Buffer[p], 10 000," %srn", LastMessage3);

p+=sprintf_s (&Buffer[p], 10 000," %srn", LastMessage4);

Buffer[p]=0;

//Послать данные.

SetDlgItemTextA (DialogWindow, IDC_EDIT1,Buffer);

}.

//************* Запустить все *****************.

void Init ().

{.

randomize ();

//Создать семафоры.

CreateSemaphors ();

//Создать потоки.

CreateThreads ();

char MM[25];

MM[sprintf_s (MM," Ресурсов %d", N)]=0; Log (MM);

MM[sprintf_s (MM," Процессов %d", M)]=0; Log (MM);

MM[sprintf_s (MM," Максимум %d", HowMany)]=0; Log (MM);

// MM[sprintf_s (MM," «)]=0; Log (MM);

}.

7. Выводы.

В рамках курсовой работы было разработано приложение, моделирующее возникновение взаимоблокировок и восстановление после них.

В ходе выполнения поставленной задачи был изучен теоретический материал по указанной теме (понятие взаимоблокировки, причины возникновения и возможные стратегии устранения), изучены функции WinAPI для работы с потоками и семафорами, разработаны алгоритмы решения задачи, разработан пользовательский интерфейс программы, реализованы алгоритмы на языке программирования.

Разработанная прикладная программа имеет графический пользовательский интерфейс.

В качестве среду разработки использовалась Visual C++ из пакета Visual Studio 2008.

Список использованной литературы Жарков В. Visual C++ на практике / Валерий Жарков — Москва.: Лаборатория компьютерных знаний, 2002 — 424с.

2. Иртегов Д.

Введение

в операционные системы / Дмитрий Иртегов. — СПб.: БХВ-Петербург, 2012. — 1040 с.

3. Пахомов Б. C/C++ и MS Visual C++ 2012 для начинающих / Борис Пахомов -СПб.: БХВ-Петербург, 2015 — 518с.

4. Спиридонов Э. Операционные системы. Учебник / Эрнст Спиридонов, Михаил Клыков, Михаил Рукин, Николай Григорьев, Татьяна Балалаева, Андрей Смуров. — Москва.: Либроком, 2015. — 350 с.

5. Таненбаум Э. Современные операционные системы / Эндрю Таненбаум. — СПб.: Питер, 2015. — 1120 с.

6. Хогенсон Г. C++/CLI. Язык Visual C++ для среды .NET/ Гордон Хогенсон — Москва.:Вильямс, 2007 — 464с.

7. Холзнер С. Visual C++ 6. Учебный курс / Стивен Холзнер -СПб.:Питер, 2007 — 570с.

8. Щупак Ю. Win32 API. Эффективная разработка приложений / Юрий Щупак -СПб.:Питер, 2007 — 576с.

Начало.

да.

Захватывает некоторое количество ресурсов.

Захватывает дополнительные ресурсы.

Захвачены все необходимые ресурсы.

Освобождает все захваченные ресурсы.

нет.

Начало.

Вывод статистики.

Рестарт найденного потока и (если есть) блокирующего его.

Перебираем все потоки.

Если поток не заблокирован.

Если потоки заблокированы.

Найти поток, занявший больше всего ресурсов.

Да.

Нет.

Нет.

Да.

Показать весь текст

Список литературы

  1. Жарков В. Visual C++ на практике / Валерий Жарков — Москва.: Лаборатория компьютерных знаний, 2002 — 424с.
  2. Д. Введение в операционные системы / Дмитрий Иртегов. — СПб.: БХВ-Петербург, 2012. — 1040 с.
  3. Пахомов Б. C/C++ и MS Visual C++ 2012 для начинающих / Борис Пахомов -СПб.: БХВ-Петербург, 2015 — 518с.
  4. Э. Операционные системы. Учебник / Эрнст Спиридонов, Михаил Клыков, Михаил Рукин, Николай Григорьев, Татьяна Балалаева, Андрей Смуров. — Москва.: Либроком, 2015. — 350 с.
  5. Э. Современные операционные системы / Эндрю Таненбаум. — СПб.: Питер, 2015. — 1120 с.
  6. Хогенсон Г. C++/CLI. Язык Visual C++ для среды .NET/ Гордон Хогенсон — Москва.:Вильямс, 2007 — 464с.
  7. Холзнер С. Visual C++ 6. Учебный курс / Стивен Холзнер -СПб.:Питер, 2007 — 570с.
  8. Щупак Ю. Win32 API. Эффективная разработка приложений / Юрий Щупак -СПб.:Питер, 2007 — 576с.
Заполнить форму текущей работой
Купить готовую работу

ИЛИ