Научная статья на тему 'Программная реализация моделей оптимального распределения информационных ресурсов'

Программная реализация моделей оптимального распределения информационных ресурсов Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
113
26
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
DISTRIBUTED INFORMATION PROCESSING SYSTEM / FILE-SERVER ARCHITECTURE / TWO-LEVEL CLIENT-SERVER ARCHITECTURE / NONLINEAR COMBINATORIAL OPTIMIZATION / GENERATOR OF EQUIPROBABLE CHOICE / JORDAN-GAUSS METHOD / NORMALIZED CONSTANT / AVERAGE REACTION TIME OF THE SYSTE / РАСПРЕДЕЛЁННАЯ СИСТЕМА ОБРАБОТКИ ИНФОРМАЦИИ / АРХИТЕКТУРА "ФАЙЛСЕРВЕР" / ДВУХУРОВНЕВАЯ АРХИТЕКТУРА "КЛИЕНТ-СЕРВЕР" / НЕЛИНЕЙНАЯ КОМБИНАТОРНАЯ ОПТИМИЗАЦИЯ / ГЕНЕРАТОР РАВНОВЕРОЯТНОГО ВЫБОРА / МЕТОД ЖОРДАНА-ГАУССА / НОРМАЛИЗУЮЩАЯ КОНСТАТА / СРЕДНЕЕ ВРЕМЯ РЕАКЦИИ СИСТЕМЫ / БЛОКИРОВКА ОТНОШЕНИЯ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Михайлов В. К., Айеш Ахмед Нафеаайеш (ирак), Скоба А. Н.

В данной статье описаны этапы программной реализации задачи вычисления среднего времени реакции распределённой системы обработки информации (СОИ) на запросы пользователей и алгоритма оптимального распределения информационных отношений по узлам распределённой СОИ, реализованной на базе архитектуры «файлсервер» и двухуровневой архитектуры «клиент-сервер» с учетом и без учета влияния блокировок. Описана процедура конструирования исходных данных для моделирования: элементов матрицы начального распределения информационных ресурсов (отношений) по узлам распределённой СОИ, элементов матрицы информационной взаимосвязи запросов пользователей распределённой СОИ и самих информационных ресурсов, элементов матрицы вероятностей формирования пользователями информационных запросов. Разработана и программно реализована процедура, позволяющая существенно упростить вычисление нормализующей константы, а соответственно, и среднего времени реакции системы на запросы пользователей. Приведены результаты численных экспериментов.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Михайлов В. К., Айеш Ахмед Нафеаайеш (ирак), Скоба А. Н.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Software implementation of models of optimal allocation of information resources

This article describes the stages of implementing the program to solve the task of calculating the average response time of a distributed information processing system to user requests and an algorithm for the optimal distribution of information relations over the nodes of a distributed information processing system implemented on the basis of a file server architecture and a two-tier client server architecture, with and without locks. The procedure for constructing the initial data for modeling is described: the elements of the matrix of the initial distribution of information resources (relations) over the nodes of the distributed information processing system, the elements of the matrix of information interrelation between the requests of users of the distributed information processing system and the information resources themselves, the elements of the matrix of probabilities for generating queries by users. A procedure has been developed and programmed to significantly simplify the calculation of the normalizing constant, and accordingly the average response time of the system to user requests. The results of numerical experiments are presented

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

Программная реализация моделей оптимального распределения

информационных ресурсов

В. К. Михайлов, Айеш Ахмед НафеаАйеш (Ирак), А. Н. Скоба Южно-Российский государственный политехнический университет (НПИ) им.

М. И. Платова, Новочеркасск

