Разработка систем с помощью передачи сообщений.

Решение задачи производительности потребителя с помощью мониторов.

Монитор – это некоторый приметив синхронизации, обладающий особыми свойствами, иными словами – это некоторая библиотека функций при обращении в любой момент времени может быть активен хотябы 1 процесс. Если при вызове процедуры есть хоть 1-н процесс, вызываемый процесс блокируется. В мониторах были предложены переменные состояния и примитивы wait() и signal().

Примитив wait() вызывается, когда процедура монитора обнаруживает что она не в состоянии продолжить операцию. Она вызывает блокировку процесса, что позволяет другому процессу войти в монитор.

Примитив signal() выполняет операцию побудки на его переменную состояния. Хоар предложил при этом немедленный запуск разбуженного процесса и остановку разбудившего, по решению Хансона, процесс, выполнивший signal() немедленно покидает мониторы.

 

 

Разработка систем с помощью передачи сообщений связано с рядом проблем:

1. Сообщение может затеряться во время передачи. Во избежании этого отправитель и получатель договариваются о подтверждении приема. Если сообщение не получено отправитель повторяет передачу.

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

3. Необходимо однозначно определять процесс, указываемый в запросах send и receive, что достигается с помощью механизма аутентификации.

В механизме передачи сообщений существует свое решение проблемы производителя и потребителя.

 

#define №100

void producer(void)

{

int item;

message m;

while(true)

{

item=produce_item();

receive(consumer, &m);

build_messag(&m, item);

send(consumer, &m);

}

}

void consummer(void)

{

int item;

message m;

for(int=0;i<N;i++)

{

send(producer, &m);

item=extract_item(&m);

send(producer, &m);

if(count==N-1)wakeup(produser);

consume_item(item);

}

}

В данном примере существуют ограничения:

1. Все сообщения имеютодинаковый размер.

2. Все сообщения которые посланы и не получены помещаются в ОС в буфер.

Следует учитывать что потребитель и производитель могут работать с разной скоростью. В этом случае использеутся адресуемые сообщения т.е. каждому из процессов присвоен уникальный адрес и сообщение адресуется по номерам, такой подход называют методом почтового ящика – это некоторый буфер, который просматривает процессы в поисках запросов либо сообщений для себя. При этом send и receive обмен идет между процессом и почтовым ящиком.

Существует другой подход, так называемый метод Рандегу, в этом случае процесс обменивается с процессом без буферизации. При отсутствии данных либо запросов соотвецтвующий процесс переключается на другие задачи. Подразумевается что в этом случае процессы работают примерно одинаково либо ведомый процесс производный. Поэтому ведомый процесс работает медленнее ведущего однако он способен производить данные в 2 раза чаще чем происходит значение отклонения контролируемого параметра.