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

Приклад 6.1

Слідуючий приклад показує поточні значення всіх сема­форів, які встановлені програмою 6.1:

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <sys/types.h>

  4. #include <sys/ipc.h>

  5. #include <sys/sem.h>

  6. int get_sem_count(int sid);

  7. void show_sem_usage(int sid);

  8. int get_sem_count(int sid);

  9. void dispval(int sid);

  10. int main(int argc, char *argv[])

  11. {

  12. key_t key;

  13. int semset_id;

  14. key = ftok(".", 's');

  15. if((semset_id = semget(key, 1, 0666)) == -1)

  16. {

  17. printf("Semaphore set does not exist\n");

  18. exit(1);

  19. }

  20. show_sem_usage(semset_id);

  21. return(0);

  22. }

  23. void show_sem_usage(int sid)

  24. {

  25. int cntr=0, maxsems, semval;

  26. maxsems = get_sem_count(sid);

  27. while(cntr < maxsems) {

  28. semval = semctl(sid, cntr, GETVAL, 0);

  29. printf("Semaphore #%d: --> %d\n", cntr, semval);

  30. cntr++;

  31. }

  32. }

  33. int get_sem_count(int sid)

  34. {

  35. int rc;

  36. struct semid_ds mysemds;

  37. union semun semopts;

  38. semopts.buf = &mysemds;

  39. if((rc = semctl(sid, 0, IPC_STAT, semopts)) == -1) {

  40. perror("semctl");

  41. exit(1);

  42. }

  43. return(semopts.buf->sem_nsems);

  44. }

  45. void dispval(int sid)

  46. {

  47. int semval;

  48. semval = semctl(sid, 0, GETVAL, 0);

  49. printf("semval is %d\n", semval);

  50. }

Програма 6.2

В якості параметрів програми для створення семафору слід задавати такі поля:

$ prog6_1 с 1

$ prog6_1 с 2

………

$ prog6_1 с n

Для маніпуляцій з семафорами надаються опції l чи u з номером семафора:

$ prog6_1 u 3

Для вилучення значень створеного семафора користувач повинен задати команду:

$ prog6_1 d

Програма prog6_2 надає інформацію стосовно значень виконуваного семафора (роздрук 6.1).

В деяких випадках потрібно стежити за виконанням необхідних дій стосовно семафорів (команда ipcs, лаб. робота №5). Вилучення семафора можливе за допомогою команди ipcrm з опцією sem та ідентифікаційним номером черги. Роздрук 6.1 демонструє роботу програми 6.1 з 6.2 та можливі взаємодії програм зі стандартними механізмами управління семафорами:

KSI Linux release 1.1 (CyberZOO)

Kernel 2.0.33 on an i486

login: hoshaba

Password:

Last login: Mon Feb 23 18:23:18 from torro

[root@lili test]# ipcs

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 0 nobody 600 46084 8 dest

0x00280267 1 root 644 102400 44

------ Semaphore Arrays --------

key semid owner perms nsems status

0x00280269 0 root 666 32

------ Message Queues --------

key msqid owner perms used-bytes messages

0x00000000 0 root 700 0 0

[root@lili test]# ./prog6_1 c 6

Attempting to create new semaphore set with 6 members

[root@lili test]# ipcs

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 0 nobody 600 46084 8 dest

0x00280267 1 root 644 102400 44

------ Semaphore Arrays --------

key semid owner perms nsems status

0x00280269 0 root 666 32

0x73030811 1025 root 666 6

------ Message Queues --------

key msqid owner perms used-bytes messages

0x00000000 0 root 700 0 0

[root@lili test]# ./prog6_1 u 4

semaphore member 4 out of range

[root@lili test]# ./prog6_1 l 4

Semaphore resources decremented by one (locked)

semval for member 4 is 1

[root@lili test]# ipcs

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 0 nobody 600 46084 8 dest

0x00280267 1 root 644 102400 44

------ Semaphore Arrays --------

key semid owner perms nsems status

0x00280269 0 root 666 32

0x73030811 1025 root 666 6

------ Message Queues --------

key msqid owner perms used-bytes messages

0x00000000 0 root 700 0 0

[root@lili test]# ./prog6_1 d

Semaphore removed

[root@lili test]# ipcs

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 0 nobody 600 46084 8 dest

0x00280267 1 root 644 102400 44

------ Semaphore Arrays --------

key semid owner perms nsems status

0x00280269 0 root 666 32

------ Message Queues --------

key msqid owner perms used-bytes messages

0x00000000 0 root 700 0 0

[root@lili test]# ./prog6_1 c 4

Attempting to create new semaphore set with 4 members

[root@lili test]# ipcs

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 0 nobody 600 46084 8 dest

0x00280267 1 root 644 102400 44

------ Semaphore Arrays --------

key semid owner perms nsems status

0x00280269 0 root 666 32

0x73030811 1153 root 666 4

------ Message Queues --------

key msqid owner perms used-bytes messages

0x00000000 0 root 700 0 0

[root@lili test]# ipcrm sem 1153

resource deleted

[root@lili test]# ipcs

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 0 nobody 600 46084 8 dest

0x00280267 1 root 644 102400 44

------ Semaphore Arrays --------

key semid owner perms nsems status

0x00280269 0 root 666 32

------ Message Queues --------

key msqid owner perms used-bytes messages

0x00000000 0 root 700 0 0

[root@lili test]# ./prog6_1 c 7

Attempting to create new semaphore set with 7 members