Аннотация: В данной статье описаны этапы программной реализации задачи вычисления среднего времени реакции распределённой системы обработки информации (СОИ) на запросы пользователей и алгоритма оптимального распределения информационных отношений по узлам распределённой СОИ, реализованной на базе архитектуры «файл-сервер» и двухуровневой архитектуры «клиент-сервер» с учетом и без учета влияния блокировок. Описана процедура конструирования исходных данных для моделирования: элементов матрицы начального распределения информационных ресурсов (отношений) по узлам распределённой СОИ, элементов матрицы информационной взаимосвязи запросов пользователей распределённой СОИ и самих информационных ресурсов, элементов матрицы вероятностей формирования пользователями информационных запросов. Разработана и программно реализована процедура, позволяющая существенно упростить вычисление нормализующей константы, а соответственно, и среднего времени реакции системы на запросы пользователей. Приведены результаты численных экспериментов. Ключевые слова: распределённая система обработки информации, архитектура «файл-сервер», двухуровневая архитектура «клиент-сервер», нелинейная комбинаторная оптимизация, генератор равновероятного выбора, метод Жордана-Гаусса, нормализующая констата, среднее время реакции системы, блокировка отношения.

Ранее, в работах [1-3], были представлены разработанные авторами математические модели функционирования распределенных систем обработки информации (СОИ) на базе архитектуры «файл-сервер» и двухуровневой архитектуры «клиент-сервер» без учета и с учетом влияния блокировок для решения задач оптимального распределения информационных ресурсов.

В качестве исходных данных для моделирования были выбраны: множество узлов сети - и={и],.,из,.,ип}; множество пользователей -Л={Л],...,Л5,...,Лп}; множество отношений - К={К],...,К]-,...,КС}}; множество интенсивностей формирования запросов - А=(Х],...,Х3,...,Хп}; множество запросов на чтение - 0={0],.--,0ь.--,0д}; множество объёмов отношений -У={У],.,У],.,Уа}; скорость считывания в узлах - УУ={УУ],..., УУ3,..., УУп};

и

скорость записи в узлах - ¥В={¥В1,...,¥В<1,...,¥Вп}; скорость передачи данных по каналу связи - в; постоянная задержка при передаче данных по каналу связи - в0; постоянная задержка при обработке в узле - а0; производительность процессора П2-го узла - Ри2, (2 = 1,п); матрица вероятностей формирования запросов пользователями -

I

А&

|, (я = 1, п, / = 1, д), где элемент /з/ представляет собой

вероятность того, что я-й пользователь сформировал 1-й запрос; матрица

объёмов считываемой информации В = Ь&Я = Ьу , (/ = 1, д, у = 1, 1), где Ь у-

объём считываемой информации по 1-му запросу на чтение из у-го

отношения; 8(В) = ||^(ьед ) = 8^|, (/ = 1, д, у = 1, 1), где

[1, если / - й запрос обращается к у - му отношению, 8Г = 1

1 [0, такого отношения нет,

1 _

причём ^8у = 1,/ = 1, д; матрица распределения отношений по узлам

1=1

распределённой

СОИ-

X =

х

ЯЛк

X

,(7 = 1,1, к = 1, п)

где

х1к = 1

1, если Я■ е ик,

0 - в противном случае,

п _

причём ^ х]к = 1, у = 1,1.

к=1

В общем виде задача оптимального распределения информационных

ресурсов по критерию минимума среднего времени реакции системы на

запросы пользователей была сведена к задаче [4]:

Т = Т(и, Я, X, Л, V, Q, ¥¥, УИ, в, Ри, В) ^ тт^ при ограничении

У"

¿—¡к=1

(1)

Ху^ =1, ] = 1, <1.

Как показал проведенный анализ, задача (1) является задачей нелинейной комбинаторной оптимизации с булевыми переменными. Ввиду того, что функция Т имеет сложный вид, а так же, ввиду отсутствия в настоящее время алгоритмов решения такого класса задач (кроме как метод полного перебора) [5], для решения задачи (1) был применен разработанный авторами эвристический алгоритм, подробное описание которого представлено в работе [4].

Таким образом, программная реализация задачи (1) включала в себя следующие этапы: процесс конструирования исходных данных; конструирование элементов матриц переходных вероятностей ЦР^(г)У, где (/, к = 1,2 п + 1; г = 1, п); процесс вычисления интенсивностей обслуживания в узлах сети , (б = 1,2п+1, г = 1 ,п); решение систем

2 п+1 ___

линейных алгебраических уравнений вида егг = ^ еР (г), я = 1,2п +1, г = 1, п ;

1=1

вычисление величины Т; реализацию эвристического алгоритма.

