stringtranslate.com

Manejar (informática)

En programación de computadoras , un identificador es una referencia abstracta a un recurso que se utiliza cuando el software de aplicación hace referencia a bloques de memoria u objetos administrados por otro sistema, como una base de datos o un sistema operativo .

Un identificador de recurso puede ser un identificador opaco , en cuyo caso suele ser un número entero (a menudo un índice de matriz en una matriz o "tabla" que se utiliza para administrar ese tipo de recurso), o puede ser un puntero que permite el acceso. para obtener más información. Los identificadores de recursos comunes incluyen descriptores de archivos , sockets de red , conexiones de bases de datos , identificadores de procesos (PID) e ID de trabajos . Los PID y los ID de trabajo son números enteros explícitamente visibles; Si bien los descriptores de archivos y los sockets (que a menudo se implementan como una forma de descriptor de archivo) se representan como números enteros, normalmente se consideran opacos. En las implementaciones tradicionales, los descriptores de archivos son índices en una tabla de descriptores de archivos (por proceso) , y de ahí en una tabla de archivos (para todo el sistema) .

Comparación con punteros

Mientras que un puntero contiene la dirección del elemento al que hace referencia, un identificador es una abstracción de una referencia que se gestiona externamente; su opacidad permite que el sistema reubique el referente en la memoria sin invalidar el identificador, lo que la hace similar a la memoria virtual para punteros, pero aún más abstracta. De manera similar, la capa adicional de indirección también aumenta el control que el sistema de gestión tiene sobre las operaciones realizadas en el referente. Normalmente, el identificador es un índice o un puntero a una matriz global de lápidas .

Una fuga de identificador es un tipo de error de software que ocurre cuando un programa de computadora no libera un identificador que asignó previamente. Esta es una forma de pérdida de recursos , análoga a una pérdida de memoria para la memoria previamente asignada.

Seguridad

En términos de informática segura , debido a que el acceso a un recurso a través de un identificador está mediado por otro sistema, un identificador funciona como una capacidad : no solo identifica un objeto, sino que también asocia derechos de acceso . Por ejemplo, mientras que un nombre de archivo se puede falsificar (es solo un identificador adivinable), un sistema externo le da un identificador a un usuario y, por lo tanto, representa no solo la identidad, sino también el acceso concedido .

Por ejemplo, si un programa desea leer el archivo de contraseña del sistema ( /etc/passwd) en modo lectura/escritura ( O_RDWR), podría intentar abrir el archivo mediante la siguiente llamada:

int fd = abrir ( "/etc/contraseña" , O_RDWR );    

Esta llamada solicita al sistema operativo que abra el archivo especificado con los derechos de acceso especificados. Si el sistema operativo lo permite, abre el archivo (crea una entrada en la tabla de descriptores de archivos por proceso ) y devuelve un identificador (descriptor de archivo, índice en esta tabla) al usuario: el acceso real lo controla el sistema operativo, y el mango es una muestra de ello. Por el contrario, el sistema operativo puede denegar el acceso y, por lo tanto, no abrir el archivo ni devolver un identificador.

En un sistema basado en capacidades, se pueden pasar identificadores entre procesos, con derechos de acceso asociados. Tenga en cuenta que en estos casos el identificador debe ser algo distinto de un entero pequeño único en todo el sistema; de lo contrario, es falsificable. No obstante, dicho número entero puede usarse para identificar una capacidad dentro de un proceso; por ejemplo, un descriptor de archivo en Linux no se puede falsificar porque su valor numérico por sí solo no tiene sentido y sólo en el contexto del proceso puede referirse a algo. Sin embargo, transferir dicho identificador requiere especial cuidado, ya que su valor a menudo tiene que ser diferente en los procesos de envío y recepción.

Por otra parte, en los sistemas no basados ​​en capacidades, cada proceso debe adquirir su propio identificador independiente, especificando la identidad del recurso y los derechos de acceso deseados (por ejemplo, cada proceso debe abrir un archivo por sí mismo, dando el nombre del archivo y modo de acceso). Este uso es más común incluso en sistemas modernos que admiten el paso de identificadores, pero está sujeto a vulnerabilidades como el problema del adjunto confuso .

Ejemplos

Los identificadores eran una solución popular para la gestión de la memoria en los sistemas operativos de la década de 1990, como Mac OS [1] y Windows . La estructura de datos FILE en la biblioteca de E/S estándar de C es un identificador de archivo , que se abstrae de la representación del archivo subyacente (en Unix , estos son descriptores de archivo ). Al igual que otros entornos de escritorio , la API de Windows utiliza en gran medida identificadores para representar objetos en el sistema y proporcionar una vía de comunicación entre el sistema operativo y el espacio del usuario . Por ejemplo, una ventana en el escritorio está representada por un identificador de tipo HWND(identificador, ventana).

Los identificadores doblemente indirectos (donde el identificador no es necesariamente un puntero sino que podría ser, por ejemplo, un número entero) han caído en desgracia en los últimos tiempos, ya que los aumentos en la memoria disponible y los algoritmos de memoria virtual mejorados han hecho que el uso del puntero más simple sea más fácil. atractivo. Sin embargo, muchos sistemas operativos todavía aplican el término a punteros a estructuras de datos opacas y "privadas" ( punteros opacos ) o a índices en matrices internas pasadas de un proceso a su cliente .

Ver también

Referencias

  1. ^ Hertzfeld, Andy (enero de 1982), The Original Macintosh: húngaro , consultado el 10 de mayo de 2010

enlaces externos