Разработка многопоточной программной модели для ОС Linux

 

Задание на проектирование


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


Описание принципов, использованных в проекте


В современных ОС кроме собственно процессов выделяют их более элементарные составляющие, называемые нитями (threads - на английском). Иное название этих составляющих на русском языке - потоки, кроме того иногда используется более старое название - задачи (или мини-задачи). В данном изложении будет использоваться наименование нить, как более близкое к оригинальным техническим названиям разработчиков.

Заметим, что в ряде основополагающих ОС 60-70-х годов многопрограммное функционирование ОС строилось исключительно на понятии и использовании процессов, а нити как составляющие части процессов стали широко применяться относительно недавно. Поэтому теория вычислительных процессов строилась исключительно на понятии абстрактного процесса.

В настоящее время в рамках процесса могут функционировать несколько (и даже много) нитей. В простейших случаях в составе процесса обязательно присутствует одна нить. Собственно процесс в современных разработках и применениях специализирован исключительно на владении ресурсами вычислительной системы. К ресурсам процесса относятся области данных, используемые и обрабатываемые процессом (программой). Более того, оперативная память, которую процесс использует по своему усмотрению, распределяется процессу и временно является как бы его собственностью. В современных ОС такая память распределяется и закрепляется с помощью архитектурных средств виртуальной памяти, которыми управляет соответствующая подсистема ОС. Эта подсистема - одна из наиболее важных и ответственных частей ОС. К другим ресурсам процесса относят открытые файлы, которые конкретизируются для процесса благодаря дескрипторам (учетно-информационным описателям работы с файлом) и обозначающими их логическими номерами хэндлов (handle). В многозадачных ОС в качестве ресурсов процесса появляются дескрипторы и хэндлы ряда еще более сложных объектов (очередей, конвейеров, окон и т.д.).

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

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


Создание нитей в программе


В современных операционных системах широко используются нити. Это понятие возникло как результат развития понятия абстрактного процесса. Оказалось, что иногда целесообразно разделить процесс на части, которые выполнялись бы параллельно, конкурируя за главный ресурс - процессор, но в остальном выполняли бы общую работу. Можно подойти к осознанию понятия процесса с другой стороны. Абстрактные процессы теоретически разделяют на конкурирующие и кооперативные. Конкурирующие по существу мешают друг другу, но в совокупности выполняют много работ одновременно. Кооперативные - выполняют по частям совместно общую работу. Организационно-техническое объединение - под одной "крышей" обобщенного процесса - аналогов кооперативных процессов и составляют существо объединения нитей в одном процессе.

Процесс в современных ОС - это владелец всех основных ресурсов кооперативно работающих нитей. У этих нитей общее виртуальное адресное пространство, у них общие дескрипторы (описатели внутри служебных областей ОС) и соответствующие их хэндлы. Причем дескрипторы и хэндлы всевозможных допустимых в ОС объектов: файлов, созданных дочерних процессов, графических окон, семафоров и т.п. Практически нити одного процесса используют общий сегмент данных, откуда каждая из них может брать данные или записывать данные туда. Процессором нити пользуются по очереди, так что он не принадлежит ни одной из них, но он не принадлежит и самому процессу.

Чем же владеет отдельная нить? Нити принадлежит только текущая совокупность значений в регистрах и собственный стек. Текущая совокупность значений в регистрах называют контекстом задачи. Когда происходит переключение между задачами, необходимо запоминается контекст приостанавливаемой задачи и восстанавливается из места сохранения контекст запускаемой на процессор задачи. В современной архитектуре процессором много внимания уделяется аппаратной реализации сохранения контекста, его восстановлению и переключению между задачами. Зачем необходимо запоминать и восстанавливать контекст задачи? По той же причине, по которой сохраняются и восстанавливаются регистры при возникновении прерывания.

Обычно нить своей работой реализует действия одной из процедур общей для всех нитей процесса программы. Теоретически любой нити процесса доступны все части программы процесса, в частности все его процедуры, но реально работа организуется так, чтобы нити отвечала отдельная процедура. Учитывая, что процедуре для нормальной работы необходим кадр стека, становится понятным закрепление за нитью собственного стека.

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

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

программирование многопоточный приложение нить

Описание программы


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

1.Начальное состояние (автомобиль находится в начальной точке)

2.Состояние, когда автомобиль подъезжает к станции

.Ожидание освобождения одной из двух станций заправки

.Автомобиль занимает первую станцию (при этом занимается семафор для первой станции)

.Автомобиль занимает вторую станцию (при этом занимается семафор для второй станции)

При выполнении программы если один из семафоров занят, то автомобиль «подъезжает» к другой станции, то есть занимается другой семафор. Если оба семафора оказываются заняты, то автомобиль находится в третьем состоянии до тех пор, пока не освобождается один из них.

