Разделы презентаций


Менеджер транзакций

Содержание

Компоненты менеджера транзакцийМенеджер блокировок для конкурентного доступа.Менеджер восстановления.Буферный пул для хранения промежуточных состояний БД.Методы доступа для организации данных транзакций.

Слайды и текст этой презентации

Слайд 1Менеджер транзакций

Менеджер транзакций

Слайд 2Компоненты менеджера транзакций
Менеджер блокировок для конкурентного доступа.
Менеджер восстановления.
Буферный пул для

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

Компоненты менеджера транзакцийМенеджер блокировок для конкурентного доступа.Менеджер восстановления.Буферный пул для хранения промежуточных состояний БД.Методы доступа для организации

Слайд 3Менеджер блокировок
Две стратегии:
Блокировка
Восстановление

Менеджер блокировокДве стратегии:БлокировкаВосстановление

Слайд 4Механизмы управления согласованием в многопользовательской среде
Multi-Granular Locking scheme (сокращённо MGL,

также известна как LSCC) - схема гранулированных синхронизационных захватов;
Multi-Versioning Concurrency

Control (сокращённо MVCC) - многоверсионное управление параллелизмом;
Optimistic Concurrency Control (OCC) - управление оптимистичным параллелизмом.

Механизмы управления согласованием в многопользовательской средеMulti-Granular Locking scheme (сокращённо MGL, также известна как LSCC) - схема гранулированных

Слайд 5LSCC - схема гранулированных синхронизационных захватов
Одна строка – одна запись

=> эксклюзивная блокировка (W-lock) для защиты строк от таких операций записи

как INSERT, UPDATE или DELETE.
Одна строка – множественное чтение => совместно используемыtе блокировки (R-lock), которые могут быть предоставлены для операции чтения нескольким одновременным клиентам.

LSCC - схема гранулированных синхронизационных захватовОдна строка – одна запись => эксклюзивная блокировка (W-lock) для защиты строк

Слайд 7READ UNCOMMITTED
Уровень изолированности READ UNCOMMITTED не требует R-блокировки для защиты

от чтения, но в случае других уровней изолированности, для чтения

необходима R-блокировка, которая будет предоставлена, если никакая другая транзакция не имеет W-блокировки на строке (строках).
Если транзакция READ UNCOMMITTED меняет данные, то ставится W-блокировка
READ UNCOMMITTEDУровень изолированности READ UNCOMMITTED не требует R-блокировки для защиты от чтения, но в случае других уровней

Слайд 8Снятие блокировок
В случае уровня изолированности Read Committed, R-блокировка строки будет

снята сразу после считывания строки
При Repeatable Read и SERIALIZABLE R-блокировки

будут сохранены до конца транзакции.
Все блокировки транзакции будут сняты в конце транзакции независимо от того, как была завершена транзакция.

Снятие блокировокВ случае уровня изолированности Read Committed, R-блокировка строки будет снята сразу после считывания строкиПри Repeatable Read

Слайд 9Блокировка таблиц
В некоторых продуктах СУБД диалект SQL включает явные команды

LOCK TABLE, но снимаются эти блокировки в конце транзакции всегда

неявно, а в случае уровня изолированности READ COMMITTED R-блокировка снимается раньше.
Неявные команды UNLOCK TABLE обычно доступны в диалектах SQL, за исключением, например, MySQL/InnoDB.
Блокировка таблицВ некоторых продуктах СУБД диалект SQL включает явные команды LOCK TABLE, но снимаются эти блокировки в

Слайд 10Гранулярность блокировок

Гранулярность блокировок

Слайд 11Уровни блокировок
Table (TAB): Это самая грубая логическая блокировка, которую может

использовать SQL Server.

Extent (EXT): Эти блокировки не используются для

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

Page (PAG): Когда SQL Server требуется заблокировать одновременно множество строк, а свободные слоты блокировок заканчиваются, то он может использовать страничные блокировки.

Key (KEY): Лучший уровень блокировки, возможный в SQL Server, вместе с RID блокировкой. KEY блокировки используются в индексах, а RID блокировки - в таблицах-кучах.
Уровни блокировокTable (TAB): Это самая грубая логическая блокировка, которую может использовать SQL Server. Extent (EXT): Эти блокировки

Слайд 12Уровни блокировок
Высокая конкурентность означает, что множество пользователей может работать одновременно.

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

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

Слайд 13Иерархия объектов

Иерархия объектов

