Заметки о программировании

       

Пример с диалогами



5.2. Пример с диалогами

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

Оператор системы связан с процессами посредством так называемого "полудуплексного канала" (применяется также термин "телесвязь"). Канал называется дуплексным, если информация но нему передается в обоих направлениях: оператор может с помощью клавиатуры передавать сообщения процессам, а процессы, в свою очередь, могут выдавать сообщения оператору на телепринтер. Канал называется полудуплексным, если передача информации возможна за один раз только в одном направлении.

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

Имеется N идентичных процессов (пронумерованных от 1 до N). Каждый из них может задавать единственный вопрос, назовем его "Q1", который означает: "Каким образом мне продолжать выполнение?" Оператор системы может дать один из двух возможных ответов на этот вопрос, обозначаемых "А1" и "А2". Предполагается, что оператор должен знать, какой из процессов задает вопрос (так как его ответ может зависеть от этого), поэтому i-й процесс идентифицирует себя при передаче вопроса. Мы будем дальше говорить, что передается вопрос "Q1(i)". В некотором смысле это требование является следствием того, что все N процессов используют один и тот же канал связи.

Другое следствие этого деления средства связи между различными процессами состоит в том, что никакие два процесса не могут задать вопрос одновременно; таким образом, за всем этим должен наблюдать со стороны некоторый механизм взаимного исключения. Если взаимно исключаются только Ql-вопросы, то оператор может столкнуться с такой ситуацией: поставлен вопрос, скажем "Q1(3)", но прежде чем оператор решил, как на него ответить, приходит следующий вопрос, скажем "Q1(7)".


Тогда единственного ответа "А1" уже недостаточно, поскольку теперь не ясно, предназначается ли он "процессу 7" или "процессу З". Это можно было бы преодолеть добавлением к ответу указания о том, какому процессу он адресован, скажем "Al(i)" и "A2(i)" с соответствующим значением i.
Но это только один способ. Другое решение заключается в том, чтобы сделать вопрос и следующий на него ответ непрерываемым событием; это освобождает оператора от обязанности идентифицировать процесс, и поэтому мы выбираем это последнее соглашение. Итак, мы придерживаемся допустимой формы ответов "А1" и "А2" и имеем, следовательно, два вида диалогов: "Ql(i), А1" и "Ql(i), A2"; при этом следующий диалог может начаться только тогда, когда предыдущий завершен.
Теперь усложним задачу в трех отношениях.
Во-первых, процессам разрешается использовать канал связи для передачи специальных сообщений "M(i)", которые не требуют ответа от оператора.
Во-вторых, нам хочется предоставить оператору возможность отложить ответ. Конечно, он может сделать это, просто не отвечая в течение нужного ему времени, но тогда канал связи останется заблокированным для оставшихся N - 1 процессов, что нежелательно. Введем новый тип ответа "A3", означающий: "Канал освобождается, но диалог с соответствующим процессом остается неоконченным". Очевидно, что оператору нужно предоставить средство возобновить диалог. Он может это сделать с помощью "A4(i)" или "A5(i)", где i изменяется от 1 до N и указывает нужный процесс, причем "A4(i)" вызывает такое же продолжение процесса, как и при немедленном ответе "A1", a "A5(i)" предписывает процессу ту же реакцию, что и на ответ "А2". Приведем теперь возможные виды диалогов:
а) "Ql(i), A1" б) "Ql(i), A2" в) "Ql(i), A3" - - - "A4(i)" г) "Ql(i), A3" - - - "A5(i)".


Что касается выполнения процесса i, то для него диалог (а) эквивалентен (в), а (б) эквивалентен (г).
Рассмотренное выше второе требование имеет следующее следствие: без него, т.е. при единственно допустимых формах ответов "A1" и "A2", интерпретация входного сообщения (от оператора) могла бы быть всегда передана одному из N процессов, а именно тому, который задал вопрос; он мог дождаться ответа и затем соответственно действовать. Сейчас же мы не знаем заранее, когда появятся сообщения "A4(i)" или "A5(i)", и мы не можем поручить интерпретацию этих сообщений от оператора целиком самому i-му процессу, так как выявление принадлежности входящего сообщения (от оператора) i-му процессу является частью самой интерпретации сообщения!
В-третьих, А4- и А6-сообщения должны иметь приоритет над Q1- и М-сообщениями. Это означает следующее. В то время как канал связи занят (передачей Q1- или М-сообщения), процессы могут достигнуть точки, когда им необходимо использовать канал. Но такая же потребность может появиться в это же время у оператора. Мы хотим, чтобы оператор мог использовать канал как только он освободится, и, если оператор пожелал использовать канал, то последний не может быть снова захвачен каким-либо процессом. Это означает, что оператор имеет средства выразить свое желание с помощью какой-либо элементарной формы ввода, даже если сам канал занят выводом для оператора.
Предположим, что оператор

  а) может выполнить какими-то внешними средствами операцию "V(входящее сообщение)", которую он может использовать для объявления сообщения (A1, A2, A3, А4 или А5);

  б) может обнаружить по реакции машины, принято его вмешательство или отвергнуто.

Содержание раздела