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

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

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

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

Стековый кадр освобождается при выходе из функции.Соответственно, если при выполнении безусловного переходапроцесс минует тот фрагмент кода, где происходит освобождениестекового кадра, и управление непосредственно перейдет в другуючасть программы (например, в объемлющую функцию), тофактическое состояние стека не будет соответствовать текущемуучастку кода, и тем самым стек подвергнется разрушению.Однако, такое ограничение в некоторых случаях создаетбольшое неудобство: например, в случае возникновения ошибки врекурсивной функции, после обработки ошибки имеет смыслперейти в основную функцию, которая может находиться на84несколько уровней вложенности выше текущей. Поскольку такойпереход невозможно осуществить ни оператором return, ниоператором goto, программист будет вынужден создавать какие-тогромоздкие структуры для обработки ошибок на каждом уровневложенности.Возможность передавать управление в точку, находящуюся водной из вызывающих функций, предоставляется двумя системнымивызовами, реализующими механизм нелокальных переходов:#include <setjmp.h>int setjmp(jmp_buf env);void longjmp(jmp_buf env, int val);Вызов setjmp() используется для регистрации некоторойточки кода, которая в дальнейшем будет использоваться в качествепункта назначения для нелокального перехода, а вызов longjmp() –для перехода в одну из ранее зарегистрированных конечных точек.При обращении к вызову setjmp(), происходит сохранениепараметров текущей точки кода (значения счетчика адреса, позициистека, регистров процессора и реакций на сигналы).

Все этизначения сохраняются в структуре типа jmp_buf, которая передаетсявызову setjmp() в качестве параметра. При этом вызов setjmp()возвращает 0.После того, как нужная точка кода зарегистрирована спомощью вызова setjmp(), управление в нее может быть переданопри помощи вызова longjmp(). При этом в качестве первогопараметра ему указывается та структура, в которой былизафиксированы атрибуты нужной нам точки назначения.

Послеосуществления вызова longjmp() процесс продолжит выполнение сзафиксированной точки кода, т.е. с того места, где происходитвозврат из функции setjmp(), но в отличие от первого обращения кsetjmp(), возвращающим значением setjmp() станет не 0, азначение параметра val в вызове longjmp(), который произвелпереход.Отметим, что если программист желает определить впрограмме несколько точек назначения для нелокальных переходов,каждая из них должна быть зарегистрирована в своей структуре типаjmp_buf. С другой стороны, разумеется, на одну и ту же точкуназначения можно переходить из разных мест программы, при этом,чтобы различить, из какой точки был произведен нелокальныйпереход, следует указывать при переходах разные значенияпараметра val. В любом случае, при вызове longjmp() значение85параметра val не должно быть нулевым (даже если оно есть 0, товозвращаемое значение setjmp() будет установлено в 1). Крометого, переход должен производиться только на такие точки, которыенаходятся в коде одной из вызывающих функций для той функции,откуда осуществляется переход (в том числе, переход может бытьпроизведен из функции-обработчика сигнала).

При этом в моментперехода все содержимое стека, используемое текущей функцией ивсеми вызывающими, вплоть до необходимой, освобождается.Пример 16. Использование нелокальных переходов.#include <signal.h>#include <setjmp.h>jmp_buf env;void abc(int s){…longjmp(env,1);/*переход- в точку *** */}int main(int argc, char **argv){…if (setjmp(env) == 0)/* запоминается данная точка процесса - *** */{signal(SIGINT,abc);на сигнал *//* установка реакции…/* цикл обработкифункции setjmp() */данныхпослевызова}else{…/* цикл обработки данных после возврата изобработчика сигнала */}...86}4.4 Программные каналыОдним из простейших средств взаимодействия процессов воперационной системе UNIX является механизм каналов.Неименованный канал есть некая сущность, в которую можнопомещать и извлекать данные, для чего служат два файловыхдескриптора, ассоциированных с каналом: один для записи в канал,другой — для чтения.

Для создания канала служит системный вызовpipe():#include <unistd.h>int pipe(int *fd);Данный системный вызов выделяет в оперативной памятинекоторый буфер ограниченного размера и возвращает черезпараметр fd массив из двух файловых дескрипторов: один длязаписи в канал — fd[1], другой для чтения — fd[0].Эти дескрипторы являются дескрипторами открытых файлов,с которыми можно работать, используя такие системные вызовы какread(), write(), dup() и так далее. Более того, эти дескрипторы,как и прочие дескрипторы открытых файлов, наследуются припорождении сыновнего процесса (что и позволяет использоватьканалы как средство общения между процессами). Однако следуетчетко понимать различия между обычным файлом и каналом.Основные отличительные свойства канала следующие:- в отличие от файла, к неименованному каналу невозможендоступ по имени, т.е.

единственная возможностьиспользовать канал – это те файловые дескрипторы,которые с ним ассоциированы;- канал не существует вне процесса, т.е. для существованияканала необходим процесс, который его создаст и вкотором он будет существовать, а после того, как будутзакрыты все дескрипторы, ассоциированные с этимканалом, ОС автоматически освободит занимаемый имбуфер.

