Главная » Просмотр файлов » Н.В. Вдовикина, И.В. Машечкин, А.Н. Терехин, А.Н. Томилин - Операционные системы - взаимодействие процессов (2008)

Н.В. Вдовикина, И.В. Машечкин, А.Н. Терехин, А.Н. Томилин - Операционные системы - взаимодействие процессов (2008) (1114653), страница 23

Файл №1114653 Н.В. Вдовикина, И.В. Машечкин, А.Н. Терехин, А.Н. Томилин - Операционные системы - взаимодействие процессов (2008) (Н.В. Вдовикина, И.В. Машечкин, А.Н. Терехин, А.Н. Томилин - Операционные системы - взаимодействие процессов (2008)) 23 страницаН.В. Вдовикина, И.В. Машечкин, А.Н. Терехин, А.Н. Томилин - Операционные системы - взаимодействие процессов (2008) (1114653) страница 232019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 23)

Идентификатор, принадлежавший завершившейсяобособленной нити, может быть сразу же присвоен новойсоздаваемой нити.Статус нити – будет ли она ожидаемой или обособленной –определяется атрибутом detachstate, который может быть задан внаборе атрибутов, используемом при создании нити, при помощифункции:#include <pthread.h>int pthread_attr_setdetachstate(pthread_attr_t*attr, intdetach_state);Первым аргументом ее является набор атрибутов,использованный для создания нити.

Значениями второго аргументамогут быть константы PTHREAD_CREATE_JOINABLE (создатьожидаемую нить) либо PTHREAD_CREATE_DETACHED (создатьобособленную нить).Узнать текущее значение этого атрибута можно, обратившиськ функции:138#include <pthread.h>int pthread_attr_getdetachstate(pthread_attr_t*attr, int*detach_state);Текущее значение атрибута будет записано во второйпараметр функции.Кроме того, нить, созданная как ожидаемая, впоследствииможет изменить свой статус на обособленную, обратившись кфункции:#include <pthread.h>int pthread_detach(pthread_t tid);В качестве аргумента ей указывается идентификатор нити.Пример 28. Создание и ожидание завершения нитей.В данном примере порождаются две нити: одна ожидаемая иодна обособленная.

Основная программа дожидается завершенияожидаемой нити, а затем завершает свою собственную нить.#include <pthread.h>#include <stdio.h>void *do_something(void* arg) {/*…*/}/* функция для первой нити */void *do_something_else(void* arg) {/*…*/}/* функция для второй нити */int *pInt; //фактический параметр для первой нитиchar *str = "hello";//фактический параметр для второй нитиint main(int argc, char *argv[]){pthread_t tid1, tid2;// идентификаторы нитейpthread_attr_t attr;//набор атрибутовint status, *pStatus = &status; /* переменнаядля получения статуса завершения первой нити *///заполняем набор атрибутов первой нити139pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);// порождаем первую нитьpthread_create(&tid1, &attr, do_something,(void *)pInt);printf("joinable thread created with id= %ul \\n", tid1);//заполняем набор атрибутов второй нитиpthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);// порождаем вторую нитьpthread_create(&tid2, &attr, do_something_else,(void *)str);printf("detached thread created with id = %ul \\n", tid2);// ожидаем завершения первой нитиpthread_join(tid1, (void **)&pStatus);printf("joinable thread id = %ul exited,status= %ul \n", tid1, *pStatus);\//уничтожаем набор атрибутовpthread_attr_destroy(&attr);// завершаем текущую нитьpthread_exit(NULL);return 0;}6.1.4 Конкуренция нитей при планированииНити в pthreads имеют атрибут, называемый областьюдействия конкуренции при планировании нити (schedulingcontention scope).

