Пример выполнения лабораторной работы


Готовый проект с откомпилированным кодом вы можете скачать здесь:)

В этой модели деятельность Слонов носит более коллективистский характер.

Каждый Слон ищет воду самостоятельно. Однако, найдя водоем, Слон сравнивает свою потребность с объемом водоема. Если его потребность меньше, чем объем водоема, Слон отправляет Ганеше сообщение, в котором указывает, сколько "лишней" воды он нашел. Ганеша находит в списке Слонов того Слона, который в настоящее время находится в поиске и имеет наибольшую потребность в воде, и направляет этого Слона к водоему, найденному его товарищем.

В отличие от предыдущих моделей, мы не применяем здесь "жесткого" прекращения деятельности Слонов: если сообщение о прекращении деятельности приходит к Слону в тот момент, когда он потребляет воду, Слон имеет возможность закончить потребление и, если после этого его потребность будет удовлетворена полностью, завершиться нормально.

В реализации этой модели передача информации между процессами происходит через очереди сообщений. Все Слоны посылают свои сообщения Ганеше в одну очередь, идентификатор которой представлен переменной 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