Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MET_VS~2.DOC
Скачиваний:
0
Добавлен:
10.11.2019
Размер:
271.87 Кб
Скачать

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

  1. Назвіть різниці між іменованими та неіменованими кана­лами.

  2. Розкажіть про шляхи створення іменованих програмних ка­налів.

  3. Наведіть приклади створення іменованих програмних кана­лів непрограмним шляхом.

  4. Наведіть приклади створення іменованих програмних кана­лів програмним шляхом.

  5. Розкажіть про реалізацію технології "клієнт-сервер" за допомогою іменованих каналів в середовищі операційної системи Unix.

  6. Як виконується робота у фоновому та оперативному режимах? Команди переведення завдань у фоновий режим, відновлення дії програми, знищення завдань за допомогою відносних та абсолютних адрес.

  7. Поясніть призначення та роботу рядка 4 (int main(int argc, char *argv[])) у програмі 4.2.

Завдання

  1. Отримайте у викладача текст програми 4.1. Відком­пілюйте її під іменем fifoserver. Виконайте запуск програми у фоновому режимі;

  2. Отримайте у викладача текст програми 4.2. Відкомпілюйте її під іменем fifo_client з помилковим та безпомилковим варіантами;

  3. Отримайте у викладача програму розв'язання квадрат­ного рівняння. Виконайте її запуск в фоновому режимі, потім знищіть її як завдання. Виконайте повторний запуск в оперативному режимі. Зупиніть та відновіть її дію.

  4. Підготуйте звіт по лабораторній роботі.

Зміст звіту:

  • короткі відповіді на контрольні питання;

  • призначення та робота програм fifo_client та fifo_server;

  • алгоритм і текст програм 4.1 та 4.2.

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

Маніпуляції з чергами повідомлень

Мета роботи: ознайомити з чергами повідомлень та маніпу­ляціями над ними.

Загальні відомості

Черги повідомлень є потужним засобом обміну інформацією між процесами, але на відміну від програмних каналів припускають більш гнучку організацію взаємодій між завданнями. Насамперед це пов'язано з відсутністю існувань парних процесів для "читача" та "письменника". В програмних засобах створюється певна черга повідомлень, яка викорис­товується як сховище повідомлень для будь-яких процесів. В даному випадку механізми для обробки інформації створюються таким чином, що до черги повідомлень можуть звертатися і "читачі" і "письменники".

Використовуючи механізми черг, зникає необхідність застосу­вання обох каналів - одного для читання, іншого для запису (у випадках повнодуплексного зв'язку між процесами). При цьому можна обійтись однією чергою, якщо відрізняти повідомлення за типом: від клієнта до сервера чи навпаки.

Ще однією перевагою у застосуванні черг є можливість вибирання повідомлень у довільному порядку, не викорис­товуючи методу FIFO (лабораторна робота №3). Ця особливість відкриває перспективу побудови систем з пріоритетним обслуговуванням клієнтів.

Таким чином, при формуванні черги повідомлень не використовується потокова модель даних. Кожне повідомлення має точно визначену структуру: тип та дані. В повідомленнях допустимі будь-які дані. Їх довжина задається користувачем і може бути довільною в обсязі пам'яті, відведеної під розмі­щення черги у момент її створення.

Ядро системи ніяк не інтерпретує змісту повідомлень, а лише забезпечує розміщення та вибирання у співвідношенні з вказаним типом. Шаблон повідомлень знаходиться у файлі msg.h:

Struct msgbuf {

long mtype; // тип повідомлення

char mtext[1]; // дані

}

Для роботи з чергами існують такі функції (системні виклики):

  • msgget - створення черги;

  • msgetl - встановлення параметрів черги;

  • msgsnd - посилання повідомлення до черги;

  • msgrcv - одержання повідомлень з черги.

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

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <linux/ipc.h>

  4. #include <linux/msg.h>

  5. struct mymsgbuf {

  6. long mtype; /* Значення номера черги */

  7. int request; /* Перший елемент */

  8. double salary; /* Другий елемент */

  9. } msg;

  10. int open_queue (key_t keyval);

  11. int send_message (int gid, struct mymsgbuf *qbuf);

  12. void main(void)

  13. {

  14. int qid;

  15. key_t msgkey;

  16. /* Генерація ключового поля msgkey для IPC */

  17. msgkey = ftok(".", 'm');

  18. /* Відкриття та створення черги */

  19. open_queue(msgkey);

  20. if((qid = open_queue(msgkey)) == -1) {

  21. perror("open_queue");

  22. exit(1);

  23. }

  24. /* Надання значень для черги та її елементів */

  25. msg.mtype = 1;

  26. msg.request = 1;

  27. msg.salary = 1000.00;

  28. if((send_message( qid, &msg )) == -1) {

  29. perror("send_message");

  30. exit(1);

  31. int open_queue (key_t keyval) {

  32. int gid;

  33. if ((gid = msgget(keyval, IPC_CREAT | 0660)) == -1) {

  34. return (-1);

  35. }

  36. return (gid);

  37. }

  38. int send_message (int qid, struct mymsgbuf *qbuf)

  39. {

  40. int result, length;

  41. length = sizeof(struct mymsgbuf) - sizeof(long);

  42. if ((result) = msgsnd(qid, qbuf, length, 0) == -1) {

  43. return(-1);

  44. }

  45. return (result);

  46. }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]