Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практична робота 4.doc
Скачиваний:
2
Добавлен:
25.11.2019
Размер:
206.34 Кб
Скачать

Практичне заняття 4 Засоби System V ipc. Організація роботи з пам'яттю, що розділяється, в unix. Поняття ниток виконання (thread):

Мета: Розглянути переваги і недоліки потокового обміну даними. Ознайомитися на практиціз наступними поняттями та функціями: поняття System V IPC, простір імен, адресація в System V IPC, функція ftok(), дескриптори System V IPC, пам'ять, що розділяється, в UNIX, системні виклики shmget(), shmat(), shmdt(), команди ipc і ipcrm. Здійснити практичне використання системного виклику shmctl() для звільнення ресурсу. Розглянути необхідність синхронізації процесів і ниток виконання, що використовують загальну пам'ять.

Переваги і недоліки потокового обміну даними.

На попередньому семінарі ми познайомилися з механізмами, що забезпечують потокову передачу даних між процесами в операційній системі UNIX, а саме з pip'ами і FIFO. Потокові механізми достатньо прості в реалізації і зручні для використовування, але мають ряд істотних недоліків:

  • Операції читання і запису не аналізують вміст передаваних даних. Процес, що прочитав 20 байт з потоку, не може сказати, чи були вони записані одним процесом або декількома, чи записувалися вони за один раз або було, наприклад, виконано 4 операції запису по 5 байт. Дані в потоці ніяк не інтерпретуються системою. Якщо потрібна яка-небудь інтерпретація даних, то передаючий і приймаючий процеси повинні наперед погоджувати свої дії і уміти здійснювати її самостійно.

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

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

Поняття про System V ipc

Вказані вище недоліки потоків даних привели до розробки інших механізмів передачі інформації між процесами. Частина цих механізмів, що вперше з'явилися в UNIX System V і згодом що перекочували звідти практично у всі сучасні версії операційної системи UNIX, одержала загальну назву System V IPC (IPC – скорочення від interprocess communications). До групи System V IPC входять: черги повідомлень, пам'ять і семафори, що розділяється. Ці засоби організації взаємодії процесів зв'язані не тільки спільністю походження, але і володіють схожим інтерфейсом для виконання подібних операцій, наприклад, для виділення і звільнення відповідного ресурсу в системі. Ми розглядатимемо їх в порядку від менш семантично навантажених з погляду операційної системи до більш семантично навантаженим. Іншими словами, чим пізніше ми почнемо займатися яким-небудь механізмом з System V IPC, тим більше дій по інтерпретації передаваної інформації доведеться виконувати операційній системі при використовуванні цього механізму.

Простір імен. Адресація в System V ipc. Функція ftok()

Всі засоби зв'язку з System V IPC, як і вже розглянуті нами pipe і FIFO, є засобами зв'язку з непрямою адресацією. Як ми встановили раніше, для організації взаємодії неспоріднених процесів за допомогою засобу зв'язку з непрямою адресацією необхідно, щоб цей засіб зв'язку мав ім'я. Відсутність імен у pip'ів дозволяє процесам одержувати інформацію про розташування pip'а в системі і його стан тільки через споріднені зв'язки. Наявність асоційованого імені у FIFO – імені спеціалізованого файлу у файловій системі – дозволяє неспорідненим процесам одержувати цю інформацію через інтерфейс файлової системи.

Безліч всіх можливих імен для об'єктів якого-небудь вигляду прийнято називати простором імен відповідного виду об'єктів. Для FIFO простором імен є безліч всіх допустимих імен файлів у файловій системі. Для всіх об'єктів з System V IPC таким простором імен є безліч значень деякого цілочисельного типу даних – key_t – ключа. Причому програмісту не дозволено напряму привласнювати значення ключа, це значення задається опосередковано: через комбінацію імені якого-небудь файлу, вже існуючого у файловій системі, і невеликого цілого числа – наприклад, номеру екземпляра засобу зв'язку.

Такий спосіб отримання значення ключа пов'язаний з двома міркуваннями:

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

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

Отримання значення ключа з двох компонентів здійснюється функцією ftok().

Функція для генерації ключа System V IPC

#include <sys/types.h>

#include <sys/ipc.h>

key_t ftok(char *pathname, char proj);

Опис функції

Функція ftok служить для перетворення імені існуючого файлу і невеликого цілого числа, наприклад, порядкового номера екземпляра засобів зв'язку, в ключ System V IPC.

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

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

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

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