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

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

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

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

пока значение семафоране станет как минимум 3 (3-2=1 > 0) */semop(semid, &sops, 1);132/* теперь значение семафора равно 1 */strcpy(str, shmaddr); /* копируем строкуиз разд.памяти *//*критическая секция - работа сразделяемой памятью - в этот моментпервый процесс к разделяемой памятидоступа не имеет*/if (str[0] == ‘Q’){/*завершение работы - освобождаемразделяемую память */shmdt(shmaddr);}/*после работы – обнулим семафор*/sops.sem_op=-1;semop(semid, &sops, 1);printf(“Read from shared memory: %s\n”,str);} while (str[0] != ‘Q’);return 0;}Отметим, что данный пример демонстрирует два разныхприема использования семафоров для синхронизации: первыйпроцесс блокируется в ожидании обнуления семафора, т.е.

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

Обратите внимание, что в данномпримере, помимо взаимного исключения процессов, достигаетсястрогая последовательность действий двух процессов: они получаютдоступ к критической секции строго по очереди.1336 Многонитевая модель. Библиотека pthreadsКак уже говорилось, в процессе эволюции UNIX былиразработаны различные реализации многонитевой моделипрограммирования. Они в разной степени опираются на поддержкуядра ОС: в некоторых из них используются нити с поддержкой ядра,тогда как другие предлагают «прикладные» нити, поддерживаемыеисключительно средствами самой нитевой библиотеки.Далеемырассмотриммодельмногопоточного(многонитевого) программирования, описанную в стандарте POSIX– она называется pthreads22.

Различные реализации этой моделиприсутствуют во многих ОС семейства UNIX.6.1 Реализация нитейБиблиотека pthreads реализует прикладные нити, для которыхпрактически не требуется поддержка ядра ОС. Функционированиетаких нитей (в частности, переключение выполнения между ними)практически не требует обращения к ОС и вследствие этого являетсяочень быстрым и несет минимум накладных расходов.Для каждой нити поддерживаются следующие элементы:- идентификатор нити;- динамический стек;- набор регистров (счетчик команд, регистр стека);- сигнальная маска;- значение приоритета;- специальная память.Каждой создаваемой нити присваивается идентификатор,уникальный среди всех нитей данного процесса – он характеризуетее подобно тому, как PID характеризует процесс.

Наличиесобственного динамического стека и регистров позволяет нитивыполняться независимо от других нитей. В момент создания нитьнаследует сигнальную маску породившего ее процесса, а такжеполучает от него по наследству значения приоритета, содержимое22pthreads – это сокращение от «POSIX threads», т.е. буквально «нити POSIX»134стека и регистров.

В дальнейшем нить может изменить своюсигнальную маску и значение приоритета.Подобно тому, как выполнение процесса ассоциируется снекой основной функцией реализующей его программы (в языке Ситакой функцией является main()), каждой нити при созданииставится в соответствие функция, выполнением которой оназанимается на протяжении всего своего существования.

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

Таким образом, при явномпорождении первойнити, фактически, в процессе будетнасчитываться уже две нити: одна (вновь порожденная) будетзаниматься выполнением назначенной ей функции, в то время каквторая – основная нить процесса – продолжит выполнение самогопроцесса.Как и системные вызовы, все функции библиотеки pthreads(если явно не указано иное) в случае успешного завершениявозвращают 0, в противном случае возвращается ненулевой кодошибки. Они не устанавливают переменную errno, но используютконстанты, описанные в <errno.h>, при непосредственном возвратезначений, сигнализирующих об ошибках.6.1.1 Представление атрибутов нитиКак уже говорилось, каждая нить обладает определеннымнабором характеристик (атрибутов), часть из которых она можетподвергать изменению.

Для описания атрибутов и управления ими вбиблиотеке pthreads вводятся понятие набора атрибутов нити икомплект функций для создания, удаления, запроса и изменениязначений атрибутов.Объект «набор атрибутов» может существовать независимо ниот какой нити, и один и тот же набор атрибутов может быть связан снесколькими нитями, что сокращает объем кода в том случае, еслинескольким нитям следует придать одни и те же значения атрибутов.Для создания набора атрибутов нити служит функция:# include <pthread.h>int pthread_attr_init(pthread_attr_t* attr_p);135Функция создает новый набор атрибутов нити, придает имзначения по умолчанию и размещает в области памяти, на которуюуказывает переданный ей параметр. Тип данных pthread_attr_tслужит для представления набора атрибутов нити.Набор атрибутов существует до тех пор, пока не будет явноуничтожен функцией# include <pthread.h>int pthread_attr_destroy(pthread_attr_t* attr_p);Эта функция удаляет набор атрибутов, на который указываетпереданный ей параметр.Далее по ходу изложения мы рассмотрим некоторыеконкретные атрибуты нитей, содержащиеся в наборе, и функции дляпроверки и изменения их значений.6.1.2 Создание нитиДля создания новой нити используется библиотечная функция:#include <pthread.h>intpthread_create(pthread_t*pthread_attr_t* attr, void *(*funcp)*argp);tid_p,const(void *), voidЭта функция создает новую нить для выполнния функции,указатель на которую задан аргументом funcp.