Для файла это, разумеется, не так;- канал реализует модель последовательного доступа кданным (FIFO), т.е. данные из канала можно прочитатьтолько в той же последовательности, в какой они былизаписаны. Это означает, что для файловых дескрипторов,ассоциированных с каналом, не определена операция87позиционирования lseek() (при попытке обратиться кэтому вызову произойдет ошибка).Кроме того, существует ряд отличий в поведении операцийчтения и записи в канал, а именно:При чтении из канала: если прочитано меньше байтов, чем находится в канале,оставшиеся данные сохраняются в канале; если делается попытка прочитать больше данных, чем имеетсяв канале, и при этом существуют открытые дескрипторызаписи, ассоциированные с каналом, будет прочитано (т.е.изъято из канала) доступное количество данных, после чегочитающий процесс блокируется до тех пор, пока в канале непоявится достаточное количество данных для завершенияоперации чтения; процесс может избежать такого блокирования, изменив дляканала режим блокировки с использованием системноговызова fcntl().

В неблокирующем режиме в ситуации,описанной выше, будет прочитано доступное количестводанных, и управление будет сразу возвращено процессу; при закрытии записывающей стороны канала (т.е. закрытиивсех дескрипторов записи, связанных с данным каналом), длянего устанавливается признак конца файла (это можнопредставить себе так, что в канал «помещается символEOF»)16. После этого процесс, осуществляющий чтение, можетвыбрать из канала все оставшиеся данные и получить признакконца файла, благодаря чему блокирования при чтении в этомслучае не происходит.При записи в канал: если процесс пытается записать большее число байтов, чемпомещается в канал (но не превышающее предельный размерканала) записывается возможное количество данных, послечего процесс, осуществляющий запись, блокируется до техпор, пока в канале не появится достаточное количество местадля завершения операции записи;16Надо понимать, что на самом деле EOF не является символом, а представляет собойконстанту, отличную от представления какого-либо символа в какой-либо кодировке, котораяслужит лишь для удобства возврата значений из читающих операций при достижении признакаконца файла.

Поэтому фактически, конечно, никакой «символ» EOF в канал (как и в обычныйфайл) никогда не помещается.88 процесс может избежать такого блокирования, изменив дляканала режим блокировки с использованием системноговызова fcntl(). В неблокирующем режиме в ситуации,описанной выше, запись в канал не производится (т.к. причастичной записи у ядра нет возможности обеспечить ееатомарность), и вызов write()возращает ошибку,устанавливая в переменной errno значение EAGAIN; если же процесс пытается записать в канал порцию данных,превышающую предельный размер канала, то будет записанодоступное количество данных, после чего процессзаблокируется до появления в канале свободного месталюбого размера (пусть даже и всего в 1 байт), затем процессразблокируется, вновь производит запись на доступное местов канале, и если данные для записи еще не исчерпаны, вновьблокируется до появления свободного места и т.д., пока небудут записаны все данные, после чего происходит возврат извызова write(); если процесс пытается осуществить запись в канал, с которымне ассоциирован ни один дескриптор чтения, то он получаетсигнал SIGPIPE (тем самым ОС уведомляет его онедопустимости такой операции).В стандартной ситуации (при отсутствии переполнения)система гарантирует атомарность операции записи, т.

е. приодновременной записи нескольких процессов в канал их данные неперемешиваются.Пример 17. Использование канала.Пример использования канала в рамках одного процесса –копирование строк. Фактически осуществляется посылка данныхсамому себе.#include <unistd.h>#include <stdio.h>int main(int argc, char **argv){char *s = ”chanel”;char buf[80];int pipes[2];pipe(pipes);write(pipes[1], s, strlen(s) + 1);89read(pipes[0], buf, strlen(s) + 1);close(pipes[0]);close(pipes[1]);printf(“%s\n”, buf);return 0;}Процессwrite()pipes[1]read()pipes[0]Рис. 15 Обмен через канал в рамках одного процесса.Чаще всего, однако, канал используется для обмена даннымимежду несколькими процессами.

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

Рис. 16 и Пример 18).Процесс-отецПроцесс-сынpipe();fork()fd[0]fd[0]fd[1]fd[1]каналчтениезаписьРис. 16 Пример обмена данными между процессами через канал.Пример 18. Схемавзаимодействияиспользованием канала.#include <sys/types.h>90процессовс#include <unistd.h>int main(int argc, char **argv){int fd[2];pipe(fd);if (fork()){/*процесс-родитель*/close(fd[0]);дескриптор *//*закрываемненужныйзакрываемненужныйwrite (fd[1], …);…close(fd[1]);…}else{/*процесс-потомок*/close(fd[1]);дескриптор *//*while(read (fd[0], …)){…}…}}Аналогичным образом может быть организован обмен черезканал между, например, двумя потомками одного порождающегопроцесса и вообще между любыми родственными процессами −единственным требованием здесь, как уже говорилось, являетсянеобходимость создавать канал в порождающем процессе прежде,чем его дескрипторы будут унаследованы порожденнымипроцессами.Как правило, канал используется как однонаправленноесредство передачи данных, т.е.

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

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

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