Модель внешней памяти
Данные хранятся во внешней памяти на магнитных дисках, магнитных лентах и т.д., а их обработка выполняется в оперативной памяти ЭВМ. Поэтому при обработке некоторые порции данных пересылаются из внешней памяти в оперативную либо наоборот [17].
При больших объемах данных в БД может потребоваться несколько томов внешней памяти. Однако обмен между внешней и оперативной памятью выполняется небольшими порциями данных – обычно объемом не более нескольких сотен байт. С этой целью внешняя память разбивается на части, называемые блоками или страницами. Данные пересылаются блоками. Операции пересылки еще называют обменом данными между внешней и оперативной памятью. Такой обмен называется чтением блока, а в обратном направлении - записью блока.
При чтении блока, последний помещается в оперативной памяти в специально отведенный (буферный) участок памяти. Может отводиться участок под несколько буферов (буферный пул). Чем больше буферный пул, тем эффективнее обработка данных. При считывании другого блока из внешней памяти в тот же самый буфер предыдущее содержимое буфера теряется. При внесении изменений в блок вначале блок считывается в буфер, затем выполняются изменения и далее блок записывается во внешнюю память.
Для организации каждого файла в зависимости от его размера во внешней памяти ему выделяется от одного до
![](image/image164.gif)
Каждый байт в блоке пронумерован:
![](image/image165.gif)
В качестве адресов записей файла во внешней памяти используют: машинный адрес, относительный адрес, ключ записи [17].
В качестве относительного адреса записи файла используют ее номер по порядку (внутрисистемный номер) в файле либо комбинацию таких составляющих адреса, как номер блока и относительный адрес в блоке, ибо номер блока и значение ключа.
В последнем случае, после считывания блока в буфер оперативной памяти, доступ к записи в буфере осуществляется с помощью какого-либо метода поиска записей в файле по значению ключа.
При чтении записи из блока, который уже находится в буфере, обмен с внешней памятью не выполняется. Во многих системах при вводе записи ей присваивается уникальный системный идентификатор – ключ базы данных.
Запись обычно состоит из:
1) служебных полей, в которых хранятся указатели, реализующие связи с другими записями, и другая информация, необходимая для организации управления файлом,
2) полей хранимых данных.
Записи могут быть фиксированной и переменной длинны. Записи размещаются в блоках плотно, без промежутков, последовательно одна за другой. В блоке часть памяти отводится для служебной информации о блоке: относительные адреса свободных участков памяти, указатели на следующий блок и т.д.
Если файл базы данных состоит из записей фиксированной длинны, то в одном блоке может разместиться
![](image/image166.gif)
![](image/image167.gif)
где
![](image/image160.gif)
![](image/image168.gif)
![](image/image169.gif)
Однако обычно блоки заполняются не полностью, например, наполовину. Оставшаяся область блока остается некоторое время при работе системы незаполненной (зарезервированной). В дальнейшем эта область заполняется при расширении (увеличении) записей, хранящихся в блоке, или при поступлении в систему новых записей, которые в соответствии со значениями их ключей или по другим условиям необходимо поместить в одном блоке с уже хранящимися записями. По истечении некоторого времени блок заполняют полностью.
Для хранения поступающих данных, которые должны были бы попасть в этот блок, выделяется дополнительный блок памяти в области переполнения. Записи, которые должны были размещаться в одном блоке, связываются специальными указателями в одну цепь.
Процесс выделения дополнительных блоков в области переполнения можно было бы не ограничивать, если бы при этом не снижалась эффективность (по временному критерию) обработки хранимых данных.
Снижение эффективности обработки данных связано с тем, что система непроизводительно затрачивает время на поиск записей в области переполнения, что сказывается на увеличении общего времени поиска требуемых записей (по сравнению со случаем, когда область переполнения еще не была использована и все записи были размещены в основной области).
Поэтому периодически файл реорганизуется: при необходимости файлу добавляется требуемое количество блоков в основной области памяти и выполняется требуемая перекомпоновка записей. При этом исходят из расчета, чтобы можно было освободить область переполнения, а все записи разместить в блоках основной области, причем, в каждом блоке разместить записи последовательно и в таком количестве, чтобы
![](image/image170.gif)
![](image/image171.gif)
где
![](image/image170.gif)
![](image/image172.gif)
Считается, что все блоки каждого файла пронумерованы:
![](image/image173.gif)
![](image/image174.gif)
Среднее время выполнения операций обмена зависит от типа устройства внешней памяти (от его характеристик) и от размера блока:
![](image/image175.gif)
где
![](image/prilozhenie-6-principy-organizacii-kompjuternyh_3.gif)
![](image/image176.gif)
![](image/image177.gif)
Время поиска данных в файле:
![](image/image178.gif)
где
![](image/image179.gif)
![](image/image180.gif)
![](image/image181.gif)
![](image/image182.gif)
Если
![](image/image180.gif)
![](image/prilozhenie-6-principy-organizacii-kompjuternyh_3.gif)
На скорость поиска данных в файле наибольшее влияние оказывают следующие характеристики файла и технических устройств внешней памяти, использованных для его организации [17]:
– объем блока;
– объем байта;
– количество записей в блоке файла
![](image/image183.gif)
– количество записей в блоке индекса;
– количество блоков в файле данных
![](image/image184.gif)
– доля резервируемой части блока
![](image/image185.gif)
– длина поля, отведенного для указателя;
– количество записей в файле
![](image/image186.gif)
– размер записи
![](image/image187.gif)
– длина ключевого поля записи;
– число записей файла, удовлетворяющих условию поиска Q;
– среднее число блоков переполнения на один блок файла;
– среднее время обмена
![](image/image188.gif)
На рис. 3.7 изображен файл со следующими характеристиками:
![](image/image189.gif)
![](image/image183.gif)
![](image/image185.gif)
![](image/image190.gif)
![](image/image191.gif)