Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метвказівки для Астистовой1.doc
Скачиваний:
2
Добавлен:
08.11.2019
Размер:
288.26 Кб
Скачать

Контрольні питання

1. Що називається процесом?

2. Які Ви знаєте системні виклики для роботи з процесами?

3. Які Ви знаєте системні процеси?

4. Які атрибути має процес в ОС LINUX?

5. Яким системним викликом створюється процес?

6. Відрізняються чи ні дані та інструкції батьківського та дочірнього процесів?

7. Як відбувається реалізація процесів в операційній системі?

8. Які Ви знаєте можливі стани процесу?

9. Які події призводять до створення процесів?

10. Назвіть складові елементи процесу.

11. Що таке контекст процесу?

Лабораторна робота № 5

Тема: Канали як засіб міжпроцесної взаємодії.

Мета роботи: Вивчення та реалізація взаємодії між окремими процесами із застосуванням каналів.

Основні положення

Як зазначалося вище (в лабораторній роботі №4), процеси виконуються у власному адресному просторі і по суті ізольовані один від другого. Тим самим зведений до мінімуму вплив процесів одного на другий, що є необхідним в багатозадачних операційних системах, якими є сучасні версії ОС WINDOWS та LINUX. Але від ізольованого процесу мало користі. Сама концепція ОС UNIX полягає в модульності, тобто заснована на взаємодії між окремими процесами.

Для реалізації взаємодії потрібно:

  • забезпечити засоби взаємодії між процесами;

  • виключити небажаний вплив одного процесу на інший.

Взаємодія між процесами необхідна для розв'язку наступних задач:

  • передача даних. Один процес передає дані іншому процесу, причому їх об'єм може варіюватися від десятків байт до десятків мегабайт;

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

  • сповіщення. Процес може сповістити інший процес або групу процесів про настання деякої події. Це може знадобитися, наприклад, для синхронізації виконання декількох процесів.

Очевидно, що розв'язати дану проблему засобами самих процесів неефективно і небезпечно (для багатозадачних систем), тому сама операційна система повинна забезпечити механізми міжпроцесної взаємодії.

До засобів міжпроцесної взаємодії, які присутні у всіх версіях ОС UNIX, відносяться:

  • сигнали;

  • канали;

  • іменовані канали (FIFO);

  • повідомлення (черги повідомлень);

  • семафори;

  • розділювана пам'ять.

В деяких версіях ОС UNIX є ще один засіб міжпроцесної взаємодії (IPC – interprocess communication) – сокети, які вперше були запропоновані в BSD UNIX.

Використання сигналів в якості IPC обмежене тим, шо сигнали досить ресурсоємні. Тому більш доцільно використовувати канали.

1. Застосування каналів.

При роботі в командному рядку інтерпретатора shell організація програмних каналів має наступний синтаксис:

$ cat myfile wc

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

Для створення каналів в системі LINUX використовується системний виклик pipe( ):

#include <unistd.h>

int pipe(int *filedes).

Виклик повертає два файлових дескриптори:

filedes[0] - для запису в канал;

filedes[1] - для читання із каналу.

Тепер, якщо один процес записує дані в filedes[0], другий зможе отримати ці дані із filedes[1]. Питання полягає в тому, як саме другий процес зможе отримати файловий дескриптор filedes[1]. Згадаємо наслідування атрибутів при створенні процесу. Як відомо, дочірній процес наслідує і розділяє всі файлові дескриптори батьківського. Тобто, доступ до дескрипторів filedes каналу може отримати сам процес, що викликав pipe ( ), і його дочірні процеси. В цьому полягає серйозний недолік каналів, оскільки вони можуть бути використані для передачі даних лише між процесами – родичами. Канали не можуть використовуватися в якості засобу міжпроцесної взаємодії між незалежними процесами. В наведеному прикладі для інтерпретатора shell процеси cat( ) і wc( ) насправді не є незалежними, як здається на перший погляд, тому що обидва ці процеси створюються процесом інтерпретатора і є «родичами».

Іменовані канали FIFO, на відміну від розглянутих вище програмних каналів, мають імена, що дозволяє отримати доступ до цих об'єктів незалежним процесам. Це також однонаправлені засоби передачі даних, причому читання даних відбувається в порядку їх запису, тобто за принципом черги. Іменований канал FIFO є окремим типом файлу у файловій системі UNIX (команда інтерпретатора ls –l покаже в першій позиції символ p).

Іменовані канали створюються функцією:

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/fcntl.h>

#include <unistd.h>

int mknod(const char *pathname, mode _ t, dev _ t dev);

Перший параметр специфікує ім'я створюваного каналу, параметр mode задає права доступу і тип (для іменованого каналу використовується значення S _ IFIFO). Третій параметр ігнорується. Функція повертає ознаку нормального завершення - 0, при помилці повертається значення - 1.

Знищення каналу виконується за допомогою функції int unlink(const char *pathname).