Будь умным!


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

на тему- Моделирование перевозки пассажиров такси Выполнил- студент гр

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


ОМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра информатики и вычислительной техники

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе по дисциплине «Операционные системы»

на тему: «Моделирование перевозки пассажиров такси»

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

        Семенов А.В.

            _______________

           (число, подпись)

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

Омск 2009 г

Содержание

  1.  Задание ………………………………………………………………...…...3
  2.  Описание работы программы………………………………………....…...4
  3.  Листинг программы……………………………………………………...…6

Список использованной литературы……………………………………....…….11



  1.  Задание

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


2. Описание работы программы

а) Основные части программы и их описание

Всю программную модель можно разделить на 4 смысловые блока:

  1.  Основная программа, которая запускает N+1 параллельных процесса: процесс тпкси и процессы N пассажиров.
  2.  Процесс такси, движение такси по остановкам.
  3.  Процессы пасажиров, моделирующие поведение пасажиров на маршруте.
  4.  Вспомогательные функции.

Детальное описание рассмотренных блоков.

  1.  Основная программа инициализирует переменные, осуществляет ввод числа пассажиров на маршруте, заполняет случайно выбранную остановку введеным пользователем количеством пассажиров. После чеговыполняется главный цикл программы, в котором происходит отрисовка такси и пассажиров. Запрлнение случайной остановки происходит вызовом fill, а отрисовка вызовом функции draw
  2.  В главной функции создается процесс моделирующий работу такси. За его работу отвечает функция void* procTaxi(void *arg) в которой осуществляется инкремент текущей позиции такси. Если таксии стоит на последней остановке, то происходит переход на первую. Задержка с которой такси стоит на остановке 3с.
  3.  В функции заполнения fill происходит создание отдельного процесса для каждого пассажира. За работу которого отвечает функция void* procPass(void* arg). Которую функционально можно разделить на 2 части, цикл проверки мест в такси на предметналичия свободных в случае если к остановке на которой стоит пассажир, подъехало такси. Если таковые имеются то происходит посадка пассажира. Вторая часть выполняется если пассажир сидит в такси и текущая остановка является его конечным пунуктом назначения. Тогда пассажир выходит из такси и для него случайным образом генерируется следующий пункт назначения, чтобы пассажир не успел сесть в такси из которого только что вышел, введена задержка 3с.
  4.  Вспомогательная функция fill заполняет остановку N пассажирами, задавая случайный пункт назначения, все N пассажиров появляются на одной из 6-и остановок. В этой же функции создаются потоки дл япассажиров функцией

pthread_create(&(cur->tidPass), NULL, procPass, (void*) cur);

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


3. Листинг программы

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

#include <math.h>

#include <time.h>

#define randomize srandom((unsigned)time(0)); //Интициализация генератора

      //случайных чисел

int N = 12;  //Число пассажиров на маршруте

typedef struct Ost *link; //Указатель на экземпляр пассажира

typedef int elemtype;

typedef struct Ost { // Односвязный список с пассажирами

   elemtype pass;

   elemtype position;

   elemtype next_ost;

   pthread_t tidPass;

   link next;

} ost;

ost* ostanovka[6]; //6 остановок

link last[6];

link taxi[5]; // Массив такси 5 мест

int cur_taxi_pos = 0; //Текущая позиция такси (номер остановки)

int pass_in_taxi = 0; //Число пассажиров в такси

pthread_mutex_t hmtx1; //Хэндл мютекса для процесса такси

void print33( ost* p) { //Печать списка в вертикальный  столбик

   //Печать пассажиров на остановке

    printf("\033[16;0H->    \n  ");

   while ((p) != NULL) {  //Проход по всему списку

       printf("\033[16;0H->%d\n  ", (p)->pass);

       p = (link) (p)->next;

   }

}

void* procTaxi(void *arg) {  //Процедура работы процесса такси

   while (1) {

       pthread_mutex_lock(&hmtx1);

       //print33(ostanovka[cur_taxi_pos]);

       if (cur_taxi_pos == 6)  //переезжаем на след. остановку, если конец маршрута

    //то идем на первую

           cur_taxi_pos = 1;

       else

           ++cur_taxi_pos;

       pthread_mutex_unlock(&hmtx1);

       usleep(3000000);

   }

}

link GetLast(const int i){  //Процедура получения последнего пассажира в очереде

   link p = ostanovka[i];

   if (p == NULL) return NULL;

   while (1) {

       if(p->next == NULL)  //Пробежаться по всем

           return p;   //пока не найдем последнего

       else

           p = (link) (p)->next;  //иначе идем на следующего, если он есть

   }

}

void* procPass(void* arg) {

   int i = 0;

   int k;

   while (1) {

       pthread_mutex_lock(&hmtx1);

       if ((ostanovka[cur_taxi_pos - 1]!=NULL)&&(ostanovka[cur_taxi_pos - 1]->pass == ((link) arg)->pass)) { //Если к пассажиру подъехало такси

        for(i = 0; i <5 ; i++ ) //перебрать все места в такси

           if (taxi[i] == NULL){ //Найти свободное

               taxi[i] = (link) arg;  //Посадить туда пассажира

               ((link) arg)->position = i;

               pass_in_taxi++;  //Увеличить счетчик числа пассажиров в такси

               ostanovka[cur_taxi_pos - 1] = ostanovka[cur_taxi_pos - 1]->next;

               ((link) arg)->next = NULL;

               break;

           }

       }

      if ((((link) arg)->position != -1)&&(cur_taxi_pos == ((link) arg)->next_ost)) {

 //если пассажир прибул в пункт назначения

          taxi[((link) arg)->position] = NULL;  //выти из такси

          ((link) arg)->position = -1; //сделать позицию на остановке

          pass_in_taxi--;  //уменьшить счетчик числа пассажиров в такси

                  do{

                   k = rand()% 6+ 1;

       }while(k == cur_taxi_pos); //сгенерить след. ост. неравную текущей

       ((link) arg)->next_ost = k;

          if (GetLast(cur_taxi_pos -1 ) == NULL) //Поставить человека в очередь на          //останове

              ostanovka[cur_taxi_pos-1] = ((link) arg);

          else

               GetLast(cur_taxi_pos-1)->next = (link) arg;

pthread_mutex_unlock(&hmtx1);

           usleep(3000000);  //Ждем след такси

pthread_mutex_lock(&hmtx1);

       }

       pthread_mutex_unlock(&hmtx1);

       usleep(100000);

   }

}

