Trabalhos entregues após a data estipulada perdem 1 ponto por dia de
atraso, inclusive sábado e domingo.
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.
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).
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.
- 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
?