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.