Загальні області пам'яті
В операційних системах Unix і Linux є можливість створювати сегменти
пам'яті, доступні декількох процесів. При використанні цього засобу ділянки віртуального простору адрес різних процесів, відображаються на
одні і ті ж адреси реальної пам'яті.
При роботі з загальним сегментом пам'яті один з процесів повинен створити сегмент
спільної (сумісної) пам'яті, вказавши необхідний розмір сегменту, і отримати його
ідентифікатор. Цей ідентифікатор потім використовується процесом-творцем для
виконання керуючих операцій з поділюваної пам'яті.
Отримавши ідентифікатор розділеного сегмента пам'яті (створивши сегмент або отримавши
його ідентифікатор від іншого процесу), процес повинен "приєднати" сегмент.
Операція приєднання повертає адресу розділеного сегмента у віртуальному
адресному просторі процесу. Віртуальний адресу одного і того ж сегмента
може бути різним для різних процесів. Далі процеси ведуть читання і запис
даних в сегменті поділюваної пам'яті, використовуючи для цього ті ж самі машинні
команди, що і при роботі з звичайною пам'яттю.
Процес, який закінчив роботу з сегментом поділюваної пам'яті повинен "від'єднати"
його, а по закінченні використання сегмента всіма процесами він повинен бути
знищений.r
При одночасній роботі процесів із загальною областю пам'яті, можливо, потрібно
синхронізація їх доступу до області. За забезпечення такої синхронізації
повністю відповідає програміст, який може використовувати для цього алгоритми,
виключають конфлікти одночасного доступу або системні засоби, наприклад,
семафори.
Системні виклики Unix/Linux
ОС Unix/Linux механізм поділюваних сегментів пам'яті забезпечується чотирма
системними викликами: shmget,
shmctl, shmat,
shmdt
.
Системний виклик shmget
створює спільне сегмент або повертає ідентифікатор вже існуючого
сегмента. Цей ідентифікатор використовується при подальших операціях з сегментом.
Щоб отримати ID потрібен ключ, який можна сформувати з допомогою ftok.
Системний виклик shmctl
дозволяє виконувати керуючі операції над сегментом: отримувати інформацію про
його стан, змінювати права доступу до нього, знищувати сегмент.
Системні виклики shmat і
shmdt
виконують приєднання і від'єднання сегмента відповідно.
Колективні сегменти пам'яті в Unix/Linux (як і семафори) не мають зовнішніх імен.
При отриманні ідентифікатора сегмента процес користується числовим ключем.
Розробники язаних процесів можуть домовитися про загальне значення ключа,
який вони будуть використовувати, але у них немає гарантії в тому, що це ж
значення ключа не буде використано ким ще. Гарантовано унікальний
сегмент можна створити з використанням ключа IPC_PRIVATE, але такий
ключ не може бути зовнішнім. Тому сегменти використовуються, як правило,
спорідненими процесами, які мають можливість передавати один одному їх
ідентифікатори, наприклад, через успадковані ресурси або через параметри виклику
дочірньої програми.
Увага!
В процесі налагодження програми у Вас можуть виникати ситуації, коли програма
буде аварійно закінчуватися або перериватися Вами, перш ніж вона знищить
створені нею загальні області пам'яті. Такі області не видаляються в системі
автоматично і можуть накопичуватися протягом багатьох днів. Накопичення таких
"забутих" загальних областей може призвести до того, що буде вичерпано системний
ліміт на кількість загальних областей, і черговий виклик shmget
закінчиться з помилкою. Для того, щоб цього не відбувалося, регулярно
виконуйте процедуру очищення IPC: /home/metod/rmipc.
Виконуйте цю процедуру також перед кожним виходом з сеансу.
Список створених Вами загальних областей Ви можете побачити, виконавши команду: ipcs
-m.
|
Приклад виконання наведено тут.
Довідковий матеріал
Обрані системні виклики Linux/Unix. Короткий опис.
Довідник бібліотечних функція мови З: частина 1,
частина 2 (кодування кирилиця ibm866).