Handle (informática)
Na programação de computadores, um handle ou uma alça é uma referência abstrata a um recurso usado quando o software aplicativo faz referência a blocos de memória ou objetos gerenciados por outro sistema informático, como um banco de dados ou um sistema operacional .
Um identificador de recurso pode ser um identificador opaco, caso em que é sempre um número inteiro (número de vezes que um índice de matriz em uma matriz ou "tabela" que é usado para gerenciar esse tipo de recurso), ou pode ser um ponteiro que permite o acesso a informações adicionais. As alças de recursos comuns incluem descritores de arquivos, sockets de rede, conexões de banco de dados, identificadores de processo (Pid), e Identificações de trabalho. PIDs e Identificações de trabalho são explicitamente números inteiros visíveis ; enquanto descritores de arquivos e sockets (que são frequentemente implementados como uma forma de descritor de arquivo) são representados como números inteiros, eles normalmente são consideradas opacas. Nas implementações tradicionais, descritores de arquivo são os índices em um (por processo) arquivo de descritor de tabela, dali uma tabela de arquivos (sistema-amplo).
Comparação com ponteiros
editarEnquanto um ponteiro contém o endereço do item ao qual ele se refere, um identificador é uma abstração de uma referência que é gerenciada externamente; a sua opacidade permite que o referente seja realocado na memória pelo sistema sem invalidar o identificador, o que é impossível com ponteiros. A camada extra de indireção também aumenta o controle que o sistema de gerenciamento tem sobre as operações realizadas no referente. Normalmente, o identificador é um índice ou um ponteiro para uma matriz global de lápides .
Uma alça de vazamento de identificador é um tipo de bug de software que ocorre quando um programa de computador solicita um identificador para um recurso, mas não libera o identificador quando não é mais usado; essa é uma forma de vazamento de recurso, semelhante a um vazamento de memória de um ponteiro para a memória.
Segurança
editarNos termos de computação segura, porque o acesso a um recurso através de um identificador é mediada por um outro sistema, um identificador funciona como uma capacidade: ele não só identifica um objeto, mas também associa direitos de acesso. Por exemplo, enquanto um nome de arquivo é imprevisto (que é apenas uma adivinhação do identificador), um identificador é dada a um usuário por um sistema externo, e, portanto, representa não apenas a identidade, mas também o acesso concedido.
Por exemplo, se um programa deseja ler a senha do sistema de arquivos (/etc/passwd) em modo de leitura/escrita (O_RDWR
), ele pode tentar abrir o arquivo através do seguinte chamada :
int fd = open("/etc/passwd", O_RDWR);
Esta chamada solicita ao sistema operacional para abrir o arquivo especificado com o especificado nos direitos de acesso. Se o SO permite isso, em seguida, abre o arquivo (cria uma entrada no por-processo de arquivo de descritor de tabela) e retorna um identificador (descritor de arquivo, índice nesta tabela) para o usuário: o real, o acesso é controlado pelo sistema operacional, e a alça é um token disso. Por outro lado, o SO pode negar o acesso, e, portanto, nem abrir o arquivo nem retornar um identificador .
Em um recurso de sistema baseado em alças podem ser passados entre os processos, com os respectivos direitos de acesso. Note que, nesses casos, o identificador deve ser algo diferente de um integral geral do sistema único de pequeno inteiro, caso contrário, é esquecivel. Como um inteiro pode, todavia, ser utilizado para identificar um recurso dentro de um processo; por exemplo, descritor de arquivo no Linux é imprevisto porque o seu valor numérico sózinho é sem sentido, e só no contexto de processo pode se referir a qualquer coisa. A transferência desse um identificador requer cuidados especiais, porém, como o seu valor, muitas vezes, tem que ser diferente no envio e recebimento de processos.
Em sistemas não baseados em capacidade, por outro lado, cada processo deve adquirir o seu próprio identificador separado, especificando a identidade do recurso e os direitos de acesso desejados ( por exemplo, cada processo deve abrir um arquivo, fornecendo o nome do arquivo e modo de acesso) . Esse uso é mais comum mesmo em sistemas modernos que suportam identificadores de passagem, mas está sujeito a vulnerabilidades, como o problema confuso do deputado .
Exemplos
editarOs manipuladores eram uma solução popular para gerenciamento de memória em sistemas operacionais da década de 1980, como Mac OS[1] e Windows . A estrutura de dados FILE na biblioteca de E / S padrão C é um identificador de arquivo, abstraindo da representação de arquivo subjacente (no Unix, esses são descritores de arquivo ). Como outros ambientes de área de trabalho, a API do Windows usa muito identificadores para representar objetos no sistema e fornecer um caminho de comunicação entre o sistema operacional e o espaço do usuário . Por exemplo, uma janela na área de trabalho é representada por um identificador do tipo HWND (identificador, janela) .
Os identificadores duplamente indiretos caíram em desuso nos últimos tempos, à medida que os aumentos na memória disponível e os algoritmos aprimorados de memória virtual tornaram o uso do ponteiro mais simples mais atraente. No entanto, muitos sistemas operacionais ainda aplicam o termo a ponteiros para estruturas de dados "privadas" opacas - ponteiros opacos - ou para índices em matrizes internas passadas de um processo para seu cliente.
Referências
- ↑ Hertzfeld, Andy (Janeiro de 1982), The Original Macintosh: Hungarian, consultado em 10 de maio de 2010