Слайд 14Эскалация блокировок
Эскалация блокировок – это процесс, при котором множество блокировок

с маленькой гранулярностью, конвертируются в одну блокировку на более высоком

уровне иерархии с большей гранулярностью.
Эскалация блокировокЭскалация блокировок – это процесс, при котором множество блокировок с маленькой гранулярностью, конвертируются в одну блокировку

Слайд 15Проблемы маленьких блокировок
Locking overhead. иногда выгоднее наложить одну блокировку с

большей гранулярностью, чем несколько (или несколько тысяч) более мелких.
Data contention.

Наложение одной блокировки - действие атомарное, а наложение нескольких блокировок уже таковым не является.
Resource contention. Блокировки занимают место + нуждаются так же и в некотором обслуживании, которое расходует системные ресурсы (проверка на тупики). + предел количества транзакций, которые могут выполняться в системе одновременно без ущерба для производительности.

Проблемы маленьких блокировокLocking overhead. иногда выгоднее наложить одну блокировку с большей гранулярностью, чем несколько (или несколько тысяч)

Слайд 16Подсказки оптимизатору
По умолчанию сервер старается наложить блокировку min гранулярности. Если

сервер посчитает, что блокировать на уровне отдельной записи не самое

оптимальное решение, то он заблокирует больший объем.
Можно указать явно, с какой гранулярностью блокировать, с помощью специальных подсказок оптимизатору (hints) (в сторону увеличения!).
ROWLOCK – блокировка на уровне записи.
PGLOCK - блокировка на уровне страницы данных.
TABLOCK – блокировка на уровне таблицы.

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

Слайд 17Бесконечное ожидание
Протокол блокировки уладит проблему потерянных обновлений, но если конкурирующие

транзакции используют уровень изолированности, который не снимает R-блокировки до конца

транзакции, то это может привести к бесконечному ожиданию. Транзакции будут ожидать друг друга в бесконечном цикле, называемом взаимная блокировка (Deadlock). В ранних продуктах баз данных это было серьёзной проблемой, но современные СУБД включают в себя находящийся в спящем режиме поток выполнения, называемый детектор взаимных блокировок (Deadlock Detector), который «просыпается», как правило, каждые 2 секунды (продолжительность «сна» можно изменять) для поиска взаимных блокировок, а после нахождения таковой выберет одну из ожидающих транзакций в качестве «жертвы» и произведёт этой «жертве» автоматический откат.

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

Слайд 19Важно помнить, что никакая СУБД не может автоматически перезапустить прерванную

взаимной блокировкой «жертву», за это несёт ответственность код приложения или

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

Важно помнить, что никакая СУБД не может автоматически перезапустить прерванную взаимной блокировкой «жертву», за это несёт ответственность

Слайд 20MVCC - многоверсионное управление параллелизмом
В MVCC техника такова, что сервер

сохраняет цепь истории в некоторых метках порядка обновленных версий для

данных всех строк, так что для любой обновленной строки в момент начала любой параллельной транзакции может быть найдена зафиксированная версия.
Эта техника управления параллелизмом исключает время ожидания чтения и обеспечивает всего 2 уровня изолированности:
READ COMMITTED
SNAPSHOT
MVCC - многоверсионное управление параллелизмомВ MVCC техника такова, что сервер сохраняет цепь истории в некоторых метках порядка

Слайд 21MVCC - многоверсионное управление параллелизмом
Любая транзакция с уровнем изолированности READ

COMMITTED получит последние зафиксированные версии строк от цепи истории.
Транзакция с

уровнем изолированности SNAPSHOT будет видеть только последние версии строк, зафиксированные во время начала транзакции (или записанные самой транзакцией). В уровне изолированности SNAPSHOT, транзакция никогда не увидит фантомные строки и не может даже предотвратить запись фантомных строк параллельными транзакциями, тогда как изолированность SERIALIZABLE, основанная на механизме LSCC (MGL), препятствует тому, чтобы параллельные транзакции записывали фантомные строки в базу данных. Фактически, транзакция продолжает видеть в снимке фантомные строки, которые параллельные транзакции тем временем удалили из базы данных.
Несмотря на уровень изолированности, как правило, запись также защищена в системах MVCC какой-либо блокировкой строк. Обновление строк, содержание которых тем временем был обновлено другими, будет генерировать ошибки «Your snapshot is too old» («Ваш снимок слишком старый»).

MVCC - многоверсионное управление параллелизмомЛюбая транзакция с уровнем изолированности READ COMMITTED получит последние зафиксированные версии строк от