В процессе формирования исходных данных, было необходимо сформировать матрицу начального распределения информационных отношений по узлам распределённой СОИ - X = \\х]к ||,где(/ = 1, й; к = 1 ,п); матрицу 6(В) = \\S(bQlRj)|| = \\бц\\, где (/ = 1, с?; I = 1, (?), описывающую информационную связь между запросами и отношениями; матрицу F = У/^сЛ = \\fsi\l, где (5 = 1 ,п; I = - вероятностей формирования

запросов пользователями.

Конструирование элементов данных матриц было проведено с использованием программно реализованного «генератора равновероятного выбора», работающего по следующему алгоритму. Задаются числа: п (число узлов распределенной СОИ), q (число информационных запросов), й (количество информационных отношений, подлежащих распределению по узлам распределённой СОИ). Далее, интервал (0,1) разбивается на п

и

подинтервалов, равной длины, при этом, каждому подинтервалу будет соответствовать конкретный узел распределенной СОИ, запрос или информационный фрагмент. С помощью стандартных процедур, генерируются случайные числа, равномерно распределенные на интервале (0,1). Очередное случайное число представляется в виде: {1 = где (С)-

операция определения дробной части от произведения чисел А е [1111110; 4444445] и {0 = 0,19091994. Определяется номер подинтервала, в который попадает полученное число ^, которые и определяют соответствующие элементы матриц X, 6(В), F. После этого, генерируется следующее случайное число = (^1) и т.д. В общем случае

Ь = {^У-1}.

Расчет элементов матриц переходных вероятностей (5)||,(/,к =

1,27- + 1,5 = 1,71) и интенсивностей обслуживания в узлах сети , (5 =

1,2п + 1, г = 1,7-) был произведён по формулам, приведенным в работах [13]. Система линейных алгебраических уравнений вида

2п+1 ---

ег = ^ е]ГР]6- (г), £ = 1,2« +1, г = 1, п была решена методом Жордана-Гаусса,

1=1

что позволило определить точное значение всех переменных.

Как было показано в работах [6-10], расчёт величины Т сводится по существу к расчёту нормализующей константы 0(М1,^,Ып), для вычисление которой был использован рекуррентный метод Бузена [11], который сводит расчёт нормализующей константы к итерационной процедуре вида:

^ («)= О^ (П)+±хтгОт (п - 1г), (2)

г=1

где п = (п1,...,пг),п{ = 0,1;хтг = ,(т = 1,2« +1;г = 1,«). Предполагается также, что

№тг

От (п)= 1, если все п1 = 0, ( = 1, п) и От (п - 1г )= 0, если хотя бы одна из координат вектора п - 1г < 0. Значение нормализующей константы

и

G(Ni,...,Nn) получается по формуле (2) при m = 2п + 1 и n = (N1,...,Nn), где Nt = 1,(i = 1,n).Используемая прцедура расчёта величины G(Ni,...,Nn) имеет трудоёмкость порядка ~0(тп22п ). Авторами была разработана и программно реализована оригинальная процедура вычисления величины Gm(fi), связанная с переходом к представлению векторов п и п—1г в десятичной системе счисления, благодаря чему отпала необходимость, при выполнении операции поиска значений Gm-1(n) и Gm (п-1г) в массиве, сравнивать эти вектора до достижения соответствия между их разрядами. Предложенная процедура свелась к стандартному обращению к элементу массива по его индексу. В связи с этим произошло снижение трудоёмкости до ~0(т2п), и как следствие, снижение общего времени работы алгоритма нахождения нормализующей константы. Так, например, для n=20 и d=30, q=40 нормализующая константа G = 2.79 5 42 * 1044 была найдена за t « 180 секунд, а при поиске значений в массиве по их векторам - процедура вычисления могла занимать несколько десятков часов.

Программная реализация задачи (1) была проведена на языке С#, платформе .NET Framework 4.6.1, и компьютере на базе процессора фирмы Intel, с тактовой частотой 1,8 ГГц, объемом оперативной памяти 8 ГБ, при численных значениях исходных данных, приведённых в работе [4].

С использованием разработанного программного продукта был проведён ряд численных экспериментов, результаты которых могут быть использованы разработчиками при выборе рациональной организации вычислительного процесса на базе распределённой СОИ.

На рисунках 1-2 приведены графики зависимости Т от размерности решаемых задач оптимального распределения информационных отношений

по узлам распределённой СОИ - щ = (n х q х d), i = 1,(3, где щ =

И Инженерный вестник Дона, №2 (2018) ivdon.ru/ru/magazine/arcliive/n2y2018/4888

1,«

2,16

1,ВЯ

1,1?

2,16

,37

(5 х 10 х 10), п- = (7 х 30 х 20), Щ = (9 х 50 х 30), т-- = (11 х 70 х 40), = (13 х 90 х 50), 7— = (15 х 100 х 60).

(сек) д лГ(сек)

0,6-е,4-0,2г> 0

3

2,521,5 10Л в

,60

м

п1 п2 пЗ п4 п5 лб

П = (ГС X <7 X С?)

а)

—>

Г1 п2 ИЗ п4 П5 Пб

п = (nxq Х(1)

б)

Рис.1. Зависимость Т от размерности решаемых задач для архитектуры «файл-сервер»: а - с учетом блокировок; б - без учета блокировок

0,140,12 0,10,080,06 0,04 0,02 0

А т (сек)

,05

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

,06

04

п1 п2 пЗ п4 п5 пб

п = (п X <? X <£)

а)

0,1 ц

0,08 0,96 0,04

0,020

А т (сек)

м

04

ее

,05

п1 п2 пЗ п4 п5 пб

п = (тг X <7 X с/)

б)

Рис. 2. Зависимость Т от размерности решаемых задач для двухуровневой архитектуры «клиент-сервер»: а - с учетом блокировок; б - без учета

блокировок

Вид графиков показывает, что учёт блокировок для распределенной СОИ, реализованных на базе двухуровневой архитектуры «клиент-сервер», при заданных параметрах системы, не оказывает существенного влияния на реактивность системы (рис. 2), однако, при использовании архитектуры «файл-сервер», влияние блокировок на величину Т становится более

и

значительным (рис. 1) и её необходимо учитывать при проектировании реальных распределенных СОИ.

На рисунках 3-4 представлены графики зависимости величины Т от скорости считывания в узлах ¥¥ (КБ/сек) при различных размерностях задач 71[ и при фиксированной скорости передачи данных по каналу 0=5000 (КБ/сек).

а Т (сек)

_ ч-н- —

.......

ем 33 7В4 № Ев 933 9вС ев 1вв 333

21,51> 0

Т (сек)

1 I I 1

-1=5

п=7 1=9

4=10^=10; Ч=ЭМ=20; .. _;о=50:с1=30; п=11:ч=70:(МО; п=13;ч=Э0;с1=Э0; п=15;с=1С|0;<)=60;

Б5(ЗвВ тзевв

УУ (КБ/сек)

твеве звеее гаеев 1®ззвэ

бэяее 75 вн 35333 ЭбввЯ

УУ (КБ/сек)

а) б) Рис.3. Зависимость Т от скорости считывания в узлах для архитектуры «файл-сервер»: а - с учетом блокировок; б - без учета блокировок

^ д7£ек)