.Ожидание кассы

7.Автомобиль занимает кассу (фаза оплаты заправки). В данном состоянии занимается семафор кассы.

.Отъезд автомашины (освобождение семафора кассы)

В основе графического отображения процесса выполнения программы лежит функция move(PosX, PosY), где PosX и PosY являются номерами строки и столбца соответственно. Данная функция перемещает курсор в указанную точку. Команда addstr("text") добавляет надпись в строке PosX начиная с символа PosY.

Семафоры создаются (инициализируются) с помощью функции sem_init(). Первый параметр функции sem_init() - указатель на переменную типа sem_t, которая служит идентификатором семафора. Второй параметр, pshared, в настоящее время не используется. Мы оставим его равным нулю. В третьем параметре передается значение, которым инициализируется семафор. Дальнейшая работа с семафором осуществляется с помощью функций sem_wait() и sem_post(). Единственным аргументом функции sem_wait() служит указатель на идентификатор семафора. Функция sem_wait() приостанавливает выполнение вызвавшего ее потока до тех пор, пока значение семафора не станет больше нуля, затем функция уменьшает значение семафора на единицу и возвращает управление. Функция sem_post(), наоборот, увеличивает значение семафора, идентификатор которого был ей передан, на единицу. Присвоив семафору значение 0, наша программа создает первый поток и вызывает функцию sem_wait(). Эта функция вернет управление программе после того, как функция потока вызовет функцию sem_post().

При отрисовке автомобилей используем функцию redraw_state () в которй мы сначала ожидаем семафор для работы с консолью, так как несколько потоков не должны писать одновременно sem_wait(&console). Затем мы «пробегаем» по всем машинам for (j=0;j<max;j++) и, в зависимости от состояния, в котором нах. машина, делаем отрисовку. Пример:

(states[j].state = = 2) {(30, 35);(states[j].name);


В данном случае, если машина находится в состоянии 2, а это обозначает, что автомобиль занял первую станцию заправки, мы перемещаем курсов в 30 строку на 35 символ и выводим на экран имя автомашины (букву).

В данный момент времени занимается семафор станции и мы ожидаем пока машина заправится (sleep(FUEL_TIME)). После этого состояние машины меняется на 4 и освобождается семафор станции. Состояние машины не случайно меняется с 2 сразу на 4. Это объясняется тем, что состояния 2 и 3 описывают период нахождения автомобиля на первой или второй станции заправки соответственно. То есть, если машина заправлялась на первой станции, то заправка на второй не нужна и авто движется к кассе.

Аналогично обрабатывается процесс оплаты за заправку. Машина ждет освобождения семафора кассы и, если семафор свободен, занимает кассу и ждет время KASSA_TIME. Затем семафор кассы освобождается и машина покидает заправку, чтобы ее место у кассы занял другой автомобиль.

На рисунке изображен пример работы программы с десятью машинами:


Рис. 1. Окно терминала с запущенной программой


Как видно из рисунка 1, программа успешно работает в операционной системе Mac OS X Leopard (v10.5.6). Данный успех обусловлен тем, что Mac OS X является гибридной, т.е. ее ядро базируется на двух источниках: первый - пример классического микроядра, взятый из проекта Mach. А второй содержит код проекта FreeBSD, который, в свою очередь, основан на Unix. Именно это и обеспечивает работу программы данного курсового проекта как в Linux системе, так и в Mac OS X. Ниже приведена графическая схема ядра Mac OS X.


Рис. 2. Ядро XNU (X is Not Unix)

Программа создавалась в среде Mac OS X при использовании пакета программ X-Code, содержащего компилятор GCC (GNU Compiler Collection), и файлового менеджера Midnight Commander (mc) для консоли (Терминала). Во время разработки я столкнулся с трудностью компиляции программы с консольной визуализацией (проблема с библиотекой Curses.h). Проблема была устранена при установке более новой версии библиотеки (5.7).



Заключение


В ходе курсового проектирования была написана программа в соответствии с требованиями задания, а также изучены методы и средства программирования в операционной системе Mac OS X при помощи функций языка Си. В программе реализованы методы программного представления семафоров и функции ожидания события, принципы создания многопоточных приложений и организовано их корректное выполнение. Изучены базовые функции и основные приемы программирования на языке Си с использованием функций Unix API.


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


1.Болски М.И., Язык программирования Си. Справочник: Пер. с англ. - М.: Радио и связь, 1988. - 96с.: ил.

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

Используемые интернет ресурсы:

1.#"justify">2.#"justify">3.#"justify">.#"justify">5.http://insanelymac.com


Задание на проектирование Разработать для Linux многопоточную программную модель следующей задачи. Имеется заправочная станция с двумя колонками заправки

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