DAS5303: Informática Industrial II

Trabalhos para 2003/1

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.
 

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.

Trabalho de sockets

Implementar o "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 três diferentes comandos a partir do teclado, indicados pela letra digitada.

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 ?