Professional Documents
Culture Documents
#define sys_fork 2
// int fork()
Move sys_fork, eax
Int 80H
//Void Relógio() {
Salvar contexto();
Atualizar_ontabilização_d_tempo();
Rescalonar();
}
3. Crie um grafo com no mínimo 5 nodos e implemente com a primitiva fork do sistema
operacional Unix.
Não, porque o processo CPU Bound pode monopolizar o uso do processador, fazendo que
processos I/O bound sejam postergados. Além disso, neste algoritmo o tempo de resposta não é
uniforme, o que também não é adequado aos sistemas de tempo compartilhado.
Monolítica: Pode-se dizer que possui melhor performance que o Microkernel, pois todas as
funcionalidades são implementadas em um núcleo. O pedido é recebido por este núcleo que
executa o procedimento correspondente ao serviço. É de difícil manutenção, e não modular.
Multiprogramado: Usa o tempo de espera pelo I/0 de algum processo para executar outro
processo. Possui mais de um programa em execução simultânea, possui um escalonador e uma
gerencia de memória que permite a existência de mais de um processo na memória.
Void CriarProc()
Se arquivo é executável
AlocarMemória () ;
AlocarDescritor () ;
ColocarInformaçôesDescritor() ;
CarregarPrograma () ;
InserirReady list
Senão
erro
9. Apresente os estados que um processo assume durante a sua execução e faça o grafo
de transição, indicando o evento causador da transição.
Tem na apostila!
Void do_Disco() {
SalvarContexto();
CopiarDadosParaAreaDoProcesso() ; //no caso de read
InserirProcReady-list()
Rescalonar()
}
11. Considere um sistema que possui duas filas de scheduling, com prioridades 0 e 1,
sendo que somente pode ser escalonado um processo da fila de prioridade 1 não
existindo processos na fila de prioridade 0. Sabendo que o algoritmo utilizado nas duas
filas é o Round-Robin, escreva o pseudo-código dos procedimentos insere(p), onde p é o
índice da tabela de descritores de processos e que possui um campo que contém a
prioridade dos processos e r= seleciona(), que retorna o índice da tabela de descritores
que descreve o processo selecionado. Cite duas situações em que cada procedimento é
chamado.
Void Relógio() {
SalvarContexto() ;
AtualizarContabilizaçãoTempo() ;
Rescalonar() ;
}
SaveContext()
- copiar os registradores para o descritor do processo
RestoreContext()
- O inverso
struct Desc{
Int pid, estado, prioridade, SP, Msize, Mbase, AC, R0, R1, PC;
};
struct Desc proc_Descritor [1000] ; // portanto, no máximo 1000 processos no sistema.
Considerando que o índice do descritor do processo que estava rodando está armazenado na
variável running:
# saveContext ()
mov SP, proc_Descritor[running].SP;
mov Msize, proc_Descritor[running].Msize;
mov Mbase, proc_Descritor[running].Mbase,;
mov R0, proc_Descritor[running].R0;
mov R1, proc_Descritor[running].R1;
mov AC, proc_Descritor[running].AC;
mov PC, proc_Descritor[running].PC;
#restoreContext( p)
mov proc_Descritor[p].SP, SP;
mov proc_Descritor[p].Msize, Msize;
mov proc_Descritor[p].Mbase, Mbase;
mov proc_Descritor[p].R0, R0;
mov proc_Descritor[p].R1, R1;
mov proc_Descritor[p].AC, AC;
mov proc_Descritor[p].PC, PC;