Чей индекс

Чей индекс

4.1 ИНДЕКСЫ

Индексы существуют на диске в статической форме и ядро считывает их в память прежде, чем начать с ними трудиться. Дисковые индексы включают в себя следующие поля:

  • Идентификатор обладателя файла. Права собственности поделены между личным обладателем и групповым и тем самым оказывают помощь выяснить круг пользователей, имеющих права доступа к файлу. Суперпользователь в праве доступа ко всем файлам в совокупности.
  • Тип файла. Файл возможно файлом простого типа, каталогом, особым файлом, соответствующим устройствам ввода-вывода знаками либо блоками, и абстрактным файлом канала (организующим обслуживание запросов в порядке поступления, первым пришел — первым вышел).
  • Права доступа к файлу. Совокупность разграничивает права доступа к файлу для трех классов пользователей: личного обладателя файла, прочих пользователей и группового владельца; каждому классу выделены определенные права на чтение, исполнение и запись файла, каковые устанавливаются лично. Потому, что каталоги как файлы не смогут быть выполнены, разрешение на выполнение в этом случае интерпретируется как право создавать поиск в каталоге по имени файла.
  • Календарные сведения, характеризующие работу с файлом: время внесения последних трансформаций в файл, время последнего обращения к файлу, время внесения последних трансформаций в индекс.
  • Число указателей на файл, означающее количество имен, применяемых при поиске файла в иерархии каталогов. Указатели на файл детально рассматриваются в главе 5.
  • Таблица адресов на диске, в которых находится информация файла. Не смотря на то, что пользователи трактуют данные в файле как логический поток байтов, ядро располагает эти данные в несоприкасающихся дисковых блоках. Дисковые блоки, которые содержат данные файла, указываются в индексе.
  • Размер файла. Данные в файле адресуются посредством смещения в байтах относительно начала файла, начиная со смещения, равного 0, исходя из этого размер файла в байтах на 1 больше большого смещения. К примеру, в случае если пользователь формирует файл и записывает лишь 1 байт информации по адресу со смещением 1000 от начала файла, размер файла составит 1001 байт. В индексе отсутствует составное имя файла, нужное для осуществления доступа к файлу.

Рисунок 4.2. Пример дискового индекса

На Рисунке 4.2 продемонстрирован дисковый индекс некоего файла. Данный индекс в собственности простому файлу, обладатель которого — mjb и размер которого 6030 байт. Совокупность разрешает пользователю mjb создавать чтение, исполнение и запись файла; участникам группы os и всем остальным пользователям разрешается лишь просматривать либо выполнять файл, но не записывать в него эти. Последний раз файл был прочтён 23 октября 1984 года в 13:45, запись последний раз производилась 22 октября 1984 года в 10:30.

Индекс изменялся последний раз 23 октября 1984 года в 13:30, не смотря на то, что никакая информация сейчас в файл не записывалась. Ядро кодирует все перечисленные выше данные в индексе. Обратите внимание на различие в записи на диск содержимого файла и содержимого индекса.

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

Копия индекса в памяти, не считая полей дискового индекса, включает в себя и следующие поля:

  • Состояние индекса в памяти, отражающее
  • заблокирован ли индекс,
  • ожидает ли снятия блокировки с индекса какой-либо процесс,
  • отличается ли представление индекса в памяти от собственной дисковой копии в следствии трансформации содержимого индекса,
  • отличается ли представление индекса в памяти от собственной дисковой копии в следствии трансформации содержимого файла,
  • находится ли файл в верхней точке (см. раздел 5.15 ).
  • Логический номер устройства файловой совокупности, содержащей файл.
  • Номер индекса. Так как индексы на диске сохраняются в линейном массиве (см. раздел 2.2.1 ), ядро идентифицирует номер дискового индекса по его расположению в массиве. В дисковом индексе это поле не требуется.
  • Указатели на другие индексы в памяти. Ядро связывает индексы в хеш-очереди и включает их в перечень свободных индексов подобно тому, как связывает буферы в буферные хеш-очереди и включает их в перечень свободных буферов. Хеш-очередь идентифицируется в соответствии с номером индекса и логическим номером устройства. Ядро может располагать в памяти не более одной копии данного дискового индекса, но индексы смогут пребывать в один момент как в хеш-очереди, так и в перечне свободных индексов.
  • Счетчик ссылок, означающий количество активных экземпляров файла (таких, каковые открыты).

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

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

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

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

Ядро идентифицирует индексы по имени файловой совокупности и номеру индекса и выделяет индексы в памяти по запросам соответствующих методов. Метод iget назначает индексу место для