[root@lili test]# ./prog6_2

Semaphore #0: --> 1

Semaphore #1: --> 1

Semaphore #2: --> 1

Semaphore #3: --> 1

Semaphore #4: --> 1

Semaphore #5: --> 1

Semaphore #6: --> 1

[root@lili test]# ./prog6_1 u 4

semaphore member 4 out of range

[root@lili test]# ./prog6_2

Semaphore #0: --> 1

Semaphore #1: --> 1

Semaphore #2: --> 1

Semaphore #3: --> 1

Semaphore #4: --> 1

Semaphore #5: --> 1

Semaphore #6: --> 1

[root@lili test]# ./prog6_1 l 4

Semaphore resources decremented by one (locked)

semval for member 4 is 0

[root@lili test]# ./prog6_2

Semaphore #0: --> 1

Semaphore #1: --> 1

Semaphore #2: --> 1

Semaphore #3: --> 1

Semaphore #4: --> 0

Semaphore #5: --> 1

Semaphore #6: --> 1

[root@lili test]# logout

Роздрук 6.1

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

  1. Назвіть властивості та призначення семафорів.

  2. Розкажіть про процес створення та роботи семафорів.

  3. Поясніть значення системних викликів (функцій) semget, semop та semctl.

  4. Розкажіть про типи операцій над семафорами.

  5. У програмі 6.1 визначте основні блоки: створення сема­фора, захоплення та звільнення ідентифікаторів процесів, їх знищення, зміна параметрів доступу до семафорів.

  6. Поясніть призначення та роботу функції fprintf у рядку 115 програми 6.1.

  7. Поясніть призначення та роботу функції exit у рядку 41 програми 6.2.

Завдання

  1. Одержати та відкомпілювати програму 6.1. Запам'ятати попередні значення системи семафорів. Виконати програму 6.1. і записати значення системи семафорів. Вилучити наслідки роботи програми з семафорами за допомогою команди ipcrm;

  2. Одержати та відкомпілювати програму 6.2. Виконати програму 6.2 до і після запуску програми 6.1. Записати результати роботи програми 6.2.

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

Зміст звіту:

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

  • призначення програм 6.1 та 6.2;

  • алгоритм і текст програм 6.1 та 6.2.

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

Поділяєма оперативна пам'ять.

Мета роботи: ознайомити з поділяємою оперативною пам'яттю та маніпуляціями над нею.

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

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

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

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

Для поділяємих сегментів застосовуються такі header-файли (файли заголовків) та системні виклики:

#include <sys/types.h>

#include <sys/ipc.h>

shmget – створення сегмента;

shmetl – установка параметрів;

shmat – під'єднання сегмента;

shmdt – від'єднання сегмента.

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

  1. #include <stdio.h>

  2. #include <sys/types.h>

  3. #include <sys/ipc.h>

  4. #include <sys/shm.h>

  5. #define SEGSIZE 100

  6. main(int argc, char *argv[])

  7. {

  8. key_t key;

  9. int shmid, cntr;

  10. char *segptr;

  11. if(argc == 1)

  12. usage();

  13. key = ftok(".", 'S');

  14. if((shmid = shmget(key, SEGSIZE, IPC_CREAT|IPC_EXCL|0666)) == -1)

  15. {

  16. printf("Shared memory segment exists - opening as client\n");

  17. if((shmid = shmget(key, SEGSIZE, 0)) == -1)

  18. {

  19. perror("shmget");

  20. exit(1);

  21. }

  22. }

  23. else

  24. {

  25. printf("Creating new shared memory segment\n");

  26. }

  27. if((segptr = shmat(shmid, 0, 0)) == -1)

  28. {

  29. perror("shmat");

  30. exit(1);

  31. }

  32. switch(tolower(argv[1][0]))

  33. {

  34. case 'w': writeshm(shmid, segptr, argv[2]);

  35. break;

  36. case 'r': readshm(shmid, segptr);

  37. break;

  38. case 'd': removeshm(shmid);

  39. break;

  40. case 'm': changemode(shmid, argv[2]);

  41. break;

  42. default: usage();

  43. }

  44. }

  45. writeshm(int shmid, char *segptr, char *text)

  46. {

  47. strcpy(segptr, text);

  48. printf("Done...\n");

  49. }

  50. readshm(int shmid, char *segptr)

  51. {

  52. printf("segptr: %s\n", segptr);

  53. }

  54. removeshm(int shmid)

  55. {

  56. shmctl(shmid, IPC_RMID, 0);

  57. printf("Shared memory segment marked for deletion\n");

  58. }

  59. changemode(int shmid, char *mode)

  60. {

  61. struct shmid_ds myshmds;

  62. shmctl(shmid, IPC_STAT, &myshmds);

  63. printf("Old permissions were: %o\n", myshmds.shm_perm.mode);

  64. sscanf(mode, "%o", &myshmds.shm_perm.mode);

  65. shmctl(shmid, IPC_SET, &myshmds);

  66. printf("New permissions are : %o\n", myshmds.shm_perm.mode);

  67. }

  68. usage()

  69. {

  70. fprintf(stderr, "shmtool - A utility for tinkering with shared memory\n");

  71. fprintf(stderr, "\nUSAGE: shmtool (w)rite <text>\n");

  72. fprintf(stderr, " (r)ead\n");

  73. fprintf(stderr, " (d)elete\n");

  74. fprintf(stderr, " (m)ode change <octal mode>\n");

  75. exit(1);

  76. }

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