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


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

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

Реализация этой модели при помощи именованных каналов состоит в следующем. Для выдачи каждому Слону его порций воды создается отдельный канал. Этот канал является выходным для Ганеши и входным - для Слона. Имя этого канала совпадает с именем Слона. Для приема докладов от Слонов об окончании водопоя создается один канал с именем "Ganesha ". К выходному концу этого канала подключен Ганеша, а к входному - все Слоны.

При нахождении очередной порции воды Ганеша заносит размер этой порции (число типа long в канал того Слона, которому порция предназначена. Слон считывает из своего входного канала размер порции и приступает к ее "потреблению".

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

"Пробудившись из спячки" Ганеша читает содержимое своего входного канала - до окончания данных в нем. Слонов, имена которых считаны из канала Ганеша считает нормально завершившимся. Остальным Слонам Ганеша посылает сигнал завершения, и они гибнут.

Некоторую сложность при реализации данной модели может представлять синхронизация работы процессов с каналами. При этом следует учитывать следующие обстоятельства:

При наличии двух (или более) процессов и двух каналов, возможна ситуация классического тупика, показанная на рисунке:

Строго говоря, для синхронизации деятельности процессов следовало бы использовать специальные средства, но чтобы избежать усложнения примера, мы попытались обойтись без них и построить алгоритмы функционирования процессов таким образом, чтобы предупредить или, по крайней мере,свести к минимуму вероятность возникновения нежелательных эффектов. Укрупненная схема этого алгоритма показана на рисунке ниже. Красными стрелками показаны моменты выполнения, в которые происходит принудительная синхронизация процессов - за счет возможных ожиданий при выполнении операций над каналами.

Кодовые модули, реализующие эту программную модель - ganesha4.c и elephant4.c - показаны ниже.

В программах используються следующие вызовы:

Программный модуль, реализующий деятельность Ганеши (ganesha4.c ) и программный модуль, реализующий деятельность одного Слона (elephant4.c).

Ниже приводится пример выполнения этой модели

  18:21:20.559 - Начало работы
  18:21:20.576 Слон Aun приступил
  18:21:20.584 Слон Tandy приступил
  18:21:20.594 Слон Maya приступил
  18:21:20.605 Слон BakZap приступил
  18:21:20.616 Слон Hao приступил
  18:21:20.619 Слон Assam приступил
  18:21:20.625 Слон Hathy приступил
  18:21:20.634 Слон Kitty приступил
  18:21:21.630 Канал для Tandy открыт - 3
  18:21:21.630 Канал для Aun открыт - 4
  18:21:21.631 Канал для Assam открыт - 5
  18:21:21.631 Канал для Maya открыт - 6
  18:21:21.631 Канал для BakZap открыт - 7
  18:21:21.632 Канал для Hao открыт - 8
  18:21:21.632 Канал для Hathy открыт - 9
  18:21:21.633 Канал для Kitty открыт - 10
  18:21:22.640 Слон Tandy получил 766
  18:21:22.660 Слон Aun получил 1100
  18:21:22.730 Слон Assam получил 11
  18:21:22.730 Слон Assam выпил 11, остаток потребности - 2888
  18:21:22.750 Слон Maya получил 1619
  18:21:22.815 Слон BakZap получил 8
  18:21:22.816 Слон BakZap выпил 8, остаток потребности - 2242
  18:21:22.850 Слон Hao получил 1476
  18:21:22.930 Слон Hathy получил 1518
  18:21:22.950 Слон BakZap получил 1886
  18:21:23.080 Слон Kitty получил 213
  18:21:23.120 Слон Assam получил 1047
  18:21:30.410 Слон Kitty выпил 213, остаток потребности - 1287
  18:21:30.411 Слон Kitty получил 809
  18:21:30.904 Слон BakZap выпил 1886, остаток потребности - 356
  18:21:30.904 Слон BakZap получил 356
  18:21:32.314 Слон BakZap выпил 356, остаток потребности - 0
  18:21:33.749 Слон Assam выпил 1047, остаток потребности - 1841
  18:21:33.750 Слон Assam получил 1588
  18:21:33.839 Слон Maya выпил 1619, остаток потребности - 530
  18:21:34.080 Слон Maya получил 233
  18:21:34.830 Слон Hathy выпил 1518, остаток потребности - 1932  
  18:21:34.830 Слон Hathy получил 911
  18:21:35.278 Слон Maya выпил 233, остаток потребности - 297
  18:21:35.278 Слон Maya получил 297
  18:21:36.720 Слон Maya выпил 297, остаток потребности - 0
  18:21:40.201 Слон Hathy выпил 911, остаток потребности - 1021
  18:21:40.201 Слон Hathy получил 986
  18:21:45.242 Слон Hathy выпил 986, остаток потребности - 35
  18:21:45.243 Слон Hathy получил 35
  18:21:45.243 Слон Hathy выпил 35, остаток потребности - 0
  18:21:46.428 Слон Hao выпил 1476, остаток потребности - 124
  18:21:46.428 Слон Hao получил 124
  18:21:46.504 Слон Assam выпил 1588, остаток потребности - 253
  18:21:46.504 Слон Assam получил 253
  18:21:47.419 Слон Hao выпил 124, остаток потребности - 0
  18:21:47.933 Слон Assam выпил 253, остаток потребности - 0
  18:21:48.882 Слон Kitty выпил 809, остаток потребности - 478
  18:21:48.883 Слон Kitty получил 478
  ВРЕМЯ ОЖИДАНИЯ ИСТЕКЛО
  18:21:54.299 Слон Kitty выпил 478, остаток потребности - 0
  18:21:55.280 Слон BakZap доложил о завершении
  18:21:56.290 Слон Maya доложил о завершении
  18:21:57.300 Слон Hao доложил о завершении
  18:21:58.310 Слон Hathy доложил о завершении
  18:21:59.320 Слон Assam доложил о завершении
  18:22:00.273 Слон Aun выпил 1100, остаток потребности - 0
  18:22:00.330 Слон Kitty доложил о завершении
  18:22:01.340 Слон Aun доложил о завершении
  18:22:02.350 Слон Tandy погиб


 

© life-prog.ru