Слайд 23В MVCC Oracle первой транзакции для записи строки (то есть

для выполнения вставки, обновления или удаления) будет предоставлена блокировка строки

и приоритет записи, а конкурирующие записи будут помещены в очередь. Блокировки строки реализуются при помощи маркировки записанных строк посредством SCN (англ. «System Change Number» - системный номер изменения) транзакции, порядковыми номерами начатой транзакции. Поскольку SCN строки принадлежит активной транзакции, то эта строка будет зарезервирована для этой транзакции. Использование блокировки по записи означает, что взаимные блокировки возможны, но вместо автоматического прерывания «жертвы», Oracle немедленно находит блокировку строки, которая бы могла привести к взаимной блокировке, вызывает исключение в приложении клиента и ожидает клиента, чтобы разрешить взаимную блокировку явной командой отката (ROLLBACK).

В MVCC Oracle первой транзакции для записи строки (то есть для выполнения вставки, обновления или удаления) будет

Слайд 24Технику управления параллелизмом в Oracle можно назвать гибридным CC, так

как в дополнение к MVCC с неявной блокировкой строки, Oracle

обеспечивает явные команды «LOCK TABLE», а также явную блокировку строк посредством команды «SELECT ... FOR UPDATE», которая обеспечивает средства для предотвращения невидимых фантомных строк. В Oracle транзакция также может быть объявлена как Read Only (только для чтения).
 
Microsoft также отметил преимущества MVCC, а в SQL Server, начиная с версии 2005, стало возможным настроить в сервере использование управления версиями строк при помощи настроек свойств базы данных посредством команд Transact-SQL, а начиная с версии 2012 – посредством свойств базы данных, как это показано на рисунке 2.9.

Технику управления параллелизмом в Oracle можно назвать гибридным CC, так как в дополнение к MVCC с неявной

Слайд 25Механизм управления параллелизмом в MySQL/InnoDB является реальным гибридным CC, обеспечивающим

для чтения четыре уровня изолированности:

READ UNCOMMITTED считывает строки таблицы без

R-блокировки;
READ COMMITTED (фактически «Read Latest Committed») считывает строки таблицы даже когда они заблокированы посредством MVCC;
REPEATABLE READ (фактически «Snapshot»), использующий MVCC;
SERIALIZABLE, использующий MGL CC с S-блокировками для предотвращения появления фантомных строк.
 
Примечание: независимо от уровня изолированности запись всегда будет нуждаться в защите исключительной блокировкой.

Механизм управления параллелизмом в MySQL/InnoDB является реальным гибридным CC, обеспечивающим для чтения четыре уровня изолированности:READ UNCOMMITTED считывает

Слайд 26OCC - управление оптимистичным параллелизмом
Begin: Пометка о времени начала транзакции.
Modify:

Чтение и запись изменение данных.
Validate: Поиск конфликтов - проверка изменений

данных, которые читала и меняла транзакция, другими транзакциями.
Commit/Rollback: Если конфликтов нет, изменения записываются. Если конфликт обнаружен, то откат транзакции.

OCC - управление оптимистичным параллелизмомBegin: Пометка о времени начала транзакции.Modify: Чтение и запись изменение данных.Validate: Поиск конфликтов

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


Восстановление после поломки основного внешнего носителя базы данных.

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

Слайд 28Отказы приложений
завершение оператором ROLLBACK;
аварийное завершение работы прикладной программы;
принудительный

откат транзакции в случае взаимной блокировки при параллельном выполнении транзакций.

Отказы приложенийзавершение оператором ROLLBACK; аварийное завершение работы прикладной программы; принудительный откат транзакции в случае взаимной блокировки при

Слайд 29Технические проблемы
Мягкий сбой
при аварийном выключении электрического питания;
при возникновении

неустранимого сбоя процессора и т. д. Потеря той части базы

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

Слайд 30Возобновление при отказах
Отказы приложений/транзакции: транзакции обрываются
Отказы системы: функционирование возобновляется после

рестарта и восстановления согласованности БД
Разрушение носителя: рестарт, восстановление с резервной

копии, восстановление согласованности

Возобновление при отказахОтказы приложений/транзакции: транзакции обрываютсяОтказы системы: функционирование возобновляется после рестарта и восстановления согласованности БДРазрушение носителя: рестарт,

Слайд 31Восстановление оборванных транзакций: откат
Обрывы транзакций могут быть вызваны ошибками при

