Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Дескриптор ресурса может быть непрозрачным идентификатором , и в этом случае это часто целое число (часто индекс массива в массиве или «таблице», который используется для управления этим типом ресурса), или это может быть указатель, который разрешает доступ к дополнительной информации. Распространенные дескрипторы ресурсов включают дескрипторы файлов , сетевые сокеты , соединения с базой данных , идентификаторы процессов (PID) и идентификаторы заданий.. Идентификаторы PID и задания являются явно видимыми целыми числами; в то время как файловые дескрипторы и сокеты (которые часто реализуются как форма файлового дескриптора) представлены как целые числа, они обычно считаются непрозрачными. В традиционных реализациях файловые дескрипторы представляют собой индексы в (для каждого процесса) таблице файловых дескрипторов , а оттуда в (для всей системы) файловую таблицу .

Сравнение с указателями [ править ]

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

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

Безопасность [ править ]

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

Например, если программа желает прочитать файл системного пароля ( /etc/passwd) в режиме чтения / записи ( O_RDWR), она может попытаться открыть файл с помощью следующего вызова:

int  fd  =  open ( "/ etc / passwd" ,  O_RDWR );

Этот вызов просит операционную систему открыть указанный файл с указанными правами доступа. Если ОС позволяет это, то она открывает файл (создает запись в таблице дескрипторов файла для каждого процесса ) и возвращает дескриптор (дескриптор файла, индекс в этой таблице) пользователю: фактический доступ контролируется ОС, и ручка является знаком этого. И наоборот, ОС может отказать в доступе и, таким образом, не открыть файл и не вернуть дескриптор.

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

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

Примеры [ править ]

Ручки были популярным решением для управления памятью в операционных системах 1980-х годов, таких как Mac OS [1] и Windows . Структура данных FILE в стандартной библиотеке ввода-вывода C - это дескриптор файла , абстрагирующийся от базового представления файла (в Unix это файловые дескрипторы ). Как и другие среды рабочего стола , Windows API активно использует дескрипторы для представления объектов в системе и обеспечения канала связи между операционной системой и пользовательским пространством . Например, окно на рабочем столе представлено дескриптором типаHWND (ручка, окно).

Двойные косвенные дескрипторы в последнее время потеряли популярность , поскольку увеличение доступной памяти и улучшенные алгоритмы виртуальной памяти сделали использование более простого указателя более привлекательным. Однако во многих операционных системах этот термин по-прежнему применяется к указателям на непрозрачные, «частные» структуры данных - непрозрачным указателям - или к индексам внутренних массивов, передаваемых от одного процесса к его клиенту .

См. Также [ править ]

  • Пул памяти
  • Слабая ссылка

Ссылки [ править ]

  1. ^ Hertzfeld, Энди (январь 1982), The Original Macintosh: венгерский , извлекаться 2010-05-10 CS1 maint: обескураженный параметр ( ссылка )

Внешние ссылки [ править ]

  • Выходя за рамки Windows: ручки