XML-СУБД Sedna технические особенности и варианты использования

       

Управление памятью


Как уже говорилось, одним из основных проектных решений, имеющих отношение к организации памяти в СУБД Sedna , является использование прямых указателей для представления связей между узлами. Хотя использование обычных указателей языков программирования, поддерживаемых механизмом управления виртуальной памяти операционной системы, идеально с точки зрения эффективности и простоты программирования, в данном случае это решение не является удовлетворительным. Во-первых, оно накладывает ограничение на размер адресного пространства, свойственное стандартным 32-битовым архитектурам, которые превалируют в настоящее время. Во-вторых, при обработке запросов над большими объемами данных СУБД не может полагаться на механизм виртуальной памяти, обеспечиваемый ОС, потому что требуется собственное управление процедурой замещения страниц для выталкивания страниц на диск в соответствии логикой выполнения запроса [].

Для решения этой проблемы в проекте Sedna был разработан собственный механизм управления памятью, поддерживающий 64-битовое адресное пространство ( Sedna Address Space , SAS ) и тесно взаимодействующий с менеджером буферов. Каждой базе данных, управляемой СУБД Sedna , соответствует свое SAS , полностью отображаемое на внешнюю память, где реально хранится база данных, и частично отображаемое на виртуальное адресное пространство каждого процесса, в котором выполняется транзакция с соответствующей базой данных ( Process Virtual Address Space , PVAS ). В отображенной части SAS можно использовать обычные указатели.

SAS разбивается на уровни одинакового размера. Размер уровня выбирается таким, чтобы диапазон адресов уровня умещался в PVAS . Уровень стоит из страниц (они соответствуют блокам внешней памяти, в которых хранятся узлы XML -документа). Все страницы имеют один и тот же размер, что облегчает работу менеджера буферов. В заголовке каждой страницы сохраняется номер уровня, которому принадлежит данная страница. Адрес объекта в SAS (длиной 64 бита) состоит из номера уровня (первые 32 бита) и адреса внутри уровня (последние 32 бита). Адрес внутри уровня отображается в точно такой же адрес PVAS . Диапазон адресов PVAS , на который отображаются уровни SAS , в свою очередь, отображается менеджером буферов Sedna в адреса основной памяти с использованием средств управления памятью, обеспечиваемых ОС.


При использовании указателя ( layer _ num , addr ) в любом процессе- транзакции для перехода от дескриптора некоторого узла к узлу, который потенциально может находиться в другом блоке (левый и правый братья, потомки) выполняется процедура разыменования указателя. Эта процедура проверяет, присутствует ли страница, на которую указывает адрес addr , в основной памяти, и если да, то соответствует ли значение layer _ num данного указателя соответствующему значению в заголовке страницы. Если оба эти условия выполнены, то процедура завершается, и addr используется как обычный указатель в PVAS . В противном случае происходит обращение к менеджеру буферов, который находит в основной памяти требуемую страницу или выделяет свободную страницу (возможно, выталкивая из основной памяти во внешнюю некоторую занятую страницу), считывая на нее соответствующий блок внешней памяти, и обеспечивает ее расположение по требуемому адресу в PVAS . После этого в данной транзакции можно использовать addr как обычный указатель в PVAS . Следует также заметить, что, помимо прочего, выполнение процедуры разыменования в данном процессе приводит к фиксации соответствующей страницы в основной памяти до явного указания возможности отмены фиксации.

Таким образом, в любом PVAS могут одновременно находиться страницы с разными значениями layer _ num , а в пуле страниц основной памяти, управляемом менеджером буферов, могут даже одновременно находиться заполненные страницы с разными layer _ num , которым соответствует один и тот же виртуальный адрес в PVAS (конечно, в одном PVAS может в одно и то же время присутствовать только одна из этих страниц).

              


Содержание раздела