ПКРПСиБД_ЛАБ5_Степная Е.В. (Лабораторные работы РИСиБД)
Описание файла
Файл "ПКРПСиБД_ЛАБ5_Степная Е.В." внутри архива находится в папке "Лабораторные работы РИСиБД". Документ из архива "Лабораторные работы РИСиБД", который расположен в категории "". Всё это находится в предмете "распределённые ис и базы данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "распределённые ис и базы данных" в общих файлах.
Онлайн просмотр документа "ПКРПСиБД_ЛАБ5_Степная Е.В."
Текст из документа "ПКРПСиБД_ЛАБ5_Степная Е.В."
Национальный исследовательский университет
«Московский Энергетический Институт»
Институт автоматики и вычислительной техники
Кафедра прикладной математики
Лабораторная работа №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
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());
}
}
}
}
}
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
{
var tcpListeners = new List
where listener.Pending()
select listener);
return tcpListeners;
}
}
}
UML-диаграммы
Диаграмма классов
Диаграмма последовательности
Литература
-
http://jdevnotes.blogspot.ru/2009/11/reactor-pattern.html
-
http://en.wikipedia.org/wiki/Reactor_pattern