
- •37. Операционная система. Понятие ос; основные функции ос; программно-аппаратные средства поддержки режима мультипрограммирования.
- •3) Процессы
- •4) Устройства ввода-вывода и хранения данных
- •38. Процессор. Принципы работы процессора. Команды процессора, счетчик команд, слово состояния процессора. Режимы работы процессора. Прерывания и их обработка. Квантование времени.
- •39. Оперативная память. Методы организации. Принципы защиты памяти и средства обеспечения достаточного объема памяти в системах с фиксированным и переменным числом разделов.
- •41. Виртуальная память
- •42. Процессы. Концепция состояний. Реализация процессов и основные структуры данных. Контекст процесса. Нити.
- •43. Синхронизация процессов: условия корректной синхронизации; алгоритмы с активным ожиданием; примитивы межпроцессорного взаимодействия: семафоры, сообщения, мониторы.
39. Оперативная память. Методы организации. Принципы защиты памяти и средства обеспечения достаточного объема памяти в системах с фиксированным и переменным числом разделов.
Операти́вная па́мять (также оперативное запоминающее устройство, ОЗУ) — часть системы компьютерной памяти, в которой временно хранятся данные и команды, необходимые процессору для выполнения им операции и время доступа к которой не превышает одного его такта. Передача данных в/из оперативную память процессором производится непосредственно, либо через сверхбыструю память.
Программы вместе с обрабатываемыми ими данными могут выполняться только тогда, когда они находятся в основной (оперативной) памяти. Поэтому основная память является важнейшим и наиболее дефицитным ресурсом вычислительной системы, требующим тщательного управления.
При разработке программ и планировании размещения данных программист использует некоторую абстрактную модель основной памяти, к основным свойствам которой можно отнести следующие:
память представляет собой непрерывную последовательность автономных неперекрывающихся участков (ячеек), в которые можно записать либо команды программы, либо некоторые значения данных;
размер ячеек может быть фиксирован, либо является переменным, однако всегда достаточен для размещения команды или данных;
все ячейки пронумерованы, номер ячейки используется для ссылок на ее содержимое и называется адресом ячейки;
адреса ячеек образуют упорядоченное множество, называемое адресным пространством;
мощность адресного пространства (количество различных адресов) определяется разрядностью процессора, например, для 16-разрядного процессора возможны 216 адресов, а для 32-разрядного – 232;
для каждой ячейки можно выполнить операции записи и чтения данных, причем данные, записанные в ячейку, сохраняются до следующей операции записи в туже ячейку;
время записи или чтения (время доступа) не зависит от адреса ячейки;
порядок доступа к ячейкам не зависит от их адреса (произвольный порядок доступа).
Модуль ОС, предназначенный для управления памятью, называется менеджером памяти. Работа этого модуля в современных ОС основана на нескольких следующих базовых принципах:
Разделение адресных пространств. При работе с памятью выполняется разделение адресных пространств программы и вычислительной системы. Такое разделение реализуется использованием двух видов адресов, а именно – адресов, к которым обращается программа, и адресов, реально существующих в оперативной памяти. Адрес, указанный в программе, обычно называют логическим адресом. Адрес, по которому происходит обращение к памяти компьютера, называется физическим адресом. Совокупность логических адресов образует логическое адресное пространство, а совокупность физических - физическое адресное пространство. В соответствии с принятыми в ОС принципами управления памятью менеджер памяти организует отображение логического адресного пространства программы на физическое пространство памяти.
Сегментация. Адресное пространство программы разбивается на области (сегменты), в которые размещаются данные, логически связанные в соответствии с особенностями их обработки. Обычно в разных сегментах располагаются данные различных видов (код, данные, стек и т.д.). Сегментация позволяет менеджеру памяти контролировать порядок работы с данными, находящимися в сегментах, при отображении их на физическое адресное пространство посредством присвоения сегментам некоторых атрибутов, определяющих, например, права доступа или разрешенные виды операций.
Локальность. Принцип локальности основан на том обстоятельстве, что обычно в течение некоторого фиксированного промежутка времени выполняется ограниченный фрагмент кода, который обращается к ограниченному множеству данных. Наличие в памяти других частей кода и данных не требуется для нормальной работы программы в течение этого промежутка. Данная особенность построения программ и организации данных позволяет использовать иерархию памяти, отображая в быструю память минимум необходимой информации и размещая остальную часть на устройствах с более медленным доступом.
Методы организации. Принципы защиты памяти и средства обеспечения достаточного объема памяти в системах с фиксированным и переменным числом разделов
Существует несколько основных схем управления памятью. Использование конкретной схемы в рамках определенной ОС обусловлено особенностями решаемых задач, требованиями к производительности и архитектурными особенностями используемой вычислительной системы.
Схема с фиксированными разделами.
Самым простым способом управления оперативной памятью в многозадачной ОС является предварительное разбиение (обычно на этапе генерации или в момент загрузки системы) основной памяти на разделы фиксированного размера. При запуске процесс помещается в раздел подходящего размера.
Выбор раздела:
a) Каждый раздел может иметь на диске свою очередь процессов, или организуется одна глобальная очередь для всех разделов.
б) Если в системе используется одна очередь для всех разделов, то подсистема управления памятью выбирает подходящий раздел, сравнивая размер программы, поступившей на выполнение, с размерами существующих разделов и затем осуществляет загрузку программы в соответствующий раздел и настройку адресов.
Стратегия первого подходящего раздела. Задание помещается в первый подходящий по размеру раздел.
Стратегия наиболее подходящего раздела. Задание помещается в тот раздел, где остается меньше всего свободной памяти.
Стратегия наименее подходящего раздела. Задание помещается в самый большой существующий раздел, оставляя большой свободный участок. (В случае фиксированных разделов не используется).
Моделирование показало, что с точки зрения использования памяти первый и второй способы примерно одинаковы, но первый способ быстрее.
«-» Очевидным недостатком этой схемы является фиксированное число одновременно выполняемых процессов, которое ограничено числом разделов.
«-» Другим существенным недостатком является то, что предлагаемая схема сильно страдает от внешней фрагментации - потери памяти, не используемой ни одним процессом. Фрагментация возникает потому, что процесс не полностью занимает выделенный ему раздел или из-за того, что имеющиеся разделы, слишком малы для программ, находящихся в очереди.
«+» Достоинством схемы является простота управления памятью. Для организации распределения программ по разделам менеджеру памяти достаточно поддерживать таблицу разделов, в которой указаны местоположение, размер и текущее состояние занятости каждого раздела.
Таблица разделов: Nпп | адрес начала | размер раздела | состояние занятости
«+» очень эффективна («накладные» расходы минимальны)
Частный случай системы – система с единственным разделом – DOS
1. Связывание адресов. (отображении логического пространства на физическое) либо происходит на этапе создания загрузочного модуля , либо на этапе загрузки программы.
2. Распределение памяти между конкурирующими процессами. Осуществляется по таблице разделов. Если раздел свободен, то можно размещать. Если нет, то нельзя.
3. Обеспечение достаточного объема памяти.
Так как размер логического адресного пространства процесса может быть больше, чем размер выделенного ему раздела (или больше, чем размер самого большого раздела), иногда используется техника, называемая оверлей (overlay) или организация структуры с перекрытием. Основная идея – держать в памяти только те инструкции программы, которые нужны в данный момент.
Этот метод распределения предполагает, что вся программа может быть разбита на части — сегменты. Каждая оверлейная программа имеет одну главную (main) часть и несколько сегментов (segments), причем в памяти машины одновременно могут находиться только ее главная часть и один или несколько не перекрывающихся сегментов.
Пока в оперативной памяти располагаются выполняющиеся сегменты, остальные находятся во внешней памяти. После того как текущий (выполняющийся) сегмент завершит свое выполнение, возможны два варианта: либо он сам (если данный сегмент не нужно сохранить во внешней памяти в его текущем состоянии) обращается к операционной системе с указанием, какой сегмент должен быть загружен в память следующим; либо он возвращает управление главному сегменту задачи, и уже тот обращается к операционной системе с указанием, какой сегмент сохранить (если это нужно), а какой сегмент загрузить в оперативную память, и вновь отдает управление одному из сегментов, располагающихся в памяти.
4. Защита памяти.
При фиксированном числе разделов защита памяти реализуется с помощью таблицы распределения разделов, в которой указывается физический адрес начала раздела и его длина.
Если значение физического адреса внутри программы превышает максимальный возможный физический адрес внутри раздела или оказывается меньшим адреса начала раздела, то генерируется ошибка защиты памяти.
Сравнение адресов требуется производить при каждом обращении к памяти, поэтому часто предусматриваются специальные аппаратные регистры, в которые для каждого раздела загружаются значения адреса начала раздела и длины.
Схема с переменными разделами.
В системах разделения времени использование фиксированных разделов практически невозможно т.к. ограничивает число пользователей и запущенных ими программ. Более эффективной в этом случае является схема с переменным числом разделов. В рамках схемы с переменными разделами память не разделяется заранее на разделы и каждой вновь поступающей задаче выделяется необходимый участок памяти. После окончания работы программы память временно освобождается и, по истечении некоторого времени, в памяти чередуются занятые и свободные участки. Смежные свободные участки могут быть объединены в один.
—Выбор раздела: При запросе на выделение свободного раздела менеджер памяти, выбирает его среди имеющихся, применяя одну из стратегий (первый подходящий, наиболее подходящий, наименее подходящий). Затем загружает процесс в выбранный участок и регистрирует изменения состояния памяти. Связывание адресов может быть осуществлено на этапах загрузки и выполнения.
—Внешняя фрагментация. Этому методу также присуща внешняя фрагментация вследствие наличия большого числа участков свободной памяти. В худшем случае могут возникнуть участки свободной (потерянной) памяти между двумя процессами. Если все эти участки объединить в один блок, то можно разместить больше процессов.
Стратегии, выбирающие первый подходящий или наиболее подходящий участки, обычно увеличивают фрагментацию.
1) Одно из возможных решений проблемы внешней фрагментации – сегментация физического адресного пространства процесса. В этом случае адресное пространство процесса может разбиваться на фрагменты, что позволяет выделять разделы в произвольных доступных местах памяти. Проблема фрагментации в данном случае не решается полностью, поскольку число возможных сегментов ограничено.
2) Другим способом борьбы с внешней фрагментацией является сжатие памяти, то есть перемещение всех занятых (свободных) участков в сторону возрастания (убывания) адресов, так, чтобы вся свободная память формировала непрерывную область. Этот метод иногда называют схемой с перемещаемыми разделами.
—Учет свободных участков памяти.
Существует два способа учета использования памяти: битовые массивы, иногда называемые битовыми картами, и списки свободных участков
1) При работе с битовым массивом память разделяется на единичные блоки размещения размером от нескольких слов до нескольких килобайт. В битовой карте каждому свободному блоку соответствует один бит, равный нулю, а каждому занятому блоку – бит, установленный в 1 (или наоборот). Размер единичного блока представляет собой важный вопрос стадии разработки системы. Чем меньше единичный блок, тем больше потребуется битовый массив. Если выбираются большие единичные блоки, битовая карта становится меньше, но при этом может теряться существенная часть памяти в последнем блоке каждого процесса (если размер процесса не кратен размеру единичного блока).
Битовый массив предоставляет простой способ отслеживания слов в памяти фиксированного объема, потому что размер битовой карты зависит только от размеров памяти и единичного блока. Основная проблема, возникающая при этой схеме, заключается в том, что при решении переместить k-блочный процесс в память модуль управления памяти должен найти в битовой карте серию из k следующих друг за другом нулевых битов. Поиск серии заданной длины в битовой карте является медленной операцией (так как искомая последовательность битов может пересекать границы слов в битовом массиве). В этом состоит аргумент против битовых карт.
2) Другой способ отслеживания состояния памяти предоставляет поддержка связных списков занятых и свободных фрагментов памяти, где сегментом является или процесс, или участок между двумя процессами. Каждая запись в списке указывает, является ли область памяти свободной (Н, от hole – дыра) или занятой процессом (Р, process); адрес, с которого начинается эта область; ее длину; содержит указатель на следующую запись. Лучше всего если список отсортирован по адресам. Этот способ имеет ряд минусов: список время от времени надо модифицировать (для повышения скорости сортировать по длине), при освобождении памяти в список необходимо внести запись об изменении, проблема при слиянии(особенно при упорядочивании по длине).
Обеспечение достаточного объема памяти. В системах с разделением времени возможна ситуация, когда память не в состоянии содержать все пользовательские процессы. Для загрузки процессора на 90% достаточно всего трех счетных задач. Однако для того, чтобы обеспечить такую же загрузку интерактивными задачами, выполняющими интенсивный ввод-вывод, потребуются десятки таких задач. Необходимым условием для выполнения задачи является загрузка ее в оперативную память, объем которой ограничен. В этих условиях был предложен метод организации вычислительного процесса, называемый свопингом. В соответствии с этим методом некоторые процессы (обычно находящиеся в состоянии ожидания) временно выгружаются на диск. Планировщик операционной системы не исключает их из своего рассмотрения, и при наступлении условий активизации некоторого процесса, находящегося в области свопинга на диске, этот процесс перемещается в оперативную память. Если свободного места в оперативной памяти не хватает, то выгружается другой процесс.
При свопинге процесс перемещается между памятью и диском целиком, то есть в течение некоторого времени процесс может полностью отсутствовать в оперативной памяти. Существуют различные алгоритмы выбора процессов на загрузку и выгрузку, а также различные способы выделения оперативной и дисковой памяти загружаемому процессу.
При большом числе одновременно выполняющихся процессов таблица разделов становится слишком громоздкой и ее поддержка нецелесообразна.
В связи с этим защита памяти может базироваться на схеме с использованием ключа защиты памяти, которая требует определенной аппаратной поддержки.
В рамках этой схемы память процессу выделяется блоками фиксированной длины. Каждый блок снабжается специальным кодом, называемым ключом защиты. Значение ключа защиты устанавливается менеджером памяти и является одинаковым для всех блоков, выделенных процессу. Кроме того, ключ защиты сохраняется также в блоке управления процессом и при выполнении процесса загружается в один из регистров процессора (обычно в регистр PSW).
При каждом обращении к памяти содержимое соответствующего регистра процессора сравнивается со значением ключа защиты блока, к которому происходит обращение, и в случае несовпадения генерируется ошибка защиты памяти.
Файловая система.
Файловая система – это часть операционной системы, предназначенная для организации эффективной работы с данными, хранящимися во внешней памяти, и обеспечивающая пользователю удобный интерфейс с этими данными, не зависящий от конструктивных особенностей носителей.
К основным функциям файловой системы относятся:
Связывание имени файла с выделенным ему пространством внешней памяти.
Распределение внешней памяти между файлами, учет свободного и занятого пространства носителя данных.
Обеспечение надежности хранения информации.
Защита данных от несанкционированного доступа.
Обеспечение высокой производительности.
Файловые системы различных операционных систем могут иметь различные реализации и ориентироваться на различные аппаратные платформы. Однако во всех случаях они предназначены для поддержки абстрактной модели файлов и должны предоставлять пользователю сходный интерфейс, выполняя в конечном итоге одинаковые функции и сохраняя, возможно в различной форме, сходные вспомогательные данные
В простейшем случае (Unix, MS DOS, Windows) файл рассматривается как неструктурированная последовательность байтов и файловая система не осуществляет никакой их интерпретации.
Методы реализации файлового интерфейса существенно зависят от конструктивных особенностей внешних устройств. По способам обмена данными устройства принято делить на две группы: блочные (магнитные диски, ленты и др.) и символьные (клавиатура, принтер и др.).
Основной особенностью блочных устройств является то, что данные на них хранятся в виде набора блоков фиксированной длины (физических блоков). Для магнитного диска каждый блок имеет адрес, включающий номер цилиндра, дорожки и сектора. Такая организация позволяет поддерживать произвольный порядок доступа к блокам при обмене с дисками. Файловая система обрабатывает логические блоки фиксированной длины, размер которых кратен размеру физических блоков.
Для символьных устройств обмен данными выполняется посимвольно без блокирования.
Файловый интерфейс обычно поддерживается для обоих видов устройств, однако, для длительного хранения данных используются блочные устройства.
Реализуя отображение имен файлов дисковые блоки, и организуя распределение внешней памяти между файлами, файловая система должна обеспечить хранение следующей основной информации:
• связь имени файла с адресами блоков;
• адреса блоков, принадлежащих файлам;
• адреса свободных блоков;
• атрибуты файлов;
• текущую позицию файла;
• режим доступа к файлу.
Для этого необходимо поддерживать вспомогательные структуры данных, которые либо сохраняются на носителе данных, либо размещаются в области памяти ядра.
Для сохранения сведений об адресах блоков, принадлежащих файлу, атрибутов и адресах свободных блоков файловые системы организуют структуры, которые размещаются на внешних носителях и существенно зависят от вида файловой системы.
Выделение непрерывной последовательностью блоков
Простейшим способом распределения дискового пространства является выделение каждому файлу непрерывной области диска. В этом случае файл характеризуется начальным адресом и длиной (в блоках).
Такая схема имеет следующие преимущества:
• для каждого файла достаточно хранить информацию об адресе первого блока и размере, что сокращает объем вспомогательной информации, который требуется хранить в системе;
• определение местоположения файла сводится к поиску адреса первого блока;
• обеспечивается высокая производительность файловой системы, т.к. целый файл может быть считан за одну дисковую операцию.
Основная проблема схемы является внешняя фрагментация, неизбежно возникающая в случаях выделения непрерывных участков памяти, и приводящая к невозможности размещения на диске новых файлов при наличии свободного пространства.
Связный список
Блоки файла организуются в виде связного списка, в котором каждый блок, принадлежащий файлу, в фиксированном месте сохраняет адрес следующего блока. Последний блок содержит фиксированное, например нулевое, значение адреса, которое является признаком конца файла. Запись в директории содержит указатель на первый блок файла.
При прямом доступе к файлу для поиска i-го блока нужно осуществить несколько обращений к диску, последовательно считывая блоки от 1 до i-1, то есть выборка логически смежных записей, которые занимают физически несмежные секторы, может требовать много времени.
Низкая надежность. Наличие дефектного блока в списке приводит к потере информации в остаточной части файла и, возможно, к потере дискового пространства отведенного под этот файл.
Связный список с использованием индекса
Недостатки предыдущего способа могут быть устранены путем изъятия указателя из каждого дискового блока и помещения его в индексную таблицу в памяти, которая называется FAT (File Allocation Table).
б) Методы хранения информации о дисковых блоках, принадлежащих файлу в FAT, Ext2, NTFS;
FAT, NTFS
NTFS и FAT используют кластер как основную единицу распределения дискового пространства. Кластер — логическая единица хранения данных в таблице размещения файлов, объединяющая группу секторов. Например, на дисках с размером секторов в 512 байт, 512-байтный кластер содержит один сектор, тогда как 4-килобайтный кластер содержит восемь секторов. Как правило, это наименьшее место на диске, которое может быть выделено для хранения файла.
Таблица FAT состоит из записей одинакового размера и не имеет ни служебных заголовков, ни завершителей. В FAT32 размер записи таблицы 32 разряда. Адресация записей начинается с 0 и каждая запись соответствует кластеру с тем же адресом. В случае если запись равна 0, то кластер считается свободным. Кластеры 0,1 используются для служебных целей.
Индексные узлы
Информация о положении файла хранится в структуре данных фиксированного размера, называемой индексным узлом (i-node), которая содержит атрибуты и адреса дисковых блоков файла
Индексные узлы всех файлов объединяются в таблицу индексов, которая хранится на диске. Запись в директории, относящаяся к файлу, содержит номер индексного узла. При открытии файла, соответствующий индекс считывается в память. Индексирование поддерживает прямой доступ к файлу и устраняет внешнюю фрагментацию.
Адреса начальных дисковых блоков файла могут быть извлечены непосредственно из индексного узла. Для больших файлов используется косвенная адресация, при которой один из адресов, находящихся в индексном узле указывает на блок одинарной косвенной адресации, содержащий адреса блоков данных. Если этого недостаточно используется блок двойной косвенной адресации, который содержит адреса блоков косвенной адресации. Если и этого недостаточно используют блок тройной косвенной адресации
EXT2 Для хранения адреса файла выделено 15 полей, каждое из которых состоит из 4 байт. Если размер файла меньше или равен 12 блоков, то номера этих кластеров непосредственно перечисляются в первых двенадцати полях адреса. Если размер файла превышает 12 блоков, то следующее 13-е поле содержит адрес кластера, в котором могут быть расположены номера следующих блоков файла. Таким образом, 13-й элемент адреса используется для косвенной адресации. При максимальном размере блока равном 4096 байт, 13-й элемент, может содержать до 1024 номеров следующих кластеров данных файла. Если размер файла превышает 12+1024 блоков, то используется 14-е поле, в котором находится номер блока, содержащего 1024 номеров блоков, каждый из которых хранят 1024 номеров блоков данных файла. Здесь применяется уже двойная косвенная адресация. И наконец, если файл включает более 12+1024+1048576 = 1049612 блоков, то используется последнее 15-е поле для тройной косвенной адресации.
Таким образом, описанная выше система адресации, позволяет при максимальном размере блока 4 Кб иметь файлы размера до 2 терабайт.
в) Средства обеспечения надежности и высокой производительности ФС.
Средства обеспечения надежности:
средства, позволяющие уменьшить возможный вред, возникающий из-за нарушения целостности ФС;
Ущерб можно существенно уменьшить, если правильно определить порядок выполнения операций со структурами данных ФС. Эта группа средств реализуется на этапе разработки алгоритмов выполнения файловых операций.
средства, позволяющие восстановить целостность ФС;
Средства этой группы сканируют структуры данных ФС в поисках возможных противоречий
средства, предотвращающие нарушение целостности ФС.
Наиболее надёжным средством предотвращения нарушения целостности файловой системы является реализация файловых операций в виде транзакций. Под транзакцией понимается последовательность операций, которая либо выполняется полностью, либо не выполняется ни одна операция из группы.
Средства обеспечения высокой производительности:
Кэширование
Наиболее распространенным методом повышения производительности файловой системы является копирование и хранение дисковых блоков в специальной области памяти – буферном кэше. Свойство локальности процессов обработки данных позволяет ожидать сокращения числа обращений к диску.
Алгоритмы доступа к данным модифицируются таким образом, что при выполнении дисковых операций в первую очередь проверяется наличие соответствующего блока в буферном кэше. Если блок там присутствует, то запрос выполняется без обращения к диску, в противном случае блок считывается с диска в буфер и сохраняется там для удовлетворения возможных повторных обращений.
Реализация кэширования требует решения ряда проблем. В первую очередь отметим проблему ограниченной емкости буферного кэша. Когда буферный кэш заполнен, а очередной дисковый блок должен быть загружен, возникает необходимость выгрузки некоторого блока для освобождения буфера.
Модификация алгоритмов записи и чтения дисковых блоков
Отложенная запись
Эффективность кэширования дисковых блоков повышается, если используется механизм отложенной записи, при котором модификация буфера не вызывает немедленной записи на диск. В этом случае серьезной проблемой является старение информации в дисковых блоках, образы которых находятся в буферном кэше.
В рамках алгоритма блоки, существенные для сохранения целостности файловой системы (блоки индексных узлов, косвенной адресации, директорий), должны быть переписаны на диск немедленно.
В остальных случаях выполняется периодическая синхронизация содержимого буферов и диска с помощью фонового процесса, который делает это через определенные промежутки времени.
В некоторых системах, например MS-DOS модифицированные блоки немедленно записываются на диск. Кэш, обладающий таким свойством, называется кэшем со сквозной записью. При использовании такого метода буферизации увеличивается число обращений к диску, однако практически исключается проблема потери данных или повреждения файловой системы.
Чтение с продвижением Другой метод увеличения производительности файловой системы состоит в модификации порядка чтения дисковых блоков, а именно, при чтении очередного блока из файла файловая система проверяет наличие в буферном кэше следующего за ним блока и, если этого блока, считывает его с диска. Такая техника получила название «опережающее чтение блоков».
Оптимизация перемещения блока головок
Среднее время обращения к диску можно заметно уменьшить за счет сокращение количества и длины перемещений блока головок диска. В этом случае следует ожидать достаточно большого эффекта, поскольку именно на перемещение головок уходит большая часть времени, необходимого для доступа к дисковому блоку. Основным методом сокращения перемещений блока головок является рациональное размещение информации на диске. Обычно используются следующие приемы:
Для размещения блоков, принадлежащих одному файлу, по возможности выделяются соседние дисковые блоки, расположенные в пределах одного цилиндра.
Вспомогательные структуры данных, например массив индексных узлов, размещаются как можно ближе к соответствующим блокам с данными. Часто массив индексных узлов размещается на средних дорожках, что позволяет сократить в два раза среднюю длину пути блока головок. Альтернативной техникой является распределение массива индексных узлов по всему диску. Для этого диск разбивается на группы цилиндров, каждую из которых обслуживает собственный массив индексов.