Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Пока (флаг завершения потока 1 не установлен)




{

захватить мьютекс /*неименованный семафор*/;

В цикле несколько раз выполнять

{

выводить символ ‘1’ на экран;

задержать на время;

}

освободить мьютекс /*неименованный семафор*/;

задержать на время;

}

}

Функция потока 2()

{

Пока (флаг завершения потока 2 не установлен)

{

захватить мьютекс /*неименованный семафор*/;

В цикле несколько раз выполнять

{

выводить символ ‘2’ на экран;

задержать на время;

}

освободить мьютекс /*неименованный семафор*/;

задержать на время;

}

}



Основная программа()

{

объявить идентификатор потока 1;

объявить идентификатор потока 2;

инициализировать мьютекс /*неименованный семафор*/;

создать поток из функции потока 1;

создать поток из функции потока 2;

ждать нажатия клавиши;

установить флаг завершения потока 1;

установить флаг завершения потока 2;

ждать завершения потока 1;

ждать завершения потока 2;

удалить мьютекс /*неименованный семафор*/;

}

Вопросы для самопроверки

1. Какой ресурс называется критическим ресурсом?

2. Какой участок программы называется критическим участком?

3. Какой режим выполнения программ называется режимом взаимного исключения?

4. Перечислите способы организации режима взаимного исключения.

5. Опишите алгоритмы операций захвата и освобождения мьютекса.

6. Опишите алгоритмы операций захвата и освобождения семафора.

7. Какими операциями с мьютексом и с неименованным семафором можно осуществить проверку занятости ресурса без блокирования потока?



ВЗАИМОДЕЙСТВИЕ ПОТОКОВ ЧЕРЕЗ НЕИМЕНОВАННЫЕ КАНАЛЫ

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

Общие сведения

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

Канал создается с помощью следующего вызова:

int pipe(int filedes[2]),

где filedes[2] – массив из двух файловых дескрипторов, один из которых используется для записи данных (filedes[1]), а второй (filedes[0]) – для чтения данных.

Чтение данных из канала производится следующей операцией:

ssize_t read(int fd, void *buf, size_t count),

где fd – файловый дескриптор для чтения; buf – адрес буфера для чтения данных; count – размер буфера.

Запись данных в канал производится следующей операцией:

ssize_t write(int fd, const void *buf, size_t count),

где fd – файловый дескриптор для записи; buf – адрес буфера для записи данных; count – количество байтов, предназначенных для записи.

Каждый из дескрипторов канала отдельно закрывается следующим вызовом:

int close(int fd).

Указания к выполнению работы

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

 

Шаблон программы представлен ниже:


объявить флаг завершения потока 1;

объявить флаг завершения потока 2;

объявить идентификатор неименованного канала;


Функция потока 1()

{

объявить буфер;

Пока (флаг завершения потока 1 не установлен)

{

сформировать сообщение в буфере;

записать сообщение из буфера в неименованный канал;

задержать на время;

}

}

Функция потока 2()

{

объявить буфер;

Пока (флаг завершения потока 2 не установлен)

{

очистить буфер;

прочитать сообщение из неименованного канала в буфер;

вывести сообщение на экран;

}

}

Основная программа()

{

объявить идентификатор потока 1;

объявить идентификатор потока 2;

создать неименованный канал;

создать поток из функции потока 1;

создать поток из функции потока 2;

ждать нажатия клавиши;

установить флаг завершения потока 1;

установить флаг завершения потока 2;

ждать завершения потока 1;

ждать завершения потока 2;

закрыть неименованный канал;

}



Вопросы для самопроверки

1. Как обеспечивается синхронизация записи и чтения в неименованном канале?

2. Как осуществить использование неименованного канала для взаимодействия процессов?

3. Как для неименованного канала организовать чтение и запись данных «без ожидания»?

4. Как реализовать функциональность неименованного канала с помощью семафоров?

5. Как с помощью неименованных каналов организовать двунаправленное взаимодействие?

6. Каким отношением должны быть связаны процессы, чтобы взаимодействие между ними могло бы быть организовано через неименованные каналы?



СИНХРОНИЗАЦИЯ ПРОЦЕССОВ С ПОМОЩЬЮ ИМЕНОВАННЫХ СЕМАФОРОВ

Цель работы -знакомство студентов со средством синхронизации процессов - именованными семафорами и с системными вызовами, обеспечивающими создание, закрытие и удаление именованных семафоров, а также захват и освобождение именованных семафоров.

Общие сведения

Именованные семафоры позволяют организовать синхронизацию процессов в операционной системе. За счет того, что при создании и открытии именованного семафора, ему передается «имя» - цепочка символов, два процесса получают возможность получить указатель на один и тот же семафор. Т.е. в отличие от мьютексов и неименованных семафоров, именованные семафоры могут координировать доступ к критическому ресурсу не только на уровне нескольких потоков одной программы, но и а на уровне нескольких, выполняющихся программ - процессов.

В системе этот семафор реализуется в виде специального файла, время жизни которого не ограничено временем жизни процесса, его создавшего.

Существует несколько видов программных интерфейсов для создания именованных семафоров. В данном случае рассматривается программный интерфейс POSIX.

Именованный семафор создается следующим вызовом:

sem_t *sem_open(const char *name,

int oflag,

mode_t mode,

unsigned int value),

где name – имя семафора; oflag – флаг, управляющий операцией создания семафора, при создании семафора необходимо указать флаг O_CREAT; mode

– права доступа к семафору, могут быть установлены, например, в 0644; value – начальное состояние семафора.

Именованный семафор закрывается следующим вызовом:

int sem_close(sem_t *sem).

При входе в критический участок необходимо вызвать функцию:

int sem_wait(sem_t *sem).

При выходе из критического участка необходимо вызвать функцию:

int sem_post(sem_t *sem).


Именованный семафор удаляется следующим вызовом:

int sem_unlink(const char *name).










Последнее изменение этой страницы: 2018-04-12; просмотров: 643.

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