(pronto para a execucao, em espera, ou emexecucao) e seu nivel de privilegio. Os threadspossuem tambem uma lista de mensagens, que e utilizada pelo sistema decomunicacao entre processos do FESO. Diversas operacoes sao realizadas sobre os processos e threads. Processos e threads podem ser criados ou destruidospelo sistema a qualquer momento. O sistema operacional fornece um conjuntominimo de chamadas ao sistema que permitem a realizacao dessas operacoes. Acriacao de processos e feita atraves do carregamento de arquivos executaveis noformato ELF (Executable and LinkableFormat). Porem, o sistema FESO ainda nao suporta o carregamento debibliotecas compartilhadas, entao e imperativo que o arquivo executavel estejacom todas as suas bibliotecas estaticamente linkadasem um unico arquivo binario.Algoritmo de EscalonamentoO numero total de threadsno sistema, na maioria dos casos, e maior do que a quantidade de CPUsdisponiveis. Por este motivo, o sistema operacional deve permitir que cada thread tenha uma fatia de tempo para serexecutado pela CPU. O sistema FESO se utiliza de um algoritmo de escalonamentopor chaveamento circular, conhecido como round-robinpara escalonar as CPUs para os diversos threadspresentes no sistema. A figura abaixo mostra um exemplo de execucao o algoritmode escalonamento, bem como um diagrama das possiveis trocas de estado entre threads. Existem basicamente 2 tipos de threads presentes no sistemaFESO, os threads de aplicativos deusuario (com prioridade 1) e os threads dos processos servidores (prioridade0). O algoritmo de escalonamento do FESO utiliza 2 filas de threads com prioridades diferentes, e oalgoritmo round-robin e executadonessas duas filas. O algoritmo de escalonamento verifica, inicialmente, naprimeira fila, de prioridade 0, se existe algum thread pronto para a execucao. E caso exista ele e escalonado. Casonao exista, a mesma verificacao e executada na segunda fila.O algoritmo deescalonamento e executado constantemente, seja por causa de uma interrupcaocausada pelos temporizadores do sistema, ou porque algum thread executou uma chamada bloqueante. Em ambos os casos, oprocesso tem sua execucao interrompida, e o estado de seus registradores salvo.A diferenca e que threads cuja fatiade tempo se encerrou ainda estao prontos para execucao, e so nao estao alocadospois o sistema decidiu permitir que outro threadexecutasse. O caso do thread querealizou uma chamada bloqueante e diferente, pois a continuacao de sua execucaoso sera possivel, depois da ocorrencia do evento pelo qual ele esta esperando.O algoritmo de escalonamento sempre armazena o estado de todos os registradoresda CPU no momento em que um thread einterrompido, e quando um thread eposto de volta em execucao, o estado de seus registradores e restaurado. Esteprocesso e chamado de troca de contexto, e permite que a execucao de um thread seja retomada exatamente de ondeparou. O algoritmo deescalonamento coloca o thread emexecucao no final de sua fila, sempre que ele sofre preempcao, ou seja, tem suaexecucao interrompida, ou executa uma chamada bloqueante. Desta maneira, todosos threads tem a chance de obter umafatia de tempo para execucao na CPU. Entretanto, como os threads de processo servidores tem uma prioridade maior que threads de processos de usuario, caso umthread servidor nunca entre em estadode espera, qualquer thread de usuariofica indefinidamente impedido de executar. Para evitar que isto ocorra, osprocessos servidores, que so podem ser