копии в памяти (Рисунок 4.3 ); он практически аналогичен методу getblk для поиска дискового блока в буферном кеше. Ядро преобразует индекса и номера устройства в имя хеш-очереди и просматривает эту хеш-очередь в отыскивании индекса. В случае если индекс не найден, ядро выделяет его из перечня свободных индексов и блокирует его. После этого ядро подготавливается к чтению с диска в память индекса, к которому оно обращается.

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

где операция деления возвращает целую часть частного. К примеру, предположим, что блок 2 есть начальным в перечне индексов и что в каждом блоке помещаются 8 индексов, тогда индекс с номером 8 находится в блоке 2, а индекс с номером 9 — в блоке 3. В случае если же в дисковом блоке помещаются 16 индексов, тогда индексы с номерами 8 и 9 находятся в дисковом блоке с номером 2, а индекс с номером 17 есть первым индексом в дисковом блоке 3.

Рисунок 4.3. Метод выделения индексов в памяти

В случае если ядро знает дискового блока и номера устройства, оно просматривает блок, применяя метод bread (глава 2 ), после этого вычисляет смещение индекса в байтах в блока по формуле:

К примеру, в случае если любой дисковый индекс занимает 64 байта и в блоке помещаются 8 индексов, тогда индекс с номером 8 имеет адрес со смещением 448 байт от начала дискового блока. Ядро убирает индекс в памяти из перечня свободных индексов, помещает его в соответствующую хеш-очередь и устанавливает значение счетчика ссылок равным 1. Ядро переписывает владельца типа файла и поля файла, установки прав доступа, число указателей на файл, размер файла и таблицу адресов из дискового индекса в память и возвращает заблокированный в памяти индекс.

Ядро манипулирует с счётчиком ссылок и блокировкой индекса независимо один от другого. Блокировка — это установка, которая действует на время исполнения системного вызова и имеет целью запретить вторым процессам обращаться к индексу до тех пор пока тот в работе (и вероятно хранит противоречивые эти). Ядро снимает блокировку по окончании обработки системного вызова: блокировка индекса ни при каких обстоятельствах не выходит за границы системного вызова.

Ядро увеличивает значение счетчика ссылок с возникновением каждой активной ссылки на файл. К примеру, в разделе 5.1 будет продемонстрировано, как ядро увеличивает значение счетчика ссылок тогда, в то время, когда процесс открывает файл. Оно сокращает значение счетчика ссылок лишь тогда, в то время, когда ссылка делается неактивной, к примеру, в то время, когда процесс закрывает файл.

Так, установка счетчика ссылок сохраняется для множества системных вызовов. Блокировка снимается между двумя обращениями к ОС, дабы разрешить процессам в один момент создавать поделённый доступ к файлу; установка счетчика ссылок действует между обращениями к ОС, дабы предотвратить переназначение ядром активного в памяти индекса. Так, ядро может заблокировать и разблокировать выделенный индекс независимо от значения счетчика ссылок. освобождением и Выделением индексов занимаются и хорошие от open системные операции, в чем мы и убедимся в главе 5.

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

Процессы осуществляют контроль выделение индексов на пользовательском уровне при помощи запуска системных операций open и close и исходя из этого ядро не имеет возможности обеспечивать момент, в то время, когда индекс станет дешёвым. Следовательно, процесс, приостанавливающий собственный исполнение в ожидании освобождения индекса, может ни при каких обстоятельствах не возобновиться. Ядро скорее прервет исполнение системного вызова, чем покинет таковой процесс в зависшем состоянии. Но, процессы не имеют для того чтобы контроля над буферами.

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

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

В то время, когда позднее процесс B разблокирует индекс, он разбудит все процессы (включая процесс A), ожидающие освобождения индекса. В то время, когда же наконец процесс A сможет применять индекс, он заблокирует его, дабы другие процессы не могли к нему обратиться. В случае если первоначально счетчик ссылок имел значение, равное 0, индекс кроме этого покажется в перечне свободных индексов, исходя из этого ядро уберет его оттуда: индекс больше не есть свободным.

Ядро увеличивает значение счетчика ссылок и возвращает заблокированный индекс.

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

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

Рисунок 4.4. Освобождение индекса

В том случае, в то время, когда ядро освобождает индекс (метод iput, Рисунок 4.4 ), оно сокращает значение счетчика ссылок для него. В случае если это значение делается равным 0, ядро переписывает индекс на диск в том случае, в то время, когда копия индекса в памяти отличается от дискового индекса. Они различаются, в случае если изменилось содержимое файла, в случае если к файлу производилось обращение либо в случае если изменились обладатель файла или права доступа к файлу.

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

Источник: citforum.ru

Почта России Зачем нужен индекс?

Важное на сайте:

Самые интересные результаты статей, подобранные именно по Вашим интересам: