Лучшие вопросы
Таймлайн
Чат
Перспективы
Дескриптор (программирование)
Из Википедии, свободной энциклопедии
Remove ads
Дескриптор или хэндл (англ. handle — 'рукоять') — это абстрактная ссылка на ресурс[англ.], которая используется, когда программа обращается к блокам памяти или объектам, которыми управляет другая система, например, база данных или операционная система.
Дескриптор ресурса может быть непрозрачным[англ.] идентификатором, часто представляющим собой целое число (часто индекс в массиве или «таблице», используемой для управления данным типом ресурсов), или это может быть указатель, который позволяет получить дальнейшую информацию. К распространённым дескрипторам ресурсов[1] относятся файловые дескрипторы[2][3], сетевые сокеты, соединением с базой данных[англ.], идентификаторы процессов (PIDs) и ID заданий. Идентификаторы процессов и заданий являются явно видимыми целыми числами. Файловые дескрипторы и сокеты (часто реализуемые как разновидность файловых дескрипторов) также представлены числами, но обычно считаются непрозрачными. В традиционных реализациях файловые дескрипторы служат индексами в таблице файловых дескрипторов(для каждого процесса), которая, в свою очередь, ссылается на системную таблицу файлов.
Remove ads
Дескрипторы и указатели
В то время как указатель содержит адрес объекта, на который он ссылается, дескриптор является абстракцией ссылки, управляемой извне. Его непрозрачность позволяет системе перемещать объект, на который он ссылается, в памяти, не делая сам дескриптор недействительным, что похоже на виртуальную память для указателей, но ещё более абстрактно. Аналогично, дополнительный уровень косвенности[англ.] увеличивает контроль управляющей системы над операциями, выполняемыми над объектом. Обычно дескриптор представляет собой индекс или указатель в глобальный массив «надгробий»[англ.][4].
Утечка дескрипторов[англ.] — это тип программной ошибки, возникающий, когда компьютерная программа не освобождает ранее выделенный ею дескриптор[5][6]. Это форма утечки ресурсов[англ.], аналогичная утечке ранее выделенной памяти.
Remove ads
Безопасность
Суммиров вкратце
Перспектива
В терминах компьютерной безопасности, поскольку доступ к ресурсу через дескриптор осуществляется другим системным компонентом, дескриптор функционирует как полномочия — он не только идентифицирует объект, но и определяет права доступа к нему. Например, если имя файла может быть подделано (это просто угадываемый идентификатор), то дескриптор выдаётся пользователю внешней системой и, следовательно, представляет собой не только идентификацию, но и предоставленный доступ.
Например, если программа хочет прочитать системный файл паролей (/etc/passwd) в режиме чтения/записи (O_RDWR), она может попытаться открыть файл с помощью следующего вызова:
int fd = open("/etc/passwd", O_RDWR);
Этот вызов просит операционную систему открыть указанный файл с заданными правами доступа. Если ОС разрешает это, она открывает файл (создаёт запись в таблице файловых дескрипторов процесса) и возвращает пользователю дескриптор (дескриптор файла, индекс в таблице). Фактический доступ контролируется операционной системой, а дескриптор является маркером доступа (токеном) к файлу. В противном случае ОС может отказать в доступе, не открывая файл и не возвращая дескриптор[7].
В системе, основанной на полномочиях, дескрипторы могут передаваться между процессами вместе с соответствующими правами доступа. В таких случаях дескриптор должен быть чем-то иным, чем общесистемно уникальное малое целое число, иначе его можно подделать. Тем не менее, такое целое число может использоваться для идентификации возможности внутри процесса; например, файловый дескриптор в Linux не подделывается, потому что его числовое значение само по себе бессмысленно, и только в контексте процесса оно может ссылаться на что-либо. Передача такого дескриптора требует особой осторожности, поскольку его значение часто должно отличаться в отправляющем и принимающем процессах.
В системах, не основанных на полномочиях, напротив, каждый процесс должен получить собственный отдельный дескриптор, указав идентификатор ресурса и желаемые права доступа (например, каждый процесс должен сам открыть файл, указав его имя и режим доступа). Такое использование встречается чаще даже в современных системах, поддерживающих передачу дескрипторов, но оно подвержено уязвимостям, таким как проблема обманутого посредника[8][9].
Remove ads
Примеры
Дескрипторы были популярным решением для управления памятью в операционных системах 1990-х годов, таких как Mac OS[англ.][10] и Windows. В стандартной библиотеке ввода-вывода языка Си файл определяется файловым дескриптором, абстрагирующим от нижележащего представления файла[11]. Как и другие среды рабочего стола, Windows API активно использует дескрипторы для представления объектов в системе и обеспечения пути связи между операционной системой и пользовательским пространством. Например, окно на рабочем столе представлено дескриптором типа HWND (дескриптор окна)[12].
Двойные косвенные дескрипторы (где дескриптор не обязательно является указателем, а может быть, например, целым числом) в последнее время вышли из употребления, поскольку увеличение доступной памяти и улучшенные алгоритмы виртуальной памяти сделали использование более простого указателя более привлекательным. Однако многие операционные системы по-прежнему применяют этот термин к указателям на непрозрачные, «приватные» структуры данных — непрозрачные указатели — или к индексам во внутренних массивах, передаваемых от процесса его клиенту.
См. также
- Пул памяти[англ.]
- Слабая ссылка
- Система дескрипторов[англ.]
Примечания
Ссылки
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads