Transcript Document

Математическая
модель задачи о
читателях
и писателях
Хусаинов А.А.
[email protected]
http://husainov51.narod.ru
Цель доклада
• Построение и применение
асинхронной системы переходов для
решения задачи о читателях и
писателях
2
Задачи
• Рассмотреть различные методы решения
задачи о читателях и писателях
• Дать определение и примеры асинхронных
систем
• Построить асинхронную систему для
задачи о читателях и писателях
• Разработать программное обеспечение
3
Задача о читателях и
писателях
В многопроцессорный компьютер в случайные моменты времени
загружаются два типа процессов – читатели и писатели,
осуществляющие сеансы работы (транзакции) с общей базой данных.
Читатели выполняют чтение, писатели – чтение и запись. Транзакции
изменяют состояние системы.
База
Данных
Читатель
Читатель
Писатель
1. Писатель может работать только один.
2. Читателей может быть несколько
3. Писатели имеют приоритет перед читателями – если появился
писатель, новые читатели не могут получить доступ к базе.
4
Решение с помощью одного
семафора
int nr =0; // количество читателей
Semaphore rw(1,1); // мьютекс на доступ к базе данных
Reader()
{
<nr++; if (nr==1) P(rw);>
read();
<nr--; if (nr==0) V(rw);>
}
Writer()
{
P(rw);
write();
V(rw)
}
5
Уточнение неделимых
операций
int nr =0; // количество читателей
Semaphore rw(1,1); // максимальное и начальное значения =1
Semaphore mr(1,1);
Reader()
{
// <nr++; if (nr==1) P(rw);>
P(mr); nr++; if (nr==1) P(rw); V(mr);
read();
//<nr--; if (nr==0) V(rw);>
P(mr); nr--; if (nr==0) V(rw); V(mr);
}
Writer()
{
P(rw);
write();
V(rw)
}
// Бесконечный поток читателей может блокировать работу писателей
6
Условная синхронизация для
приоритета писателей
int nr =0; // количество читателей, имеющих доступ к базе
int nw=0; // количество писателей, имеющих доступ
// (nr==0 || nw==0) && nw ≤1 -- глобальный инвариант
// читатель ждет условия (nw==0)
// писатель ждет условия (nr==0 || nw==0)
Reader()
{
<await (nw==0) nr++; >
read();
<nr--; >
}
Writer()
{
<await (nr==0 && nw==0) nw++; >
write();
<nw--;>
}
Проблема: реализовать <await(B) S;>
7
Детализация условной синхронизации
методом передачи эстафеты
int nr =0, // количество читателей, имеющих доступ к базе
dr=0; // приостановленных читателей
int nw=0, // количество писателей, имеющих доступ
dw=0; // приостановленных писателей
Semaphore e(1,1), // мьютекс для упр входом в неделимые действия
r(1,0), // равен 1 если (nw==0)
w(1,0); // равен 1 если (nr==0 && nw==0)
Reader()
{
//
<await (nw==0) nr++; >
P(e); if (nw>0) {dr++; V(e); P(r);}
nr++;SIGNAL;
read();
//
<nr--; >
P(e); nr--; SIGNAL;
}
Writer()
{
//
<await (nr==0 && nw==0) nw++; >
P(e); if (nr>0 || nw>0) {dw++; V(e); P(w);}
nw++; SIGNAL;
write();
//
<nw--;>
P(e); nw--; SIGNAL;
}
SIGNAL: if (nw==0 && dr > 0) V(r);
else if ((nw==0|| nr==0) && dw>0) V(w)
else if (dr==0 && dw==0) V(e);
8
Решение с помощью монитора
Монитор = объект класса с исключительным
запуском составных функций
Monitor RW
{ // инв (nr==0 || nw==0) && (nw ≤1)
int nr=0, nw=0;
cond oktoread, // сигнал nw==0
oktowrite; // сигнал nr==0 && nw==0;
Procedure req_read()
{
while (nw>0) wait(oktoread); nr++;
}
Procedure release_read()
{
nr--;
if (nr==0) signal(oktowrite);
}
Procedure req_write()
{
while (nr>0||nw>0) wait(oktowrite); nw++;
}
Procedure release_write()
{
nw--;
signal(oktowrite);
signal_all(oktoread);
}
}
Reader()
{
RW.req_read();
read();
RW.release_read();
}
Writer()
{
RW.req_write();
read();
RW.release_write();
}
9
Асинхронные системы
•
•
•
A=(S, s0, E, I, Tran)
S - множество состояний,
s0  S начальное состояние s0  S,
E - множество событий,
I  E  E - антирефлексивного симметричного
отношения независимости.
Если (s,a,s') Tran & (s,a,s'') Tran, то s'=s''.
Если (a,b) I & (s, a, s') Tran & (s', b, s'') Tran, то
существует такой s1 S, что (s,b,s1) Tran & (s1, a,
s'') Tran.
10
Асинхронная система для задачи
о читателях и писателях
Состояния (r,w), r – число активных читателей, w – число загруженных писателей
Начальное (0,0). I={(b,c),(c,b)}. E состоит из следующих событий:
•
a – читатель пытается получить доступ к базе;
•
b – читатель закончил работу с базой;
•
c – поступил новый писатель;
•
d – писатель закончил работу с базой.
11
Решение с помощью
асинхронной системы
int r=0, w=0;
Semaphore m(1,1), // семафор доступа к (r,w)
en(1,1);
// разрешение записи
Event req0=0; // событие "значение r равно 0"
Reader()
{
P(m); // "a" (читатель пытается войти)
if (w>0) { V(m); return; }
r++; // читатель получил доступ
Reset(req0);
V(m);
read();
P(m); // "b" (читатель закончил работу)
r--;
if (r==0) SetEvent(req0);
V(m);
}
W riter()
{
P(m);
// событие "c"
w++;
// поступил писатель
V(m);
Wait(req0);
P(en);
write(); // производит запись
V(en);
P(m);
// событие "d"
w--;
// писатель выгружается
V(m);
}
12
Разбиение семафора доступа
к числам читателей и писателей
int r=0, w=0;
Semaphore mr(1,1), // семафор доступа к r
mw(1,1), // семафор доступа к w
en(1,1);
// разрешение записи
Event req0=0; // событие "значение r равно 0"
Reader()
{
P(mr); // "a" (читатель пытается войти)
P(mw);
if (w>0) { V(m); return; }
r++; // читатель получил доступ
Reset(req0);
V(mw);
V(mr);
read();
P(mr); // "b" (читатель закончил работу)
r--;
if (r==0) SetEvent(req0);
V(mr);
}
W riter()
{
P(mw);
// событие "c“
w++;
// поступил писатель
V(mw);
Wait(req0);
P(en);
write(); // производит запись
V(en);
P(mr);
P(mw);
// событие "d"
w--;
// писатель выгружается
V(mw);
V(mr);
}
События b и c можно обрабатывать
параллельно
13
Читатели ожидают
возможности чтения базы
int r=0, w=0;
Semaphore mr(1,1), // семафор доступа к r
Semaphore mw(1,1), // семафор доступа к w
en(1,1);
// разрешение записи
Event req0=0,// событие "значение r равно 0”
weq0=0;// событие "значение w равно 0”
Reader()
{
Wait(weq0);//ждем оконч.раб. писателей
P(mw); // "a" (читатель пытается войти)
P(mr);
r++; // читатель получил доступ
Reset(req0);
V(mr);
V(mw);
read();
P(mr); // "b" (читатель закончил работу)
r--;
if (r==0) SetEvent(req0);
V(mr);
}
Writer()
{
P(mw);
// событие "c"
w++;
// поступил писатель
Reset(weq0);
V(mw);
Wait(req0);
P(en);
write(); // производит запись
V(en);
P(mw);
// событие "d“
P(mr);
w--;
// писатель выгружается
if (w==0) SetEvent(weq0);
V(mr);
V(mw);
}
Читатели и писатели ждут разрешения
14
Заключение
Построение программ по асинхронной системы
состоит из двух шагов
• Сначала определяется мьютекс для
переменной, пробегающей множество
состояний. Строится монитор, включающий
подпрограммы обработки событий.
• Затем этот мьютекс заменяется на мьютексы,
соответствующие независимым событиям
15