ПКРПСиБД LAB5 Машеров Д.Е. (Лабораторная работа 5)
Описание файла
Файл "ПКРПСиБД LAB5 Машеров Д.Е." внутри архива находится в папке "Лабораторная работа 5". Документ из архива "Лабораторная работа 5", который расположен в категории "". Всё это находится в предмете "распределённые ис и базы данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "распределённые ис и базы данных" в общих файлах.
Онлайн просмотр документа "ПКРПСиБД LAB5 Машеров Д.Е."
Текст из документа "ПКРПСиБД LAB5 Машеров Д.Е."
Национальный исследовательский институт
Московский Энергетический Институт (Технический Университет)
Институт автоматики и вычислительной техники
Кафедра Прикладной математики
Лабораторная работа №5
по дисциплине «Проектирование крупных распределенных программных систем и баз данных»
тема: «Реализация одного из шаблонов параллельного программирования»
Выполнил:
Машеров Д.Е.
Проверил:
к.т.н., доц. Куриленко И.Е.
Москва
2012 г.
Leaders/followers/Ведущий/ведомый
Категория: Шаблоны параллельного программирования
Описание
Ведущий / ведомый (Leader / Follower) – шаблон параллельного программирования, применяющийся для распределения задач ведущим (Leader) по ведомым (Followers) компонентам и последующей сборки всех полученных результатов..
Уместность применения
Шаблон параллельного программирования «Ведущий / ведомый» уместно применять при распараллеливании любой задачи, требующей одной или нескольких точек сборки результатов. Классическими примерами подобных задач являются перемножение матриц, LU-разложение матриц, решение СЛАУ и т. п.
Преимущества, достигаемые при применении шаблона
-
Простота разработки и реализации.
-
Шаблон позволяет отлавливать факты ошибочного завершения работы отдельных параллельных ветвей программы и делать определённых шаги для корректного завершения работы программы, например, повторно запускать неудачно завершившуюся часть программы.
-
Кроме того, все ведомые компоненты реализуют один интерфейс и могут взаимодействовать только с ведущим, но не друг с другом, что препятствует возникновению многих ошибок.
Недостатки шаблона
-
Отсутствие способа обмена информацией между ведомыми компонентами зачастую существенно усложняет код.
Детали реализации
Классы
class Leader
{
double[] Result;
public double[] Multiplication(double[] Matrix, double[] Vector)
{
int size = (int)Math.Sqrt(Matrix.Count());
int mid = size / 2;
Follower f1 = new Follower(Matrix, Vector, 0, mid);
Follower f2 = new Follower(Matrix, Vector, mid, size);
Thread t1 = new Thread(new ThreadStart(f1.Multiplication));
Thread t2 = new Thread(new ThreadStart(f2.Multiplication));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Result = new double[size];
f1.Result.CopyTo(Result, 0);
f2.Result.CopyTo(Result, mid);
return Result; // combine results
}
}
class Follower
{
double[] Matrix;
double[] Vector;
double[] result;
int start,end;
public Follower(double[] Matrix, double[] Vector, int start, int end)
{
this.Matrix = Matrix;
this.Vector = Vector;
result = new double[end - start];
this.start = start;
this.end = end;
}
public void Multiplication()
{
int size = (int)Math.Sqrt(Matrix.Count());
for (int i = start; i < end; i++)
{
for (int j = 0; j < size; j++)
{
result[i - start] += Matrix[i*size + j] * Vector[j];
}
}
}
public double[] Result
{ get { return result; }
}
}
Программа:
static void Main(string[] args)
{
double[] Matrix = { 3, 4, 5,
1, 2,3,
9, 10, 11};
double[] Vector = { 1, 2, 3 };
double[] Result = new Leader().Multiplication(Matrix, Vector);
foreach(int e in Result)
Console.WriteLine(e);
Console.Read();
}
UML-диаграмма
Диаграмма классов:
Диаграмма последовательности
Литература
-
Leader/Followers. A Design Pattern for Efficient Multi-threaded I/O Demultiplexing and Dispatching. Douglas C. Schmidt, Carlos O’Ryan. Electrical and Computer Engineering Dept. University of California, Irvine, CA 92697, USA
http://www.kircher-schwanninger.de/michael/publications/lf.pdf
Reactor/Реактор
Категория: Шаблоны параллельного программирования
Описание
Шаблон Реактор – это шаблон проектирования для синхронного демультиплескриования одновременно прибывающих событий.
Уместность применения
Шаблон следует применять, если требуется получать сообщения/запросы/соедиения от параллельно работающих клиентов и обрабатывать эти сообщения последовательно, используя обработчики событий.
Преимущества, достигаемые при применении шаблона
-
Позволяет избежать проблемы создания потоков для всех входящих сообщений/запросов/соедиений.
Недостатки шаблона
Приложения, написанные с помощью наблона Реактор, сложно отлаживать, поскольку имеется хаотичный поток управления между инфраструктурой системы и вызовами метода на обработчиках приложения.
Детали реализации
Классы
public interface ISynchronousEventDemultiplexer
{
IList
}
public class SynchronousEventDemultiplexer : ISynchronousEventDemultiplexer
{
public IList
{
var tcpListeners =
new List
where listener.Pending()
select listener);
return tcpListeners;
}
}
public interface IEventHandler
{
void HandleEvent(byte[] data);
TcpListener GetHandler();
}
public class MessageEventHandler : IEventHandler
{
private readonly TcpListener _listener;
public MessageEventHandler(IPAddress ipAddress, int port)
{
_listener = new TcpListener(ipAddress, port);
}
public void HandleEvent(byte[] data)
{
string message = Encoding.UTF8.GetString(data);
}
public TcpListener GetHandler()
{
return _listener;
}
}
public interface IReactor
{
void RegisterHandle(IEventHandler eventHandler);
void RemoveHandle(IEventHandler eventHandler);
void HandleEvents();
}
public class Reactor : IReactor
{
ISynchronousEventDemultiplexer _synchronousEventDemultiplexer;
IDictionary
public Reactor(ISynchronousEventDemultiplexer synchronousEventDemultiplexer)
{
_synchronousEventDemultiplexer = synchronousEventDemultiplexer;
_handlers = new Dictionary
}
public void RegisterHandle(IEventHandler eventHandler)
{
_handlers.Add(eventHandler.GetHandler(), eventHandler);
}
public void RemoveHandle(IEventHandler eventHandler)
{
_handlers.Remove(eventHandler.GetHandler());
}
public void HandleEvents()
{
while (true)
{
IList
foreach (TcpListener listener in listeners)
{
int dataReceived = 0;
byte[] buffer = new byte[1];
IList
Socket socket = listener.AcceptSocket();
do
{
dataReceived = socket.Receive(buffer);
if (dataReceived > 0)
{
data.Add(buffer[0]);
}
} while (dataReceived > 0);
socket.Close();
_handlers[listener].HandleEvent(data.ToArray());
}
}
}
}
Программа:
static void Main(string[] args)
{
IEventHandler client1 = new MessageEventHandler(IPAddress.Parse("123.123.123.123"), 123);
IEventHandler client2 = new MessageEventHandler(IPAddress.Parse("234.234.234.234"), 123);
IEventHandler client3 = new MessageEventHandler(IPAddress.Parse("125.125.125.125"), 123);
ISynchronousEventDemultiplexer synchronousEventDemultiplexer = new SynchronousEventDemultiplexer();
Reactor dispatcher = new Reactor(synchronousEventDemultiplexer);
dispatcher.RegisterHandle(client1);
dispatcher.RegisterHandle(client2);
dispatcher.RegisterHandle(client3);
dispatcher.HandleEvents();
}
UML-диаграмма
Диаграмма классов:
Диаграмма последовательности
Литература
-
http://www.robertsindall.co.uk/blog/the-reactor-pattern-using-c-sharp/
-
Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Douglas C. Schmidt, University of California, Irvine, CA 92697, USA
Scheduler/Планировщик
Категория: Шаблоны параллельного программирования
Описание
Планировщик - паттерн параллельного программирования, который используется для обеспечения явного контроля за ситуацией, когда разные потоки могут выполнять куски однопоточного кода (операции записи в файл и т.д.).
Суть паттерна заключается в создании объекта, который явным образом ставит в очередь ожидающие ресурс потоки.
Уместность применения
Шаблон следует применять, если:
-
Несколько потоков могут потребовать доступа к ресурсу одновременно, и только один из них может в конкретный момент осуществить доступ к ресурсу
-
Требуется обеспечение доступа потоков к ресурсу в строго определенном порядке
Преимущества, достигаемые при применении шаблона
При использовании шаблона «Планировщик» объект планировщика независим от политики, по которой упорядочиваются потоки, что упрощает повторное использование кода.
Недостатки шаблона
-
Отсутствие способа обмена информацией между ведомыми компонентами зачастую существенно усложняет код.
Детали реализации
Классы
class Scheduler
{
private AutoResetEvent evnt = new AutoResetEvent(false);
private Thread runningThread;
private Dictionary
public void Enter(IOrdering s)
{
var thisThread = Thread.CurrentThread;
lock (this)
{
if (runningThread == null)
{
runningThread = thisThread;
return;
}
waiting.Add(thisThread, s);
}
lock (thisThread)
{
while (thisThread != runningThread)
{
evnt.WaitOne();
evnt.Set();
Thread.Sleep(1);
}
evnt.Reset();
}
lock (this)
{
waiting.Remove(thisThread);
}
}
public void Done()
{
lock (this)
{
if (runningThread != Thread.CurrentThread)
throw new ThreadStateException(@"Wrong Thread");
int waitCount = waiting.Count;
if (waitCount <= 0)
{
runningThread = null;
}
else if (waitCount == 1)
{
runningThread = waiting.First().Key;
waiting.Remove(runningThread);
evnt.Set();
}
else
{
var next = waiting.First();
foreach (var wait in waiting)
{
if (wait.Value.ScheduleBefore(next.Value))
{
next = wait;
}
}
runningThread = next.Key;
evnt.Set();
}
}
}
}
class BankAccount
{
private static int transactionID;
private Scheduler scheduler = new Scheduler();
private int balance = 0;
public void Handle(Transaction transaction)
{
int id = ++transactionID;
try
{
Console.WriteLine(String.Format(@"Transaction #{0}: enter scheduler", id));
scheduler.Enter(transaction);
Console.WriteLine(String.Format(@"Transaction #{0}: start handling", id));
try
{
transaction.Do(id);
balance += transaction.Chng;
}
finally
{
scheduler.Done();
Console.WriteLine(String.Format(@"Transaction #{0}: done! Account balance is {1}", id, balance));
}
}
catch (Exception) { }
}
}