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

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

CC BY
677
175
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
КЭШ-ПАМЯТЬ / ОПЕРАТИВНАЯ ПАМЯТЬ / КОГЕРЕНТНОСТЬ КЭШ-ПАМЯТИ / ПРОТОКОЛЫ НАБЛЮДЕНИЯ / МОДЕЛИРОВАНИЕ / CACHE / RANDOM ACCESS MEMORY / CACHE COHERENCY / SNOOPY PROTOCOL / MODELING

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Орлов Сергей Павлович, Ефимушкина Наталья Владимировна

Рассмотрены модели и методика исследования различных структур кэш-памяти в компьютерных архитектурах. Приведена сетевая модель Петри для протоколов наблюдения для когерентной кэш-памяти в многоуровневой памяти.

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

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Орлов Сергей Павлович, Ефимушкина Наталья Владимировна

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

modeling of MULTILEVEL MEMORY IN the study of the architecture of Computer Systems

The models and methodology of the study of various structures of the cache in the computer architectures are considered. The Petri network model of snoopy protocols for the coherence caches in a multilevel memory is given.

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

УДК 004.7+ 681.324 ББК 32.973.2я7

С.П.Орлов, Н.В. Ефимушкина

МОДЕЛИРОВАНИЕ МНОГОУРОВНЕВОЙ ПАМЯТИ ПРИ ИЗУЧЕНИИ АРХИТЕКТУР ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ

S.P. Orlov, N. V. Efimuchkina

MODELING OF MULTILEVEL MEMORY IN THE STUDY OF THE ARCHITECTURE OF COMPUTER SYSTEMS

Ключевые слова: кэш-память, оперативная память, когерентность кэш-памяти, протоколы наблюдения, моделирование

Key words: cache, random access memory, cache coherency, snoopy protocol, modeling

Аннотация

Рассмотрены модели и методика исследования различных структур кэш-памяти в компьютерных архитектурах. Приведена сетевая модель Петри для протоколов наблюдения для когерентной кэш-памяти в многоуровневой памяти.

Abstract

The models and methodology of the study of various structures of the cache in the computer architectures are considered. The Petri network model of snoopy protocols for the coherence caches in a multilevel memory is given.

Введение.

Федеральный стандарт третьего поколения по направлению 230100 «Информатика и вычислительная техника» предусматривает глубокое изучение принципов устройства ЭВМ и вычислительных систем. Особенно это относится к профилю «Вычислительные машины, комплексы, системы и сети», где подробно рассматриваются архитектурные принципы построения многопроцессорных систем.

Один из важнейших вопросов - организация многоуровневой памяти в компьютере, включая кэш-память и оперативную память. Эффективная работа всей системы зависит от типа используемой кэш-памяти, соотношения объемов памяти на всех уровнях, методов обеспечения достоверности разделяемых данных в памятях процессоров, способов замещения строк данных в памяти и многих других факторов. В силу сложности микроэлектронного исполнения современных процессоров невозможно построить лабораторные макеты для изучения памяти, которые бы адекватно отображали все свойства уровней памяти и процессы, происходящие в них при считывании, записи и обмене данными.

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

Теоретические вопросы организации многоуровневой памяти применительно к традиционным архитектурам компьютеров рассмотрены в научных и учебных изданиях [1,2,3,4], в учебных пособиях [5,6] описаны основные типы кэш-памяти.

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

1. Исследование типовых структур кэш-памяти.

Изучается двухуровневая систем , состоящая из оперативной памяти (ОП) и кэшпамяти первого уровня, непосредственно взаимодействующей с ядром процессора.

Имитационная модель воспроизводит процесс выполнения команд обращения к памяти (чтения и записи). Для этого в программе реализованы модули генерации случайной последовательности команд, случайный выбор операции, модуль алгоритмов замещения строк. Поддерживается моделирование основных типов кэш-памяти. Основное внимание уделено визуализации процессов взаимодействия устройств подсистемы. На рис. 1 представлен вид основного окна имитационной модели. Имеется возможность сравнивать эффективность алгоритмов замещения блоков в различных типах кэш-памяти [7].

