Головна

III. Робота з пам'яттю.

  1.  I. Робота з джерелом
  2.  II. Робота з джерелом: ГРАМОТА НА ПРАВА І ВИГОДИ МІСТАХ РОСІЙСЬКОЇ ІМПЕРІЇ. 21 квітня 1785 р
  3.  IV. Робота з вироблення практичних умінь і навичок
  4.  VI. ЧИ революціонерів ПРАЦЮВАТИ В реакційну ПРОФСПІЛКИ?
  5.  А В МІРУ НЕРОЗУМІННЯ, ПРАЦЮЄ НА ТОГО, ХТО РОЗУМІЄ БІЛЬШЕ!
  6.  АЛГОРИТМИ І РОБОТА МОЗКУ

Для роботи з пам'яттю, що використовуються системні виклики:

  • shmget () створює новий сегмент розділяється пам'яті або знаходить існуючий сегмент з тим же ключем;
  • shmat () підключає сегмент із зазначеним описателем до віртуальної пам'яті звертається процесу;
  • shmdt () відключає від віртуальної пам'яті раніше підключений до неї сегмент із зазначеним віртуальним адресою початку;
  • shmctl () служить для управління різноманітними параметрами, пов'язаними з існуючим сегментом.

Прототипи перерахованих системних викликів описані в файлах

#include

#include

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

системний виклик

int shmid = shmget (key_t key, size_t size, int flag)

на підставі параметра size визначає бажаний розмір сегмента в байтах. Якщо в таблиці розділяється пам'яті знаходиться елемент, що містить заданий ключ, і права доступу не суперечать поточним характеристиками звертається процесу, то значенням системного виклику є ідентифікатор існуючого сегмента. В іншому випадку створюється новий сегмент з розміром не менше встановленого в системі мінімального розміру сегмента розділяється пам'яті і не більше встановленого максимального розміру. Створення сегмента не означає негайного виділення під нього основної пам'яті і ця дія відкладається до виконання першого системного виклику підключення сегмента до віртуальної пам'яті деякого процесу. Прапори IPC_CREAT і IPC_EXCL аналогічні розглянутим вище.

Підключення сегмента до віртуальної пам'яті виконується шляхом звернення до системного виклику shmat ():

void * virtaddr = shmat (int shmid, void * daddr, int flags).

Параметр shmid - це раніше отриманий ідентифікатор сегмента, а daddr - бажаний процесом віртуальний адресу, який повинен відповідати початку сегмента в віртуальної пам'яті. Значним системного виклику є фактичний віртуальний адресу початку сегмента. Якщо значенням daddr є NULL, ядро ??вибирає найбільш зручний віртуальну адресу початку сегмента. Прапори системного виклику shmat () наведені нижче в таблиці.

Таблиця

Прапори системного виклику shmat ()

 SHM_RDONLY  ядро підключає ділянку пам'яті тільки для читання;
 SHM_RND  визначає, якщо можливо, спосіб обробки ненульового значення daddr.

Для відключення сегмента від віртуальної пам'яті використовується системний виклик shmdt ():

int shmdt (* daddr);

де daddr - це віртуальний адресу початку сегмента в віртуальної пам'яті, раніше отриманий від системного виклику shmat ().

Системний виклик shmctl:

int shmctl (int shmid, int command, struct shmid_ds * shm_stat);

по синтаксису і призначенням системний виклик повністю аналогічний msgctl ().

варіанти завдань

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

2. Чотири дочірніх процесу виконують деякі цикли робіт, передаючи після закінчення чергового циклу через один і той же сегмент розділяється пам'яті батьківського процесу черговий рядок деякого вірші, при цьому перший процес передає 1-ю, 5-ю, 9-ю і т.д . рядки, другий - 2-ю, 6-ю, 10-ю і т.д. рядки, третій - 3-ю, 7-ю, 11-ю і т.д. рядки, четвертий - 4-ю, 8-ю, 12-ю і т.д. рядки. Цикли робіт процесів не збалансовані за часом. Батьківський процес компонує з переданих фрагментів закінчене вірш і виводить його після закінчення роботи всіх процесів. Вирішити задачу з використанням апарату семафорів.

3. Вирішити завдання з варіанта 1 за умови, що передаються процесами тексти передаються батьківського процесу не через сегмент розділяється пам'яті, а через чергу повідомлень.

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

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

6. Вирішити завдання з варіанта 5 за умови, що повинно бути забезпечено, щоб не були одночасно запущені дві програми від одного процесу.

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

8. Програма моделює роботу примітивної СУБД, що зберігає єдину таблицю в оперативній пам'яті. Виконуючи деякі цикли робіт, породжені процеси за допомогою черги повідомлень передають батьківського процесу інформацію про операції, яка повинна бути виконана: тип операції (вставка, модифікація, видалення рядка), номер рядка, вміст рядка. Батьківський процес від імені процесу, який видав запит, виконує операцію.

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

1. У чому різниця між двійковим і загальним семафора?

2. Чим відрізняються P () і V () - операції від звичайних операцій збільшення і зменшення на одиницю?

3. Для чого служить набір програмних засобів IPC?

4. Для чого введені масові операції над семафора в ОС UNIX?

5. Яке призначення механізму черг повідомлень?

6. Які операції над семафора існують в ОС UNIX?

7. Яке призначення системного виклику msgget ()?

8. Які умови повинні бути виконані для успішної постановки повідомлення в чергу?

9. Як отримати інформацію про власника і права доступу черги повідомлень?

10. Яке призначення системного виклику shmget ()?


 




 Лабораторна робота N 1 |  Методичні вказівки до лабораторної роботи |  контpольной аналогічні питання |  Методичні вказівки до лабораторної роботи |  Функції для роботи з файловою системою |  Методичні вказівки до лабораторної роботи |  Методичні вказівки до лабораторної роботи |  Завдання до лабораторної роботи |  Лабораторна робота N 5 |  Методичні вказівки до лабораторної роботи |

© um.co.ua - учбові матеріали та реферати