выполнении приложений или невозможностью выполнить транзакцию сериализуемым образом
Операции обрыва можно

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

Восстановление оборванных транзакций: откатОбрывы транзакций могут быть вызваны ошибками при выполнении приложений или невозможностью выполнить транзакцию сериализуемым

Слайд 32Восстановимость
Восстановимость расписаний: транзакции должны фиксироваться до того, как их результаты

используются другими транзакциями
Пример невосстановимого расписания
w1(x) w2(x) c2 a1
S2L (Двухфазный протокол

с удержанием замков на запись до конца транзакции) гарантирует восстановимость

ВосстановимостьВосстановимость расписаний: транзакции должны фиксироваться до того, как их результаты используются другими транзакциямиПример невосстановимого расписанияw1(x) w2(x) c2

Слайд 33Откат
По команде rollback система откатит транзакцию на начало (на неявную

точку отката)
По команде commit – зафиксирует всё до неявной точки

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

ОткатПо команде rollback система откатит транзакцию на начало (на неявную точку отката)По команде commit – зафиксирует всё

Слайд 34Оптимистический и пессимистический подходы
Для обеспечения целостности транзакции СУБД может откладывать

запись изменений в БД до момента успешного выполнения всех операций,

входящих в транзакцию, и получения команды подтверждения транзакции (commit).
Иногда используется другой подход: система записывает изменения в БД, не дожидаясь завершения транзакции, а старые значения данных сохраняет на время выполнения транзакции в сегментах отката.

Оптимистический и пессимистический подходыДля обеспечения целостности транзакции СУБД может откладывать запись изменений в БД до момента успешного

Слайд 35Сегмент отката (rollback segment, RBS)
Сегмент отката – это специальная область

памяти на диске, в которую записывается информация обо всех текущих

изменениях. Обычно записывается "старое" и "новое" содержимое изменённых записей, чтобы можно было восстановить прежнее состояние БД при откате транзакции (по команде rollback) или при откате текущей операции (в случае возникновения ошибки).
Данные в RBS хранятся до тех пор, пока транзакция, изменяющая эти данные, не будет завершена. Потом они могут быть перезаписаны данными более поздних транзакций.
Сегмент отката  (rollback segment, RBS)Сегмент отката – это специальная область памяти на диске, в которую записывается

Слайд 36Savepoint
savepoint запоминает промежуточную "текущую копию" состояния базы данных для того,

чтобы при необходимости можно было вернуться к состоянию БД в

точке сохранения: откатить работу от текущего момента до точки сохранения (rollback to <имя_точки>) или зафиксировать работу от начала транзакции до точки сохранения (commit to <имя_точки>).
На одну транзакцию может быть несколько точек сохранения (ограничение на их количество зависит от СУБД).
Savepointsavepoint запоминает промежуточную

Слайд 37Журнал транзакций
Журнал транзакций – это часть БД, в которую поступают

данные обо всех изменениях всех объектов БД. Журнал недоступен пользователям

СУБД и поддерживается особо тщательно. Форма записи в журнал изменений зависит от СУБД. Но обычно там фиксируется:
номер транзакции (номера присваиваются автоматически по возрастанию);
состояние транзакции (завершена фиксацией или откатом, не завершена, находится в состоянии ожидания);
точки сохранения (явные и неявные);
команды, составляющие транзакцию, и проч.

Журнал транзакцийЖурнал транзакций – это часть БД, в которую поступают данные обо всех изменениях всех объектов БД.

Слайд 38Ведение журнала
Журнал ведется последовательно
Опережающая запись в журнал (WAL, write-ahead log)
Регистрируются

операции записи, начала и конца транзакций
Каждая запись содержит данные отката

(undo)и «наката» (redo)
При фиксации запись журнала обязательно «выталкивается» на диск

Ведение журналаЖурнал ведется последовательноОпережающая запись в журнал (WAL, write-ahead log)Регистрируются операции записи, начала и конца транзакцийКаждая запись

Слайд 39Фиксация транзакции
Изменения, внесённые транзакцией, помечаются как постоянные.
Уничтожаются все точки

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

то освобождаются объекты, заблокированные транзакцией.
В журнале транзакций транзакция помечается как завершенная, уничтожаются системные записи о транзакции в оперативной памяти.

Фиксация транзакции Изменения, внесённые транзакцией, помечаются как постоянные.Уничтожаются все точки сохранения для данной транзакции.Если выполнение транзакций осуществляется

Слайд 40Восстановление после системных отказов
Необходим рестарт сервера БД
Для того, чтобы восстановление

