Эта статья требует дополнительных ссылок для проверки . ( апрель 2014 г. ) ( Узнайте, как и когда удалить это сообщение-шаблон ) |
В компьютерном программировании , ручка является абстрактной ссылкой на ресурс , который используется , когда прикладное программное обеспечение ссылка блоки памяти или объектов, которые управляются с помощью другой системы , как базы данных или операционной система .
Дескриптор ресурса может быть непрозрачным идентификатором , и в этом случае это часто целое число (часто индекс массива в массиве или «таблице», который используется для управления этим типом ресурса), или это может быть указатель, который разрешает доступ к дополнительной информации. Распространенные дескрипторы ресурсов включают дескрипторы файлов , сетевые сокеты , соединения с базой данных , идентификаторы процессов (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
(ручка, окно).
Двойные косвенные дескрипторы в последнее время потеряли популярность , поскольку увеличение доступной памяти и улучшенные алгоритмы виртуальной памяти сделали использование более простого указателя более привлекательным. Однако во многих операционных системах этот термин по-прежнему применяется к указателям на непрозрачные, «частные» структуры данных - непрозрачным указателям - или к индексам внутренних массивов, передаваемых от одного процесса к его клиенту .
См. Также [ править ]
- Пул памяти
- Слабая ссылка
Ссылки [ править ]
- ^ Hertzfeld, Энди (январь 1982), The Original Macintosh: венгерский , извлекаться 2010-05-10 CS1 maint: обескураженный параметр ( ссылка )
Внешние ссылки [ править ]
- Выходя за рамки Windows: ручки