Исходными данными для моделирования являются:

• количество команд обращения к памяти;

• доля команд чтения в последовательности;

• доля команд записи в общей смеси команд;

• объем оперативной памяти; объем кэш-памяти;

• способ организации кэш-памяти:

о полностью ассоциативная;

о множественно-ассоциативная;

о с прямым отображением;

• для множественно-ассоциативной памяти дополнительно задается

количество подмножеств в кэше;

• метод обеспечения когерентности памяти;

• метод замещения строк в кэш-памяти;

• времена чтения и записи в кэш-память;

• времена чтения и записи в оперативную память.

Объем памяти измеряется в строках, время измеряется в машинных тактах. Результаты моделирования содержат: количество выполненных команд; количество выполненных тактов; среднее время выполнения команды; количество промахов при обращении к кэш-памяти.

Рисунок 1 - Интерфейс имитационной модели системы «ОП -кэш-память» Закладка Параметры (рис. 2) позволяет выбрать вид кэш-памяти: полностью ассоциативная, множественно-ассоциативная или с прямым отображением. При выборе множественно-ассоциативной памяти можно задать количество подмножеств в кэше из следующего ряда: 2, 4, 8. Для множественно-ассоциативной памяти или с прямым отображением в модели кэша поле тега дополняется полем индекса. На этой вкладке

можно также выбрать метод замещения строк в кэш-памяти: LRU, FIFO, LFU или произвольный. В модели имитируется выполнение циклических участков программ и анализируется количество кэш-промахов для этих случаев.

Параметры

1

Команды | Взаимодействие ] Другие

Кэш

Объём памяти | Циклы

Вид кэш памяти

(9) Полностью ассоциативная кэш память Кэш память с прямым отображением Множественно-ассоциативная кэш память

Кол-во подмножеств: \2 ^

Методы замещения строк

LRU © LFU

О FIFO

. ■■ Random

Рисунок 2 - Задание режимов и параметров имитационной модели кэш-памяти

Возможность автоматического и потактового выполнения операций в модели позволяет студентам изучить процесс в подробностях и обратить внимание на взаимодействие между устройствами памяти.

2. Исследование типовых структур памяти многопроцессорных систем.

Программа имитационного моделирования позволяет исследовать архитектуру многопроцессорной вычислительной системы типа иМА SMP с шинной организацией [8], содержащую основную (оперативную) память, локальные и кэш-памяти. Интерфейс модели показан на рис. 3. В модели представлены шины адреса микропроцессоров и системная шина. Имитационная модель отображает выполнение обращения к памяти. Исходными данными для моделирования являются:

• количество процессоров в системе;

• количество команд обращения к памяти;

• доля команд обращения к памяти в общей смеси;

• доля команд чтения в последовательности;

• доля команд записи в общей смеси;

• конфигурация многопроцессорного вычислительного комплекса;

• объем оперативной памяти; объем кэш-памяти; объем локальной памяти;

• времена чтения и записи в оперативную память;

• времена чтения и записи в кэш-память;

• времена чтения и записи в локальную память.

Для конфигурации с локальными устройствами памяти задаются вероятности обращения к ним и основной памяти.

Результаты моделирования содержат: количество выполненных команд;

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

Файл Параметры Уел. обознач.

ВП - Вы полнен но команд

КП - Кэш промахов ПЛПЛ - Промахов Локальной памяти

С - Состояние М - Mod if iced Е - Exclusive S - Shared

Операти вная

Строка

Строка О

Строка 1 Строка 2

Строка 3

Строка 4

Строка 5

Строка 6 Строка 7

Строка 8

Строка 9

Строка

Строка

Строка

Строка

Строка

|=

ч

Строка С

Строка ... Е

Строка ... Е

Строка ... S

Строка ... S —

