Memória Transacional Com Suporte de Kernel

Propaganda
Memória Transacional Com Suporte de Kernel
Maycon Sambinelli (PIBIC/Fundação Araucária-UEM), Anderson Faustino da
Silva, e-mail: [email protected].
Universidade Estadual de Maringá/Departamento de Informática/Maringá,
PR.
Área: Ciências Exatas e da Terra. Subárea: Ciência da Computação
Palavras-chave: memória transacional, kernel, transações
Resumo:
Memória transacional tem surgido como uma alternativa para
simplificar a programação paralela, principalmente as questões referentes a
sincronização. Tradicionalmente esta questão tem sido tratada utilizando
locks, porém estes muitas vezes levam a problemas como deadlocks,
inversão de prioridade e convoying. A proposta deste artigo é implementar
suporte a memória transacional em kernel para que o acesso a memória
transacional possa ser utilizando nativamente.
Introdução
Como as arquiteturas atuais não seguem o modelo PRAM [1] é necessário o
uso de algum mecanismo para sincronizar o acesso aos dados. A exclusão
mutua é talvez a forma mais utilizada de fazer sincronização [2].
Bancos de dados alcançaram sucesso explorando o paralelismo [3]
por meio de transações. Transações oferecem uma abstração que permite
fazer buscas paralelas no banco sem que o usuário precise se preocupar
com o paralelismo. Similarmente, surgiu a proposta de utilizar transações
para explorar o paralelismo no nível de linguagens de programação.
Este artigo propõe uma arquitetura para suporte a memória
transacional nativa no kernel do sistema operacional. Um suporte nativo
ofereceria as vantagens do sistema transacional a qualquer tipo de
Anais do XIX EAIC – 28 a 30 de outubro de 2010, UNICENTRO, Guarapuava –PR.
aplicações, sem exigir a necessidade de um compilador ou interpretador
especial.
Materiais e métodos
O sistema transacional proposto expande a chamada de sistema mprotect
do padrão POSIX adicionando a ele a proteção PROT_TRANS. Esta
proteção marca uma região de memória como sendo transacional. Apenas
os dados que estão em regiões transacionais possui as propriedades ACI [4]
das transações. A chamada mprotect aplica a proteção de memória a todas
as páginas que estão no intervalo de endereços, por esse motivo o sistema
transacional proposto se baseia na gerencia de páginas transacionais.
Para poder suportar transações o kernel deve manter algumas
informações sobre estas, para isto ele mantém uma Tabela Transacional. A
tabela transacional armazena todas as transações ativas de um processo.
Cada transação é representada por uma estrutura transaction que contém
dois campos: id_trans e trans_data. O campo id_trans armazena o
identificador da transação, que é único. Enquanto o campo trans_data
armazena todos os dados locais a transação.
O descritor de página recebe um campo id_trans, para identificar a
transação que possui a página. Um id_trans igual a zero não pode ser
utilizado por nenhuma transação, uma página transacional que possui este
id_trans é chamada de matriz.
A ideia básica do sistema é sempre fornecer a unidade paralela uma
cópia do dado transacional, ao invés do dado real. Para alcançar este
objetivo, o sistema transacional duplica a página ao qual se pretende fazer o
acesso e atualiza a entrada da tabela de página da unidade paralela,
fazendo com que esta entrada passe a apontar para a cópia e não mais para
a página verdadeira (matriz).
Quando uma unidade paralela acessa uma página transacional é
gerada uma exceção que será tratada pelo sistema transacional que pode se
deparar com duas situações: o id_trans da página que contém o endereço
ao qual foi feito o acesso é o mesmo da transação ou eles são diferentes.
Anais do XIX EAIC – 28 a 30 de outubro de 2010, UNICENTRO, Guarapuava –PR.
Quando os id_trans são diferentes o sistema transacional busca a
página correta para a transação na sua lista de dados transacionais e insere
a página correta na entrada da tabela de página. Caso a transação não
possua uma cópia para aquela página, primeiramente é feito uma cópia da
página matriz para a página acessada, em seguida esta nova página é
inserida na lista de dados transacionais da transação. Além disto, o id_trans
da página cópia é marcado com o mesmo da transação e faz-se a
substituição da entrada na tabela de páginas. Quando os id_trans são iguais
o sistema transacional simplesmente permite o acesso ao dado, sem
precisar fazer nenhum tratamento extra.
Antes de encerrar toda transação deve abortar ou efetivar [5]. Quando
uma transação efetiva significa que a transação ocorreu com sucesso e que
as suas modificações podem serem vistas globalmente. Quando uma
transação aborta, todas as suas modificações são descartadas e a
transação é reiniciada.
O suporte transacional nativo provê a operação commit para as
transações efetivarem os seus dados. Quando uma transação invoca a
operação commit, o sistema checa todas as mudanças realizadas pela
transação verificando se existe algum conflito com outra transação. Caso
não existam conflitos, a transação efetiva atualizando todas as páginas
matrizes das quais ela possui uma cópia. Para abortar uma transação o
kernel provê a operação abort. Esta quando invocada por uma transação
descarta todas as cópias de páginas e automaticamente reinicia a transação.
Uma característica importante do sistema implementado é o fato da
arquitetura proposta evitar cascading abort [6], garantindo que uma
transação apenas lê dados que foram efetivados.
Resultados e Discussão
Como resultado obtemos um suporte a transações nativo do sistema
operacional. Uma vantagem do sistema proposto é facilitar a escrita de
qualquer tipo de sistema paralelo, não sendo restrita a uma determinada
classe de aplicações. Outra vantagem é o fato de construções nativas
proporcionarem um melhor desempenho, quando comparadas com as
mesmas implementadas como biblioteca de usuário.
Anais do XIX EAIC – 28 a 30 de outubro de 2010, UNICENTRO, Guarapuava –PR.
Atualmente, o sistema está sendo validado e em seguida será
implementado um sistema transacional em nível de compilador. Assim, será
possível implementar programas paralelos escritos na linguagem de
programação C que utilizem transações ao invés de locks.
Conclusões
Este artigo apresentou um sistema transacional capaz de fornecer suporte a
memória transacional em kernel. Assim, qualquer programa executado pelo
sistema operacional, seja em modo kernel ou em modo usuário, é capaz de
utilizar chamadas ao sistema para realizar sincronização. E desta forma tirar
proveito de transações como um mecanismo de sincronização nativa.
Agradecimentos
Agradeço ao Prof. Dr. Anderson Faustino da Silva, a minha namorada Carla
Negri Lintzmayer e a Fundação Araucária pelo apoio financeiro.
Referências
[1] Grama, A.; Karypis, G.; Kumar, V.; Gupta, Anshul. Introduction to Parallel
Computing. New York: Addison Wesley, 2003.
[2] Herlihy, M.; Shavit, N. The Art of Multiprocessor Programming. New York:
Morgan Kaufmann, 2008.
[3] Harris, T.; Guerraoui, R.; Fetzer, C. F.; Felber, P. Transactions are back--but are they the same?. ACM SIGACT News, New York. 2008, 39, 1.
[4] Herlihy, Maurice; B. Moss; Eliot, J.Transactional memory: architectural
support for lock-free data structures. SIGARCH Comput. Archit. News. New
York, 1993, 21, 2.
[5] Bernstein, Philip A.; Newcomer, Eric. Principles of Transaction
Processing. New York: Morgan Kaufmann, 2009.
[6] Bernstein, Philip A.; Hadzilacos, Vassco; Goodman, Nathan. Concurrency
control and recovery in database systems. New York: Addison-Wesley, 1987.
Anais do XIX EAIC – 28 a 30 de outubro de 2010, UNICENTRO, Guarapuava –PR.
Download