void fill(link *res, int n_, elemtype ost) {

   int i = 0;

   int r = 0;

   double d = 0;

   int k = 0;

   link cur;

   (*res) = cur = malloc(sizeof (ost));

   cur->pass = 1;

   cur->position = -1;

   do{

        k = rand()% 6 + 1 ;

   }while(k == ost);  //Следующий пункт назначения не равный текущему

   cur->next_ost = k;

   pthread_create(&(cur->tidPass), NULL, procPass, (void*) cur); //мютекс процесса такси

   for (i = 2; i <= n_; i++) {

       do{

           k = rand()% 6+ 1;

       }while(k == ost); //Следующий пункт назначения не равный текущему

       cur = (cur->next) = malloc(sizeof (ost));

       cur->pass = i; //id пассажира

       cur->position = -1;

       cur->next_ost = k;

       pthread_create(&(cur->tidPass), NULL, procPass, (void*) cur); //мютекс процесса            //пасс.

   }

   last[ost - 1] = cur;

   cur->next = NULL;

}

void print(const int n_ost, ost* p) {  //Печать списка в вертикальный  столбик

     //Печать пассажиров на остановке

   int i = 5;

   printf("\033[4;%dH^\n", n_ost * 5);

   while ((p) != NULL) {

       printf("\033[%d;%dH%d\n", i++, n_ost * 5, (p)->pass);

       p = (link) (p)->next;

   }

}

void draw() {  //Печать такси

  ///Печать пассажиров на остановке

   int i;

   int str_pos;

   system("clear");

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

       print(i + 1, ostanovka[i]); //печатаем кто на остановках

   str_pos = 5 * cur_taxi_pos;

   printf("\033[2;%dH", str_pos - 2);

   printf("\033[1;30;43m T %d \033[0m", pass_in_taxi); //Печатаем такси

   if (str_pos == 5)

       str_pos = 35;

   printf("\033[2;%dH", str_pos - 7);

   printf("     ");

}

int close_pass() //освобождаем занятые ресурвсы

{

int i;

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

{

 link p = ostanovka[i];

     if (p == NULL) return NULL;

     while (1) {

          if(p->next == NULL)  //Пробежаться по всем

  {

              return 0;   //пока не найдем последнего

  }

          else

  {

   pthread_cancel(&(p->tidPass));

   free(&p);

              p = (link) (p)->next;  //иначе идем на следующего, если

       //он есть

  }

     }

}

}

int main() {

   int i;

   srand(time(0));

   pthread_t tidTaxi;

   pass_in_taxi = 0; //Число пассажиров в такси

   printf("\033[2J\n");  //Очистка экрана

   printf("Input number of man: ");

   scanf("%d", &N);  //Ввод числа пассажров

   printf("\033[2J\n");  //Очистка экрана

   ostanovka[0] = NULL;

   ostanovka[1] = NULL;

   ostanovka[2] = NULL;

   ostanovka[3] = NULL;

   ostanovka[4] = NULL;

   ostanovka[5] = NULL;

   cur_taxi_pos = 1; //Изначально такси на 1-ой остановке

   srand(time(NULL));

   int k = rand()% 5;

   fill(&ostanovka[k], N, k + 1); //Заполняем случайную остановку пассажирами

   pthread_create(&tidTaxi, NULL, procTaxi, NULL);

   pthread_mutex_init(&hmtx1, NULL);

   while (1) {

       pthread_mutex_lock(&hmtx1);

       draw();  //Рисуем сцену

       pthread_mutex_unlock(&hmtx1);

       usleep(100000);

   }

   pthread_mutex_destroy(&hmtx1);

close_pass();

pthread_cancel(&tidTaxi);

}


Список использованной литературы

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




1. История марксистской диалектики
2. 2010 Copyright- legor7 Fbric- id 14 Pltinum
3. Использование последовательного порт
4. Реферат- Факторы и механизмы организационного развития
5. вот основные составляющие воспитания любого лидера
6. Философия и специальная педагогика
7. ый налогналог взимаемый с владельцев зарегных тра
8. экономических отношений а также производства с другой он предполагает осуществление стабилизационных ме
9. Методология развития компетентностного подхода в условиях двуязычной подготовки студентов специальности Управление качеством
10.  Позадипрямокишечное клетчаточное пространство
11. Коррекционно-воспитательная работа по развитию речевого дыхания у старших дошкольников с нарушениями речи
12. Сочинение- Защита права собственности- комплексный (межотраслевой) анализ регулирования
13. по теме- Упражнение в распознавании типа склонения имён существительных употреблённых в косвенном паде
14. Курсовая работа- Организационное поведение в менеджменте
15. 30 сентября 1883 г. Князь Г
16. Тема- Анализ возможностей дистанционного управления компьютеров
17. На тему- История развития делопроизводства в России
18. Реалізація запозичених афіксів у системі англійського дієслова
19. эмиссионный анализ
20. ЛЕКЦИЯ- Кальций магний алюминий железо