1 Programação na nuvem (Programming in the cloud)
Nos últimos anos a computação na(s) nuvem(ns) ou cloud computing, tem sido um paradigma emergente de acesso a recursos de computação. Utilizadores podem aceder a aplicações remotas de um ponto qualquer da internet, muitas vezes através de um comum web browser. Os utilizadores não necessitam de saber onde os dados são guardados e onde a computação tem lugar ou que recursos lhe serão afectados: um servidor, um cluster ou alguns nós de uma grid (Foster, 2002a; 2002b).
Tem sido investigada a extensão deste paradigma não apenas para execução de aplicações na nuvem, mas também para o próprio desenvolvimento destas: Programação na nuvem. Assim foi desenvolvido e é proposto um modelo de programação onde o ambiente de desenvolvimento necessário está instalado algures na nuvem, sendo acedido através de um portal, podendo aplicações serem desenvolvidas a partir de qualquer posto de trabalho que tenha instalado um web browser e um processador de texto.
O modelo proposto assume que a infra-estrutura da nuvem consiste numa grid, o que de acordo com (Gentzsch, 2008) deverá ser comum no futuro próximo. A infraestrutura grid é baseada no middleware Globus (Foster, 2005).
Fig. 1 Acesso à nuvem
O ambiente proposto foi projectado para desenvolvimento de aplicações computacionalmente exigentes envolvendo álgebra linear, na linguagem de programação C/C++. O ambiente de execução permite distribuir a carga computacional dessas aplicações na nuvem, onde um nó da grid poderá ser um computador ou um cluster, como mostra a Fig. 1.
Para aplicações debilmente acopladas, onde o conjunto de dados a processar poderá ser distribuído sem necessidade de relacionamento durante o processamento, pares (instância da aplicação, segmento de dados a processar) são atribuídos a computadores da grid disponíveis.
Para aplicações fortemente acopladas, onde durante o processamento os dados distribuídos poderão ser migrados explicitamente no código da aplicação entre diferentes computadores, uma instância da aplicação e todo o conjunto de dados a processar serão atribuídos a um cluster da grid.
Normalmente para cada um dos casos de distribuição acima referidos, é necessário desenvolver uma aplicação específica.
O ambiente proposto unifica ambas as estratégias de distribuições, podendo o mesmo código de alto nível C/C++ ser usado para gerar uma aplicação que se execute num só computador ou num cluster.
Por exemplo assumindo que se pretende obter um produto de duas matrizes. O utilizador deverá usar uma API desenvolvida para o efeito, onde neste caso o código seria:
matrix A(1000,200), B(200,400);
A.rand ();
B.rand ();
A API foi desenvolvida de modo a unificar o acesso às bibliotecas de cálculo LAPACK (Bai et al., 1999) e SCALAPACK (Blackford et al., 1997). O interface da API é o mesmo para cada caso, abstraindo o programador de se preocupar com as necessidades dos recursos computacionais ou do acoplamento da aplicação. Para além, esta API, disso sendo orientada por objectos e suportando polimorfismo elimina a replicação da mesma função de cálculo, uma para cada tipo de dados, e para cada tipo de matriz, existente em ambas as bibliotecas LAPACK e SCALAPACK programadas em Fortran.
Esta API permite que a aplicação seja expressa numa linguagem sequencial, tal como foi proposto no Sistema de Paralelização Automática de Algoritmos Matriciais (Daniel, 2003), sendo ligada ao código executável, dependendo de se pretender gerar uma aplicação debilmente acoplada (LAPACK) ou fortemente acoplada (SCALAPACK), a versão correspondente da API.
O programador apenas terá de submeter o código fonte através de um portal e indicar se a aplicação é debilmente ou fortemente acoplada. Após a aplicação ser gerada na nuvem, o escalonamento da aplicação na grid, dependendo dos recursos disponíveis é gerido pelo GridWay metascheduler (Huedo et al., 2005).
Correntemente a API suporta as operações mais comuns, mas não todo o conjunto de operações Lapack e Scalapack. O suporte para as restantes operações encontra-se em desenvolvimento.
O portal foi desenvolvido com recurso ao framework PHP wmtp 1.0 (Daniel, 2009b), para geração dinâmica de páginas do portal a partir de ficheiros de texto que descrevem aspectos da configuração. Este framework inclui uma hierarquia de classes para parsing de ficheiros de texto e também uma hierarquia de classes para criação em alto nível e colocação de widgets em páginas html.
Este Framework foi inicialmente projectado após o desenvolvimento da aplicação web para inscrição e submissão de trabalhos práticos para disciplinas de informática (Daniel, 2007b), já referida em 1.2.1.2.1, que incluiu algumas das classes do futuro framework.
Uma versão preliminar (Daniel, 2008c), foi usada nas aplicações web de apoio ao curso de Lic. em Ensino de informática (Daniel, 2007d; 2008a; 2008b) já referidas em 1.1.1.2.
2 Ensaio intensivo de aplicações
A fiabilidade das aplicações consiste numa das principais preocupações actuais da Engenharia de Software. Uma forma de ensaiar a fiabilidade de uma aplicação consiste em executar uma bateria de testes de caixa negra, que podem incluir casos especiais e de esforço. Idealmente uma bateria de testes deverá incluir todos os casos possíveis. Para aplicações computacionalmente exigentes, a aplicação de tal bateria de testes poderá ocupar um intervalo de tempo proibitivo.
Em (Daniel et al, 2009) é proposto um sistema de distribuição da carga computacional por uma grid, onde cada caso de teste é executado num nó diferente, reduzindo o tempo de ensaio da aplicação.
Esta grid é baseada no midleware Globus e no GridWay metascheduler tal como em 2.1.1, mas cada nó é composto apenas por um computador, não sendo usados clusters.
A submissão do teste de uma aplicação é efectuada através de um portal, que também foi desenvolvido com recurso ao framework PHP wmtp 1.0 (Daniel, 2009b).
Neste portal deverá ser submetido o código fonte da aplicação bem como a bateria de testes. Esta bateria é composta por um conjunto de casos de teste, onde cada caso é composto por um conjunto de dados de entrada e pelo conjunto de dados de saída esperados de acordo com as especificações.
Sendo a grid heterogénea, ao submeter código fonte e não executável permite aumentar a portabilidade, pois será construída em cada nó, um executável da aplicação apropriado para as características desse nó.
Outro modo de ensaio de aplicações proposto em (Daniel et al, 2009), poderá ser usado para treino de programadores, avaliação de trabalhos práticos ou concursos de programação, tais como os baseados nas regras (ACM-ICPC, 2008).
Nestes casos cada utilizador acede ao portal, submetendo apenas o código fonte. Esse código será transferido para um nó de execução onde será compilado e aplicada uma bateria de testes pré-definida, sendo retornado para o web browser do utilizador um relatório indicando quais os testes que passaram os que falharam, para cada teste os dados de entrada usados os dados de saída esperados e os dados de saída obtidos.
Este modo de operação, do ponto de vista do utilizador é semelhante ao Mooshak (Leal e Silva, 2003), um sistema para avaliação automática de concursos de programação on-line, se bem que no Mooshak as aplicações dos utilizadores são distribuídas por um conjunto de servidores e não por uma grid.
Em (Daniel et al, 2009) é proposta ainda uma outra alternativa de distribuição para estes casos, se o computador de cada utilizador contiver o ambiente de desenvolvimento de aplicações, o que é normal, por exemplo num concurso, pois antes de submeter o código fonte para avaliação o utilizador deve ensaiá-lo localmente. Nestes casos se os computadores dos utilizadores forem nós da grid, isto é se tiverem o midleware instalado, podem ser usados pelo sistema para fazer o ensaio automático.
Após submissão o scheduler agenda a avaliação automática no próprio nó que submeteu, numa área protegida. Assim além dos computadores dos utilizadores é apenas necessário outro computador que alberga o portal. Deste modo em concursos com muitos utilizadores o sistema de avaliação nunca é sobrecarregado.
3 API para ensaio de aplicações
Tanto no sistema proposto em (Daniel et al, 2009), como no caso do Mooshak, os dados de entrada são fornecidos à aplicação pela entrada padrão e os resultados produzidos pela aplicação são enviados para a saída padrão.
No entanto aplicações como drivers e daemons normalmente não podem ser ensaiadas através da saída e entrada padrão, pois não têm acesso a estas.
Foi proposto o projecto "Intensive software probing and testing", PTDC/EIA-EIA/105423/2008 que aguarda resposta, onde se irá desenvolver uma API sondas. Esta API consistirá numa hierarquia de classes, para testar processos em execução no espaço de utilizador ou do núcleo, ou mesmo componentes do sistema operativo e do hardware.
A hierarquia permitirá a descendência de classes de sondas especializadas para novas necessidades não previstas inicialmente.
O ensaio de aplicações poderá ser efectuado num ambiente distribuído baseado numa grid como o proposto (Daniel et al, 2009) e já descrito em 2.1.2, ou num ambiente distribuído desenvolvido para esse efeito, sem recurso a nenhum midleware.
Para facilitar a inscrição e submissão remota de trabalhos práticos, bem como possibilitar a emissão de pautas e relatórios de estado das submissões, foi desenvolvida a aplicação web (Daniel, 2007b) já referida em 1.2.1.2.1. Correntemente esta aplicação é usada nas disciplinas Periféricos e Interfaces (Daniel, 2009b), Sistemas de tempo real (Daniel, 2008e), Programação Orientada por Objectos (Oliveira, 2008b) e Inteligência Artificial (Oliveira, 2008c).
No futuro esta aplicação deverá ser integrada com os sistemas de avaliação automática de aplicações descritos nos dois pontos anteriores, de modo que no caso de trabalhos de programação, após submissão dos trabalhos estes sejam avaliados e cotados. Usando a API de sondas descrita no ponto anterior será possível indicar não apenas se a aplicação passou todo o conjunto de testes, como é indicado no Mooshak, mas também descriminar num relatório quais as especificações da aplicação que não foram cumpridas e o estado espera e o obtido para cada caso.
O conteúdo das disciplinas de Periféricos e Interfaces (Daniel, 2007a), bem como Sistemas de Tempo Real (Daniel e Ruano 2007), que têm sido disponibilizados via world wide web, desde 2008
5 PHP OO Framework
- Facil colocação de widgets em páginas dinâmicas html
- Geração automática de páginas html a partir de dados em ficheiros de texto
wmtp v0.6 (9 apr 2008)
wmtp v1.0 (2 apr 2009)
6 Paralelização automática de algoritmos matriciais
Tese de doutoramento: Paralelização automática de algoritmos matriciais.
7 Referências usadas no texto acima
ACM-ICPC (2008). "The Rules of the 2009 ACM-ICPC World Finals", http://icpc.baylor.edu/icpc/finals/About.htm, [last accessed: December 3rd 2008]
Bai, Z., C. Bischof, S. Blackford, J. Demmel, J. Du Croz, A. Greenbaum, S. Hammarling, A. McKenney, D. Sorensen (1999). "LAPACK Users' Guide 3rd", SIAM, also available online: http://www.netlib.org/lapack/lug/, [last accessed: December 3rd 2008]
Blackford, L. S., J. Choi, A. Cleary, E. D'Azevedo, J. Demmel, I. Dhillon, J. Dongarra, S. Hammarling, G. Henry, A. Petitet, K. Stanley, D. Walker, R. C. Whaley (1997). "ScaLAPACK Users' Guide (Software, Environments & Tools) (Software, Environments and Tools) ", SIAM, also available online: http://www.netlib.org/scalapack/slug/, [last accessed: December 3rd 2008]
Daniel, Helder (2003). Paralelização automática de algoritmos matriciais. Tese de Doutoramento, UAlg http://w3.ualg.pt/~hdaniel/spam.pdf [último acesso em: 9 Abril 2008]
Daniel, Helder (2006). Periféricos e interfaces 2005/6: Relatório da disciplina.
http://w3.ualg.pt/~hdaniel/pin/2005-6/Relatório_Pin_2005-6.pdf [último acesso em: 7 Abril 2008]
Daniel, Helder (2007a). Periféricos e interfaces
http://w3.ualg.pt/~hdaniel/pin/ [último acesso em: 7 Abril 2008]
Daniel, Helder (2007b). Periféricos e interfaces: Entrega de trabalhos práticos
http://www.deei.fct.ualg.pt/PIn/Entregas/ [último acesso em: 7 Abril 2008]
Daniel, Helder (2007c). Periféricos e interfaces 2006/7: Relatório da disciplina.
http://w3.ualg.pt/~hdaniel/pin/Relatório_Pin_2006-7.pdf [último acesso em: 7 Abril 2008]
Daniel, Helder (2007d). Sistema digital de apoio ao curso de Licenciatura em Ensino de Informática. http://www.deei.fct.ualg.pt/LEnsI [último acesso em: 9 Abril 2008]
Daniel, Helder (2008a). Pré-inscrição online em estágios pedagógicos para curso de ensino.
http://www.deei.fct.ualg.pt/LEnsI/registoEstagios/ [último acesso em: 9 Abril 2008]
Daniel, Helder (2008b). Inscrição online para apresentações.
http://www.deei.fct.ualg.pt/LEnsI/registoProjectos/ [último acesso em: 9 Abril 2008]
Daniel, Helder (2008c). wmtp 0.6: An Object Oriented php framework for deployment of html objects v0.6. http://w3.ualg.pt/~hdaniel/wmtp0.6.zip [último acesso em: 9 Abril 2008]
Daniel, Helder (2008d). Periféricos e interfaces 2007/8: Relatório da disciplina.
http://www.ualg.pt/moodle2007/mod/resource/view.php?id=119318 [último acesso em: 2 Abril 2009]
Daniel, Helder (2008e). Sistemas de tempo real 2007/8.
http://www.ualg.pt/index.php?option=com_moodle&ano=2007 [último acesso em: 2 Abril 2009]
Daniel, Helder (2008f). Sistemas de tempo real 2007/8: Relatório da disciplina.
http://www.ualg.pt/moodle2007/mod/resource/view.php?id=119319 [último acesso em: 2 Abril 2009]
Daniel, Helder (2009a). Periféricos e interfaces 2008/9.
http://www.ualg.pt/moodle2008/course/enrol.php?id=60010097 [último acesso em: 3 Abril 2009]
Daniel, Helder (2009b). wmtp 1.0: An Object Oriented php framework for deployment of html objects v1.0. http://w3.ualg.pt/~hdaniel/wmtp0.6.zip [último acesso em: 9 Abril 2008]
Daniel, H. e A. Ruano (2007). Sistemas de tempo real. http://w3.ualg.pt/~hdaniel/str/ [último acesso em: 7 Abril 2008]
Daniel H., M. M. M. Moura, Ana Leiria . "Intensive software testing and evaluation on a grid", Research, Reflections and Innovations in Integrating ICT in Education: Proceedings Book of the V International Conference on Multimedia and ICT in Education (m-ICTE2009), Vol.3, pp. 1353-1357, Lisboa, Portugal, Abril 2009.
Foster, I (2002a). "What is the Grid? A Three Point Checklist", GRIDToday, July 20
Foster, I (2002b) "The Grid: A New Infrastructure for 21st Century Science", Physics Today, 55(2):42-47
Foster, I. (2005). "Globus Toolkit Version 4: Software for Service-Oriented Systems". IFIP International Conference on Network and Parallel Computing, Springer-Verlag LNCS 3779, pp 2-13
Gentzsch, Wolfgang (2008). "Grids are Dead! Or are they?". http://www.on-demandenterprise.com/features/26060699.html, [last accessed: December 3rd 2008]
Huedo E., R. S. Montero and I. M. Lorente (2005). "The GridWay Framework for Adaptive Scheduling and Execution on Grids", Scalable Computing - Practice and Experience 6 (3): 1-8
Leal J. and F. Silva (2003). "Mooshak: a Web-based multi-site programming contest system", Software-Practice & Experience 33(6): 567-581
Oliveira, José Valente de (2008b). Programação orientada por objectos 2007/8: Entrega de trabalhos práticos. http://www.deei.fct.ualg.pt/POO/Entregas/ [último acesso em: 7 Abril 2008]
Oliveira, José Valente de (2008c). Inteligência Artificial 2007/8: Entrega de trabalhos práticos. http://www.deei.fct.ualg.pt/IA/Entregas/ [último acesso em: 7 Abril 2008]