Há três paradigmas importantes para a troca de informações entre processos em sistemas distribuídos, quais sejam, a passagem de mensagens, a chamada a procedimentos remotos e o compartilhamento de memória.
A comunicação via passagem de mensagens é feita através da interpretação de dados transferidos no sub-sistema de comunicação.
A chamada a procedimentos remotos é uma comunicação em um nível mais alto de abstração que possibilita a troca de informações através da passagem de parâmetros entre processos utilizando o mecanismo de passagem de mensagens.
O compartilhamento de memória possibilita a comunicação direta entre os processos em sistemas fortemente acoplados, ou seja, viabiliza a troca de informações entre processos através de uma memória de uso comum ligada ao sub-sistema de comunicação.
O problema da utilização direta do mecanismo de passagem de mensagens é a falta de transparência. Por outro lado, embora a chamada a procedimentos remotos possibilite a comunicação de dados com transparência, sua eficiência é limitada pelo mecanismo utilizado. Como não é possível acessar diretamente o espaço de endereçamento de máquinas remotas, o compartilhamento real de informações é difícil, em particular quando se trata de estruturas de dados grandes e complexas, abarrotadas de apontadores. Por fim, o compartilhamento de memória, que poderia resolver os problemas de acesso transparente à informações reais é restrito, em sua forma original, a sistemas fortemente acoplados.
O objetivo primordial do compartilhamento de memórias distribuídas é viabilizar o compartilhamento direto de informações entre processos comunicantes por meio da simulação de um espaço de endereçamento lógico compartilhado, sobre um conjunto de memórias locais distribuídas fisicamente. Este conjunto de memórias chamar-se-á Memória Compartilhada Distribuída (MCD). Para sua implementação utiliza-se o mecanismo de passagem de mensagens, o qual fica transparente por ser encapsulado em uma camada com programas para o gerenciamento e o mapeamento entre a MCD e o sistema de passagem de mensagens.
Dependendo da localização dos dados, a forma de acesso a eles deve ser diferente, isto é, em um sistema distribuído fracamente acoplado, onde tenha sido implementado um sistema para compartilhamento de memória, os dados podem ser armazenados localmente, na memória do processador onde o processo estiver sendo executado, ou remotamente, na memória de algum outro processador. A forma para acessar os dados em um e no outro caso é diferente.
Em sistemas multiprocessadores de grande porte convém manter a parte do espaço de endereçamento mais freqüentemente acessada por um conjunto de processos mais próxima do(s) processador(es) em que estiverem sendo executados, deixando o restante do espaço de endereçamento mais afastado. Os multiprocessadores com arquiteturas que permitem este tipo de hierarquia de acessos à memória em vários níveis são ditos sistemas com forma irregular de acesso à memória ou, do inglês, sistemas NUMA ( Non-Uniform Memory Access) [12].
Como este tópico, vários outros aspectos do projeto e da implementação de MCDs são muito semelhantes aos que devem ser considerados para sistemas de memória cache de
multiprocessadores (MCM). Por exemplo, a informação tratada em cada acesso à memória pode consistir em uma palavra, um bloco de palavras, uma página ou um segmento. Esta dimensão corresponde à granularidade do procedimento de acesso. A escolha da granularidade é um item importante a ser considerado em ambos os casos.
Outro aspecto importante em sistemas NUMA é a possibilidade de mover páginas de memória compartilhada entre os módulos de memória do sistema, ou copiar alguma página muito concorrida para diversos módulos em processadores diferentes. Esta multiplicação de páginas em sistemas distribuídos requer a manutenção do coerência no sistema de memória. O controle de consistência (ou da coerência de memória) é um aspecto muito estudado em MCDs e muito importante no projeto de MCDs.
Devido a esta analogia entre MCMs e MCDs e tendo em vista a quantidade de estudos já realizados para MCMs, que podem ser aplicados a MCDs, a seguir serão analisados alguns aspectos desses sistemas, quando aplicados em arquiteturas NUMA.
Arquiteturas NUMA
Para iniciar, a configuração genérica de uma arquitetura NUMA é apresentada na Fig. 1, juntamente com suas versões para implementação de MCMs e MCDs. Na fig. 1-a vê-se que uma máquina NUMA genérica é composta por um conjunto de processadores, cada um dos quais com um módulo de memória local. Além deste conjunto de pares (processador, memória) há uma malha de comunicação interligando todos os conjuntos e, na interface entre cada par processador-memória e a malha de comunicação há um controlador cujo objetivo é manter a coerência do sub-sistema de memória. Nas Fig. 1-b e 1-c tem-se, respectivamente, as implementações de MCMs e MCDs, como mencionado anteriormente e descrito nos dois parágrafos seguintes.
Na fig. 1-b tem-se o diagrama do que seria uma implementação, sobre uma máquina NUMA genérica, de um sistema MCM. Neste caso, os módulos de memória local são “caches” utilizadas principalmente para reduzir o tempo médio de espera nos acessos à memória e minimizar o tráfego de acessos à memória global. A memória global pode ser uma grande memória RAM compartilhada por todos os processadores, mas também pode ser um conjunto de módulos de memória distribuídos pelo sistema. O barramento, por sua vez, pode ser um barramento comum, mas isto tende a gerar grande disputa pelo seu uso. Alternativamente, é possível utilizar vários barramentos, ou uma rede de conexão. Isto é recomendável, principalmente se o sistema for composto por muitos processadores e tiver vários módulos de memória compondo a memória global.
Na fig. 1-c tem-se o diagrama do que seria a implementação, sobre uma máquina NUMA genérica, de um sistema MCD. Neste caso, não há uma memória global física. Os módulos de memória locais são utilizados para formar um espaço de endereçamento global, correspondendo a uma grande memória virtual. Este espaço de endereçamento é compartilhado por todos os processadores do sistema. Os processadores acessam cada porção não local deste espaço de endereçamento através de uma rede de conexão, geralmente formada como uma LAN (local area network ) ou
WAN (wide area network ).
Processador (P1) Módulo dememória MM1 Controlador de coerência de memória P2 MM2 CCM2 Pn MMn CCMn Malha de comunicação ...
Os atrasos para acesso aos dados nas memórias variam de acordo com a organização hierárquica da memória e com as políticas de atualização de dados. Só para constar, pode-se citar o exemplo da máquina NUMA de Stanford, DASH[4], que consiste em 16 nós de processamento, cada um dos quais com quatro processadores. Cada processador possui uma memória cache de 64 Kbytes no
primeiro nível, as quais formam um segundo nível com 256 Kbytes. A rede de conexão é uma
malha bidimensional roteada como rosca sem fim. A coerência na memória é mantida por um protocolo que se reporta a uma estrutura especial de diretório para invalidar cópias dos dados após a escrita em uma delas. O acesso a dados se dá em quatro estágios possíveis, quais sejam: local, remoto em dois passos, remoto em três passos ou ausente. Nos três primeiros casos o dado é encontrado nacachee no quarto é necessário um acesso à memória global. As latências típicas são,
respectivamente, de 1, 30, 100 e 135 ciclos de relógio do processador.
O principal objetivo das MCDs é alcançar transparência do sistema e o das MCMs e melhorar o acesso à memória.
Para atingir seu objetivo as MCMs exploram as localidades temporal (freqüência de referência) e espacial (proximidade das instruções) de programas aplicativos. Apesar dito, aplicações distribuídas precisam compartilhar informações e conforme aumenta o número de processadores o barramento se torna o gargalo do sistema. A solução de hardware para este problema é o aumento
da banda de passagem da memória utilizando-se vários barramentos ou uma rede de ligações CCM M 1 CCM P2 M 2 CCM P3 M 3 CCM Pn M n ... processadores P1 Memórias locais Controladores de coerência Rede de conexão Memória
Fig. 1-c: Implementação de uma MCD CCM P1 M 1 CCM P2 M 2 CCM P3 M 3 CCM Pn M n ... processadores Memória Global Barramento Comum Controladores cacheslocais
escalonável. A solução por software é fazer várias cópias da mesma informação em módulos de
memórias locais, para evitar a necessidade de acessos globais. Em MCDs implementadas sobre redes fracamente acopladas a abordagem por softwareparece ser a única viável.
As MCDs conseguem prover a transparência na comunicação de dados usando o mecanismo de passagem de mensagens. Com isto os usuários não precisam se preocupar com o movimento e eventuais conversões de dados, com o tratamento de parâmetros necessários à troca das mensagens ou com a manipulação dos detalhes dos protocolos de comunicação.
Outras vantagens das MCDs são que o tráfego entre o processador e o sistema de memória fica menos sensível ao tamanho da rede de comunicação; que a compreensão do sistema e sua implementação se tornam relativamente fáceis devido à grande quantidade de coisas feitas para uniprocessadores; e que o sistema pode ser facilmente escalado, uma vez que para aumentar o espaço de endereçamento basta aumentar a quantidade de módulos de memória.