Gerenciamento de conexão e estrutura de arquivos

Há seis estruturas de dados fundamentais usadas pelo RDBSS para gerenciar conexões e estruturas de arquivos. Essas estruturas de dados são usadas internamente pelo RDBSS e pelos vários minidiretórios de rede. Há duas versões dessas estruturas de dados. A versão do minidiretório de rede contém campos que podem ser manipulados por um driver de minidiretório de rede. A versão do minidiretor de rede dessas estruturas de dados começa com o prefixo MRX_. A versão do RDBSS contém campos adicionais que só podem ser manipulados pelo RDBSS.

Essas seis estruturas de dados fundamentais são as seguintes:

  • SRV_CALL– contexto de chamada de servidor. Essa estrutura fornece a abstração para um servidor remoto.

  • NET_ROOT -net root. Essa estrutura abstrai uma conexão com um compartilhamento.

  • V_NET_ROOT – exibição de raízes líquidas (também conhecidas como netroots virtuais).

  • FCB – bloco de controle de arquivo. Essa estrutura representa um arquivo aberto em um compartilhamento.

  • SRV_OPEN – contexto aberto do lado do servidor. Essa estrutura encapsula um identificador aberto no servidor.

  • FOBX – extensão de objeto de arquivo. Essa estrutura é uma extensão RDBSS para a estrutura FILE_OBJECT .

Essas estruturas de dados são organizadas na seguinte hierarquia:

                SRV_CALL 
     FCB   <------> NET_ROOT
        SRV_OPEN  <---> V_NET_ROOT
            FOBX
                FILE_OBJECT

Em resposta a chamadas do sistema de arquivos kernel, o RDBSS normalmente cria e finaliza para um driver de minidiretório de rede todas as estruturas mencionadas anteriormente, exceto a estrutura FOBX. Portanto, um driver de minidiretório de rede normalmente chamará apenas algumas das rotinas rdbss usadas para gerenciamento de conexão e estrutura de arquivos. A maioria dessas rotinas é chamada internamente pelo RDBSS.

Todas essas estruturas de dados são contadas por referência. As contagens de referência em uma estrutura de dados são as seguintes:

Estrutura de Dados Descrição da contagem de referências

SRV_CALL

O número de entradas NET_ROOT que apontam para SRV_CALL, além de algum valor dinâmico.

NET_ROOT

O número de entradas fcb e entradas V_NET_ROOT que apontam para NET_ROOT, além de algum valor dinâmico.

V_NET_ROOT

O número de entradas SRV_OPEN que apontam para V_NET_ROOT, além de algum valor dinâmico.

FCB

O número de entradas SRV_OPEN que apontam para FCB, além de algum valor dinâmico.

SRV_OPEN

O número de entradas FOBX que apontam para SRV_OPEN, além de algum valor dinâmico.

FOBX

Algum valor dinâmico.

Em cada caso, o valor dinâmico refere-se ao número de chamadores que referenciaram a estrutura sem desreferenciar. A parte estática da contagem de referência é mantida pelas próprias rotinas. Por exemplo, RxCreateNetRoot incrementa a contagem de referência para a estrutura de SRV_CALL associada.

Chamadas de referência e pesquisas bem-sucedidas incrementam as contagens de referência; desreference chama decrementa a contagem. Criar chamadas de rotina aloca uma estrutura e definir a contagem de referência como 1.

A contagem de referência associada a qualquer estrutura de dados é pelo menos 1 mais o número de instâncias da estrutura de dados no próximo nível inferior associado a ela. Por exemplo, a contagem de referência associada a uma SRV_CALL, que tem duas NET_ROOTs associadas a ela, é pelo menos 3. Além das referências mantidas pelas estruturas NameTable internas do RDBSS e pela estrutura de dados no próximo nível inferior, há referências adicionais que podem ter sido adquiridas.

Essas restrições garantem que uma estrutura de dados em qualquer nível específico não possa ser finalizada (liberada e o bloco de memória associado liberado) até que todas as estruturas de dados no próximo nível abaixo tenham sido finalizadas ou tenham liberado suas referências. Por exemplo, se uma referência a um FCB for mantida, será seguro acessar as estruturas de V_NET_ROOT, NET_ROOT e SRV_CALL associadas a ela.

As duas abstrações importantes usadas na interface entre os minidiretores de rede e o RDBSS são SRV_CALL e NET_ROOT estruturas. Uma estrutura SRV_CALL corresponde ao contexto associado a um servidor com o qual uma conexão foi estabelecida e a estrutura NET_ROOT corresponde a um compartilhamento em um servidor (isso também pode ser exibido como uma parte do namespace, que foi reivindicado por um minidiretório de rede).

A criação de estruturas de SRV_CALL e NET_ROOT normalmente envolve pelo menos uma viagem de ida e volta de rede. Para fornecer operações assíncronas para continuar, essas operações são modeladas como uma atividade de duas fases. Cada chamada para um minidiretório de rede para criar um SRV_CALL e uma estrutura de NET_ROOT é acompanhada por uma chamada do minidiretório de rede para o RDBSS para notificar o status de conclusão da solicitação. Atualmente, elas são síncronas.

A criação de uma estrutura de SRV_CALL é ainda mais complicada pelo fato de que o RDBSS deve escolher entre vários minidiretórios de rede para estabelecer uma conexão com um servidor. Para fornecer ao RDBSS máxima flexibilidade na escolha do minidiretório de rede que ele deseja implantar, a criação de uma estrutura de SRV_CALL envolve uma terceira fase na qual o RDBSS notifica o minidiretório de rede de um vencedor. Todos os minidiretórios de rede perdedores destroem o contexto associado.

Esta seção contém os seguintes tópicos:

A estrutura SRV_CALL

A estrutura NET_ROOT

A estrutura V_NET_ROOT

A estrutura FCB

A estrutura SRV_OPEN

A estrutura FOBX

Conexões e bloqueio de estrutura de arquivo

Rotinas de gerenciamento de blocos de conexão e controle de arquivos