Вы на НеОфициальном сайте факультета ЭиП

На нашем портале ежедневно выкладываются материалы способные помочь студентам. Курсовые, шпаргалки, ответы и еще куча всего что может понадобиться в учебе!
Главная Контакты Карта сайта
 
Где мы?
» » » Операционные системы. Взаимодействие процессов.

Реклама


Операционные системы. Взаимодействие процессов.

Просмотров: 3338 Автор: admin

Операционные системы Лабораторная работа №3.1 Взаимодействие процессов.
Цель работы: изучить взаимодействие процессов в ОС Linux.
Методический материал.
Взаимодействие процессов — это механизм обмена данными между 
процессами. 
В этой лабораторной работе рассмотрим один способ из пяти возможныхдля взаимодействия процессов. Все способы:
– Совместно используемая память — процессы могут просто читать изаписывать данные в рамках заданной области памяти;
– Отображаемая память — напоминает совместно используемую память,но организуется связь с файлами;
– Каналы — позволяют последовательно передавать данные от одногопроцесса к другому;
– FIFO-файлы — в отличие от каналов, с ними работают несвязанныепроцессы, поскольку у такого файла есть имя в файловой системе и кнему может обратиться любой процесс;
– Сокеты — соединяют несвязанные процессы, работающие на разныхкомпьютерах.
Различия между способами взаимодействия определяются следующимикритериями:
– ограничен ли процесс только чтением либо только записью данных;
– число взаимодействующих процессов;
– синхронизируются ли взаимодействующие процессы (например, долженли читающий процесс перейти в режим ожидания при отсутствииданные на входе);
– ограничено ли взаимодействие рамками связанных процессов (имеющихобщего предка) или же соединяются процессы, выполняющиеся в однойфайловой системе либо на разных компьютерах.
Совместно используемая память
Простейшим способом взаимодействия процессов является совместныйдоступ к общей области памяти. Это выглядит так, как если бы два илиболее процесса вызвали функцию malloc() и получили указатели на одини тот же блок памяти. Когда один из процессов меняет содержимое памяти,другие процессы замечают это изменение.
Быстрое локальное взаимодействие
Совместное использование памяти — самый быстрый способвзаимодействия. Процесс обращается к общей памяти с той же скоростью,что и к своей собственной памяти, и никаких системных вызовов или обращений к ядру нет требуется. Устраняется также ненужноекопирование данных.
Ядро не синхронизирует доступ процессов к общей памяти — об этомследует позаботиться программисту. Например, процесс не должен читатьданные из совместно используемой памяти, пока в нее осуществляетсязапись, и два процесса не должны одновременно записывать данные водну и ту же область памяти. Стандартная стратегия предотвращенияподобной конкуренции заключается в использовании семафоров.
Модель памяти
При совместном использовании сегмента памяти один процесс долженсначала выделить память. Затем все остальные процессы, которые хотятполучить доступ к ней должны подключить сегмент. По окончании работы ссегментом каждый процесс отключает его. Последний процесс освобождаетпамять.
Для того чтобы понять принципы выделения и подключениясегментов памяти, необходимо разобраться в модели памяти Linux. В Linuxвиртуальная память (ВП) каждого процесса разбита на на страницы. Всепроцессы хранят таблицу соответствий между своими адресами памяти истраницами ВП, содержащими реальные данные. Несмотря на то что закаждым процессом закреплены свои адреса, разным процессамразрешается ссылаться на одни и те же страницы. Это и есть совместноеиспользование памяти.
При выделении совместно используемого сегмента памяти создаютсястраницы ВП. Это действие должно выполняться только один раз, так каквсе остальные процессы будут обращаться к этому же сегменту. Еслизапрашивается выделение существующего сегмента, новые страницы несоздаются; вместо этого возвращается идентификатор существующихстраниц. Чтобы сделать сегмент общедоступным, процесс подключает его,при этом создаются адресные ссылки на страницы сегмента. По окончанииработы с сегментом адресные ссылки удаляются. Когда все процессызавершили работу с сегментом, один (и только один) из них долженосвободить страницы виртуальной памяти.
Размер совместно используемого сегмента кратен размеру ВП. В Linuxпоследняя величина обычна равна 4кбайт, но никогда не помешает этопроверить с помощью функции getpagesize().
Выделение памяти
Процесс выделяет сегмент памяти с помощью функции shmget(). Первымаргументом функции является целочисленный ключ, идентифицирующийсоздаваемый сегмент. Если несвязанные процессы хотят получить доступ кодному и тому же сегменту, они должны указать одинаковый ключ. Ксожалению, ничто не мешает посторонним процессам выбрать тот жесамый ключ сегмента, а это приведет к системному конфликту. Указаниеспециальной константы IPC_PRIVATE в качестве ключа позволяетгарантировать, что будет создано совершенно новый сегмент.
Во втором аргументе функции задается размер сегмента в байтах. Этозначение округляется, чтобы быть кратным размеру страницы ВП.Третий параметр содержит набор битовых флагов. Перечислимнаиболее важные из них.
– IPC_CREAT. Указывает на то, что создается новый сегмент, которомуприсваивается заданный ключ.
– IPC_EXCL. Всегда используется совместно с флагом IPC_CREAT изаставляет функцию shmget() выдать ошибку в случае, когда сегмент суказанным ключом существует. Если флаг не указан и возникаетописанная ситуация, функция shmget() возвращает идентификаторсуществующего сегмента, не создавая новый сегмент.
– Флаг режима. В эту группу входят 9 флагов, задающих права доступа ксегменту владельца, группы и остальных пользователей. Битывыполнения игнорируются. Проще всего задавать права доступа спомощью констант, определенных в файле <sys/stat.h>. Например,флаги S_IRUS и S_IWUSR предоставляют право чтения и записивладельцу сегмента, а флаги S_IROTH и S_IWOTH предоставляютаналогичные права остальным пользователям.
В следующем фрагменте программы функция shmget() создает новыйсовместно используемый сегмент памяти (или возвращает идентификаторсуществующего, если значение shm_key уже зарегистрировано в системе),доступный для чтения/записи только его владельцу:
int segment_id = shmget (shm_key, getpagesize(), IPC_CREAT | S_IRUSR | S_IWUSR);
В случае успешного завершения функция возвращает идентификаторсегмента, если сегмент уже существует, проверяются права доступа кнему.
Подключение и отключение сегментов
Чтобы сделать сегмент памяти общедоступны, процесс должен подключитьего с помощью функции shmat(). В первом ее аргументе предаетсяидентификатор сегмента, возвращаемый функцией shmat().
Второй аргумент — это указатель, определяющий, где в адресномпространстве процесса необходимо создать привязку на совместноиспользуемую область памяти. Если задать значение NULL, ОС Linuxвыберет первый доступный адрес. Третий аргумент может содержатьследующие флаги.
– SHM_RND. Указывает на то, что адрес, заданный во втором параметредолжен быть округлен, чтобы стать кратным размеру страницы. Еслиэтот флаг не указан, необходимо самостоятельно позаботиться овыравнивании сегмента по границе страницы.
– SHM_RDONLY. Указывает на то, что сегмент доступен только для чтения,не не для записи.
В случае успешного завершения функция возвращает адресподключенного сегмента. Дочерний процесс, созданный функцией fork(),унаследует этот адрес и в случае необходимости сможет отключитьсегмент.По завершении работы с сегментом его необходимо отключить спомощью функции shmdt(). Ей следует передать адрес, возвращаемыйфункцией shmat(). Если текущий процесс был последним, кто ссылается на сегмент, сегмент удаляется из памяти. Функция exit() и exec()автоматически отключает сегменты.
Контроль и освобождение совместно используемой памяти
Функция shmctl() возвращает информацию о совместно используемомсегменте и способна модифицировать его. Первым параметром являетсяидентификатор сегмента.
Чтобы получить информацию о сегменте, укажете в качестве второгопараметра константу IPC_STAT, а в третьем параметре передайте указательна структуру shmid_ds.Чтобы удалить сегмент, передайте во втором параметре константуIPC_RMID, а в третьем параметре NULL. Сегмент удаляется, когдапоследний подключивший его процесс отключает сегмент.
Каждый совместно используемый сегмент должен явно освобождатьсяс помощью функции shmctl(), чтобы случайно не был превышенсистемный лимит на общее число таких сегментов. Функция exit() иexec() отключают сегменты, но не освобождают их.
Пример программы
/*Пример совместного использования памяти shm.c*/
#include<stdio.h>
#include<sys/shm.h>
#include<sys/stat.h> #
int main()
{
int segment_id;
char * shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x6400; /*Выделение совместно используемого сегмента. */ /
segment_id = shmget (IPC_PRIVATE, shared_segment_size, IPC_CREAT |IPC_EXCL | S_IRUSR | S_IWUSR); I
/*Подключение сегмента.*/ /
shared_memory = (char*) shmat (segment_id, 0, 0);
printf ("shared memory attached at address %p\n", shared_memory); ,
/*Определение размера сегмента.*/ /
shmctl (segment_id, IPC_STAT, &shmbuffer);
segment_size = shmbuffer.shm_segsz;
printf ("segment size: %d\n", segment_size); ,
/*Запись строки в сегмент.*//
sprintf (shared_memory, "Hello World"); )
/*Отключение сегмента. */ /
shmdt (shared_memory); s
/*Повторное подключение сегмента, но по другому адресу. */ /
shared_memory = (char*) shmat (segment_id, (void*) 0x5000000, 0);
printf ("shared_memory reattached at address %p\n",shared_memory); ,
/*Отображение строки, хранящейся в совместно используемойпамяти.*/ п
printf ("%s\n", shared_memory); ,
/*Отключение сегмента.*/ /
shmdt (shared_memory); s
/*Освобождение сегмента.*/ /
shmctl (segment_id, IPC_RMID, 0);
return 0;
}
/*Конец программы*/
Отладка.
Команда ipcs выдает информацию о взаимодействии процессов, включаясведения о совместно используемых сегментах (для этого следует задатьфлаг -m.). Например, в показанном ниже случае сообщается о том, чтоиспользуется один такой сегмент, с номером 327681:
ключ shmid владелец права байты nattch состояние
0x00000000 327681 user 600 393216 0 Если это сегмент был по ошибке забыт какой-то программой, егоможно удалить с помощью команды ipcrm: ipcrm shm 327681
Порядок выполнения работы.
1. Прочитать методический материал.
2. Набрать код и произвести компиляцию примера программы.
3. Проверить работоспособность программы.
4. Разобраться с функциями, системными вызовами и командами.

 

Скачать Операционные системы. Взаимодействие процессов. lab3.zip [355,36 Kb] (cкачиваний: 45)


Информация

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

Популярные новости

Статистика сайта



Rambler's Top100



 
Copyright © НеОфициальный сайт факультета ЭиП