Concorrência e Occam
Paulo Abadie Guedes
09/2002
A linguagem Occam
Estrutura
– Introdução
– Características
– Sintaxe da linguagem
– Exemplos
– Occam na prática
– O compilador KROC
Introdução
A linguagem Occam– Homenagem a William of Ockham
Occam’s Razor– “Things should be complicated, but no
more than necessary”– A explicação mais simples, em geral, tende
a ser a correta– Keep it simple
Fonte: http://wotug.ukc.ac.uk/parallel/www/occam/occam-bio.html
Características
Criada para considerar paralelismo– Construtores na linguagem para denotar
operações com execução em paralelo
Linguagem com base formal – Baseada em CSP
Sintaxe simples e limpa– Processamento, comunicação e controle
Communicant Sequential Processes
Base formal para a linguagem Occam
Modelo de processamento paralelo
Processos seqüenciais
Cooperação:
– Comunicação explícita (troca de dados)
– Não existem variáveis compartilhadas
Occam e CSP - Propriedades
Permite a verificação de propriedades– Análise e transformação de programas
Como garantir que:– Não haverá nunca deadlock?– Não ocorrem condições de corrida?– Não haverá starvation e livelock?
Conveniente para paralelismo– PISH e Co-Design:Implementação HW/SW
Concorrência, Paralelismo e Tempo Real
Concorrência
– Compartilhamento da CPU
Paralelismo
– Várias unidades de processamento
– Execução de operações ao mesmo tempo
Tempo real
– Processamento no tempo certo
– Forte interação com o ambiente
Concorrência
Compartilhamento da CPU– Simulação do paralelismo
S.O. é responsável pelo escalonamento– Melhor esforço
Objetivos:– Melhor uso de recursos– Otimizar a resposta, na média– Interação usuário/máquina
Concorrência
Execução
Seqüencial
Fonte: Introduction to POSIX Threads Programming
Concorrência
Execução
Concorrente
Fonte: Introduction to POSIX Threads Programming
Concorrência
Fonte: Introduction to POSIX Threads Programming
Paralelismo
Diversas unidades de processamento– Execução das operações em paralelo
Escalonamento– S.O. + usuário/programa determinam o
escalonamento– Otimizado para carga de trabalho pesada
Linguagens– Fortran, C e assembler
Paralelismo
Objetivos– Velocidade máxima– Minimizar comunicação e espera– Problemas com processamento pesado
Requer hardware especializado– Algumas formas:
• Temporal: pipelines (arquitetura escalar)• Espacial: dupla canalização (superescalar)
Paralelismo
Exemplo– Problemas– Máquinas paralelas
Grand Challenge Problems– Modelagem meteorológica e física– Seqüenciamento e análise de DNA– ...
Tempo Real
Concorrência ou paralelismo Forte interação com o ambiente
– Em geral, são sistemas embutidos Objetivo:
– Garantir a resposta certa nos tempos corretos, mesmo no pior caso possível
– Controle, e não apenas velocidade
Tempo Real
Aplicações específicas Escalonamento
– HW, SW e S.O. próprios– Em geral, criados pelo desenvolvedor– Análise profunda dos cenários de execução
Garantias funcionais e temporais– Soft Real Time X Hard Real Time
Existem centenas de kernels para RT
Tempo Real
Exemplos– Circuitos de proteção
• Monitoração contra sobrecarga da rede elétrica• Falhas de suprimento de energia: No-break
– Freios ABS– Injeção eletrônica– Sistemas de navegação e controle aéreo,
terrestre, ferroviário e espacial– Sondas espaciais e robôs
• Para trabalho em ambiente hostil
– Sistemas de monitoração e suporte vital
A linguagem Occam
Baseada em processos seqüenciais Comunicação explícita via canais Tipos fortes Permite descrever naturalmente
– Execução seqüencial– Execução paralela– Comunicação– Sincronização
A linguagem Occam
Tipos básicos– Inteiro (INT, INT16, INT32, INT64)
• INT size:– Byte– Fracionário (REAL,REAL32, REAL64)
Outras primitivas da linguagem– TIMER– Canal
• CHAN OF BYTE stdin:– Processo
• Pode ser uma composição de outros processos
A linguagem Occam
Processos básicos– Atribuição– Seleção (if) e iteração (for e while)– Stop, Skip– Combinação de outros processos
• Seq: execução seqüencial• Par: execução em paralelo
– Comunicação• Send/receive (? e !)• Canais de comunicação
Sintaxe baseada na posição do texto– Identação muda a semântica do programa– Ex.:
IF( x > 1)
x = 0
TRUESKIP
A linguagem Occam
Deslocado 2 caracteres à direita
Composição de processos
Execução em seqüênciaSEQ
p1p2
Execução em paraleloPAR
p1p2
ProcedimentosPROC meuProc(INT x, VAL INT i) SEQ p1(x, i) p2(x):
FunçõesINT FUNCTION inc(INT x) INT aux: VALOF SEQ aux = (x + 1) RESULT aux:
Exemplo:
#INCLUDE "hostio.inc"
#USE "hostio.lib"
PROC today (CHAN OF BYTE stdin, stdout, stderr)
CHAN OF SP fs, ts:
[80]BYTE textline:
SEQ
[textline FOR 18] := "The date/time is: "
so.today.ascii (fs, ts, FALSE, TRUE, [textline FROM 18 FOR 19])
so.write.string.nl (fs, ts, [textline FOR 35])
:
Passagem de parâmetros
Por valor ou cópia (PROC meuProc(VAL INT x) )– Não altera variáveis externas
Por referência (PROC meuProc(INT x) )– Efeitos colaterais visíveis
Compilador usa regras estritas– Constantes passadas apenas por valor
Conversão explícita de tipos– Mesmo conversão de int para float é explícita
Executando Occam
Processador específico– O Transputer (INMOS)– Processamento paralelo
Compilação– Fonte occam =>
executável linux– Processamento
concorrente
O Transputer
O Compilador KROC
Kent Retargettable Occam Compiler– Compilador para a linguagem Occam 2.0– Programas usam concorrência– Código aberto, sob a licensa GNU
Disponível no CIn na rede Linux– Suporte bom à linguagem Occam– Configuração do compilador:
• source /opt/kroc/bin/setup.csh
A página do KROC está em– http://www.cs.ukc.ac.uk/projects/ofa/kroc/
O Compilador KROC
Compilador de linha de comando Desenvolvimento
– Criar o código fonte (arquivo .occ)– Compilar (Occam => C => arquivo objeto)– Ligar e executar diretamente
• Não precisa de um ambiente para execução
O programa– Executável no formato ELF– Depende apenas das bibliotecas
O Compilador KROC
Flags e parâmetros– Executável a ser gerado: “-o <program name>”– Depuração
• Flag “-d”. Útil inclusive para parar processos “travados”
– Geração de arquivos intermediários– Flags para passar parâmetros ao gcc– Verbose mode (“-v”)– Mais opções: digitar “kroc”
Uso do kroc na prática– Usar um makefile (just “make” it!)– Para criar o makefile: kmakef
Opções do compilador Kroc - 1
bonito:~> krocKROC version 1.3.2 targeting i686-pc-linux-gnu (driver V1.38)Usage: kroc [options] [occam sources/pre-compiled sources]Options: -b, --brief Give brief occ21 error messages -c, --compile Compile source to objects, do not link -s, --strict Strict checking mode -d Enable post-mortem debugging -di Enable insert debugging (implied by -d) -h, --help Print this message and exit -IDIRECTORY Search DIRECTORY for occam libs & includes, C headers -k, --keep-temp Keep temporary files -V, --version Print version -l, --library Generate .so shared library -lNAME Link with native library libNAME.a -LDIRECTORY Search DIRECTORY for native libraries
Opções do compilador Kroc - 2 -n, --dry-run Do not run any commands; just print them. --oc-opts=opts Use these occam compiler (occ21) options --oc-opts opts "" --cc-opts=opts Use these C compiler (gcc) options --cc-opts opts "" -nw, --no-warn Give no warnings from occ21 -nd, --no-dynmem Disable dynamic memory support -oFILE, -o FILE Place output in file FILE -p, --pre-compile Pre-compile occam source to .ktx files -t2, -t4, -t8, -t9 Set processor compilation class (default t8) -O --optimise Enable optimisations [now default] -P --pause Event/schedule check at loop-ends and backward jumps -io, --inline-io Inline input/output kernel calls -is, --inline-sched Inline parts of the scheduler -it, --inline-ldtimer Inline load-timer instruction -v, --verbose Show commands run during compilation -w, --warn Additional warnings from occ21 -X5 Enable MOBILEs and extended input (experimental) --oos Compile for OOS (experimental)bonito:~>
KROC – Programas Auxiliares
Compilação– Executáveis kroc e occ21
Criação de bibliotecas– Occam: ilibr– Unix: ar e ranlib
Análise do conteúdo dos executáveis– tdump
Depuração e desenvolvimento– gcc + gdb– kmakef (criação automática de makefiles)
Compilandoo Hello Occam Fonte Compilação Execução
Arquivos Fonte
(hello.occ)
Arquivos
Fonte em C
Compilador Kroc
Compiladorgcc
Arquivos
objeto (.o)
Bibliotecas C
Bibliotecas OccamExecutável
O Comando “make”
Programa auxiliar– Automatizar tarefas repetitivas
O make– Analisa dependências entre os alvos– Executa as regras na ordem correta– Apenas executa o que for necessário
Vantagens– Facilita o processo de desenvolvimento– Facilita compilação e instalação
Função– Guiar a ordem de execução das tarefas– Algoritmo para a compilação
Lista de regras de execução– Formato das regras:
<alvo>: <lista de dependências><ações para criar o alvo>
O arquivo Makefile
Tabs separando os itens
O arquivo Makefile
Alvo (destino)– Arquivo a ser criado– Ação a ser realizada ou rótulo intermediário
Dependências– Pré-condições para a regra– Arquivos ou outros alvos
Ações– Comandos para a criação de cada alvo
Regra:Hello: hello.occ
kroc hello.occ -o hello -d
Usando o make:– Criar o arquivo fonte
(hello.occ)– Criar o makefile– Executar “make”
O arquivo Makefile
Dependência:Arquivo fonte
Ação para a criação do alvo
Alvo
Make - Outras Opções
Símbolo “#” usado para comentários
Parâmetros– Definição:
FONTE=hello.occ
– Uso: $(FONTE)
Regras sem dependências:– Sempre executarãoclean:
rm -f hello
Execução completa– make
• Executa a primeira regra
Execução específica– make <alvo>
• Executa a regra <alvo>
Um Makefile Realista
Estrutura geral de um bom makefile:– # Criado por ... em ... para ...– Parâmetros– Help (texto com a forma de uso)– Alvo principal (em geral, “all”)– Lista de alvos secundários– Regras para manutenção
• clean => eliminar arquivos intermediários• cleanAll => eliminar todos os arquivos gerados
Usar o kmakef para criar o makefile
Um Makefile Realistabonito:~/grad/Mestrado/mp3/desenvolvimento/copy_occ> more makefile# Makefile built by kmakef for pag on Tue Jun 26 17:24:58 2001# with 'kmakef copy'#KROC=krocILIBR=ilibrAR=arRANLIB=ranlibDEL=rm -f
LIB_DIR=/opt/kroc.old/libINC_DIR=$(LIB_DIR)
# Default - build all targetsall: copy
LIBS=$(LIBDIR)/libfile.a $(LIB_DIR)/libhostio.a $(LIB_DIR)/libcourse.a $(LIB_DIR)/libstring.a $(LIB_DIR)/libconvert.aINCS=$(INC_DIR)/filelib.inc $(INC_DIR)/hostio.inc $(INC_DIR)/consts.inc
clean: -$(DEL) copy *.tce *.o *.lib *.a *.s *.kt* *~
#copy: copy.occ $(INCS) $(LIBS)# $(KROC) copy.occ -o copy -lfile -lhostio -lcourse -lstring -lconvert -d
copy: copy.occ /opt/kroc.old/lib/inc/filelib.inc /opt/kroc.old/lib/libfile.a \ /opt/kroc.old/lib/inc/hostio.inc /opt/kroc.old/lib/libhostio.a \ /opt/kroc.old/lib/inc/consts.inc /opt/kroc.old/lib/libcourse.a \ /opt/kroc.old/lib/libstring.a /opt/kroc.old/lib/libconvert.a $(KROC) copy.occ -o copy -lfile -lhostio -lcourse -lstring -lconvert -d
Documentação
Arquivos do kroc– Manuais de uso em formato PostScript (ps)– Exemplos de aplicativos em Occam– Código do compilador kroc
Livro sobre Occam 2.0– Diretório de exemplos da ferramenta
Help on-line: páginas sobre o KROC– http://wotug.ukc.ac.uk/kroc/– http://www.cs.ukc.ac.uk/projects/ofa/kroc/
Exercício prático
Configurar o ambiente Criar o arquivo fonte(hello.occ) Compilar manualmente e executar Criar o makefile Compilar usando o make
– Hello.occ– Exemplo de comunicação– Servidor WEB em Occam
Referências Kent Retargetable OccamTM Compiler (KRoC)
– http://www.cs.ukc.ac.uk/projects/ofa/kroc/
Compilers for the Occam Language– http://wotug.ukc.ac.uk/occam/compilers/index.shtml
The WWW Virtual Library (http://www.vlib.org)– The Occam archive
• http://www.afm.sbu.ac.uk/occam/
– The CSP archive• http://www.afm.sbu.ac.uk/csp/
– The transputer archive• http://www.afm.sbu.ac.uk/transputer/
William of Ockham– http://wotug.ukc.ac.uk/parallel/www/occam/occam-bio.html
Referências
Parallel Programming in C for the Transputer– http://cs.smith.edu/~thiebaut/transputer/toc.html
Introduction to POSIX Threads Programming – http://www.llnl.gov/computing/tutorials/workshops/
workshop/pthreads/MAIN.html
Concurrent and Real-time Systems: the CSP Approach (Steve Schneider)– http://www.cs.rhbnc.ac.uk/books/concurrency/
Professor C.A.R. Hoare, FRS– http://users.comlab.ox.ac.uk/tony.hoare/