Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОС

.docx
Скачиваний:
29
Добавлен:
30.03.2015
Размер:
51.11 Кб
Скачать

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

ФГБОУ ВПО «Омский государственный технический университет»

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

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

К КУРСОВОМУ ПРОЕКТУ

по дисциплине «Операционные системы»

Вариант 62

Преподаватель А. Н. Флоренсов

подпись, дата

Исполнитель:

студент гр. ИВТ-349 Е. В. Овчинникова

подпись, дата

Омск 2012

Реферат

Пояснительная записка к курсовому проекту 15 с.,1 ч., 3 источника, 1 приложение

WINDOWS, СЕМАФОР, МНОГОПОТОЧНОСТЬ, ЯМЩИК, ПОТОК

Данная курсовая работа по дисциплине «Операционные системы» нацелена на разработку приложения с использованием основных принципов многопоточного программирования. В работе решаются второстепенные и промежуточные задачи. Оценивается соответствие созданного приложения требованиям, заявленным в задании.

Цель работы – разработать программную модель ямской почтовой связи, имевшейся в Российской империи в ОС типа Windows.

Содержание

Введение 4

1Постановка задачи 5

2Описание глобальных переменных 6

3Принцип работы 7

3 void main(void) 7

4Разработка пользовательского интерфейса 8

5Текст программы 9

Заключение 10

Список использованных источников 11

Приложение А 12

(обязательное) 12

Код программы 12

Введение

Данная курсовая работа посвящена разработке программы с использованием основных принципов многопоточного программирования.

В первой части приведена постановка задачи.

Вторая часть содержит разработку структур данных и их представление.

Третья часть описывает декомпозицию приложения.

В четвертой части представлено описание вида программы в консольном окне.

Пятая часть посвящена написанию кода программы.

При работе использован материал из [1].

  1. Постановка задачи

Разработать программную модель ямской почтовой связи, имевшейся в Российской империи. Модель представляет 8 почтовых станций, между которыми перемещаются почтовые подводы. За каждой почтовой станцией закреплено некоторое число лошадей. (Для модели выбрать число в пределах 5-7). Это количество может быть не полностью готовым для перевозок (лошади отдыхают после гоньбы), промоделировать случайными величинами. На четырёх ведущих станциях, моделирующих города, случайным образом формируются лица, едущие по казенной надобности, случайным образом в один из городов, которые представляются станциями. Граф дорожной связи городов связный, линейный контур, замкнутый или нет - по выбору разработчика. Ввести 2 приоритета для пользующихся услугами ямской связи, более приоритетные едут в 2 раза быстрее. Подобрать характеристики программных генераторов ездоков, чтобы на станциях возникали ситуации ожидания освободившихся или отдохнувших лошадей. Для упрощения модели в подводу для путешественника впрягается одна лошадь, для высокоприоритетных - две. Разработку провести в ОС типа Windows как многопоточную программную имитацию в консольном окне. Поведение модели должно отображаться с помощью символов по усмотрению разработчика. Поведение каждого пассажира должно реализовываться отдельной нитью. Для правильного взаимодействия использовать семафоры или мьютексы.

  1. Описание глобальных переменных

В данном разделе приведены описания глобальных переменных, используемых в программе:

int BornNum; // общая область для всех потоков

int BornHorseDest; // город в котором рождается лошадь

int BornCowboyDest; // город, где рождается ямщик

int BornCowboyNumber; // номер ямщика, с которым он рождается

HANDLE hmtx; //семафор

BOOL hflag; // лошадиный флаг

int dest; // номер города.

  1. Принцип работы

Программа состоит из следующий функций:

1 void horsethread(void *arg)

Данная функция отвечает за лошадей.

Сначала описывается, какая лошадь, в какой город едет. Затем в бесконечном цикле while (TRUE) происходит подготовка лошадей к поездке в город. В цикле while (horses[num].hflag) происходит перемещение лошадей вместе с ямщиками. Если условия данного цикла выполняются, то это означает, что лошадь прибыла в нужный город и отдыхает. За это отвечает WaitForSingleObject(horses[num].hmtx, INFINITE). Выполнение ReleaseMutex(horses[num].hmtx) говорит о том, что лошадь отдохнула, готова ехать дальше и цикл повторяется по-новой.

2 void cowboythread(void *arg)

Данная функция отвечает за ямщиков.

Внутри данной функции при помощи srand(time(NULL)) и next=(rand()%7)+1 происходит случайное распределение, какой ямщик, в какой город поедет.

Далее также происходит бесконечный цикл while (TRUE). Когда hflag=FALSE выводится сообщение о том, что ямщик занял лошадь. Когда ямщик добрался до нужного ему города hflag=TRUE

3 void main(void)

Основная функция программы.

В ней происходит непосредственное «рождение» лошадей и ямщиков. Она вызывает две предыдущие функции.

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

