Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Пояснительная записка к курсовой работе по курсу ldquo;Операционные системы и среды

Работа добавлена на сайт samzan.net: 2016-06-20

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 17.5.2024

Министерство образования Российской Федерации

Омский Государственный Технический Университет

Кафедра «Информатики и Вычислительной Техники»

Пояснительная записка

к курсовой работе

по курсу  “Операционные системы и среды.”

Выполнил: студент гр.В-316

Сибагатулин Д.Р.

Проверил:  Флоренсов А.Н..

Омск 2009


Задание

Вариант №40

Разработать для ОС типа WINDOWS многопоточную программную имитацию работы кольцевого маршрутного такси с 6 остановками. Фиксированное число N потенциальных пассажиров в случайный момент времени пребывают где-то вне маршрута, затем появляются случайным образом на одной из остановок. Такси вмещает не более 5 пассажиров. При необходимости пассажиры выстраиваются на остановке в очередь. Едущие пассажиры случайным образом выходят на одной из следующих остановок, но не ездят по кругу. Программа должна перед началом работы вводить значение числа N. Поведение модели должно отображаться на экране в текстовом режиме с помощью текстов и символов по усмотрению разработчика. Поведение каждого пассажира должно реализовываться отдельной нитью. Для правильного взаимодействия использовать семафоры.

Анализ задания.

Так как в такси вмещает не более 5 пассажиров, то  следует использовать семафор со внутренним максимальным счетчиком до 5.

Если счетчик не равен 0, то можно заходить, иначе ждем.

Также необходимо использовать семафор для того, чтобы пассажиры не ездили по кругу.

Для завершения работы мы уничтожаем нити.


ТЕКСТ ПРОГРАММЫ

#include <stdio.h>

#include <windows.h>

#include <time.h>

HANDLE semOstanovka[6],

      semTaxi,    

      semVihod,

      hOut;

const int JdetTaxi = 0, Edet = 1, VneMarshruta = 2;

int Sostojania[40];

int Ostanovka[40];

int taxiOstanovka;

int N;

BOOL taxiEdet;

BOOL edetVpravo;

DWORD WINAPI peopleFunc(void *param);

DWORD WINAPI taxiFunc(void *param);

void Risovanie(void);

void RisovanieTaxi(void);

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

int main()