1А т (сек)

п=5Ч=10^=10; п=7;ч=30;сН20: п=9;ч=Э0;с1=30; ;и=70;(1=4С;

5:41=100^=60:

имод 70000 веевв июни азеззз

взеве 75333 В5330 9ЯИв

езззз тмев везвз взззз 1 авосе

55333 75333 35333 95333

УУ (КБ/сек)

УУ (КБ/сек)

а) б)

Рис.4. Зависимость Т от скорости считывания в узлах для двухуровневой архитектуры «клиент-сервер»: а - с учетом блокировок; б - без учета

блокировок

Анализ графиков данных зависимостей показывает, что использование двухуровневой архитектуры «клиент-сервер» приводит к значительно более быстрому уменьшению величины Т при увеличении скорости считывания в

N Инженерный вестник Дона, №2 (2018) ivdon.ru/ru/magazine/arcliive/n2y2018/4888

узлах ¥¥ 6 [6 * 104; 1 * 105] (КБ/сек) (рис. 4), как в моделях с учетом влияния блокировок, так и без, по сравнению с архитектурой «файл-сервер» (рис. 3), которая демонстрирует на графиках практически статическую зависимость Т от скорости считывания УУ в том же диапазоне её изменения.

На рисунках 5-6 представлены графики зависимости величины Т от скорости передачи данных по каналу в при различных размерностях задач щ.

