МИНОБРНАУКИ РОССИИ
__________________________
Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им. В. И. Ульянова (Ленина)
________________________________________________________
В. В. СИДЕЛЬНИКОВ В. В. ШИРОКОВ
СРЕДСТВА ВЗАИМОДЕЙСТВИЯ ПРОЦЕССОВ В ОПЕРАЦИОННЫХ СИСТЕМАХ
Учебно-методическое пособие
Санкт-Петербург
Издательство СПбГЭТУ «ЛЭТИ»
2018
УДК 681.518.3:681.3.06
ББК З973-018я7
С34
Сидельников В. В., Широков В. В.
С34 Средства взаимодействия процессов в операционных системах: учеб.- метод. пособие. СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2018. 36 с.
ISBN 978-5-7629-2377-4
Рассматриваются средства операционных систем, предназначенные для взаимодействия потоков и процессов. По каждому из рассмотренных средств приведены основные системные вызовы и шаблоны программ, в которых они используются.
Предназначено для подготовки бакалавров по направлению 09.03.02 – «Информационные системы и технологии» и специалистов по специальности 090301.65 – «Компьютерная безопасность».
УДК 681.518.3:681.3.06
ББК З973-018я7
Рецензент канд. техн. наук, ст. науч. сотр. В. А. Павлов (ЦНИИ РТК).
Утверждено
редакционно-издательским советом университета
в качестве учебно-методического пособия
ISBN 978-5-7629-2377-4 |
© СПбГЭТУ «ЛЭТИ», 2018 |
2
ВВЕДЕНИЕ
Задания выполняются в среде операционной системы Linux.
При выполнении заданий необходимо использовать библиотеку
«pthread».
В разделах «Общие сведения» каждой лабораторной работы приведены системные вызовы, которые необходимо использовать для реализации программы. Приведенные сведения являются минимальными. Для подробной информации следует обратиться к руководству программиста системы Linux (команда man).
Если системный вызов возвращает результат, в программе необходимо проверить этот результат и запрограммировать действия – вывод результата на экран и завершение программы в случае ошибки.
Полагая, что программа содержится в файле lab.cpp, ее компиляцию и сборку можно выполнить следующей последовательностью команд:
Компиляция программы:
g++ -c lab.cpp.
В результате компиляции получается объектный код lab.o.
Сборка программы с включением библиотеки pthread: g++ -o lab lab.o –lpthread.
В результате сборки получается исполняемая программа.
Шаблоны, предложенные в каждой лабораторной работе, являются приблизительными. Студент самостоятельно должен выбрать типы данных, подходящие для объявления переменных, а также операторы языка и системные функции, подходящие для выполнения предписанных действий программы.
3
1. СОЗДАНИЕ И УНИЧТОЖЕНИЕ ПОТОКОВ
Цель работы – знакомство с базовой структурой построения многопоточной программы и с системными вызовами, обеспечивающими создание и завершение потоков.
Общие сведения
Базовая структура многопоточной программы, взятая за основу всех работ, выглядит следующим образом:
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).
4
Указания к выполнению работы
Написать программу, содержащую 2 потока (в дополнение к основному потоку). Каждый из потоков должен выводить определенное число на экран.
Шаблон программы:
объявить флаг завершения потока 1; объявить флаг завершения потока 2; функция потока 1()
{
пока (флаг завершения потока 1 не установлен) делать
{
выводить символ ‘1’ на экран; задержать на время;
}
}
функция потока 2()
{
пока (флаг завершения потока 2 не установлен) делать
{
выводить символ ‘2’ на экран; задержать на время;
}
}
основная программа()
{
объявить идентификатор потока 1; объявить идентификатор потока 2; создать поток из функции потока 1; создать поток из функции потока 2; ждать нажатия клавиши; установить флаг завершения потока 1;
установить флаг завершения потока 2; ждать завершения потока 1; ждать завершения потока 2;
}
5