Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Указания к выполнению работыСтр 1 из 5Следующая ⇒
Методические указания к лабораторным работам по дисциплине «Операционные системы» Средства взаимодействия процессов в операционных системах Содержание Введение СОЗДАНИЕ И УНИЧТОЖЕНИЕ ПОТОКОВ СИНХРОНИЗАЦИЯ ПОТОКОВ С ПОМОЩЬЮ МЬЮТЕКСОВ И НЕИМЕНОВАННЫХ СЕМАФОРОВ ВЗАИМОДЕЙСТВИЕ ПОТОКОВ ЧЕРЕЗ НЕИМЕНОВАННЫЕ КАНАЛЫ СИНХРОНИЗАЦИЯ ПРОЦЕССОВ С ПОМОЩЬЮ ИМЕНОВАННЫХ СЕМАФОРОВ ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ РАЗДЕЛЯЕМУЮ ПАМЯТЬ ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ ИМЕНОВАННЫЕ КАНАЛЫ ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ ОЧЕРЕДИ СООБЩЕНИЙ ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ СОКЕТЫ Заключение Введение Задания выполняются в ОС Linux. При выполнении заданий необходимо использовать библиотеку «pthread». В разделах «Общие сведения» каждой лабораторной работы приведены системные вызовы, которые необходимо использовать для реализации программы. Приведенные сведения являются минимальными. Для подробной информации следует обратиться к руководству программиста системы Linux (команда man). Если системный вызов возвращает результат, в программе необходимо проверить этот результат и запрограммировать действия – вывод результата на экран и завершение программы в случае ошибки. Полагая, что программа содержится в файле lab.cpp, ее компиляция и сборка может быть выполнена следующей последовательностью команд. Компиляция программы: g++ -c lab.cpp, в результате компиляции получается объектный код lab.o. Сборка программы с включением библиотеки pthread: g++ -o lab lab.o –lpthread, в результате сборки получается исполняемая программа. Шаблоны, предложенные в каждой лабораторной работе, являются приблизительными. Студент самостоятельно должен выбрать типы данных, подходящие для объявления переменных, а также операторы языка и системные функции, подходящие для выполнения предписанных действий программы. СОЗДАНИЕ И УНИЧТОЖЕНИЕ ПОТОКОВ Цель работы - знакомство с базовой структурой построения многопоточной программы и с системными вызовами, обеспечивающими создание и завершение потоков. Общие сведения Базовая структура многопоточной программы, взятая за основу всех работ, выглядит следующим образом: 1. Описываются поточные функции, соответствующие потокам программы. 2. В основной программе создаются потоки на основе поточных функций. 3. После создания потоков основная программа приостанавливает выполнение и ожидает команды завершения. 4. При поступлении команды завершения основная программа формирует команды завершения потоков. 5. Основная программа переходит к ожиданию завершения потоков. 6. После завершения потоков основная программа завершает свою работу. Создание потока в стандарте POSIX осуществляется следующим вызовом: int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg), где thread – указатель на идентификатор потока; attr – указатель на структуру данных, описывающих атрибуты потока; start_routine – имя функции, выполняющей роль потока; arg - указатель на структуру данных, описывающих передаваемые в поток параметры. Завершение потока может осуществляться вызовом оператора return из функции потока. При этом необходимо синхронизировать завершение с основным потоком, используя следующую функцию: int pthread_join(pthread_t thread, void **retval), где thread – идентификатор потока; retval – код завершения потока. Функция, выполняющая роль потока, создается на основе следующего шаблона: static void * thread_start(void *arg). Указания к выполнению работы Написать программу, содержащую два потока (в дополнение к основному потоку). Каждый из потоков должен выводить определенное число на экран. Шаблон программы представлен ниже: объявить флаг завершения потока 1; объявить флаг завершения потока 2; Функция потока 1() { Пока (флаг завершения потока 1 не установлен) делать { выводить символ ‘1’ на экран; задержать на время; } } Функция потока 2() { Пока (флаг завершения потока 2 не установлен) делать { выводить символ ‘2’ на экран; задержать на время; } } Основная программа() { объявить идентификатор потока 1; объявить идентификатор потока 2; создать поток из функции потока 1; создать поток из функции потока 2; ждать нажатия клавиши; установить флаг завершения потока 1; установить флаг завершения потока 2; ждать завершения потока 1; ждать завершения потока 2; } Вопросы для самопроверки 1. В чем состоит различие между понятиями «поток» и «процесс»? 2. Как осуществить передачу параметров в функцию потока при создании потока? 3. Какие способы завершения потока существуют? 4. На какие характеристики потока можно влиять через атрибуты потока? 5. В каких состояниях может находиться поток? 6. Какие способы переключения задач используются в ОС? 7. Объясните суть параметров, входящих в вызов pthread_create(). 8. Объясните суть параметров, входящих в вызов pthread_join(). 9. Опишите трассу выполнения программы. СИНХРОНИЗАЦИЯ ПОТОКОВ С ПОМОЩЬЮ МЬЮТЕКСОВ И НЕИМЕНОВАННЫХ СЕМАФОРОВ Цель работы - знакомство со средствами синхронизации потоков - двоичными и общими неименованными семафорами и с системными вызовами, обеспечивающими создание, закрытие, захват и освобождение мьютексов и неименованных семафоров. Общие сведения Для обеспечения взаимного исключения при доступе нескольких потоков к одному критическому ресурсу используются семафоры. Семафоры можно разделить на двоичные и общие, а также на неименованные и именованные. Двоичный семафор – мьютекс – обладает только двумя состояниями – захвачен и свободен. Если критический участок свободен, то поток выполняет операцию захвата мьютекса и входит в критический участок. При выходе из критического участка поток освобождает мьютекс. Если критический участок занят, то поток, выполняя операцию захвата мьютекса, блокируется и не входит в критический участок. Активизация заблокированного потока и вход в критический участок происходит тогда, когда ранее вошедший в критический участок поток выходит из него и освобождает мьютекс. Семафор отличается от мьютекса большим числом состояний за счет использования внутреннего счетчика. Это позволяет обеспечить большее разнообразие правил нахождения потоков в критическом участке. При начальном состоянии счетчика семафора, равном 1, семафор эквивалентен мьютексу. Мьютексы и неименованные семафоры используются для синхронизации потоков в рамках одного процесса. Именованные семафоры используются для синхронизации процессов и будут рассмотрены позже. Вызов, которым создается мьютекс, выглядит следующим образом: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr), где mutex – идентификатор мьютекса; attr – указатель на структуру данных, описывающих атрибуты мьютекса. При входе в критический участок необходимо осуществить следующий вызов: int pthread_mutex_lock(pthread_mutex_t *mutex).При выходе из критического участка необходимо осуществить следующий вызов: int pthread_mutex_unlock(pthread_mutex_t *mutex).Вызов, которым удаляется мьютекс, выглядит следующим образом: int pthread_mutex_destroy(pthread_mutex_t *mutex).Создание семафора производится вызовом: int sem_init(sem_t *sem, int shared, unsigned int value), где sem – идентификатор семафора; shared – индикатор использования семафора потоками или процессами; value – начальное значение счетчика семафора. При входе в критический участок необходимо осуществить следующий вызов: int sem_wait(sem_t *sem).При выходе из критического участка необходимо осуществить следующий вызов: int sem_post(sem_t *sem).Удаление семафора производится вызовом: int sem_destroy(sem_t *sem). Указания к выполнению работы Написать программу, содержащую два потока, осуществляющих координированный доступ к разделяемому ресурсу (ресурс выбрать по согласованию с преподавателем, например, экран или файл). Необходимо убедиться, что в случае отсутствия мьютекса (семафора) потоки выводят символы в произвольном порядке, например:
121212121212121212121212121212121212121212121212121212121212121.
В случае использования мьютекса (семафора) потоки выводят символы в определенном порядке, например:
111111111122222222221111111111222222222211111111112222222222.
По согласованию с преподавателем выбрать средство координации – мьютексы или неименованные семафоры. А также проверить работу функций входа в критический участок с блокировкой и без блокировки.
Шаблон программы представлен ниже:
объявить флаг завершения потока 1; объявить флаг завершения потока 2; объявить идентификатор мьютекса /*неименованного семафора*/; Функция потока 1() { |
||
Последнее изменение этой страницы: 2018-04-12; просмотров: 631. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |