Пример выполнения лабораторной работы |
Посреди саванны существует большое озеро с каменистым дном, питаемое подземными ключами. В засушливый период озеро, однако, высыхает. Ключи продолжают бить, но уже без прежней силы. Вокруг тех из ключей, которые находятся в углублениях, образуются небольшие резервуары, которые наполняются водой, но вода, переливающаяся через края резервуара моментально впитывается в землю или испаряется. Озеро, таким образом, превращается в несколько маленьких озер, скорее даже луж, каждая из которых поддерживается одним из едва живущих, неравномерно бьющих, ключей. Стадо Слонов приходит к бывшему озеру и разбредается по его территории. Каждый Слон выбирает себе ключ с ужей вокруг него и ожидает, когда в луже наберется порция воды, достаточная для того, чтобы забрать ее хоботом. Набрав порцию воды, Слон медленно ее выпивает, а затем ожидает, когда в луже наберется следующая порция.
В реализации этой модели роль лужи выполняет общая область памяти, представляющая собой массив байт. Каждый байт отображает порцию воды "на один хобот" с возможными значениями 1(порция есть)/0(порции нет). По условиям модели для каждого Слона создается собственная область памяти, которая совместно используется им с родительским процессом - Ганешей. Размерности всех общих областей одинаковы - по 8 байтов. Ганеша записывает в массив каждого Слона единицы - "снабжает" его водой. Процесс-Слон записывает в массив нули - "потребляет" воду.
Оба процесса используют разделяемый массив как кольцевой, то есть, дойдя до конца массива продолжают с его начала. Мы применили синхронизацию процессов данными: процесс-производитель не записывает 1 в следующий элемент массива, пока значение в нем не станет равным 0; процесс-потребитель не записывает 0 в следующий элемент массива, пока значение в нем не станет равным 1.
Потребность каждого Слона в воде (выраженная в количестве порций) пропорциональна квадрату веса Слона, умноженному на 5. Время потребления Слоном одной порции обратно пропорционально возрасту Слона.
Процесс-Ганеша создает отдельный процесс для каждого Слона. Перед созданием дочернего процесса для него создается общий сегмент памяти, идентификатор которого передается программе-Слону через параметры запуска. Помимо обычной информации о каждом Слоне, Ганеша хранит для каждого Слона его потребность в воде, идентификатор его общего сегмента памяти и виртуальный адрес этого сегмента в пространстве Ганеши.
Далее в родительском процессе имеется цикл с вложенным цикле. Внешний цикл выполняется до тех пор, пока не будет удовлетворена потребность всего стада. Во внутреннем цикле перебираются все члены стада, и тем Слонам, чья потребность еще не удовлетворена, выдается порция воды (записывается 1 в элемент массива в соответствующей области памяти). Между выдачами порций выполняется задержке на случайный интервал времени, параметры которой подобраны так, чтобы общее время выдачи примерно соответствовало общему времени потребления.
Однако, перед началом внешнего цикла процесс-Ганеша выполняет системный вызов alarm устанавливая "будильник" на 30 сек. По пришествии сигнала SIG_ALRM устанавливается признак, по которому происходит досрочный выход из внешнего цикла.
После прихода сигнала "будильника" тем процессам-Слонам, которые не завершились сами, посылается сигнал SIG_TERM.
Каждый Слон после запуска определяет свою потребность в воде, присоединяет общую область памяти, идентификатор которой он получил в качестве параметра и выполняет цикл, который повторяется до тех пор, пока потребность не будет удовлетворена. Каждая итерация цикла начинается с ожидания, когда следующий элемент массива в разделяемой области примет значение 1. Когда это происходит (то есть, имеется доступная порция воды), Слон получает порцию (при этом он сбрасывает элемент массива в 0) и потребляет ее.
Программный модуль, реализующий деятельность Ганеши (ganesha6.c ) и программный модуль, реализующий деятельность одного Слона (elephant6.c) .
В программах используються следующие вызовы:
Ниже приводится пример выполнения этой модели
18:21:29.402 - Начало работы 18:21:31.050 - Слон BakZap : 100 18:21:31.340 - Слон Hao : 50 18:21:31.510 - Слон Maya : 90 18:21:32.870 - Слон Aun : 20 18:21:32.890 - Слон Kitty : 40 18:21:33.460 - Слон Assam : 160 18:21:33.580 - Слон Hathy : 230 18:21:33.650 - Слон Tandy : 10 18:21:34.480 - Слон BakZap : 90 18:21:34.920 - Слон Hao : 40 18:21:34.950 - Слон Maya : 80 18:21:36.360 - Слон Kitty : 30 18:21:37.280 - Слон Assam : 150 18:21:37.280 - Слон Hathy : 220 18:21:38.070 - Слон Aun : 10 18:21:38.170 - Слон BakZap : 80 18:21:38.440 - Слон Maya : 70 18:21:38.510 - Слон Hao : 30 18:21:39.940 - Слон Kitty : 20 18:21:40.450 - Слон Tandy : 0 18:21:40.450 - Слон Tandy нормально завершился 18:21:40.860 - Слон Hathy : 210 18:21:40.870 - Слон Assam : 140 18:21:41.840 - Слон BakZap : 70 18:21:42.120 - Слон Hao : 20 18:21:42.340 - Слон Maya : 60 18:21:43.270 - Слон Aun : 0 18:21:43.270 - Слон Aun нормально завершился 18:21:43.680 - Слон Kitty : 10 18:21:44.280 - Слон Assam : 130 18:21:44.630 - Слон Hathy : 200 18:21:45.440 - Слон BakZap : 60 18:21:45.640 - Слон Hao : 10 18:21:45.780 - Слон Maya : 50 18:21:47.180 - Слон Kitty : 0 18:21:47.180 - Слон Kitty нормально завершился 18:21:47.930 - Слон Assam : 120 18:21:48.270 - Слон Hathy : 190 18:21:49.030 - Слон BakZap : 50 18:21:49.170 - Слон Hao : 0 18:21:49.170 - Слон Hao нормально завершился 18:21:49.280 - Слон Maya : 40 18:21:51.410 - Слон Assam : 110 18:21:51.700 - Слон Hathy : 180 18:21:52.780 - Слон BakZap : 40 18:21:52.950 - Слон Maya : 30 18:21:55.290 - Слон Assam : 100 18:21:55.430 - Слон Hathy : 170 18:21:56.220 - Слон BakZap : 30 18:21:56.650 - Слон Maya : 20 18:21:58.830 - Слон Assam : 90 18:21:58.970 - Слон Hathy : 160 18:21:59.610 - Слон BakZap : 20 18:21:59.900 - Слон Maya : 10 18:22:01.110 - Слон Assam погиб 18:22:01.111 - Слон Maya погиб 18:22:01.111 - Слон BakZap погиб 18:22:01.112 - Слон Hathy погиб |
© life-prog.ru |
|