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

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

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

«Московский Энергетический Институт»

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

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















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

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

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



Выполнила студентка

Группы А-13-08

Степная Е.В.



Проверил

Куриленко И.Е.







Москва, 2012



Шаблон проектирования

Необходимо реализовать шаблон параллельного проектирования Реактор (Reactor).

Описание

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

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

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

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

  • Компоненты приложения можно разделить на модульные, многоразовые части.

  • Благодаря параллельным обработкам запросов, шаблон допускает многомодульный параллелизм без добавления сложности многопоточности в систему.



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

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

  • Из-за параллельной обработки запросов, реактор ограничивает максимальный параллелизм, особенно на SMP оборудовании. Масштабируемость реактора ограничена не только синхронным вызовом обработчиков запросов, но и демультиплексором.



Реализация

Program.cs

using System.Net;


namespace ReactorPattern

{

class Program

{

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("244.244.244.244"), 123);




ISynchronousEventDemultiplexer synchronousEventDemultiplexer = new SynchronousEventDemultiplexer();


Reactor dispatcher = new Reactor(synchronousEventDemultiplexer);


dispatcher.RegisterHandle(client1);

dispatcher.RegisterHandle(client2);

dispatcher.RegisterHandle(client3);


dispatcher.HandleEvents();


}

}

}


Reactor.cs

using System.Collections.Generic;

using System.Linq;

using System.Net.Sockets;


namespace ReactorPattern

{

public class Reactor : IReactor

{

private readonly ISynchronousEventDemultiplexer _synchronousEventDemultiplexer;

private readonly 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());

}

}

}

}

}


MessageEventHandler.cs

using System.Net;

using System.Net.Sockets;

using System.Text;


namespace ReactorPattern

{

public class MessageEventHandler : IEventHandler

{

private readonly TcpListener _listener;


public MessageEventHandler(IPAddress ipAddress, int port)

{

_listener = new TcpListener(ipAddress, port);

_listener.Start();

}


public void HandleEvent(byte[] data)

{

string message = Encoding.UTF8.GetString(data);

}


public TcpListener GetHandler()

{

return _listener;

}

}

}




SynxronousEventDemultiplexer.cs

using System.Collections.Generic;

using System.Linq;

using System.Net.Sockets;

using System.Threading;


namespace ReactorPattern

{

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;

}

}

}


UML-диаграммы

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

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

Литература

  • http://jdevnotes.blogspot.ru/2009/11/reactor-pattern.html

  • http://en.wikipedia.org/wiki/Reactor_pattern


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

Файл
129370.rtf
102529.rtf
99457.rtf
3579-1.rtf
46684.rtf




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