• Nenhum resultado encontrado

O servidor de arquivos centralizado foi projetado e implementado, para o

cluster, em outra dissertação de mestrado [PLE 01]. A função desse servidor é oferecer

aos processos clientes os serviços de acesso a informações armazenadas em disco. Quando o servidor de arquivos centralizado foi implementado, a interface da rede de trabalho e a interface da rede de controle ainda não haviam sido implementadas. Essas interfaces gerenciam respectivamente as redes de trabalho e de controle do

cluster. Desse modo, a interface da rede de trabalho, usada pelo servidor de arquivos,

foi implementada provisoriamente com sockets TCP/IP.

A figura 4.4 apresenta o servidor de arquivos centralizado, que tem como principais componentes: os processos clientes, o processo servidor de arquivos, a

interface do sistema e a interface da rede de trabalho. Nas próximas seções são descritos esses componentes.

Figura 4.4 – Servidor de arquivos centralizado. Figura retirada da dissertação de mestrado de PLENTZ [PLE 01].

4.4.1 Processos Clientes

Quando o processo cliente executa uma chamada de sistema, ele utiliza, para a maioria das chamadas de sistema relacionadas ao sistema de arquivos, a biblioteca

libcsa. Essa biblioteca implementa grande parte das chamadas de sistema relativas ao

sistema de arquivos do Linux, e é representada na figura 4.4 pela interface do sistema.

4.4.2 Interface do Sistema

A interface do sistema foi implementada para os processos clientes pela biblioteca libcsa, que substituiu parcialmente a biblioteca libc original do Linux. Os operadores dessa interface não são executados no nó de trabalho onde se localiza o processo cliente, mas empacotados em mensagens que são enviadas ao nó de trabalho que possui o servidor de arquivos.

As funções que representam as chamadas de sistema executadas pelos processos clientes e que foram implementadas na libcsa são: open, close, read, write, link, unlink,

symlink, truncate, lseek, ftruncate, chdir, rename, mkdir, rmdir, mknod, chown, dup, creat, access, stat, sync, chmod e utime. A função de cada uma dessas chamadas é

descrita na tabela 4.1. As outras chamadas de sistema que não foram implementadas nesta interface são executadas localmente a partir da biblioteca libc original do Linux.

Tabela 4.1 – Chamadas de sistema implementadas na libcsa.

access(nome, modo) Verifica se o usuário tem permissão para acessar o arquivo no modo especificado.

chdir(nome) Muda o nome do diretório de trabalho para nome. chmod(nome, modo) Muda as permissões de acesso de um arquivo.

chown(nome, owner, grp) Muda as propriedades do usuário e do grupo do usuário para o arquivo. close(fp) Fecha um arquivo aberto.

creat(nome, modo) Cria o arquivo nome com as permissões de acesso especificadas em modo. Se o arquivo já existir, tenta abrir o arquivo para as permissões especificadas em modo.

dup(fd) Duplica o descritor do arquivo fd, criando outro descritor que também aponta para o mesmo arquivo.

ftruncate(fd, length) Trunca o arquivo fd para o tamanho específico length.

link(nome, nome2) Cria uma nova entrada de diretório nome2 para um arquivo já existente nome.

lseek(fd, offset, whence) Move o ponteiro de leitura-escrita do arquivo fd para outra posição indicada por offset e whence..

mkdir(nome, modo) Cria o diretório nome especificando as permissões de uso.

mknod(nome, mode, dev) Cria a entrada de diretório nome (um nodo do sistema de arquivos), onde modo especifica as permissões de acesso e dev o tipo de nodo a ser criado. open(nome, flags) Tenta abrir o arquivo nome conforme as permissões de acesso especificadas

em flags.

read(fd, buffer, nbytes) Lê uma determinada quantidade de bytes do arquivo fd e os coloca num buffer.

rename(nome, nome2) Altera o nome de um arquivo para nome2. rmdir(pathname) Remove o diretório pathname se vazio.

stat(nome, buffer) Adquire os atributos do arquivo nome e coloca no buffer.

symlink(nome, nome2) Cria um novo nome para um arquivo. Criar um link simbólico chamado nome que conterá dentro dele nome2.

sync() Força a gravação de informações para o disco.

truncate(path, length) Trunca o arquivo path para um tamanho length específico. unlink(nome) Remove a entrada de diretório nome.

utime(nome, buffer) Retorna a data e a hora do último acesso e modificação do arquivo nome. write(fd, buffer, nbytes) Escreve nbytes de dados do buffer para o arquivo fd.

Para a execução das chamadas de sistema realizadas pelos clientes, os operadores da biblioteca libcsa interagem com o processo servidor de arquivos, através da troca de mensagens. Para cada chamada de sistema realizada por um processo cliente, é montada uma mensagem contendo a identificação da chamada de sistema e seus argumentos, a qual é enviada para o servidor de arquivos.

4.4.3 Servidor de Arquivos

O servidor de arquivos interage diretamente com a interface da rede de trabalho, desenvolvida provisoriamente com sockets TCP/IP, e usa a interface do sistema de arquivos local do Linux para atender as requisições dos clientes. Ele é implementado com processos regulares do Linux, executando em um único nó de trabalho.

O servidor de arquivos é baseado no modelo cliente/servidor. Desse modo, um cliente solicita a realização de um serviço, enviando uma mensagem ao servidor de arquivos. O cliente é suspenso enquanto o serviço é efetuado pelo servidor. Ao término da execução do serviço, os resultados são enviados ao cliente em uma mensagem. A partir daí, o cliente pode retomar sua execução.

4.4.4 Interface da Rede de Trabalho

A interface da rede de trabalho foi implementada provisoriamente com sockets TCP/IP [PLE 01]. Os operadores que compõem a interface provisória foram definidos em CORSO (1999) e são mostrados a seguir [PLE 01]:

• s_Send (proc, msg, length): Esse operador pode ser usado tanto por processos clientes quanto por processos servidores, para enviar ao processo proc a mensagem msg de tamanho length.

• s_Receive (proc, msg, length): Esse operador é usado pelo processo cliente para receber do processo proc (do servidor) a mensagem msg de tamanho lenght.

• s_ReceiveAny (proc, msg, length): Esse operador é usado pelo processo servidor para receber de um processo cliente qualquer a mensagem msg de tamanho lenght.

Esses três operadores foram implementados para realizar a comunicação entre os processos clientes e o servidor de arquivos centralizado. Assim, um cliente executa o operador s_Send para enviar uma requisição de serviço ao servidor de arquivos, seguido de s_Receive para a recepção da resposta do servidor. O servidor de arquivos executa o operador s_ReceiveAny para a recepção de uma requisição de serviço, e s_Send para o envio da resposta ao cliente.