Строка ... Е

Строка ... Е

Строка ... S

Строка ... S ▼

ft

Локальная память

Строка С -

Строка ... S

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

Строка ... S

Строка ... S ЦІ

Строка ... S

Строка ... S

Строка ... S

Строка ... S

Строка ... S

Строка ... Е

■Е-

ПЛП: О ВК: о

ЇЇ

Шина адреса Шина адреса Шина яппвт Шина адреса

1 0 1 0 1 о 1 0

Строка С *

Строка ... Е

Строка ... Е

Строка ... S

Строка ... S

Строка ... S

Строка ... S

Строка ... S

Строка ... S ▼

Локальная память

Строка С -

Строка ... Е

Строка ... Е г~

Строка ... Е LJ

Строка ... Е

Строка ... Е

Строка ... Е

Строка ... Е

Строка ... Е

Строка ... S

-S-

ПЛП: О ВК: О

її

Строка С -

Строка ... Е

Строка ... Е

Строка ... Е

Строка ... Е =

Строка ... Е

Строка ... Е

Строка ... Е _1

Строка ... Е

-IT-

Локальная память

Строка С -

Строка ... Е

Строка ... Е =

Строка ... Е UI

Строка ... Е

Строка ... Е

Строка ... Е

Строка ... Е

Строка ... Е

Строка ... Е

F

ПЛП: О ВК: О

ЇЇ

Строка С -

Строка ... Е

Строка ... Е

Строка ... Е

Строка ... Е =

Строка ... S

Строка ... S

Строка ... S _

Строка ... S

Локальная память

Строка С -

Строка ... S

Строка ... S =

Строка ... S *

Строка ... S

Строка ... S

Строка ... S

Строка ... S

Строка ... S

Строка ... Е

Е-

ПЛП: □ ВК: О

ЇЇ

Результаты

Выполненно тактов О Средняя загрузка шины

Сред апигЬ ВК О Всего ВК о

Среднее время выполнение команды МаЫ ^

Режим работы

