Материал: Sb97308

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

МИНОБРНАУКИ РОССИИ

__________________________

Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им. В. И. Ульянова (Ленина)

________________________________________________________

В. В. СИДЕЛЬНИКОВ В. В. ШИРОКОВ

СРЕДСТВА ВЗАИМОДЕЙСТВИЯ ПРОЦЕССОВ В ОПЕРАЦИОННЫХ СИСТЕМАХ

Учебно-методическое пособие

Санкт-Петербург

Издательство СПбГЭТУ «ЛЭТИ»

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