Українські рефератиучбові матеріали на українській мові

RefBaza.com.ua пропонує студентам та абітурієнтам найбільшу базу з рефератів! Також ви можете ділитися своїми рефератами для поповнення бази.

Interprocess Communication

Реферат: Interprocess Communication

Ми із Вами казали, що далі йдеться про поділюваних ресурсах, доступом до яких може здійснюватися із боку довільних процесів, у випадку, в довільному порядку. Ці ресурси доступні будь-якому процесу, а процеси необов'язково повинні прагнути бути родинними. За наявності такої схеми виникають дві принципові проблеми:

1. Именование;

2. Синхронізація;

Проблеми іменування пов'язані про те, що родинних зв'язків немає і з спадщині передати нічого не можна.

Якщо проблему іменування вирішена, виникає проблема синхронізації доступу - як організувати обмін з ресурсами, щоб ця обмін був коректним. Якщо є, наприклад, ресурс “оперативна пам'ять”, те, коли один процес ще дописав інформацію, а інший процес вже прочитав весь блок, виникає некоректна ситуація.

Рішення них ми й розглядати.

Проблема іменування вирішується з допомогою асоціювання з кожним ресурсом деякого ключа. У випадку це целочисленное значення. Тобто за створенні яке поділяється ресурсу його автор приписує йому номер яких і визначає права доступу до цього ресурсу. Після цього будь-який процес, який вкаже системі, що хоче спілкуватися із поділюваним ресурсом з ключем N, й володіє необхідними правами доступу, буде допущено до роботи з цим ресурсом.

Але такий рішення перестав бути ідеальним, оскільки цілком можлива колізія номерів - коли збігаються номери поділюваних ресурсів. І тут процеси будуть плутатися, неминучими призведе до помилок. Тож у системі передбачено стандартне засіб генерації унікальних ключів. Для генерації унікального ключа використовується функція ftok

#include <sys/types.h>

#include <sys/ipc.h>

key_t ftok(char *s, char з);

Суть його дії - по текстовій рядку і символу генерується унікальне кожної такий пари значення ключа. Після цього сгенерированным ключем можна скористатися як створення ресурсу, так підтвердження використання ресурсу. Понад те, щоб уникнути колізій, рекомендується вказувати як параметра "покажчика на рядок" шлях до певного своєму файлу. Другий аргумент - символьний, що дозволяє створювати деякі варіанти ключа, що з цим ім'ям, цей аргумент називається проектом (project). За такого підходу можна домогтися відсутності колізій.

Погляньмо конкретні засоби роботи з поділюваними ресурсами.

Разделяемая пам'ять.

Загальна схема роботи з поділюваними ресурсами така - є певний процесс-автор, створює ресурс з будь-якими параметрами. Під час створення ресурсу поділюваної пам'яті задаються три параметра - ключ, права доступу і величину області пам'яті. Після створення ресурсу щодо нього може бути підключені процеси, бажаючі працювати з цим пам'яттю. Відповідно, є дію підключення до ресурсу з допомогою ключа, який генерується за тими самими правилам, як і ключ до створення ресурсу. Зрозуміло, що тут є момент деякою рассинхронизации, який із тим, що споживач яке поділяється ресурсу (процес, який працюватиме з ресурсом, а не його автором) то, можливо запущено і почав підключатися перед запуском автора ресурсу. У цій ситуації особливого криміналу немає, оскільки є функцій управління доступом до разделяемому ресурсу, за якими можна встановити деякі опції, що визначають правила роботи функцій, котрі взаємодіють із поділюваними ресурсами. Зокрема, існує опція, що змушує процес дочекатися появи ресурсу. І це, то, можливо, трохи зле, наприклад, автор може й не з'явитися, але іншого виходу немає, це є певні накладні витрати. От у загальних словах - що є що.

Давайте розглянемо ті функції, які надаються нам до роботи з поділюваними ресурсами.

Перша функція - створення спільної пам'яті.

int shmget (key_t key, int size, int shmemflg);

key - ключ поділюваної пам'яті

size - розмір розділу пам'яті, що має бути створено

shmemflg - прапори

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

З допомогою цієї функції можна як створити новий поділюваний ресурс “пам'ять” (у разі у прапорах повинен бути вказаний IPC_CREAT)?, і навіть можна підключитися наявному разделяемому ресурсу. З іншого боку, в можливих прапорах то, можливо зазначений прапор IPC_EXECL, вона дозволяє перевірити, і підключитися наявному ресурсу - якщо ресурс існує, то функція підключає щодо нього процес і повертає код ідентифікатора, Якщо ж ресурс - не існує, то функція повертає -1 і відповідні код в errno.

Наступна функція - доступом до поділюваної пам'яті:

char *shmat(int shmid, char *shmaddr, int shmflg);

shmid - ідентифікатор яке поділяється ресурсу

shmaddr - адресу, із якого ми хотів би розмістити поділювану пам'ять

У цьому, якщо значення shmaddr - адресу, то пам'ять буде підключена, починаючи від цього адреси, якщо його значення - нуль, то система сама підбере адресу початку. Також у ролі значень цього аргументу може бути деякі визначені константи, що дозволяють організувати, зокрема вирівнювання адреси по сторінці чи початку сегмента пам'яті.

shmflg - прапори. Вони визначають різні режими доступу, зокрема, є прапор SHM_RDONLY.

Ця функція повертає покажчик на адресу, починаючи від якого починатиметься запрашиваемая розділюваний пам'ять. Коли відбувається помилка, то повертається -1.

Хотів би трохи поговорити про права доступу. Вони реально можна використовувати і коректно працювати який завжди. Оскільки, якщо апаратно не підтримується закриття області даних для читання чи запис, то такому разі можуть виникнути проблеми у реалізації що така прапорів. По-перше, вона буде працювати, адже ми отримуємо покажчик і починаємо працювати із покажчиком, і з покажчиком, і загальна схема не передбачає захисту. Друге, можна програмно зробити, щоб працювали прапори, але ми не зможемо вказувати довільну адресу, у разі система буде підставляти й повертатимуть як адресу розділеної пам'яті певні адреси, звернення яких створюватиме явно помилкову ситуацію, виникне переривання процесу, під час яких система подивиться - хто й чому було ініціатором некоректного звернення до пам'яті, і що той процес має потрібні права доступу - система підставить потрібні адреси, інакше доступ для процесу буде заблокований. Це нагадує установку контрольної точки у програмі при налагодженні, коли створювали явно помилкова ситуація у тому, щоб було перервати процес і оцінити її стан.

Третя функція - відкріплення поділюваної пам'яті:

int shmdt(char *shmaddr);

shmaddr - адресу прикріпленій до процесу пам'яті, який було отримано при підключенні пам'яті на початку роботи.

Четверта функція - управління поділюваної пам'яттю:

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmid - ідентифікатор поділюваної пам'яті

cmd - команда управління.

Зокрема, може бути команди: IPC_SET (змінити права доступу і власника ресурсу - цього потрібно мати ідентифікатор автора даного ресурсу чи суперкористувача), IPC_STAT (запросити стан ресурсу - у разі заповнюється інформація до структури, покажчик яку передається третім параметром, IPC_RMID (знищення ресурсу - по тому, як автор створив процес - з нею працюють процеси, які підключаються і відключаються, але з знищують ресурс, і з допомогою даної команди ми побачимо знищуємо ресурс у системі).

Усе це, стосовно функцій управління поділюваної пам'яттю.


Схожі реферати

Статистика

[1] 2 3 4 5 6 7 8 9 10 11 12