DAS5303: Informática Industrial II

Trabalhos para 2003/2

Trabalhos entregues após a data estipulada perdem 1 ponto por dia de
atraso, inclusive sábado e domingo.

Trabalho sobre tabelas

Baseado nos exemplos listadup.c e tabhash.c, montar uma lista que usa a estrutura hash
para localizar os elementos mas ao mesmo tempo permite uma listagem ordenada através da
lista duplamente encadeada.

As rotinas INSERE e RETIRA devem operar sobre as duas estruturas de dados.
A rotina CONSULTA utiliza a estrutura hash.
As rotinas LISTA_CRESCE e LISTA_DECRESCE utilizam a estrutura
duplamente encadeada.
A rotina LISTA_PARCIAL lista as entradas em ordem crescente, a partir do ítem
fornecido como ponto de partida.

Chamar as funções a partir da "main" para testar o funcionamento, não precisa ler
comandos do teclado.

A estrutura registro deve ter o seguinte formato:

    struct registro{
            int prio;
            char nome[30];
            struct registro *prox_hash;
            struct registro *ant_hash;
            struct registro *prox_lista;
            struct registro *ant_lista;
            };

Obs: As informações propriamente ditas "prio" e "nome" são armazenadas somente uma vez,
não devem ser duplicadas.

Trabalho sobre algoritmo de escalonamento

O trabalho consiste em implementar um dos módulos descritos abaixo. A implementação deve ser feita com a linguagem de programação C, no Linux.

São propostos vários módulos diferentes. Cada grupo deve escolher um módulo e comunicar sua escolha ao professor. A comunicação deve conter, por escrito, o nome dos integrantes do grupo e o número do módulo escolhido.

Cada grupo deverá implementar um módulo diferente. No caso de dois ou mais grupos escolherem o mesmo módulo, somente o grupo que manifestou seu interesse primeiro poderá implementar o módulo. Os demais deverão escolher outro módulo.

O módulo escolhido deverá ser testado através da função main, com chamadas a uma função que sinaliza a passagem do tempo. A entrega inclui:
(a) Listagem do código fonte;
(b) Demonstração no computador, com a presença dos membros do grupo.

Descrição dos módulos 1 a 28: Implemente o escalonador de curto termo de um sistema operacional e inclua código para testar o mesmo. O algoritmo a ser utilizado para o escalonador é:

1 - Filas multinível utilizando prioridade preemptiva (fila de maior prioridade) e FCFS (fila de menor prioridade) dentro das filas e prioridade preemptiva entre filas.
2 - Filas multinível utilizando prioridade preemptiva (fila de maior prioridade) e FCFS (fila de menor prioridade) dentro das filas e round-robin entre filas (70% e 30% do tempo da cpu).
3 - Filas multinível utilizando prioridade não preemptiva dentro das duas filas e prioridade não preemptiva entre filas.
4 - Filas multinível utilizando prioridade não preemptiva dentro das duas filas e e round-robin entre filas (70% e 30% do tempo da cpu).
5 - Filas multinível utilizando prioridade não preemptiva (fila de maior prioridade) e FCFS (fila de menor prioridade) dentro das filas e prioridade preemptiva entre filas.
6 - Filas multinível utilizando prioridade não preemptiva (fila de maior prioridade) e FCFS (fila de menor prioridade) dentro das filas e prioridade não preemptiva entre filas.
7 - Filas multinível utilizando round-robin (fila de maior prioridade) e FCFS (fila de menor prioridade) dentro das filas e prioridade não preemptiva entre filas.
8 - Filas multinível utilizando round-robin dentro das filas e round-robin entre filas (70% e 30% do tempo da cpu).
9 - Filas multinível utilizando round-robin dentro das filas e prioridade preemptiva entre filas.
10 - Filas multinível utilizando round-robin (fila de maior prioridade) e FCFS (fila de menor prioridade) dentro das filas e prioridade preemptiva entre filas.
11 - Filas multinível utilizando prioridade preemptiva (fila de maior prioridade) e FCFS (fila de menor prioridade) dentro das filas e prioridade não preemptiva entre filas.
12 - Filas multinível utilizando round-robin dentro das filas e prioridade não preemptiva entre filas.
13 - Filas multinível utilizando round-robin (primeira fila) e FCFS (segunda fila) dentro das filas e round-robin entre filas (70% e 30% do tempo da cpu).
14 - Filas multinível utilizando prioridade não preemptiva (primeira fila) e FCFS (segunda fila) dentro das filas e round-robin entre filas (70% e 30% do tempo da cpu).
15 - Filas multinível utilizando prioridade não preemptiva dentro das duas filas e prioridade preemptiva entre filas.
16 - Filas multinível utilizando prioridade não preemptiva (primeira fila) e round-robin (segunda fila) dentro das filas e round-robin entre filas (70% e 30% do tempo da cpu).
17 - Filas multinível utilizando prioridade não preemptiva (fila de maior prioridade) e round-robin (fila de menor prioridade) dentro das filas e prioridade preemptiva entre filas.
18 - Filas multinível utilizando prioridade não preemptiva (fila de maior prioridade) e round-robin (fila de menor prioridade) dentro das filas e prioridade não preemptiva entre filas.
19 - Filas multinível utilizando prioridade preemptiva (primeira fila) e round-robin (segunda fila) dentro das filas e round-robin entre filas (70% e 30% do tempo da cpu).
20 - Filas multinível utilizando prioridade preemptiva (fila de maior prioridade) e round-robin (fila de menor prioridade) dentro das filas e prioridade preemptiva entre filas.
21 - Filas multinível utilizando prioridade preemptiva (fila de maior prioridade) e round-robin (fila de menor prioridade) dentro das filas e prioridade não preemptiva entre filas.
22 - Filas multinível utilizando prioridade preemptiva (primeira fila) e prioridade preemptiva (segunda fila) dentro das filas e round-robin entre filas (70% e 30% do tempo da cpu).
23 - Filas multinível utilizando prioridade preemptiva (primeira fila) e prioridade não preemptiva (segunda fila) dentro das filas e round-robin entre filas (70% e 30% do tempo da cpu).
24 - Filas multinível utilizando prioridade não preemptiva (primeira fila) e prioridade preemptiva (segunda fila) dentro das filas e round-robin entre filas (70% e 30% do tempo da cpu).
25 - Filas multinível utilizando round-robin (fila de maior prioridade) e prioridade preemptiva (fila de menor prioridade) dentro das filas e prioridade não preemptiva entre filas.
26 - Filas multinível utilizando round-robin (fila de maior prioridade) e prioridade preemptiva (fila de menor prioridade) dentro das filas e prioridade preemptiva entre filas.
27 - Filas multinível utilizando round-robin (fila de maior prioridade) e prioridade não preemptiva (fila de menor prioridade) dentro das filas e prioridade não preemptiva entre filas.
28 - Filas multinível utilizando round-robin (primeira fila) e prioridade preemptiva (segunda fila) dentro das filas e round-robin entre filas (70% e 30% do tempo da cpu).

