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
Почта России Зачем нужен индекс?
Важное на сайте:
- Чем отличается дилер от дистрибьютора
- Чем отличается торговля фьючерсами от forex / форекс.
- Чем торгуют на бирже
- Чем торгуют на рынке forex
- Чему равно число фибоначчи
Самые интересные результаты статей, подобранные именно по Вашим интересам:
-
Что такое индекс на банковской карте
Разбираемся с индексами на базе битовых карт Джонатан Льюис (Jonathan Lewis) Индексы на базе битовых карт — великое благо для некоторых видов приложений,…
-
Автоматическое определение Гугл PageRank для перечня сайтов Компоненты пакета Бесплатную демо версию Полную версию Модуль PageRank анализатор…
-
Индекс производительности windows или что «тормозит» ваш компьютер?
Пятница, 24 Августа 2012 г. 21:06 + в цитатник Желаете узнать, какая из комплектующих компьютера больше вторых воздействует на скорость работы, быть…
-
Что такое индекс массы тела имт
Индекс массы тела [ править ] Диаграмма индекса массы тела Для характеристики массы тела громаднейшее распространение на данный момент взял (ИМТ) — это…
-
Анализ крови на протромбиновый индекс
Анализ крови для обнаружения величины протромбинового индекса назначается для оценки состояния совокупности свертывания крови. Возможно низкий либо…
-
Как узнать индекс своего дома?
Anna Pupchenko 7-02-2014, 17:16 9117 Технический прогресс движется с таковой скоростью, и без того глубоко воздействует на людскую восприятие окружающего…