- •Практичне заняття 4 Засоби System V ipc. Організація роботи з пам'яттю, що розділяється, в unix. Поняття ниток виконання (thread):
- •Переваги і недоліки потокового обміну даними.
- •Поняття про System V ipc
- •Простір імен. Адресація в System V ipc. Функція ftok()
- •Дескриптори System V ipc
- •Пам'ять, що розділяється, в unix. Системні виклики shmget(), shmat(), shmdt()
- •Прогін програм з використанням пам'яті, що розділяється
- •Команди ipcs і ipcrm
- •Використовування системного виклику shmctl() для звільнення ресурсу
- •Пам'ять, що розділяється і системні виклики fork(), exec() і функція exit()
- •Поняття про нитку виконання (thread) в unix. Ідентифікатор нитки виконання. Функція pthread_self()
- •Створення і завершення thread'а. Функції pthread_create(), pthread_exit(), pthread_join()
- •Прогін програми з використанням двох ниток виконання
- •Необхідність синхронізації процесів і ниток виконання, що використовують загальну пам'ять
Практичне заняття 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. По-третє, завдання імені файлу, як одного з компонентів для отримання ключа, у жодному випадку не означає, що інформація, передавана за допомогою асоційованого засобу зв'язку, розташовуватиметься в цьому файлі. Інформація зберігатиметься усередині адресного простору операційної системи, а задане ім'я файлу лише дозволяє різним процесам згенерувати ідентичні ключі.