Приложение представляет собой консольное окно, в котором выводятся сообщения о действиях программы, а точнее о перемещениях ямщиков,

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

Далее происходит непосредственное перемещение ямщиков между городами. То есть ямщик выбирает лошадь, едет в какой-то город, там лошадь отдыхает и ямщик может взять другую лошадь и т.д.

  1. Текст программы

Разработка приложения велась на языке C.

Листинг кода программы представлен в приложении А.

Заключение

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

В ходе написания программы были усвоены основные принципы и методы разработки многопоточных программ.

Список использованных источников

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

Приложение А

(обязательное)

Код программы

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <windows.h>

#include <process.h>

#define STACK_SIZE 4096

HANDLE hthread;

typedef struct horseinfo// все, что касается лошадей

{

HANDLE hmtx;

BOOL hflag; // лошадиный флаг

int dest; // номер города

};

struct horseinfo horses[48]; //массив лошадей

typedef struct maninfo // для пассажиров

{

HANDLE mmtx;

int dest;

};

struct maninfo mans[30];

int BornNum; //Общая область для всех потоков

int BornHorseDest; //Город, в котором рождается лошадь

int BornCowboyDest; // Город, где рождается ямщик

int BornCowboyNumber; // Номер ямщика, с которым он рождается

void horsethread(void *arg) // Данная функция отвечает за лошадей

{

int num=BornNum;

printf("%d horse in the town ",num);

printf("%d\n",horses[num].dest);

while (TRUE)

{

printf("Horse %d is ready \n ",num);

while (horses[num].hflag) {}

Sleep(300);

while (!horses[num].hflag) {}

WaitForSingleObject(horses[num].hmtx, INFINITE); // лошадь спит

printf("Horse %d is sleep \n",num);

Sleep(2000);

ReleaseMutex(horses[num].hmtx); //лошадь просыпается

}

}

void cowboythread(void *arg) // Данная функция отвечает за ямщиков с пассажирами

{

int i = 0;

int num=BornCowboyNumber;

int dest=BornCowboyDest;

int next=0;

int countmans=3;

int j=0;

int k=0;

int currentman=0;

srand(time(NULL));

next=(rand()%7)+1;

printf("Cowboy in the town ");

printf("%d Destination ",dest);

printf("Next is %d\n",next);

while (TRUE)

{

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

{

if (horses[i].dest==dest)

{

WaitForSingleObject(horses[i].hmtx, INFINITE);

printf("Cowboy %d going to the \n",num);

printf(" %d",next);

horses[i].hflag=FALSE;

for (j=0;j<=32;j++)

{

if (mans[j].dest==dest)

{

WaitForSingleObject(mans[j].mmtx, INFINITE);

printf("Cowboy %d get passager",num);

printf("%d\n",j);

currentman=j;

}

}

printf("Cowboy %d get horse",num);

printf("%d\n",i);

Sleep(300);

horses[i].dest=next;

dest=next;

mans[j].dest=dest;

printf("Cowboy %d ",num);

printf("in the %d\n",dest);

srand(time(NULL));

next = (rand()%7)+1;

horses[i].hflag=TRUE;

printf("Cowboy %d push horse",num);

printf("%d\n",i);

mans[currentman].dest=dest;

ReleaseMutex(mans[currentman].mmtx);

ReleaseMutex(horses[i].hmtx);

i=48;

}

}

}

}

HANDLE horsesmutex;

void main(void)

{

void cowboythread(void *arg);

void horsethread(void *arg);

unsigned long threadid;

//Born horses

int i,k,j;

k=0; i=0; j=0;

horsesmutex=CreateMutex(NULL, FALSE, NULL);

srand(time(NULL));

for (i=1; i<=8; i++)

{

for (j=1; j<=6; j++)

{

mans[k].dest=i;

mans[k].mmtx = CreateMutex(NULL, FALSE, NULL); // инициализируется семафор

}

}

k=0;

for (i=1; i<=8; i++)

{

for (j=1; j<=6; j++)

{

horses[k].dest=i;

horses[k].hflag=TRUE;

horses[k].hmtx = CreateMutex(NULL, FALSE, NULL); // инициализируется семафор

BornNum=k;

hthread=(HANDLE)_beginthreadNT(horsethread, STACK_SIZE, NULL, NULL, 0, &threadid); //запускает лошадь

k++;

Sleep(200);

}

}

//Born cowboys

for (i=1;i<=8;i++)

{

for (j=1; j<=4;j++)

{

BornCowboyDest=i;

BornCowboyNumber=j;

hthread=(HANDLE)_beginthreadNT(cowboythread, STACK_SIZE, NULL, NULL, 0, &threadid); //запускаем ямщиков

Sleep(20);

}

}

while (TRUE) {} //вечный цикл

}