DAS5306: Programação Concorrente e Sistemas de Tempo Real

Trabalhos para 2017/1

Sugestão para quem usa Windows normalmente: virtualbox


T1 - Trabalho do controlador de sistemas contínuos sequencial e tempo real

Implementar o controle e a supervisão do sistema descrito aqui.

Simulador é usado para simular uma unidade de caldeira e é chamado com:
java -jar aquecedor2008_1.jar <número-porta-escutada>

A caldeira possui instrumentação embutida e aceita os seguintes comandos:
"sta0" lê valor de Ta
"st-0" lê valor de T
"sti0" lê valor de Ti
"sno0" lê valor de No
"sh-0" lê valor de H
"ani123.4" define valor de Ni como 123.4
"aq-567.8" define valor de Q como 567.8
"ana123.4" define valor de Na como 123.4
"anf123.4" define valor de Nf como 123.4

Cuidado com a formatação dos valores em ponto flutuante.

Implementar em C no Linux o programa CONTROLADOR, o qual deve incluir as seguintes funcionalidades de controle:

- Laço de controle como tarefa periódica para a temperatura;
- Uso do tanque auxiliar e da saída de água;
- Informações na tela sobre a situação corrente.

Outros requisitos:
- Não usar threads;
- Período do controlador de temperatura deve ser 50ms exato, ver exemplo;
- Atualização da tela pode ser com sleep simples de 1 segundo.


Medições de tempo real

Partindo do programa controlador desenvolvido, meça o tempo de resposta do controle de temperatura.

O tempo de resposta inicia no momento t de acordar. Após concluir o controlador, antes de calcular o novo t de acordar, obtenha a hora atual t1. Com "t1 - t" temos o tempo de resposta do controlador em questão. Cuidado com a divisão de segundos e nanosegundos. Para maior precisão, NÃO converta para float ou double, mas mantenha em long+long (segundos e nanosegundos) até fazer a subtração.

Armazene esta informação em um array e depois de algum tempo grave em arquivo.

Apresente um histograma destas medições. Identifique o pior caso, isto é, o maior tempo de resposta observado (high water mark).

Faça a experiência com o computador com baixa atividade e também com o computador fazendo vários downloads de servidores com grande capacidade. Compare os histogramas obtidos para os dois casos de carga no computador.

Até que período seria possível levar o controlador nestas condições de execução ?

Usar as funções clock_nanosleep e clock_gettime.

Adicionalmente:

- Número de amostras >= 10000, usar o mesmo número de amostras em todos os experimentos.

- Plotar com carga e sem carga junto no mesmo gráfico ou em gráficos separados mas na mesma escala.

- Caso exista grande diferença entre os dois, plotar um zoom do gráfico menor.

- Usar como unidade microsegundo nos gráficos.

- Fazer a coleta dos dados em máquina real e não em máquina virtual.

- Gerar relatório em PDF com texto descrevendo as observações e os gráficos.



T2 - Trabalho do controlador de sistemas contínuos concorrente

Implementar o controle e a supervisão do sistema descrito aqui.

Simulador é usado para simular uma unidade de caldeira e é chamado com:
java -jar aquecedor2008_1.jar <número-porta-escutada>

A caldeira possui instrumentação embutida e aceita os seguintes comandos:
"sta0" lê valor de Ta
"st-0" lê valor de T
"sti0" lê valor de Ti
"sno0" lê valor de No
"sh-0" lê valor de H
"ani123.4" define valor de Ni como 123.4
"aq-567.8" define valor de Q como 567.8
"ana123.4" define valor de Na como 123.4
"anf123.4" define valor de Nf como 123.4

Cuidado com a formatação dos valores em ponto flutuante.

Implementar em C no Linux o programa CONTROLADOR, o qual deve incluir as seguintes funcionalidades de controle:

- Laço de controle como tarefa periódica para a temperatura;
- Laço de controle como tarefa periódica para o nível;
- Uso do tanque auxiliar e da saída de água;
- Informações na tela sobre a situação corrente;
- Entrada através do teclado dos valores de referência para nível e temperatura;
- Armazenagem periódica dos valores lidos de temperatura e armazenagem desses dados
em arquivo, através de buffer duplo.


Outros requisitos:
- Usar mutex para proteger as variáveis compartilhadas;
- Tarefas periódicas implementadas com precisão e não com sleep fixo;
- Período do controlador de temperatura deve ser 50ms;
- Período do controlador de nível deve ser 70ms;
- Atualização da tela pode ser com sleep simples de 1 segundo.


Alguns aspectos para a composição da nota do trabalho do controlador:
- Fez no Linux, em C, usando a biblioteca das pthreads ?
- Foi usado um mutex para cada estrutura compartilhada ?
- A aplicação apresenta valores dos sensores na tela ?
- A aplicação possui laços de controle para temperatura e nível ?
- A aplicação acessa teclado durante a execução do controlador, afeta valor de referência ?
- A aplicação grava leituras em arquivo ?
- As tarefas de controle são realmente periódicas ?
- Existe algum warning na compilação ?


T3 – Programação Concorrente

Implementar usando a biblioteca das Pthreads em C no Linux um programa concorrente composto por 9 threads as quais compartilham 4 estruturas de dados distintas.

Cada uma das 4 estruturas de dados distintas é controlada separadamente, ou seja, o acesso a uma delas é completamente independente do acesso às demais.

As estruturas de dados são acessadas da seguinte forma:

- Um buffer circular do tipo produtor/consumidor.

Operações: insere, retira

- Uma tabela com controle de acesso que permite multiplas leituras simultaneas porém a escrita deve ser exclusiva.

Operações: iniciaLer, fimLer, iniciaEscrever, fimEscrever

- Um dado com leituras e escritas exclusivas porém onde uma thread pode ficar bloqueada a espera de uma alteração naquele dado.

Operações: leValor, escreveValor, esperaAlteracao

- Uma barreira onde as threads são liberadas de duas em duas, não existe mestre.

Operações: esperaOutra



Algumas threads precisam gerar dados (podem ser strings que identifiquem a thread geradora), outras threads apenas obtem dados dos monitores e colocam na tela, enquanto outras tiram dados de um monitor e colocam em outro monitor. Cada thread geradora gera um número finito de strings e depois termina.

O design arquitetônico do programa é representado por um grafo, onde circulos são threads, quadrados são estruturas de dados com a indicação do tipo e as flechas indicam que thread usa qual estrutura de dados e de que forma (qual operação é chamada).

Cada grupo deverá escolher um grafo específico, diferente dos demais grupos, e autorizado pelo professor. Ver grafos-programa-concorrente.zip .

Cada grupo deverá colocar sleeps no código fonte para permitir uma execução mais lenta e controlada com o objetivo de testar o código.