ПКРПСиБД LAB5 Степная Е.В. (548494)
Текст из файла
Национальный исследовательский университет
«Московский Энергетический Институт»
Институт автоматики и вычислительной техники
Кафедра прикладной математики
Лабораторная работа №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
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.