Trabalho de simulação de uma planta

O acesso aos transdutores deve ser feito através de rotinas que simulam a atuação
e a leitura. Essas rotinas devem ficar no arquivo "transdutores.c". Não é necessária precisão
na simulação da dinâmica do sistema, mas um comportamento consistente. Por exemplo, ao
aumentar a queima de gás a temperatura sobe.

Testar através de chamadas da função main, que atua sobre o sistema e lê as variáveis físicas.

Nesta etapa, simular apenas o que seria um device-driver para a placa de aquisição de dados
ligada no microcomputador. A aplicação em si (e o controle) serão feitos em outra etapa.

Incluir transdutores suficientes para permitir dois laços de controle com períodos diferentes e
um alarme. Entregar por escrito uma descrição (1 página) do processo simulado.

Sugestão: Usar rotinas setAtuador( ) para atuar e getVariavel( ) para ler o valor da variável física.
A setAtuador anota o valor da atuação e a hora da atuação. A getVariavel usa o valor da
variável na hora da atuação, o valor da atuação e a hora da leitura para calcular o valor
atual da variável física.
 

Trabalho das pthreads

Implementar o produtor&consumidor usando a biblioteca pthreads do Linux.
Fazer funcionar com vários produtores e consumidores, provocando situações de
buffer cheio e buffer vazio, através da inclusão de sleeps..

Trabalho de sockets

Implementar um "servidor de meio de campo" usando sockets tipo datagrama.

Trabalho das tarefas periódicas

Implementar um laço periódico seguindo as recomendações do relatório técnico
"Trabalhando com o Tempo Real em Aplicações Sobre o Linux". Apresentar o tempo médio,
mínimo e máximo usados como parâmetros para a função de dormir, para avaliar a variação
do mesmo.

Trabalho do controlador

Implementar um programa em C no Linux usando a biblioteca de pthreads que simule um
equipamento de laboratório. Deve incluir no mínimo:

- Dois laços de controle com períodos diferentes;
- Um alarme associado com combinações de valores das variáveis amostradas;
- Armazenagem em arquivo de leitura periódicas;
- Informações periódicas na tela;
- Leitura de comandos e/ou valores a partir do teclado.

O programa em si deve ficar no arquivo "controle.c" e deve ser composto por várias threads
que colaboram entre si através de variáveis compartilhadas.

Avaliação composta por:
    - Código fonte
    - Texto explicando o processo físico simulado
    - Texto explicando qual a função de cada thread e quais variáveis compartilhadas cada uma acessa
    - Apresentação individual do trabalho

Outros requisitos:
    - Cada variável compartilhada deve ter seu próprio mutex.
    - Variáveis condição devem ser usadas para liberar as threads de alarme.
    - Tarefas periódicas implementadas com precisão e não com sleep fixo.

Alguns aspectos para a composição da nota do trabalho do controlador:
- Fez no Linux ?
- Usou a biblioteca das pthreads ?
- A aplicação acessa arquivos ?
- A aplicação acessa teclado ?
- A aplicação possui alarmes ?
- A aplicação possui laços de controle ?
- Foram feitos dois arquivos .c para compilação em separado ?
- Foi usado um mutex para cada estrutura compartilhada ?
- O alarme utiliza variável condição ?
- As tarefas são realmente periódicas ?