Этот атрибут задает способ планирования нити,т.е.фактически определяет, кто будет управлять планированиемданной нити – ядро ОС или самая нитевая библиотека. Он задается внаборе атрибутов нити, используемом при ее создании, при помощифункции140#include <pthread.h>int pthread_attr_setscope(pthread_attr_t *attr,int scope);Первым аргументом функции является набор атрибутов,использованный для создания нити, вторым – значение атрибута.ЕслиданныйатрибутустановленвзначениеPTHREAD_SCOPE_SYSTEM, то планированием данной нити управляетядро ОС. Фактически, это означает, что нить конкурирует запроцессорное время со всеми другими нитями и процессами наданной машине (или данном процессоре), причем ее приоритетопределяется в сопоставлении с приоритетами всех этих другихпроцессов и их нитей. Значение PTHREAD_SCOPE_PROCESS означает,что планирование нитей происходит на уровне библиотечныхфункций (без участия ядра ОС), и нить конкурирует припланировании только с другими нитями того же процесса(соответственно, и ее приоритет сопоставляется лишь сприоритетами других нитей в рамках того же процесса)24.Узнать текущее значение области действии конкуренции припланировании можно, обратившись к функции:#include <pthread.h>int pthread_attr_getscope(pthread_attr_t *attr,int * scope);Первым параметром ей передается набор атрибутов нити, атекущее значение атрибута будет записано во второй параметрфункции.6.1.5 Нити и сигналыРеализация pthreads расширяет рассмотренный нами ранеемеханизм надежных сигналов, распространяя их действие на нити.Как уже говорилось, при создании нить наследует сигнальнуюмаску от процесса, в рамках которого она порождается.

Однакозатем она может изменить свою сигнальную маску, заблокировавили разблокировав тот или иной сигнал. Кроме того, нити в рамкаходного процесса могут посылать сигналы друг другу.24некоторые реализации pthreads могут не поддерживать один из этих механизмовпланирования нитей. Например, реализация LinuxThreads, использовавшаяся авторами пособияпри тестировании, на момент написания этой книги поддерживает лишь значениеPTHREAD_SCOPE_SYSTEM.141Если в процесс, состоящий из нескольких нитей, приходитсигнал, он доставляется в ту нить, в которой этот сигнал незаблокирован. Если же таких нитей несколько, система произвольновыбирает в качестве адресата сигнала одну из них. Таким образом,при программировании многонитевых приложений, работающих ссигналами, следует особенно внимательно следить за сигнальнымимасками нитей, чтобы избежать эффекта неопределенности.Для изменения сигнальной маски нити служит функция:#include <pthread.h>#include <signal.h>int*newmask,pthread_sigmask(intsigset_t *oldmask);how,constsigset_tЭто аналог системного вызова sigprocmask() для нитей.Значения аргумента how влияют на характер изменения маскисигналов:–к текущей маске добавляются сигналы,указанные в наборе set;SIG_BLOCK– из текущей маски удаляются сигналы,указанные в наборе set;SIG_UNBLOCKSIG_SETMASK – текущая маска заменяется на набор set.Отметим, что несмотря на то, что нити могут изменять своисигнальные маски, блокируя и разблокируя отдельные видысигналов, способ обработки того или иного сигнала (задаваемый спомощью системного вызова sigaction()) устанавливается тольков рамках всего процесса, т.е.

распространяется на все нити данногопроцесса и не может быть изменен в отдельной нити так, чтобы этоизменение не коснулось других нитей процесса.Для отправки сигнала в другую нить того же процессаиспользуется функция:#include <pthread.h>#include <signal.h>int pthread_kill(pthread_t tid, int signo);Это аналог системного вызова kill() для нитей. Первымаргументом ее служит идентификатор нити, которой посылаетсясигнал, а вторым – номер посылаемого сигнала.1426.2 Синхронизация нитейПри использовании многонитевой модели необходимостьсинхронизации потоков выполнения, реализованных в видеотдельных нитей, возникает даже чаще, чем при программированиипараллельных процессов.