5 ее

А Т (сек)

400-

3 00-

2 ее

100-

- п=5:ч =10 (1=10 п=7:ч=30^=20 п=Э;ч=50;()=30; п=11:ч=70;сМ0; п=13;ч=90;(1=Э0; п=15;ч=100;()=60;

I_I

25е^

200-

А Т (сек)

150

100-

50-

- п=5;ч=10;(1=10; п=7:Ч=30^=20: п=Э;ч=50;()=30; п=11:ч=70;сЫ0; п=13;ч=ЭВД*50; п=15:д=100:<]=б0:

7000 9000

в (КБ/сек)

1000 3000 5000 7000 9000 ~ 1000 3000 5000

в (КБ/сек)

а) б)

Рис.5. Зависимость Т от скорости передачи данных по каналу в для архитектуры «файл-сервер»: а - с учетом блокировок; б - без учета

блокировок

0,2^ 0,150,10,05-

дТ (сек)

0

■ п=б;с|=10^=10; п=7;ч=30^=20; п=Э;с|=50;с1=30; п=11;ч=Л1?М0; п=13;ч=90;{1=50; п=15;ч=100^=е0;

А т (сек)

1еее 3000 5000 7000 9000

в (КБ/сек)

а)

1000 3000 5000 7000 9000

6 (КБ/сек)

б)

Рис.6. Зависимость Т от скорости передачи данных по каналу в для двухуровневой архитектуры «клиент-сервер»: а - с учетом блокировок; б -

без учета блокировок

и

Анализ графиков указанных зависимостей показал, что наиболее сильное изменение (уменьшение) величины Т для распределенных СОИ, реализованных на базе архитектуры «файл-сервер» происходит при в 6 [1000; 3000] КБ/сек, как с учетом, так и без учета влияния блокировок (рис. 5), а для распределенных СОИ, реализованных на базе двухуровневой архитектуры «клиент-сервер» - при в 6 [1000; 2000] КБ/сек. При этом, дальнейшее увеличение величины в (исследовался диапазон изменения в 6 [1000; 10000] КБ/сек) не приводит к значительным изменениям величины Т.

На рисунках 7-8 представлены графики зависимости величины Т от производительности узлов РП распределенной СОИ для различных размерностей задач.

А Г С^к) . „а Т (сек)

2,5' 21,510,50

+

1,7*10* 2,1*10' 2.4*10' 2.8*10* 3,2*10*

Ри (операций в сек)

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

а)

1А' 1,210,8 0,6 0,40,2> 0

---

п=5;ц=10;(1=10;

п=9;ч=ЕО;()=30; п=11;иНШМ0:

п=15;ч=100^=60;

1,7*10* 2,1*12.4*10' 2,8*10* 3,2*10''

Ри (операций в сек) б)

Рис.7. Зависимость Т от производительности узлов РП для архитектуры «файл-сервер»: а - с учетом блокировок; б - без учета блокировок

Рис.8. Зависимость Г от производительности узлов PU для двухуровневой архитектуры «клиент-сервер»: а - с учетом блокировок; б - без учета

блокировок

Анализ графиков данных зависимостей показал, что изменение величины PU 6 [1,7 * 109;3,5 * 109] операций в секунду практически не оказывает влияния на динамику изменения величины Г для различных размерностей задач, как для архитектуры «файл-сервер», так и для двухуровневой архитектуры «клиент-сервер». Данный факт можно объяснить достаточно «значительными» значениями величины PU, по сравнению с остальными значениями параметров распределенной СОИ: скорости передачи данных по каналу в; скорости считывания в узлах VV; скорости записи в узлах VD.

Литература

1. Скоба А.Н., Состина Е.В. Математическая модель оптимального размещения распределённой базы данных по узлам ЛВС на базе файл-серверной архитектуры. // Инженерный вестник Дона. 2015. №2. URL: ivdon.ru/ru/magazine/archive/n2y2015/2881.

