Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PGP_Avtosokhranennyy2.docx
Скачиваний:
1
Добавлен:
17.09.2019
Размер:
454.52 Кб
Скачать

1.3 Неіменовані і іменовані канали

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

Коли процес створює канал, ядро встановлює два файлових дескриптора для користування цим каналом. Перший дескриптор використовується, щоб відкрити шлях введення в канал (запис), в той час як другий застосовується для отримання даних з каналу (читання).

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

Для використання функцій роботи з каналами необхідно підключити заголовний файл unistd.h.

int pipe (int fd [2])

Функція створює напівдуплексний канал, і повертає 0 в разі успіху або -1 у випадку невдачі. У fd [0] записується дескриптор для читання з каналу, в fd [1] записується дескриптор для запису в канал.

size_t read (int fd, void * buf, size_t count)

Функція зчитує через файловий дескриптор fd дані в buf розмірністю count байт. Функція повертає кількість лічених байт.

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

size_t write (int fd, void * buf, size_t count)

Функція записує через файловий дескриптор fd дані buf розмірністю count байт. Функція повертає кількість записаних байтів.

int close (int fd)

Функція закриває дескриптор fd.

Процес - батько створює канал і породжує дочірній процес, який посилає свій ідентифікатор (pid) в канал. Батьківський процес зчитує дані з каналу і виводить їх на екран.

Іменований канал - це окремий тип файлу у файловій системі, що використовується для однонаправленої обміну інформацією між процесами.

Неіменовані канал може бути використаний тільки родинними процесами, тоді як іменований канал доступний і для незалежних процесів, за умови, що всім цим процесам відомо розташування й ім'я файлу іменованого каналу. В mc іменовані канали відображаються з префіксом |.

Для використання функцій роботи з іменованими каналами необхідно підключити заголовний файл fcntl.h.

int mkfifo (char * name, int mode)

Функція створює іменований канал з ім'ям name і повертає 0 в разі успіху або -1 у випадку невдачі. В mode вказуються прапори властивостей створюваного каналу.

int open (char * name, int flags)

Функція повертає дескриптор файлу з ім'ям name. При роботі з каналом змінна flags може містити такі прапори.

O_RDONLY - відкрити файл лише для читання

O_WRONLY - відкрити файл лише для запису

O_NONBLOCK - забороняє блокування процесу при роботі з каналом, як для функцій read і write, так і при отриманні дескриптора каналу. Якщо цей прапор не зазначений, то процес, який отримує дескриптор для читання (записи), блокується до того часу, коли інший процес не запросить дескриптор для запису (читання).

1.4 Засоби міжпроцесной комунікації (ipc)

Засобами міжпроцесної комунікації (IPC - Inter-Process Communication) є сигнали, канали, повідомлення, семафори, «Разделяемая память» і сокети. Процеси виконуються у власному адресному просторі, вони ізольовані один від одного, тому необхідні механізми для взаємодії процесів, що надаються самою операційною системою, і, як правило, розташовані в адресному просторі системи.

Комунікація між процесами необхідна для вирішення наступних завдань:

  • передача даних від одного процесу до іншого.

  • спільне використання загальних даних декількома процесами.

Повідомлення, семафори і «Разделяемая память» узагальнено називають System V IPC. Ці механізми об'єднуються в єдиний пакет, тому що їх відповідні системні виклики володіють близькими інтерфейсами, а в їх реалізації використовуються багато загальні підпрограми. Ось основні загальні властивості всіх трьох механізмів:

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

2. Елемент таблиці містить деякий числовий ключ, який є вибраним користувачем ім'ям представника відповідного механізму. Щоб два або більше процесу могли використовувати певний механізм, вони повинні заздалегідь домовитися про іменуванні використовуваного представника цього механізму.

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

4. Захист доступу до раніше створеним елементам таблиці кожного механізму грунтується на тих же принципах, що і захист доступу до файлів.

Коли процес А посилає дані іншому процесу В через канал, відбуваються наступні дії: дані копіюються з буфера процесу А в буфер ядра, потім ці ж дані копіюються з буфера ядра в буфер процесу В. Механізм «Разделяемая память» дозволяє виключити передачу даних через ядро, надаючи кільком процесам доступ до однієї і тієї ж області пам'яті - «Разделяемая память».

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

Для отримання інформації щодо механізмів ipc, використовуйте команду

$ Ipcs.

Для отримання інформації тільки по сегментам «Разделяемои памяти» використовуйте команду $ ipcs-m.

Для використання функцій роботи з пам'яттю, необхідно підключити заголовні файли sys / shm.h і sys / ipc.h.

int shmget (key_t key, int size, int shmflag)

Функція створює новий сегмент розділяється пам'яті з ключем key розміром size байт, якщо shmflag дорівнює IPC_CREAT, або знаходить існуючий сегмент з ключем key, якщо shmflag дорівнює IPC_EXCL. Якщо ж shmflag дорівнює IPC_CREAT | IPC_EXCL, функція створить новий сегмент «Разделяемои памяти» з ключем key, тільки коли не існує іншого сегмента «Разделяемои памяти» з тим же ключем. У разі успіху функція повертає дескриптор «Разделяемои памяти» або від'ємне значення, у разі невдачі. Параметр key може бути рівний IPC_PRIVATE, в цьому випадку, система сама визначає незайнятий ключ для «Разделяемои памяти».

void * shmat (int shmid, void * shmaddr, int shmflag)

Функція підключає сегмент «Разделяемои памяти» із зазначеним дескриптором shmid до віртуальної пам'яті процесу, що викликав цю функцію. Всі дочірні процеси, створені процесом-батьком після виклику функції, також матимуть доступ до поділюваного пам'яті. Якщо shmaddr дорівнює NULL, адреса виділяється сегмента визначається системою, в іншому випадку shmaddr задає адресу для виділяється функцією сегмента. Якщо shmflag дорівнює нулю, колективна пам'ять буде доступна як для читання, так і для запису. Якщо shmflag дорівнює SHM_RDONLY, Колективна пам'ять буде доступна тільки для читання.

int shmdt (void * shmaddr)

Функція відключає сегмент «Разделяемои памяти» з адресою shmaddr від віртуальної пам'яті процесу, що викликав цю функцію.

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

Батьківський процес чекає закінчення роботи нащадка, і виводить остаточний результат - суму всіх елементів масиву.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]