Поскольку нити совместно используютобщее адресное пространство, все глобальные и статические данныепроцесса (т.е. те переменные, область видимости которыхраспространяется на функции, назначенные нитям) доступны всемего нитям. Это означает, что если доступ к этим данным будетосуществляться из нескольких нитей, они должны синхронизироватьсвою работу.Некоторые из ранее рассмотренных нами способовсинхронизации – например, семафоры – могут успешноиспользоваться и нитями. Кроме того, нить имеет возможностьдождаться завершения работы другой нити, для чего используетсяфункция pthread_join(). Когда указанная в ней нить прекращаетсвоесуществование,происходитразблокированиенити,обратившейся к pthread_join(), и она может продолжить работу. Сдругой стороны, нитевые библиотеки, и в частности pthreads,предоставляют и ряд специфических средств синхронизации, два изкоторых мы рассмотрим ниже.6.3 Двоичные семафорыДвоичный семафор, или мьютекс (mutex – сокращение от«mutual exclusive» – «взаимное исключение»)25 представляет собойточную реализацию классического семафора Дейкстры ииспользуется (как и следует из его названия) для организациивзаимного исключения по схеме, описанной нами ранее: при входе вкритическую секцию нить опускает (или, иначе говоря, блокирует)семафор, а по выходе из критической секции – поднимает(разблокирует, освобождает) его.

Если нить пытается опуститьдвоичный семафор, который уже находится в заблокированномсостоянии, она не сможет завершить эту операцию до тех пор, покакакая-либо нить не освободит семафор – тем самым достигаетсявзаимное исключение.В отличие от семафоров IPC, мьютексы pthreads невозможноиспользовать в качестве «считающих» семафоров – они способныпропускать в критическую секцию лишь не более одной нити25в некоторых источниках можно также встретить название «взаимоисключающаяблокировка» или «критическая секция»143одновременно.использовании.Однакоонинесколькоболеепростыв6.3.1 Создание и инициализация двоичного семафораСтандарт POSIX определяет для создания двоичного семафораи задания его свойств тот же механизм, что и для нитей.

Длясемафоров тоже определены объекты-хранители наборов атрибутов,которые необходимо предварительно создать и заполнить, а затемиспользовать при создании двоичного семафора. Мы не будемподробно рассматривать функции, обслуживающие атрибутысемафора, т.к. POSIX на данный момент не описывает для нихникаких конкретных атрибутов и их значений26.Для создания двоичного семафора служит функция#include <pthread.h>intpthread_mutex_init(pthread_mutex_tconst pthread_mutex_attr_t *mutexattr);*mutex,Для представления двоичного семафора служит тип данныхpthread_mutex_t (стандарт POSIX не указывает, описывает ли этоттип сам объект или лишь его идентификатор).Функцияинициализирует семафор, адрес которого указан в первомаргументе. Начальным состоянием его будет «не заблокирован».Вторым параметром служит указатель на набор атрибутов семафора,но если мы хотим, чтобы он имел все свойства со значениями «поумолчанию», вместо этого аргумента можно передать NULL:#include <pthread.h>pthread_mutex_t mutex;pthread_mutex_init(&mutex, NULL);Самый же простой способ создания мьютекса – этоиспользование предопределенного статического инициализатораPTHREAD_MUTEX_INITIALIZER, который позволяет создать мьютекс,все атрибуты которого имеют значения «по умолчанию».

Используяего, предыдущий код можно переписать так:26некоторые реализации предлагают расширение стандарта, в частности – возможностьуказать через атрибуты тип мьютекса: помимо типа «по умолчанию», предлагается два другихварианта, причем функции работы с мьютексами этих типов содержат встроенные проверки,позволяющие избежать самоблокирования нити и связанных с этим тупиков. Кроме того,отдельные реализации мьютексов предлагают выбор между созданием «локаьного» мьютекса,который может использоваться только нитями внутри одного процесса, либо глобальногообъекта, который виден всем нитям всех процессов.144#include <pthread.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;6.3.2 Установка блокировкиЧтобы заблокировать двоичный семафор, нужно обратиться кфункции:#include <pthread.h>int pthread_mutex_lock(pthread_mutex_t *mutex);Ее единственным параметром является указатель на семафор.Если этот семафор на момент обращения к функции находился всостоянии «свободен», т.е.

Характеристики

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6451
Авторов
на СтудИзбе
305
Средний доход
с одного платного файла
Обучение Подробнее