{

HANDLE people[40], taxi, hInp;

int i, actlen;

char tmp[256];

INPUT_RECORD inpbuf;

COORD pos;

time_t t;

system("cls");

hOut = GetStdHandle(STD_OUTPUT_HANDLE);

if (hOut == INVALID_HANDLE_VALUE)

{

 CharToOem("Îøèáêà óñòðîéñòâà âûâîäà",tmp);

 printf("%s",tmp);

 return 1;

}

hInp = GetStdHandle(STD_INPUT_HANDLE);

if (hInp == INVALID_HANDLE_VALUE)

{

 CharToOem("Îøèáêà óñòðîéñòâà ââîäà/0",tmp);

 printf("%s",tmp);

 return 1;

}

 

srand((int)time(&t));

 

while (1)

{

 pos.X = pos.Y = 0;

 CharToOem("Ââåäèòå êîëè÷åñòâî ëþäåé (1-40)", tmp);

 printf("%s\n",tmp);

 gets(tmp);

 N = atoi(tmp);

 if (N <= 0 || N > 40)

 {

  pos.Y = 1;

  system("cls");

 }

 else

  break;

}

pos.X = pos.Y = 0;

 

FillConsoleOutputCharacter(hOut, ' ', 80*2, pos, &actlen);

SetConsoleCursorPosition(hOut, pos);

SetConsoleTextAttribute(hOut,FOREGROUND_INTENSITY | FOREGROUND_GREEN);

printf("N = %d", N);

for (i = 0; i < 6; i++)

{

 semOstanovka[i] = CreateSemaphore(NULL, 0, 1, NULL);

 if (semOstanovka[i] == INVALID_HANDLE_VALUE)

 {

  CharToOem("Íå ìîãó ñîçäàòü ñåìàôîð", tmp);

  printf("%s", tmp);

  return 1;

 }

}

//Ïîòîê ñîçäàåò ñåìàôîð ñ ïîìîùüþ ôóíêöèè CreateSemaphore():

semTaxi = CreateSemaphore(NULL, 5, 5, NULL);

if (semTaxi == INVALID_HANDLE_VALUE)

{

 CharToOem("Íå ìîãó ñîçäàòü ñåìàôîð", tmp);

 printf("%s", tmp);

 return 1;

}

semVihod = CreateSemaphore(NULL, 1, 1, NULL);

if (semVihod == INVALID_HANDLE_VALUE)

   {

 CharToOem("Íå ìîãó ñîçäàòü ñåìàôîð", tmp);

 printf("%s", tmp);

 return 1;

}

 

taxi = CreateThread(NULL, 0, taxiFunc, NULL, NULL, &actlen);

if (taxi == INVALID_HANDLE_VALUE)

{

 CharToOem("Íå ìîãó ñîçäàòü íèòü òàêñè", tmp);

 printf("%s", tmp);

 return 1;

}

for (i = 0; i < N; i++)

{

 people[i] = CreateThread(NULL, 0, peopleFunc, (void*)i, NULL, &actlen);

 if (people[i] == INVALID_HANDLE_VALUE)

 {

  CharToOem("Íå ìîãó ñîçäàòü íèòü äëÿ ïàññàæèðà", tmp);

  printf("%s", tmp);

  return 1;

 }

}

CharToOem("Äëÿ âûõîäà íàæìèòå Esc", tmp);

SetConsoleTextAttribute(hOut,FOREGROUND_INTENSITY | FOREGROUND_RED);

   printf("\n\t\t\t\t\t   %s", tmp);

   while(1)

{

 pos.X = 5;

 pos.Y = 5;

 FillConsoleOutputCharacter(hOut, ' ', 10*80, pos, &actlen);

 

 Risovanie();

 PeekConsoleInput(hInp, &inpbuf, 1, &actlen);

 if (inpbuf.EventType == KEY_EVENT)

  if (inpbuf.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)

   break;

  FlushConsoleInputBuffer(hInp);

  Sleep(100);

}

 

for (i = 0; i < N; i++) TerminateThread(people[i], 0);

   TerminateThread(taxi, 0);

   for (i = 0; i < 5; i++) CloseHandle(semOstanovka[i]);

CloseHandle(semTaxi);

   CloseHandle(semVihod);

   return 0;

}//end vain()

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

DWORD WINAPI peopleFunc(void *param)

{

 int i = (int)param;

 Sostojania[i] = VneMarshruta;

 Sleep(rand()%4000+2000);

 Ostanovka[i] = rand()%6;

 while(1)

 {

   Sostojania[i] = JdetTaxi;

   WaitForSingleObject(semOstanovka[Ostanovka[i]], INFINITE);

   ReleaseSemaphore(semOstanovka[Ostanovka[i]], 1, NULL);

   ReleaseSemaphore():

   if (WaitForSingleObject(semTaxi, 100) == WAIT_TIMEOUT)  continue;

   Sostojania[i] = Edet;

   while(1)

   {

     WaitForSingleObject(semVihod, INFINITE);

     ReleaseSemaphore(semVihod, 1, NULL);

     if (Ostanovka[i]!=taxiOstanovka&&(taxiOstanovka == 0 || taxiOstanovka == 5 || rand()%2))

       break;

     Sleep(2000);

   }

   ReleaseSemaphore(semTaxi, 1, NULL);

   Sostojania[i] = VneMarshruta;

   Sleep(rand()%4000+2000);

   Ostanovka[i] = rand()%6;

 }

}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

DWORD WINAPI taxiFunc(void *param)

{

 int dOst = -1;

 taxiOstanovka = 0;

 while(1)

 {

   if (dOst == -1)

   {

     dOst = 1;

     edetVpravo = TRUE;

   }

   else

   {

     dOst = -1;

     edetVpravo = FALSE;

   }

   do

   {

     taxiEdet = FALSE;

     Sleep(200);

     ReleaseSemaphore(semVihod, 1, NULL);

     ReleaseSemaphore(semOstanovka[taxiOstanovka], 1, NULL);

     Sleep(2000);

     WaitForSingleObject(semOstanovka[taxiOstanovka], 0);

     WaitForSingleObject(semVihod, 0);

     taxiEdet = TRUE;

     Sleep(2000);

     taxiOstanovka+=dOst;

   } while(taxiOstanovka != 0 && taxiOstanovka != 5);

 }

}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void RisovanieTaxi()                                     

