Mudanças entre as edições de "BOOOS - Basic Object Oriented Operating System"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 1: Linha 1:
 
Neste página encontram-se os enunciados de atividades do projeto de ensino BOOOS - Basic Object Oriented Operating System. O projeto é constituído de N atividades, descritas abaixo.
 
Neste página encontram-se os enunciados de atividades do projeto de ensino BOOOS - Basic Object Oriented Operating System. O projeto é constituído de N atividades, descritas abaixo.
 
<!--
 
= Cronograma de Trabalhos Práticos =
 
 
Apresentação parcial: 24/04/2015: t0 a t5
 
 
Apresentação final: 19/06/2015: todos os trabalhos.
 
-->
 
  
 
== Sobre mecanismo de testes ==
 
== Sobre mecanismo de testes ==
Linha 27: Linha 19:
 
Para não realizar o teste automático, basta editar a função main do teste e chamar diretamente a função de teste que deseja executar (exemplo: ''Priority_Scheduler_Test_Functions::test_scheduling_without_aging()'').
 
Para não realizar o teste automático, basta editar a função main do teste e chamar diretamente a função de teste que deseja executar (exemplo: ''Priority_Scheduler_Test_Functions::test_scheduling_without_aging()'').
  
<!--
+
Um projeto pré-configurado para o Elicpse também foi disponibilizado [http://docente.ifsc.edu.br/arliones.hoeller/sop/booos-t1.tgz aqui]. Para utilizar este projeto, baixe o Eclipse com CDT para C/C++. Se preferir, utilize o ambiente pré-configurado disponibilizado [http://wiki.sj.ifsc.edu.br/index.php/Arliones_Hoeller#Material_de_apoio aqui].
 
 
= t0: Biblioteca de Filas =
 
 
 
Uma maneira de descrever um Sistema Operacional, sob o ponto de vista da programação, é definir-lo como um grande '''gerenciador de filas'''. São exemplos de filas importantes de um SO as filas de processos prontos a serem executados, processos suspensos, processos dormindo e processos bloqueados em semáforos. Para o trabalho da disciplina implementaremos nossas filas através de uma ''lista circular duplamente encadeada'', cuja estrutura pode ser vista na figura abaixo.
 
 
 
[[Arquivo:DoublyCircularlyLinkedList.png]]
 
 
 
Para recapitular a execução de operações sobre uma lista encadeada, consulte o material de Programação II. Lembre-se, nossa estrutura de dados é uma Fila, ou seja, elementos são inseridos no final e removidos do início.
 
 
 
Neste projeto você deve construir uma pequena biblioteca que ofereça uma classe ''Queue'' com métodos de inserção e remoção de elementos genéricos. O código-base da classe, que está nos arquivos [http://tele.sj.ifsc.edu.br/~arliones.hoeller/sop29005/booos/booos-t0/lib/Queue.h Queue.h] e [http://tele.sj.ifsc.edu.br/~arliones.hoeller/sop29005/booos/booos-t0/lib/Queue.cc Queue.cc]. A declaração da classe é apresentada abaixo:
 
 
 
<syntaxhighlight lang=cpp>
 
/*
 
*
 
*  Created on: Aug 14, 2014
 
*      Author: arliones
 
*/
 
 
#ifndef QUEUE_H_
 
#define QUEUE_H_
 
 
namespace BOOOS {
 
 
        class Queue {
 
        public:
 
                Queue();
 
                virtual ~Queue();
 
 
                class Element {
 
                public:
 
                        Element() { _prev = 0; _next = 0; _rank = 0; }
 
                        virtual ~Element() {}
 
 
                        Element * prev() { return _prev; }
 
                        Element * next() { return _next; }
 
                        int rank() { return _rank; }
 
                        void prev(Element * p) { _prev = p; }
 
                        void next(Element * p) { _next = p; }
 
                        void rank(int r) { _rank = r; }
 
 
                private:
 
                        Element * _prev;
 
                        Element * _next;
 
                        int _rank;
 
                };
 
 
                Element * head() { return &_head; }
 
 
                int length() { return _length; }
 
 
                void insert(Element * elem);
 
                void insert_ordered(Element * elem);
 
 
                Element * remove();
 
                void remove(Element * e);
 
 
        private:
 
                Element * search(Element * elem);
 
 
                Element _head; // _head.next will point to head, _head.prev will point to tail
 
                int _length;
 
        };
 
 
}
 
 
#endif /* QUEUE_H_ */
 
</syntaxhighlight>
 
 
 
Esta fila organiza objetos do tipo ''Element*''. A classe ''Element'' deve ser estendida para implementar os detalhes da aplicação, como no exemplo do arquivo [http://tele.sj.ifsc.edu.br/~arliones.hoeller/sop29005/booos/booos-t0/test/Queue_Test.cc Queue_Test.cc].
 
 
 
É responsabilidade do aluno implementar mais testes além dos que estão no exemplo para garantir o funcionamento da fila. Apenas o arquivo Queue.cc deve ser entregue ao professor, devidamente preenchido (os métodos estão vazios no original).
 
-->
 
 
 
Um projeto pré-configurado para o Elicpse Luna também foi disponibilizado [http://docente.ifsc.edu.br/arliones.hoeller/sop/booos-t1.tgz aqui]. Para utilizar este projeto:
 
# Baixe o [https://eclipse.org/downloads/packages/eclipse-ide-cc-developers/lunar Eclipse Luna para C/C++];
 
# O eclipse não precisa ser instalado, basta descompactar o arquivo baixado;
 
# Execute o eclipse através do executável "eclipse" na basta descompactada;
 
# Baixe o projeto disponibilizado pelo professor;
 
# No eclipse, acesse "Arquivo->Importar..." ou "File->Import...";
 
# Selecione a opção "Geral->Projetos Existentes para a Área de Trabalho" ou "General->Existing Projects into Workspace" e clique "Next" ou "Próximo";
 
# Selecione a opção "Selecionar arquivo compactado" ou "Select archive file", clique em "Buscar..." ou "Browse..." e selecione o arquivo compactado do projeto;
 
# Verifique se o projeto chamado "booos-t1" está selecionado na lista de "Projetos" ou "Projects";
 
# Clique em "Encerrar" ou "Finish", e o projeto deve aparecer no espaço de trabalho.
 
  
 
Observe que a pasta do projeto possui Makefiles. Se preferir, não é necessário utilizar o Eclipse para compilar e testar o projeto, basta usar os seguintes comandos, a partir do diretório do projeto (booos-t1):
 
Observe que a pasta do projeto possui Makefiles. Se preferir, não é necessário utilizar o Eclipse para compilar e testar o projeto, basta usar os seguintes comandos, a partir do diretório do projeto (booos-t1):
Linha 199: Linha 108:
  
  
[http://docente.ifsc.edu.br/arliones.hoeller/sop/booos-t1.tgz Aqui] há um projeto do Eclipse pré-configurado com os gabaritos para o t0.
+
[http://docente.ifsc.edu.br/arliones.hoeller/sop/booos-t0.tgz Aqui] há um projeto do Eclipse pré-configurado com os gabaritos para o t0.
  
  
 +
<!--
 
= t1: Escalonador FCFS e por prioridades =
 
= t1: Escalonador FCFS e por prioridades =
  

Edição das 17h20min de 7 de abril de 2016

Neste página encontram-se os enunciados de atividades do projeto de ensino BOOOS - Basic Object Oriented Operating System. O projeto é constituído de N atividades, descritas abaixo.

Sobre mecanismo de testes

Os testes que passei a vocês são um programa de testes automatizados. Vocês não precisam modificá-los. Ao executar o teste, vocẽs verão uma saída como esta:

arliones.hoeller@sj-labdes-29463:~/my_booos/test$ ./Scheduler_Test 
Welcome to BOOOS - Basic Object Oriented Operating System!
This program will test the class: Scheduler
Starting tests for unit: Scheduler
	Init: OK!
	Creation and Destruction: OK!
	FCFS: OK!
	Priority with Aging: OK!
	Priority without Aging: OK!

Para não realizar o teste automático, basta editar a função main do teste e chamar diretamente a função de teste que deseja executar (exemplo: Priority_Scheduler_Test_Functions::test_scheduling_without_aging()).

Um projeto pré-configurado para o Elicpse também foi disponibilizado aqui. Para utilizar este projeto, baixe o Eclipse com CDT para C/C++. Se preferir, utilize o ambiente pré-configurado disponibilizado aqui.

Observe que a pasta do projeto possui Makefiles. Se preferir, não é necessário utilizar o Eclipse para compilar e testar o projeto, basta usar os seguintes comandos, a partir do diretório do projeto (booos-t1):

$ make all     #Compila sistema e gera aplicação padrão
$ ./booos      #Executa aplicação padrão
$ make TEST=Task_Test test     #Compila programa de teste
$ ./test/Task_Test     #Executa programa de teste


t0: troca de contexto e tarefas cooperativas

Neste trabalho deve-se estender o projeto sendo desenvolvido no curso com a construção de uma classe para abstrair processos em nível de usuários - na prática, threads. A classe implementada será chamada de Task (tarefa). Lembre-se que uma classe é uma estrutura de dados, logo, nossa classe Task será o PCB (Proccess Control Block) do sistema. A partir deste trabalho, será disponibilizado um gabarito em C++ como no código abaixo, geralmente incompleto, e um diagrama UML de uma versão completa da solução implementada pelo professor, como na imagem abaixo.

Booos.png

/*
 * Task.h
 *
 *  Created on: Aug 15, 2014
 *      Author: arliones
 */

#ifndef TASK_H_
#define TASK_H_

#include <Queue.h>
#include <ucontext.h>

namespace BOOOS {

class Task {
public:
	enum State {
		READY,
		WAITING,
		RUNNING,
		FINISHING
	};

	Task(void (*entry_point)(void *), int nargs, void * arg);
	virtual ~Task();

	int tid() { return _tid; }
	State state() { return _state; }

	void pass_to(Task * t, State s = READY);

	void exit(int code);

	static Task * self() { return (Task*)__running; }
	static void init();

private:
	static volatile Task * __running;

	State _state;
	int _tid; // task ID
	// ...
};

} /* namespace BOOOS */

#endif /* TASK_H_ */

Os métodos de interface (i.e., os públicos) que precisam ser implementados na classe estão na declaração acima. Não altere a assinatura destes métodos! Observe que você certamente precisará de novos atributos para o correto funcionamento da classe, e seria bom utilizar alguns métodos privados para auxiliar na implementação. Você pode criar métodos e atributos privados à vontade. Onde será que será declarado o ucontext_t de cada Task?

O teste no arquivo test/Task_Test.cc implementa uma aplicação para testar sua classe Task. Use este exemplo como teste inicial. Abaixo há uma descrição detalhada dos métodos de interface da classe.

static void init(): método de classe que precisa ser chamando na inicialização do sistema e deve inicializar os atributos de classe (static). Atenção, o atributo __main, que é static, deve ser inicializado aqui!
Task(void (*entry_point)(void *), int nargs, void * arg): construtor - deve inicializar todos os atributos dos objetos.
virtual ~Task(): destrutor - deve liberar recursos alocados pelo construtor (new/malloc).
int tid(): getter do Task ID (_tid).
State state(): getter do estado do processo (_state).
void pass_to(Task * t, State s = READY): este método salva o contexto do objeto (this) e carrega o contexto da Task recebida por parâmetro. O estado passado em s é o novo estado do objeto que está deixando a CPU. Há algum atributo de classe (static) que precisa ser atualizado aqui?
void exit(int code): finaliza a Task (this) e configura o valor de resultado da task com o valor de code. Por enquanto, se preocupem em fazer a Task retornar a execução para a main. Ignorem o parâmetro code agora - utilizaremos ele mais adiante.
static Task * self(): método de classe (static) que retorna a Task executando no momento.


Aqui há um projeto do Eclipse pré-configurado com os gabaritos para o t0.