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

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

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

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

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

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

от 25%

Подписываем

договор

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

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

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

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

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

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

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

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

Выполнил: студент гр.В-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. Лабораторная работа по теме
3. История политических учений
4. Провинциальная Россия 1
5. благодать или национальная трагедия В канун очередной годовщины крещения Руси многие мысленно обращаютс
6. Організаційно-правові форми малого бізнесу Контракти
7. ТЕМА ВЫПУСКНОЙ КВАЛИФИКАЦИОННОЙ РАБОТЫ Совершенствование инвестиционной политики Республики Тыва Тема
8. Открытие счетов в банке и лицензирование отдельных видов ПД.html
9. Аксиология не туралызерттейтінілім ~~ндылы~ B ~~дай C т~жірибе D білім E болмыс 6
10. Особенности цветного проявления оценка качества аппаратуры и программного обеспечения