{                                                        

 COORD pos;                                             

 DWORD actlen;

 if (taxiEdet)

 {

   if (edetVpravo)

     pos.X = 12 + taxiOstanovka*17;

   else

     pos.X = taxiOstanovka*17-6;

 }

 else

   pos.X = 5 + taxiOstanovka*17;

 pos.Y = 9;

SetConsoleTextAttribute(hOut, FOREGROUND_RED);

 WriteConsoleOutputCharacter(hOut, " @___@ ", 7, pos, &actlen);

 pos.Y++;              // |

 WriteConsoleOutputCharacter(hOut, "|     |", 7, pos, &actlen);

 pos.Y++;              // |

 WriteConsoleOutputCharacter(hOut, "|@___@|", 7, pos, &actlen);

}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void Risovanie()

{

 int i;

 COORD pos;

 DWORD actlen, jdushih[6], edushih, vneMarshr;

 char tmp[1];

 RisovanieTaxi();

 for(i = 0; i < 6; i++)

 {

   pos.X = 5+i*17;

   pos.Y = 7;

   WriteConsoleOutputCharacter(hOut, "|BASS_STOP ", 11, pos, &actlen);

   pos.Y++;

   WriteConsoleOutputCharacter(hOut, "|", 1, pos, &actlen);

 }

 jdushih[0] = jdushih[1] = jdushih[2] = jdushih[3] = jdushih[4] = jdushih[5] = vneMarshr = edushih = 0;

 for(i = 0; i < N; i++)

 {

  if (Sostojania[i] == JdetTaxi)

  {

   pos.X = 6+(Ostanovka[i]*17)+jdushih[Ostanovka[i]]++;

   pos.Y = 8;

   WriteConsoleOutputCharacter(hOut, "*", 1, pos, &actlen);

  }

  else if (Sostojania[i] == Edet)

  {

   if (taxiEdet)

   {

    if (edetVpravo) pos.X = 13+taxiOstanovka*17+edushih++;

    else pos.X = taxiOstanovka*17+edushih++ - 5;

   }

   else pos.X = 6+taxiOstanovka*17+edushih++;

   pos.Y = 10;

   WriteConsoleOutputCharacter(hOut, "*", 1, pos, &actlen);

  }

  else

  {

   pos.X = 5 + vneMarshr++;

   pos.Y = 5;

   WriteConsoleOutputCharacter(hOut, "*", 1, pos, &actlen);

  }

 }

}


СПИСОК ЛИТЕРАТУРЫ

1. Флоренсов А.Н. Операционные системы для программиста: Учеб. Пособие. - Омск: Изд-во ОмГТУ, 2005.

2. Флоренсов А.Н. Системное программирование в многозадачных ОС. Семантический подход: Учеб. Пособие. - Омск: Изд-во ОмГТУ, 2000.

3. Павловская С++: Учеб. Пособие. 2005.

4. http://trubetskoy1.narod.ru/




1. РЕФЕРАТ Решение глобальных проблем современности Выполнила- Карнаухова Е
2. Тема 1 Деловые коммуникации- что это такое Общение его виды Приходилось ли вам задумываться о роли обще
3. Наследственные права в международном частном праве
4. КАКАЯ МАКСИМАЛЬНАЯ НАГРУЗКА РАЗРЕШАЕТСЯ МУЖЧИНАМ ПРИ ПЕРЕМЕЩЕНИИ ТЯЖЕСТЕЙ В ОДИНОЧКУ НА РАССТОЯНИЕ ДО 25 МЕ
5. тематика микроорганизмов.
6.  Перечислите ключевые функции Правительства РФ и раскройте основные полномочия Председателя Правительства
7. Первая помощь больным животным
8. Позакласна робота з математики у молодших класах
9. по теме Организация производства работ МДК 01
10. Статья из опыта работы учителя физики Симоновой Галины Федоровны Функционирование школы в инно
11. Контрольная работа Зачет по дисциплине История экономических учений Для студентов заочной фо
12. t tht time it ws smll frontier settlement
13. Неблагоприятные эмоциональные состояния супругов
14.  Вступ PostgreSQL забезпечує великий набір інструментів щоб розробники управляли конкуруючим доступом до д
15. Методические рекомендации поведения в конфликте 25 2
16. Понятие и профилактика стресса
17. Экотоксикология Учебное пособие
18. Британские острова их географическое положение
19. Он используется в дебатах по проблемам управления в сфере многостороннего сотрудничества
20. Философские термины