Пример выполнения лабораторной работы |
В этой модели деятельность Слонов носит более коллективистский характер.
Каждый Слон ищет воду самостоятельно. Однако, найдя водоем, Слон сравнивает свою потребность с объемом водоема. Если его потребность меньше, чем объем водоема, Слон отправляет Ганеше сообщение, в котором указывает, сколько "лишней" воды он нашел. Ганеша находит в списке Слонов того Слона, который в настоящее время находится в поиске и имеет наибольшую потребность в воде, и направляет этого Слона к водоему, найденному его товарищем.
В отличие от предыдущих моделей, мы не применяем здесь "жесткого" прекращения деятельности Слонов: если сообщение о прекращении деятельности приходит к Слону в тот момент, когда он потребляет воду, Слон имеет возможность закончить потребление и, если после этого его потребность будет удовлетворена полностью, завершиться нормально.
В реализации этой модели передача информации между процессами происходит через очереди сообщений. Все Слоны посылают свои сообщения Ганеше в одну очередь, идентификатор которой представлен переменной msgGaneshaId. Для каждого Слона имеется собственная очередь, в которую Ганеша направляет сообщения, адресованные именно этому Слону. Идентификаторы этих очередей в программе процесса-Ганеши составляют массив msgId[]. Все очереди создает процесс-Ганеша и передает идентификаторы очередей дочернему процессу через параметры программы.
Предусмотрены два типа сообщений, которые процесс-Ганеша может отправлять процессам-Слонам:
Числовой тип сообщения | Символьное обозначение типа | Назначение сообщения | Содержание сообщения |
1 | GRANT | Сообщение о том, что Слону выделяется некоторый объем воды, найденной другим Слоном | Число - объем выделяемой порции |
2 | TERM | Требование Слону прекратить деятельность | <пустое> |
Предусмотрены четыре типа сообщений, которые процесс-Слон может отправлять процессу-Ганеше:
Числовой тип сообщения | Символьное обозначение типа | Назначение сообщения | Содержание сообщения |
1 | NEED | Отправляется в начале деятельности Слона и при каждом изменении его потребности | Имя Слона <пробел> Число - размер потребности Слона |
2 | SUCC | Сообщение о том, что Слона приступил к водопою (независимо от того, нашел он воду сам или получил от другого Слона) | Имя Слона |
3 | REST | Сообщение о том, что у Слона имеется избыток воды; отправляется Слоном при нахождении водоема, объем которого превышает потребность Слона | Имя Слона <пробел> Число - размер избытка |
4 | FINISH | Сообщение о том, что Слона удовлетворил свою потребность и закончил деятельность | Имя Слона |
Еще одна новая структура данных в этой программной модели - список резерва. Когда Ганеша получает от Слона сообщение о наличии избытка воды и не находит Слона, которому этот избыток можно перенаправить, Ганеша заносит полученную порцию в список резерва. Этот список организован как связный линейный список с обработкой LIFO, указатель на начало списка - переменная pList.
После создания очередей и запуска процессов-Слонов алгоритм деятельности Ганеши сводится к следующему:
Алгоритм выполнения процесса-Слона состоит в следующем:
Функция success выполняется при получении Слоном очередной порции воды - найденной самостоятельно или полученной в сообщении GRANT. При ее выполнении:
Программный модуль, реализующий деятельность Ганеши (ganesha7.c ) и программный модуль, реализующий деятельность одного Слона (elephant7.c) .
В программах используються следующие вызовы:
Ниже приводится пример выполнения этой модели
11:18:13.578 - Начало работы 11:18:13.632 Ganesa: получено сообщение type=NEED >Maya 92< 11:18:13.634 Ganesa: получено сообщение type=NEED >Assam 168< 11:18:13.634 Ganesa: получено сообщение type=NEED >Tandy 14< 11:18:13.635 Ganesa: получено сообщение type=NEED >Hao 51< 11:18:13.635 Ganesa: получено сообщение type=NEED >BakZap 101< 11:18:13.636 Ganesa: получено сообщение type=NEED >Aun 24< 11:18:13.636 Ganesa: получено сообщение type=NEED >Hathy 238< 11:18:13.643 Ganesa: получено сообщение type=NEED >Kitty 45< 11:18:14.330 Maya нашел -30 11:18:14.331 Ganesa: получено сообщение type=SUCC >Maya< 11:18:14.340 Tandy нашел -30 11:18:14.342 Ganesa: получено сообщение type=SUCC >Tandy< 11:18:14.342 Ganesa: получено сообщение type=REST >Tandy 16< 11:18:14.342 Assam нашел -30 11:18:14.344 Ganesa: получено сообщение type=SUCC >Assam< 11:18:14.350 Hathy: получено сообщение type=GRANT >16< 11:18:14.352 Hao нашел -30 11:18:14.353 Ganesa: получено сообщение type=SUCC >Hathy< 11:18:14.354 Ganesa: получено сообщение type=SUCC >Hao< 11:18:14.360 BakZap нашел -30 11:18:14.362 Ganesa: получено сообщение type=SUCC >BakZap< 11:18:14.362 Aun нашел -30 11:18:14.363 Ganesa: получено сообщение type=SUCC >Aun< 11:18:14.364 Ganesa: получено сообщение type=REST >Aun 6< 11:18:14.364 Kitty: получено сообщение type=GRANT >6< 11:18:14.366 Ganesa: получено сообщение type=SUCC >Kitty< 11:18:15.130 Ganesa: получено сообщение type=NEED >Hathy 222< 11:18:15.150 Hathy нашел -30 11:18:15.150 Ganesa: получено сообщение type=SUCC >Hathy< 11:18:15.530 Ganesa: получено сообщение type=NEED >BakZap 71< 11:18:15.570 Ganesa: получено сообщение type=NEED >Kitty 39< 11:18:15.590 Kitty нашел -30 11:18:15.590 Ganesa: получено сообщение type=SUCC >Kitty< 11:18:15.850 Ganesa: получено сообщение type=NEED >Assam 138< 11:18:15.970 Ganesa: получено сообщение type=NEED >Maya 62< 11:18:15.990 BakZap нашел -40 11:18:15.990 Ganesa: получено сообщение type=SUCC >BakZap< 11:18:16.310 Assam нашел -40 11:18:16.310 Ganesa: получено сообщение type=SUCC >Assam< 11:18:16.430 Maya нашел -40 11:18:16.430 Ganesa: получено сообщение type=SUCC >Maya< 11:18:16.590 Ganesa: получено сообщение type=NEED >Hathy 192< 11:18:17.050 Hathy нашел -40 11:18:17.050 Ganesa: получено сообщение type=SUCC >Hathy< 11:18:17.540 Ganesa: получено сообщение type=NEED >BakZap 31< 11:18:17.660 BakZap нашел -4 11:18:17.660 Ganesa: получено сообщение type=SUCC >BakZap< 11:18:17.830 Ganesa: получено сообщение type=NEED >BakZap 27< 11:18:17.890 BakZap нашел -39 11:18:17.890 Ganesa: получено сообщение type=SUCC >BakZap< 11:18:17.890 Ganesa: получено сообщение type=REST >BakZap 12< 11:18:18.320 Ganesa: получено сообщение type=NEED >Assam 98< 11:18:18.320 Assam: получено сообщение type=GRANT >12< 11:18:18.321 Ganesa: получено сообщение type=SUCC >Assam< 11:18:18.610 Ganesa: получено сообщение type=NEED >Maya 22< 11:18:18.650 Ganesa: получено сообщение type=NEED >Hao 21< 11:18:18.730 Maya нашел -4 11:18:18.730 Ganesa: получено сообщение type=SUCC >Maya< 11:18:18.930 Ganesa: получено сообщение type=NEED >Assam 86< 11:18:18.940 Слон BakZap закончил водопой 11:18:18.941 Ganesa: получено сообщение type=FINISH >BakZap< 11:18:18.960 Ganesa: получено сообщение type=NEED >Maya 18< 11:18:18.970 Ganesa: получено сообщение type=NEED >Hathy 152< 11:18:19.020 Maya нашел -39 11:18:19.020 Ganesa: получено сообщение type=SUCC >Maya< 11:18:19.020 Ganesa: получено сообщение type=REST >Maya 21< 11:18:19.030 Hathy: получено сообщение type=GRANT >21< 11:18:19.030 Ganesa: получено сообщение type=SUCC >Hathy< 11:18:19.050 Assam нашел -4 11:18:19.050 Ganesa: получено сообщение type=SUCC >Assam< 11:18:19.110 Hao нашел -40 11:18:19.110 Ganesa: получено сообщение type=SUCC >Hao< 11:18:19.110 Ganesa: получено сообщение type=REST >Hao 19< 11:18:19.260 Ganesa: получено сообщение type=NEED >Assam 82< 11:18:19.260 Assam: получено сообщение type=GRANT >19< 11:18:19.260 Ganesa: получено сообщение type=SUCC >Assam< 11:18:20.010 Слон Maya закончил водопой 11:18:20.010 Ganesa: получено сообщение type=FINISH >Maya< 11:18:20.040 Ganesa: получено сообщение type=NEED >Hathy 131< 11:18:20.100 Hathy нашел -4 11:18:20.100 Ganesa: получено сообщение type=SUCC >Hathy< 11:18:20.220 Ganesa: получено сообщение type=NEED >Assam 63< 11:18:20.280 Assam нашел -39 11:18:20.280 Ganesa: получено сообщение type=SUCC >Assam< 11:18:20.310 Ganesa: получено сообщение type=NEED >Hathy 127< 11:18:20.370 Hathy нашел -39 11:18:20.370 Ganesa: получено сообщение type=SUCC >Hathy< 11:18:21.600 Ganesa: получено сообщение type=NEED >Kitty 9< 11:18:22.060 Kitty нашел -40 11:18:22.060 Ganesa: получено сообщение type=SUCC >Kitty< 11:18:22.060 Ganesa: получено сообщение type=REST >Kitty 31< 11:18:22.120 Слон Hao закончил водопой 11:18:22.120 Ganesa: получено сообщение type=FINISH >Hao< 11:18:22.240 Ganesa: получено сообщение type=NEED >Hathy 88< 11:18:22.240 Ganesa: получено сообщение type=NEED >Assam 24< 11:18:22.260 Hathy: получено сообщение type=GRANT >31< 11:18:22.260 Ganesa: получено сообщение type=SUCC >Hathy< 11:18:22.420 Assam нашел -48 11:18:22.420 Ganesa: получено сообщение type=SUCC >Assam< 11:18:22.420 Ganesa: получено сообщение type=REST >Assam 24< 11:18:23.630 ВРЕМЯ ОЖИДАНИЯ ИСТЕКЛО 11:18:23.630 Слон Assam закончил водопой 11:18:23.690 Слон Tandy закончил водопой 11:18:23.750 Hathy: получено сообщение type=TERM >TERM< 11:18:23.750 Слон Hathy погиб 11:18:23.870 Слон Kitty закончил водопой 11:18:26.370 Слон Aun закончил водопой |
© life-prog.ru |
|