Лабораторная работа 5 (ПКРПСиБД LAB5 Машеров Д.Е.)

Посмотреть архив целиком

Национальный исследовательский институт

Московский Энергетический Институт (Технический Университет)

Институт автоматики и вычислительной техники

Кафедра Прикладной математики









Лабораторная работа №5

по дисциплине «Проектирование крупных распределенных программных систем и баз данных»

тема: «Реализация одного из шаблонов параллельного программирования»



Выполнил:

Машеров Д.Е.

Проверил:

к.т.н., доц. Куриленко И.Е.











Москва

2012 г.

Leaders/followers/Ведущий/ведомый

Категория: Шаблоны параллельного программирования

Описание

Ведущий / ведомый (Leader / Follower) – шаблон параллельного программирования, применяющийся для распределения задач ведущим (Leader) по ведомым (Followers) компонентам и последующей сборки всех полученных результатов..

Уместность применения

Шаблон параллельного программирования «Ведущий / ведомый» уместно применять при распараллеливании любой задачи, требующей одной или нескольких точек сборки результатов. Классическими примерами подобных задач являются перемножение матриц, LU-разложение матриц, решение СЛАУ и т. п.

Преимущества, достигаемые при применении шаблона

  1. Простота разработки и реализации.

  2. Шаблон позволяет отлавливать факты ошибочного завершения работы отдельных параллельных ветвей программы и делать определённых шаги для корректного завершения работы программы, например, повторно запускать неудачно завершившуюся часть программы.

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

Недостатки шаблона

  1. Отсутствие способа обмена информацией между ведомыми компонентами зачастую существенно усложняет код.


Детали реализации

Классы

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-диаграмма

Диаграмма классов:

Диаграмма последовательности

Литература

  1. 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<TcpListener> Select(ICollection<TcpListener> listeners);

}


public class SynchronousEventDemultiplexer : ISynchronousEventDemultiplexer

{

public IList<TcpListener> Select(ICollection<TcpListener> listeners)

{

var tcpListeners =

new List<TcpListener>(from listener in listeners

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<TcpListener, IEventHandler> _handlers;


public Reactor(ISynchronousEventDemultiplexer synchronousEventDemultiplexer)

{

_synchronousEventDemultiplexer = synchronousEventDemultiplexer;

_handlers = new Dictionary<TcpListener, IEventHandler>();

}


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<TcpListener> listeners = _synchronousEventDemultiplexer.Select(_handlers.Keys);


foreach (TcpListener listener in listeners)

{

int dataReceived = 0;

byte[] buffer = new byte[1];

IList<byte> data = new List<byte>();


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-диаграмма

Диаграмма классов:

Диаграмма последовательности

Литература

  1. http://www.robertsindall.co.uk/blog/the-reactor-pattern-using-c-sharp/

  2. Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Douglas C. Schmidt, University of California, Irvine, CA 92697, USA



Scheduler/Планировщик

Категория: Шаблоны параллельного программирования

Описание

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

Суть паттерна заключается в создании объекта, который явным образом ставит в очередь ожидающие ресурс потоки.

Уместность применения


Случайные файлы

Файл
29108-1.rtf
72897-1.rtf
14155.rtf
71151-1.rtf
80013.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.