было возможным, необходимо вести журнал обновлений
При нормальной работе БД все

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

Восстановление  после системных отказовНеобходим рестарт сервера БДДля того, чтобы восстановление было возможным, необходимо вести журнал обновленийПри

Слайд 41Общие принципы восстановления
результаты зафиксированных транзакций должны быть сохранены в

восстановленном состоянии базы данных;
результаты незафиксированных транзакций должны отсутствовать в

восстановленном состоянии базы данных.
Общие принципы восстановления результаты зафиксированных транзакций должны быть сохранены в восстановленном состоянии базы данных; результаты незафиксированных транзакций

Слайд 42Что нужно сделать при восстановлении
Определить, какие транзакции были зафиксированы до

отказа и какие были активными (не завершены)
Если необходимо, повторить изменения

зафиксированных транзакций
Оборвать незавершенные до отказа транзакции (выполнить откат)

Что нужно сделать при восстановленииОпределить, какие транзакции были зафиксированы до отказа и какие были активными (не завершены)Если

Слайд 43Журнал транзакций
сохранение промежуточных состояний,
подтверждение транзакции,
отката транзакции

Журнал транзакцийсохранение промежуточных состояний, подтверждение транзакции,отката транзакции

Слайд 44Журнал транзакций поддерживает:
восстановление отдельных транзакций;
восстановление всех незавершенных транзакций при запуске

SQL Server;
откат восстановленной базы данных, файла, файловой группы или страницы

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

Журнал транзакций поддерживает:восстановление отдельных транзакций;восстановление всех незавершенных транзакций при запуске SQL Server;откат восстановленной базы данных, файла, файловой

Слайд 45Алгоритм восстановления при рестарте
Фаза просмотра: найти все зафиксированные и активные

транзакции (прямой просмотр журнала)
Фаза наката (redo): при прямом просмотре, выполнить

все операции зафиксированных транзакций
Фаза отката (undo): обратный просмотр журнала, откат всех операций незавершенных транзакций

Алгоритм восстановления при рестартеФаза просмотра: найти все зафиксированные и активные транзакции (прямой просмотр журнала)Фаза наката (redo): при

Слайд 46Завершение восстановления
После завершения фазы отката необходимо
Записать на диск все измененные

блоки БД
После записи БД можно очистить журнал
Возобновить нормальную работу системы

Завершение восстановленияПосле завершения фазы отката необходимоЗаписать на диск все измененные блоки БДПосле записи БД можно очистить журналВозобновить

Слайд 47CREATE DATABASE Sales
ON ( NAME = Sales_dat, FILENAME =

'C:\tmp\saledat.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5

)
LOG ON ( NAME = Sales_log, FILENAME = 'C:\tmp\salelog.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB ) ;
CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME = 'C:\tmp\saledat.mdf', SIZE = 10, MAXSIZE = 50,

Слайд 48Усечение журнала транзакций
Процесс усечения журнала освобождает место в файле журнала

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

переполнения журнала.
При усечении журнала удаляются неактивные виртуальные файлы журнала из логического журнала транзакций базы данных SQL Server.
Если усечение журнала транзакций не выполняется, со временем он заполняет все доступное место на диске, отведенное для файлов физического журнала.
Усечение журнала выполняется автоматически

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

Слайд 49Сжатие журнала
Усечение журнала не приводит к уменьшению размера физического файла

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

сжатие.
DBCC SHRINKFILE (DataFile1, 7); DataFile1 – имя файла, 7 – размер в МБ);
Сжатие журналаУсечение журнала не приводит к уменьшению размера физического файла журнала.Для уменьшения реального размера физического файла журнала

Слайд 50Модель транзакций

Модель транзакций

Слайд 51Модель транзакций
оператор COMMIT означает успешное завершение транзакции; его использование делает

постоянными изменения, внесенные в базу данных в рамках текущей транзакции;


оператор ROLLBACK прерывает транзакцию, отменяя изменения, сделанные в базе данных в рамках этой транзакции; новая транзакция начинается непосредственно после использования ROLLBACK;
успешное завершение программы, в которой была инициирована текущая транзакция, означает успешное завершение транзакции (как будто был использован оператор COMMIT);
ошибочное завершение программы прерывает транзакцию (как будто был использован оператор ROLLBACK).
Модель транзакцийоператор COMMIT означает успешное завершение транзакции; его использование делает постоянными изменения, внесенные в базу данных в

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика