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

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

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
ОМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра информатики и вычислительной техники
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе по дисциплине «Операционные системы»
на тему: «Моделирование перевозки пассажиров такси»
Выполнил: студент гр. ИВТ-326
Семенов А.В.
_______________
(число, подпись)
Проверил: Флоренсов Н. А.
Омск 2009 г
Содержание
Список использованной литературы……………………………………....…….11
Разработать для ОС тип Linux многопрограммную имитацию работы кольцевого маршрутного такси с шестью остановками. Фиксированное число N потенциальных пассажиров случайный интервал времени прибывают где-то вне маршрута, затем появляются случайным образом на одной из остановок. Такси вмещает не более пяти (для упрощения) пассажиров. При необходимости пассажиры выстраиваются на остановке в очередь. Едующие пассажиры случайным образом выходят на одной из следующих остановок, но не ездят по кругу. Программа должна перед началом работы вводить значение числа N. Поведение модели должно отображаться на экране в текстовом режиме с помощью текстов и символов по усмотрению разработчика. Поведение каждого пассажира должно реализовываться отдельным процессом. Для правильного взаимодействия использовать семафоры.
2. Описание работы программы
а) Основные части программы и их описание
Всю программную модель можно разделить на 4 смысловые блока:
Детальное описание рассмотренных блоков.
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с.