Как видно изпрототипа, такая функция должна принимать один параметр типаvoid * и возвращать значение такого же типа. Фактическийаргумент для функции, связанной с создаваемой нитью, передается впараметреargp.Практически, такие типы параметра ивозвращаемого значения позволяют функции нити принимать ивозвращать «указатель на что угодно», что дает программистунеобходимую гибкость. Если же в функцию нужно передатьнесколько параметров, следует определить для них структуру ипередавать ее адрес в качестве единственного аргумента.Для представления идентификатора нити служит тип данныхpthread_t. Идентификатор создаваемой нити будет возвращенчерез параметр tid_p. Если приложение не интересуетсяидентификатором создаваемой нити, вместо этого параметра можнопередать NULL.Нить может узнатьобратившись к функциисвой136собственныйидентификатор,#include <pthread.h>pthread_t pthread_self(void);Аргумент attr задает набор атрибутов создаваемой нити (ондолжен быть создан предварительно с помощью рассмотреннойвыше функции pthread_attr_init).

Если нити следуетиспользовать значения по умолчанию для всех своих атрибутов,вместо этого аргумента также можно передать NULL.Отметим, что при последующем изменении значенийатрибутов из набора, эти изменения не распространяются на те нити,которые были созданы ранее с использованием этого набора. Новыезначения атрибутов получат лишь нити, созданные после измененияатрибутов. Для того, чтобы изменить значение атрибута ужесуществующейнити,необходимоявнообратитьсяксоответствующей функции, устанавливающей значение того илииного атрибута.6.1.3 Завершение нити.

Ожидание завершения нитиНить может завершить свое выполнение, обратившись кфункции#include <pthread.h>void pthread_exit(void *retval);Этой функции в качестве аргумента можно передать указательна статическую область памяти, содержащую код возврата23. Крометого, нить может завершиться и неявно – если произойдет возврат изфункции нити. Напомним, что возвращаемое значение функциинити имеет тип void * − в этом случае значение, переданноеоператору return, и будет адресом кода возврата.Подобно тому, как процесс может ожидать завершенияпорожденных им процессов-потомков при помощи системноговызова wait(), любая нить может приостановить свое выполнение вожидании завершения другой нити того ж процесса, используяфункцию:#include <pthread.h>int pthread_join(pthread_t tid, void ** ret);23еще раз отметим, что каждой нити выделяется свой собственный динамический стек,в котором размещаются фактический параметр и локальные переменные связанной с нейфункции и т.п.

Этот стек, как и другие ресурсы нити, может быть разрушен при ее завершении,поэтому код возврата там размещать, вообще говоря, нельзя.137Нить, вызвавшая эту функцию, приостанавливается до тех пор,пока не завершится выполнение нити с идентификатором tid. Как ив случае с системным вызовом wait(), ожидающая нить можетполучить код завершения ожидаемой нити, который будет записанпо адресу, указанному во втором параметре. Если ожидающая нитьне интересуется кодом завершения, в качестве этого параметраможно передать NULL.Однако, существует важное отличие механизма ожиданиязавершения нитей от такового же для процессов. Любая нить можетнаходиться в одном из двух состояний: она может быть ожидаемой(joinable) либо обособленной (detached).

При завершенииожидаемой нити освобождаются все ресурсы, связанные с ней, заисключением ее идентификатора, а также тех структур данных, чтонеобходимы для хранения ее кода возврата и информации опричинах ее завершения. Для того, чтобы освободить эти ресурсы,необходимо,чтобыдругаянитьявнообратиласькpthread_join().Ни библиотека, ни ОС не предпринимют никакихдействий для освобождения указанных ресурсов, если послезавершения ожидаемой нити никакая другая нить не обращается кpthread_join(), чтобы узнать результат завершения этой нити.При завершении же обособленной нити все ресурсы,связанные с ней, освобождаются немедленно. Никакая другая нитьне может ожидать ее завершения посредством вызоваpthread_join().

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

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

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