[ Один такт [ Автоматический J [ «-1 1 — 1

Рисунок 3 - Интерфейс имитационной модели многопроцессорной системы

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

3. Исследование эксклюзивной и инклюзивной кэш-памяти.

В многоядерных процессорах структура кэш-памяти на кристалле содержит три уровня: L1, L2 и L3. Для обеспечения когерентности используются разные способы организации взаимодействия памятей различных уровней [9] .

1. Эксклюзивная организация.

Данные размещаются только на одном уровне и не дублируются на других уровнях. При первоначальной загрузке блок данных поступает в кэш L1, минуя кэш L2. При замещении этот блок из кэша L1 переписывается в кэш L2. При повторном обращении процессора к этому блоку данных он удаляется из кэша L2 и поступает в кэш L1. Аналогично взаимодействуют кэш-памяти L2 и L3.

Преимущество эксклюзивного кэша в том, что общий размер кэшируемой информации равен суммарному объёму кэшей всех уровней. Это позволяет более эффективно использовать объем кэш-памяти. В процессорах АМО Phenom используется эксклюзивный кэш L3 [10].

2. Инклюзивная организация.

Нижние уровни кэш-памяти гарантированно содержат данные, присутствующие в верхних уровнях кэш-памяти (т.е. расположенных ближе к процессорному ядру). Таким образом, при инклюзивной организации блоки данных дублируются на всех уровнях.

В процессорах 1Пе1 Соге17/15 кэш L2 построен инклюзивно по отношению к кэшу L3 [11]. В последнем случае упрощается проверка когерентности: если данных в кэше L3 нет, то их нет и в кэшах L1 и L2. Если блок данных присутствует в кэше L3, то к нему привязаны четыре бита, показывающие в кэше какого ядра дублируется этот блок.

В лабораторной работе исследуется архитектура многопроцессорной вычислительной системы иМА SMP с шинной организацией, содержащая трехуровневую кэш-память и оперативную память.

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

Исходные данные для моделирования:

• количество процессоров в системе;

• общее количество команд обращения к памяти;

• доля команд чтения и записи в общей смеси;

• конфигурация многопроцессорного вычислительного комплекса: о инклюзивная организация трехуровневой кэш-памяти;

о эксклюзивная организация трехуровневой кэш-памяти.

• объем оперативной памяти и Ь1, Ь2, ЬЗ кэш-памяти в строках;

• времена чтения и записи в оперативную память и Ь1, Ь2, Ь3 кэш-память,

измеренные в тактах.

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

Модель процессора

Г енератор случайных чисел

Core 0

Core 1

L1

L2

L3

Core 2

Core 3

ОП

Рисунок 4 - Структурная схема моделирующей системы

Моделирование начинается с задания пользователем исходных данных. После этого происходит запуск программы. При моделировании последовательно выполняется процедура Так! , до тех пор, пока все команды имитируемой программы не будут обработаны.

Результаты моделирования представляются в виде:

• количества выполненных команд и общего числа тактов;

• среднего времени выполнения команды;

• количества кэш-промахов в Ь1, Ь2, ЬЗ кэш-памяти;

• количества кэш-попаданий в Ь1, Ь2, ЬЗ кэш-памяти;

• среднего количества выполненных команд в период времени.

5. Исследование протокола MESI наблюдения кэш-памяти.

Для обеспечения когерентности памяти в многоядерных и мультипроцессорных системах используются аппаратные механизмы, позволяющие решить эту проблему. Такие механизмы называются протоколами когерентности кэш-памяти [1]. Эти протоколы призваны гарантировать, что любое считывание элемента данных возвращает значение,

записанное последним в строку памяти. Наиболее простыми и распространенными являются протоколы наблюдения (snooping), при этом каждый кэш, который содержит копию данных некоторого блока физической памяти, имеет также соответствующую копию служебной информации о состоянии. Обычно кэш-памяти расположены на общей шине, и контроллеры всех кэшей наблюдают за шиной (просматривают ее), чтобы определять, какие обращения по адресам в пределах этого блока происходят со стороны других микропроцессоров.

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

Рассмотрим протокол MESI - один из наиболее распространенных протоколов, обеспечивающих согласованную работу кэш-памяти нескольких микропроцессоров и основной памяти в микропроцессорных системах [8].

Этот протокол использует 4 признака состояния строки кэш-памяти микропроцессора:

• Статус М - "Модифицированная" - автоматически присваивается кэш-строкам при их модификации.

• Статус Е - "Эксклюзивная" - автоматически присваивается кэш-строкам при их загрузке из кэша более высокой иерархии или основной оперативной памяти. Модификация строки с атрибутом Exclusive влечет его автоматическую смену на атрибут М.

• Статус S - "Разделяемая" - присваивается кэш-строкам, потенциально присутствующим в кэш-памяти других процессоров.

• Статус I - "Недействительная" - строка отсутствует в кэше и должна быть загружена из кэш-памяти более высокой иерархии или же основной памяти.

Протоколы наблюдения описываются автоматными моделями, однако такое представление неудобно при исследовании динамики процессов обеспечения когерентности.

Для исследования протокола нами предложена модель на основе сети Петри [12,13,14], приведенная на рис. 5, в которой переходы зависят от статуса строк и управляющих сигналов С1, С2 и С3.

В таблице 1 показаны действия, соответствующие переходам сети Петри.

Позиция C1 имитирует запрос от процессора на чтение или запись из кэш-памяти. Позиция C2 - запрос от другого процессора на проверку строки в кэш-памяти без перевода в состояние! Позиция C3 - запрос от другого процессора на проверку строки в кэш-памяти с последующим объявлением ее недействительной (I).

На рис. 5 фишки находятся в позициях E и C2, что соответствует циклу проверки эксклюзивной строки без перевода ее в недействительную. В результате обнаруженная строка пересылается в кэш-память другого процессора и переводится в состояние S -разделяемая.

В основе лабораторной работы лежит моделирующая программа, которая реализует сеть Петри протокола MESI. Программа предназначена для составления сетей Петри и моделирования выполнения операций с памятью. Она позволяет нарисовать сеть Петри любой сложности и с помощью методов имитационного моделирования изучить выполнение сети в интерактивном режиме. Сеть, соответствующая протоколу MESI, должна обладать свойством безопасности, т.е. в каждый момент времени в любой позиции не должно быть более одной фишки [15]. Это свидетельствует об отсутствии конфликтов и очередей.

Таблица 1 - Обозначения переходов состояний строк кэш-памяти

R1: M ^ M - кэш-попадание при чтении W1: M ^ M - кэш-попадание при записи, отложенная запись S1: M ^ S - проверка находит модифицированную строку

E ^ E - кэш-попадание при чтении W2: E ^ M - кэш-попадание при записи, отложенная запись S2: M ^ I - проверка находит модифицированную строку и она объявляется недействительной

R3: S ^ S - - кэш-попадание при чтении W3: S ^ E - кэш-попадание при записи, строка переходит в «эксклюзивная», строки в других кэшах переводятся в «недействительная» S3: E ^ S - проверка находит эксклюзивную строку и пересылает ее в другие кэши

R4: I ^ E - кэш-промах, чтение из ОП и перевод в «эксклюзивная» W4: S ^ S - - кэш-попадание при записи, сквозная запись S4: E ^ I - проверка находит эксклюзивную строку и пересылает ее в другие кэши и она объявляется недействительной

R5: I ^ S - кэш-промах, чтение из ОП и перевод в «разделяемая» W5: I ^ I - кэш-промах, строка из ОП не загружается S5: S ^ S - статус строк не меняется в кэшах

R6: I ^ I - кэш-промах, данных нет и в ОП S6: S ^ I - проверка переводит разделяемую строку в недействительную

S7: I ^ I - статус строки не меняется

Рисунок 5 - Сеть Петри для протокола MESI

Сеть задается матрицами инцидентности позиций (рис. 6). Студент определяет режимы записи или чтения и устанавливает законы появления фишек в позициях M,E,S,I,C1,C2,C3, которые реализуются с помощью встроенного генератора случайных чисел. Выполнение имитационного моделирования происходит либо по тактам, что весьма наглядно, либо в автоматическом режиме. Программа формирует отчет о срабатывании переходов, безопасности сети, наличии очередей и конфликтов.

Разработанная моделирующая программа может быть использована для изучения и других протоколов наблюдения: MOESI, Synapse, Berkeley, Illinois и т.п. [1].

Сети Петри ш

Матрица входных позиций |; Матрица выходных позиций j|

Пер. 1 Пер. 2 Пер. 3 Пер. 4 Пер. 5 Пер. 6 Пер. 7 Пер. 8 Пер. 9

Поз. 1 0 0 0 1 0 0 0 0 0

Поз. 2 1 0 1 0 0 0 0 1 0

Поз. 3 0 0 0 0 1 0 1 0 0

Поз. 4 0 1 0 0 0 0 0 0 0

Поз. 5 0 0 0 1 0 1 0 0 0

Поз. 6 0 0 0 0 0 0 0 0 1

jjS Сети Петри НМ

Матрицу входных позиций |; Матрица выходных позиций ;|

Пер. 1 Пер. 2 Пер. 3 Пер. 4 Пер. 5 Пер. 6 Пер. 7 Пер. 8 Пер. 9

Поз. 1 0 0 0 1 0 0 0 0 0

Поз. 2 1 0 1 0 0 0 0 1 0

Поз. 3 0 0 0 0 1 0 1 0 0

Поз. 4 0 1 0 0 0 0 0 0 0

Поз. 5 0 0 0 1 0 1 0 0 0

Поз. 6 0 0 0 0 0 0 0 0 1

Рисунок 6 - Матрицы инцидентности для входных и выходных позиций сети Петри Заключение.

Описанные модели представляют интерес не только для преподавания дисциплин по организации ЭВМ и архитектуре вычислительных систем. Они могут успешно использоваться для научных исследований свойств многоуровневой памяти при проектировании вычислительных комплексов и компьютерных систем различного назначения.

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Орлов С.А. Организация ЭВМ и систем: учебник для вузов/ Б.Я. Цилькер, С.А. Орлов. - СПб.: Питер, 2004. - 586 с. - ISBN 5-94723-759-8.

2. Хорошевский, В.Г. Архитектура вычислительных систем: учеб.пособие для вузов/ В.Г. Хорошевский. - М: Изд-во МГТУ им. Н.Э.Баумана, 2005. - 512 с. - ISBN 57038-2654-3.

3. Мелехин, В.Ф. Вычислительные машины, системы и сети: учебник для вузов/В.Ф. Мелехин, Е.Г. Павловский. - М.: Издательский центр «Академия», 2007. - 560 с. - ISBN 978-5-7695-4485-9.

4. Поворознюк, А.И. Архитектура компьютеров. Архитектура микропроцессорного ядра и системных устройств: учеб.пособие/ А.И. Поворознюк. - Ч.1. - Харьков, Торнадо, 2004. - 355 с. - ISBN 966-635-542-6.

5. Ефимушкина, Н.В. Вычислительные системы и комплексы: учеб.пособие для вузов/ Н.В. Ефимушкина, С.П. Орлов. - М.: Машиностроение-1, 2006. - 268 с. - ISBN 594275-281-8.

6. Орлов, С.П. Организация компьютерных систем: учеб.пособие для вузов / С.П. Орлов, Н.В. Ефимушкина. - Самара: Самар. гос. техн. ун-т, 2011. - 188 с. - ISBN 9785-7964-1451-4.

7. Alasir Enterprises [Электронный ресурс]. - Болотов П. Принципы

работы кэш-памяти. — Режим доступа:

http://alasir.com/articles/cache principles/ index rus.html.

8. Таненбаум, Э. Архитектура компьютера: пер. с англ. / Э. Таненбаум.-Изд. 5-е.- СПб., 2010. - 848 с. ISBN 5-469-01274-3.

9. TheIndispensablePCHardwareBook [Электронный ресурс]. —Кэширование —

взаимодействие с высокоскоростной памятью. — Режим доступа: http://support.mdl.ru/PC COMPL/doc/IndespPC.Bok/chapt8/chapt8.html.

10. Асмаков,С.В. Железо 2010. КомпьютерПресс рекомендует/ С.В. Асмаков, С.А. Пахомов. — СПб, Питер, 2010.- 416 с. - ISBN 975-5-49807-625-6.

11. Соломенчук, В.Г. Железо ПК 2010/ В.Г. Соломенчук, П.В. Соломенчук. — СПб, БХВ-Петербург, 2010. — 448 с. - ISBN 978-5-9775-0515-4.

12. Питерсон, Дж. Теория сетей Петри и моделирование систем: пер. с англ. / Дж. Питерсон. - Москва: Мир, 1984г. - 264 с.

13. Орлов, С.П. Моделирование когерентности данных в кэш-памяти мультипроцессорных систем/ С.П.Орлов. — Трудымеждунар. научно-техн. конф. «Информационные, измерительные и управляющие системы», Самара, СамГТУ, 2010. — С.135-138.

14. Орлов, С.П.Методы имитационного моделирования многоуровневой памяти мультипроцессорных систем/ С.П.Орлов. — Труды 10—й всеросс. научно-практич. конф. «Компьютерные технологии в науке, практике и образовании», Самара, СамГТУ, 2011. -С. 76-78.

15. Orlov S.P. Application of Petri net model for computational process synchronization// Advances in Modeling & Analysis. Vol.14. №3.-AMSE PRESS.1993. —

Р.1-6.

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