2. Скоба А.Н., Логанчук М.Л. Математическая модель функционирования распределённой информационной системы на базе архитектуры «файл-сервер» с учётом влияния блокировок // Инженерный вестник Дона. 2015. №3. URL: ivdon.ru/ru/magazine/archive/n3y2015/3276.

3. Скоба А.Н., Состина Е.В. Математическая модель оптимального размещения распределенной базы данных по узлам ЛВС на базе двухуровневой клиент-серверной архитектуры. // Инженерный вестник Дона. 2015. № 2. URL: ivdon.ru/ru/ magazine/archive/n2y2015/2882.

4. Скоба А.Н., Айеш Ахмед Нафеа Айеш (Ирак), Михайлов В.К. Эвристический алгоритм решения задачи оптимального размещения

информационных ресурсов // Инженерный вестник Дона. 2018. №1. URL: ivdon.ru/ru/magazine/archive/n1y2018/4744

5. Клейнрок Л. Вычислительные системы с очередями : Пер. с англ.-М.Мир,1979.-600с.

6. Вишневский В.М. Теоретические основы проектирования компьютерных сетей.- М.: Техносфера, 2003.- 512 с.

7. Жожикашвили В.А., Вишневский В.М. Сети массового обслуживания. Теория и применение к сетям ЭВМ.-М. : Радио и связь, 1988.-192с.

8. Герасимов А.И. Теория и практическое применение стохастических сетей.-М.: Радио и связь.,1994.-175с.

9. AntunesC.H. etal. AMultiple Objective Routing Algorithm for Integrated Communication Network // Proc. ITC-16.-1999.V.3b.-PP.1291-1300.

10.Chakka R., Harrison P.G. A Markov modulated multi-server queue with negative customers - The MM CPP/GE/c/LG-queue // ActaInformatika/-2001.-v.37.-pp.785-799.

11.Круглый З.Л. Алгоритмы расчёта моделей структур вычислительных систем с различными классами заданий // Управляющие системы и машины. 1989. №4. С.22-24.

References

1. SkobaA.N., SostinaE.V. Inzenernyj vestnik Dona (Rus), 2015, № 2. URL: ivdon.ru/ru/magazine/archive/n2y2015/2881.

2. Skoba A.N., Loganchuk M.L. Inzenernyj vestnik Dona (Rus), 2015. №3. URL: ivdon.ru/ru/magazine/archive/n3y2015/3276.

3. Skoba A.N., Sostina E.V. Inzenernyj vestnik Dona (Rus), 2015. № 2. URL: ivdon.ru/ru/ magazine/archive/n2y2015/2882.

4. Skoba A.N., Ayyesh Akhmed Nafea Ayyesh (Iraq), Mikhaylov V.K. Inzenernyjvestnik Dona (Rus), 2018. №1. URL: ivdon.ru/ru/magazine/archive/n1y2018/4744.

5. Kleynrok L. Vychislitel'nye sistemy s ocheredyami [Queueing Systems]: Per. s angl.M.Mir, 1979. 600p.

6. Vishnevskiy V.M. Teoreticheskie osnovy proektirovaniya komp'yuternykh setey [Theoretical foundations of computer network design]. M.:Tekhnosfera, 2003.512p.

7. Zhozhikashvili V.A., Vishnevskiy V.M. Seti massovogo obsluzhivaniya. Teoriya i primenenie k setyam EVM [Queueing networks. Theory and its network application].M.: Radio isvyaz', 1988.192p.

8. Gerasimov A.I. Teoriya i prakticheskoe primenenie stokhasticheskikh setey [Theory and practical application of stochasticnetworks].M.: Radio isvyaz',1994.175p.

9. Antunes C. H. et al. A Multiple Objective Routine Algorithm for Integrated Communication Network. Proc ITC-16. 1999. V. 3b. pp. 1291-1300.

10. Chakka R., Harrison P. G. A Markov modulated multi-server queue with negative customers - The MM CPP/GE/c/L G-queue. Actalnformatica, 2001, V.37.pp.785-799.

11. Kruglyj Z.L. Upravljajushhie sistemy i mashiny. 1980. №4. pp.22-24.

i Надоели баннеры? Вы всегда можете отключить рекламу.