Понятия дескрипторов, идентификаторов и хэндлов

ПРОГРАММНЫЙ ДОСТУП К ФАЙЛОВОЙ СИСТЕМЕ

Операционная система управляет множеством информационных объектов, необходимых для осуществления ее функций. Простейшей разновидностью этих объектов, присутствующих даже в самых примитивных ОС, являются файлы. В многозадачной ОС число типов таких объектов приближается к десяти, а вместе с типами объектов графической оболочки их оказывается еще больше. Мы будем изучать внутренние объекты операционной системы постепенно, отталкиваясь от понятия файла. Напомним, что файлом называется именованный информационный объект, хранимый в компьютере даже тогда, когда последний выключен. Иначе говоря, файл – это информационный объект длительного хранения, имеющий наименование, легко доступное пользователю, и который может быть перенесен с одного внутреннего места хранения в другое, в частности с одного компьютера на другой или просто на внешний носитель информации (например дискету).

С файлами программист встречается с первых своих шагов, но ему не заметно, как собственно операционная система справляется с обслуживанием файлов. В то же время с этих первых шагов ему становится известно, что для использования файла в программе его нужно открыть. Широко известным, хотя часто не замечаемым фактом, является то, что в цивилизованном обществе управлять людьми и экономическими объектами оказывается возможным только с помощью учетной информации, в качестве которой используются паспорта и документы. Аналогично этому во внутреннем мире операционной системы для управления теми же файлами создается и используется учетная информация, которую называют File Control Block или другим аналогичным образом. Терминологическое обозначение может меняться от одной ОС к другой, так как зависит от произвола создателей такой истемы. Для нас главное, что управление файлами при их "внутрикомпьютерной жизни" использует аналоги паспорта. Когда файл просто записан на дискете или жестком диске, в такой учетной информации нет необходимости.

По существу открытие файла и заключается в создании управляющего блока. Для ясного представления желательно знать, что содержится в этом блоке. Там, как минимум, содержится информация о следующем месте чтения из файла или записи в файл. (Напомним, что чтение из файла и запись в него автоматически выполняются последовательно, как на магнитную ленту, от использования которой файлы и произошли.) Программистам известно, что место следующего обращения к файлу можно изменить с помощью специальной функции, обычно называемой SEEK или каким-либо производным от этого слова. В действительности такие функции приводят к изменению параметра именно в управляющем блоке файла, но вовсе не в самом файле. Другим параметром управляющего блока файла служит вид доступа, задаваемый при его открытии (будет ли использоваться файл для чтения, для записи или обеих этих операций). В действительности управляющий блок файла может содержать и, как правило, содержит информацию о месте размещения файла или начале его размещения, позволяющую быстро добраться до его содержимого, но такая информация более важна для внутренних процедур работы с файлами и мы на ней не будем заострять внимание.

Управляющий блок файла – это служебная структура данных, необходимая для управления файлом средствами операционной системы. У вдумчивого программиста возникает вопрос, где же находится эта информация. Возможны два принципиальных решения его: эти структуры данных могут находиться в пределах самой исполняемой программы (ее области данных) и описываться в ней, либо размещаться в служебных областях, доступных только операционной системе. Первое решение использовалось в ранних ОС и помимо дополнительных усилий от программиста (по заданию экземпляров таких структур) оно имело такой недостаток, как возможность непреднамеренного изменения данных структур в результате ошибок программиста и его программы. Поэтому от него, как более трудоемкого и, главное, менее надежного решения, позже отказались. (В частности, в первых версиях MS DOS были системные функции работы с файлами с помощью FCB блоков, которые существовали и позже, но настойчиво не рекомендовались для использования.)

Практическая реализация второго подхода к размещению управляющих блоков файлов появилась вначале в ОС Unix и базируется на понятии хэндла. В этом подходе управляющие блоки размещаются в служебной области операционной системы, причем, как правило, в виде таблицы, и для доступа к ним используется номер строк такой таблицы (порядковый номер управляющего блока во внутренней таблице управляющих блоков для выполняемой программы). Этот номер строк таблицы управляющих блоков и называют handle. Иным наименованием для хэндла, использовавшимся как раз в Unix, служит слово дескриптор или (в русском переводе) описатель. Термин "дескриптор", хотя и является традиционным в операционной системе Unix, на самом деле вызывает ложные аналогии. В действительности его целесообразней применять как синоним управляющего блока, так как именно в последнем содержится учетная информация, описывающая файл и необходимая для выполнения файловых операций. Для операций над файлом при обращении к системной функции в качестве одного из параметров вызова используется значение такого хэндла. По этому значению подпрограмма ОС обращается к соответствующей строке таблицы управляющих блоков и использует информацию из управляющего блока, отвечающего этой строке.

Таким образом, хэндл с внешней (поверхностной) стороны – просто некоторый специальный номер для выполнения операций с конкретным открытым файлом. Более существенным его пониманием, важным для более сложных ситуаций использования, должно быть осознание, что на самом деле этому номеру – хэндлу однозначно соответствует строка специальной таблицы управляющих блоков, которая и дает необходимую информацию для оперативной работы с файлом. Заметим, что английское слово handle переводится на русский язык как ручка, рукоять, но в этом "родном" значении оно не привилось в технической информатике (оказывается удобней использовать чисто фонетический перенос исходного названия вместо применения оборотов русского технического языка вроде "возьмем ручку файла", хотя для англоязычного слушателя и читателя этот оборот звучит именно так).

В переводной технической литературе по программированию встречается перевод термина handle словом идентификатор. (Заметим, что последнее слово также не русского происхождения.) Этим закладывается некоторая сумятица в умы начинающих программистов, так как сложившееся использование термина identificator относится к принципиально иным информационным объектам. Идентификатор позволяет однозначно обозначить некоторый объект. Хэндлы же различных по содержанию и собственному названию файлов могут быть одинаковыми. Причем одинаковыми в один и тот же момент работы компьютера. Такие ситуации имеют место, когда в компьютере выполняется несколько программ одновременно (несколько программ начали свое выполнение, но еще не завершились). В этих выполняемых программах очень часто оказываются одинаковые значения хэндлов (как номеров строк текущих таблиц дескрипторов) по той причине, что для каждой выполняемой программы (точнее вычислительного процесса) операционная система создает и поддерживает свою собственную таблицу дескрипторов файлов. Поэтому одинаковые номера строк таких таблиц содержат различную информацию.

В некоторых ОС термин идентификатор (правда для более сложных объектов, чем дескриптор файла) используется независимо от термина хэндл и обозначает действительно уникальное в данной операционной системе условное обозначение сложного объекта. Позже идентификаторы сложных системных объектов будут рассматриваться при изучении параллельных процессов в современных операционных системах.