Você está na página 1de 7

qua, 18-abr-12

Sistemas Operativos 1 Modelo 5 processos


Elaborado por: Hlder Menezes l28774

qua, 18-abr-12

Introduo
O objectivo do trabalho para simular o modelo de 5 processos de um sistema operativo. A simulao e a representao deste modelo de 5 processos para proporcionar uma melhor compreenso de gesto de processos.

Desenvolvimento
O desenvolvimento deste trabalho foi muito duro, porque no tinha conhecimento suficiente em linguagem C portanto, tinha que aproveitar o tempo mximo possvel para estudar, depois que eu tentei desenvolver algumas das funcionalidades com a ajuda de alguns amigos para completar mximo possvel os requisitos do enunciado. Mesmo assim, no consegui implementar tudo, sobretudo nos problemas da implementao de instnciao dos objectos, tive sempre problema em codificao durante o perodo de trabalho, mas consegui resolver o mximo possvel que eu poderia. As estruturas do trabalho : 1. Criao de estruturas e assinaturas conjuntos num ficheiro header : fila.h e escalonador.h 2. Implementao das assinaturas no ficheiro *.c : fila.c e escalonador.c e, 3. Criao do mtodo main como o ponto inicial da execuo do programa O funcionamento do trabalho : 1. Inicializar todas as estruturas necessrias para a simulao e as estruturas de dados Nesta fase criei as assinaturas necessrias para a implementao da estrutura que vai ser necessrio posteriormente, estas assinaturas consiste em duas partes; assinaturas para filas e assinaturas para o escalonador. Algumas das implementaes das estruturas de dados e das assinaturas importantes: fila.h
//definio das estruturas typedef struct fila fila; typedef struct lista lista; // definir fila struct fila { lista *cabeca,*cauda; }; //definir lista struct lista{ void *x; lista *prox; };

/* assinatura funcoes*/ //metodo para criar nova fila fila *nova_fila(); //metodo para verificar se a fila esta vazia int isEmpty(fila *f); //mtodo para inserir na cauda void inserir(fila *q, void *v); //metodo para remover a cabeca void *remover(fila *f);

qua, 18-abr-12

escalonador.h Como h muitas implementaes, vou apresentar ento alguns que considero mais importante
struct AUX *init_proc; struct MEMORIA *memoria; struct STATE *states, *NEW, *READY, *RUNNING, *DISP0, *DISP1, *EXIT; /* Definicao de Estruturas */ //Estrutura que contem os processos typedef struct MEMORIA MEMORIA; struct MEMORIA{ //fila de processos fila *processos; }; //Estrutura que contem os auxs typedef struct AUX AUX; struct AUX{ fila *auxs; }; typedef struct STATE STATE; struct STATE{ fila *pcbs; }; //Accoes dos processos typedef struct accao accao; struct accao{ int inst; //tempo de instrucao ou o numero do dispositivo int val; //proxima accao accao *prox; }; typedef struct processo processo; struct processo{ int id; fila *accoes; //fila de accoes do processo em questao processo *prox; //apontador para o proximo processo }; //Imagens dos processos - PCBs typedef struct pcb pcb; struct pcb{ accao *ac; int id; int tmp_decorrido; enum estados estado; //Novo,Pronto,Bloqueado,Correr,Fim pcb *prox; }; typedef struct aux aux; struct aux{ processo *start; int tempo; aux *prox; }; /* Estruturas auxiliares aos processos */ /*posicao na memoria da accao start*/ //tempo em que o processo eh iniciado

/* Assinatura da Inicializacao de estruturas */ fila *inicia_MEMORIA(); fila *inicia_ESTADOS(); fila *inicia_AUX(); // filas fila *inicia_NEW(); fila *inicia_READY(); fila *inicia_RUNNING(); fila *inicia_DISP0(); fila *inicia_DISP1(); fila *inicia_EXIT();

qua, 18-abr-12 2. ler um ficheiro que contem a informao do tempo incio, do cpu e dos dispositivos Depois da criao das estruturas de dados e as assinaturas, necessrio a sua implementao para que o programa funciona. Para isso, de acordo com o enunciado, o programa tem que ter a capacidade para ler o input. Para ler o input, utilizei o ficheiro em formato txt que contem a informao do tempo inicio, do cpu e dos dispositivos. Implementao;
void lerFicheiro(FILE *ficheiro, int id){ int i; char op[MAX_INST]; processo *p = (processo *) malloc(sizeof(processo)); p->id=id; p->prox=NULL; //enquanto ainda no fim do ficheiro while((fscanf(ficheiro,"%d",&i))!=EOF){ fscanf(ficheiro,"%s %d\n",op,&i); accao *a = (accao *) malloc(sizeof(accao)); a->prox = NULL; //se op lido igual a char start if(strcmp(op,"start")==0){ aux *ax = (aux *) malloc(sizeof(aux)); ax->tempo = i; ax->prox=NULL; insere_aux(ax); } //se op lido igual a char cpu if(strcmp(op,"cpu")==0){ a->inst=1; a->val=i; insere_accao(a,p); } //se op lido igual a char dev if(strcmp(op,"disp")==0){ a->inst=2; a->val=i; insere_accao(a,p); } //se op lido igual a char stop if(strcmp(op,"stop")==0){ a->inst=3; a->val=i; insere_accao(a,p); } else{ printf("\nInstrucoes em formato incorrecto."); exit(0); } } insere_processo(p); }

A leitura do ficheiro linha por linha at que encontrar as instrues como 'start', 'cpu', 'disp' e 'stop'.Quando no h mais linhas para ler, o programa termina a sua execuo e vai para a prxima instruo. O programa para prxima instruo vai verificar cclicamente o estado da terminao (com o mtodo termina()), o mtodo vai verificar a cabea da lista pcb, se a cabea da lista for igual NULL retorna 0 e termina a sua execuo e sai do programa, caso contrrio retorna 1 e continua execuo. No introduzi essa parte do cdigo no trabalho enviado, porque ainda no tinha feito, mas vou apresentar aqui a sua implementao ;

qua, 18-abr-12

// Leitura e interpretacao do ficheiro input fp=fopen("processo.txt","r"); // id = 1 porque so processa um processo, ou 1 ficheiro lerFicheiro(fp,1); while(termina()!=1){ //inicia um processo pcb inicia_pcb(cont); //despachar pcbs da fila NEW para fila READY new2ready(); //gere processos em execucao corrente gere_cpu(); //gere dispositivos gere_disps(); //faz o output trace(); ++cont; }

Existe tambm algumas das funes ou mtodos auxiliares para manipulo de filas; void insere_processo(processo *p) o mtodo para inserir processo para a estrutura MEMORIA void insere_estados(pcb *pcb) Mtodo para adicionar pcb a estrutura STATES void inicia_pcb(int t) Contem as instrues para iniciar o pcb, isto ; verificar ciclicamente se a fila ou a estrutura 'aux' no est vazia vai verificar ciclicamente se a cabea da fila 'aux' diferente NULL, alocar a memoria para estrutura 'processo', atribuir os valores do processo no 'aux' estrutura processo e posteriormente, inserir esse processo a estrutura 'estado' void newReady() Despachar os pcbs de NEW para READY. Este mtodo verifica se o estado 'NEW' no est vazia e que a cabea da estrutura READY aponta para NULL ento, pode despachar o processo de NEW para READY. void scheduler() Mtodo para administrar a gesto do processo de READY para RUNNING. Comea-se por verificar se a estrutura READY no est vazia, caso no est, comer a despachar para RUNNING.

qua, 18-abr-12 void sai_CPU() Comear por verificar o tempo instante de um processo, no calculei por instante de tempo, calculei trivialmente com a comparao da varivel 'inst' (dentro da pcb->accao) com nmeros a seguir. inst for igual a 4, termina a processo e sai do processo para o estado EXIT inst for igual a 1, o processo volta para a fila READY inst for igual a 2, o processo bloqueado inst for igual a 3, o processo bloqueado void exec_CPU() Mtodo para executar processo no cpu com contagem de tempo decorrido. int query_CPU() Mtodo para comparar o tempo decorrido com tempo de execucao do pcb void gere_CPU() Mtodo para gerir processos em execucao corrente. Comear por verificar se a estrutura RUNNING est vazia ento chama o mtodo escheduler() para despachar os processos de READY para RUNNING. int termina() Comear por verificar se o estado do pcb igual a 'Fim' , ento retorna 1, caso contrrio retorna 0. Este mtodo vai ser utilizado para controlar a execuo no 'main'. se os pcb's da fila states estiverem todos no estado //Fim termina o programa char *estado2string(enum estados est) e void trace(); Estes dois mtodos utilizado para escrever no terminal/command line. Estrutura destes dois mtodos so;
char *estado2string(enum estados est){ switch(est){ case Novo: return "NULL"; case Pronto: return "READY"; case Correr: return "RUN"; case Bloqueado: return "BLOCK"; case Fim: return "EXIT"; default: return "N/A"; } } void trace(){ if(!isEmpty(states->pcbs)){ pcb *cabeca =(pcb *) (states->pcbs)->cabeca; printf("%d ",cont); while(cabeca!=NULL){ printf("P%d - %s ",cabeca->id, estado2string(cabeca->estado)); cabeca = cabeca->prox; } }; }

qua, 18-abr-12

Concluso
O trabalho foi feito com um esforo extra, porque tinha que aprender coisas novas, com a concluso do trabalho espero que posso continuar a praticar essa nova lnguagem e aumentar o meu conhecimento. O trabalho no foi muito bom, por falta de conhecimento e por falta de prtica da linguagem. O problema que surgiu no trabalho na criao das estruturas e nos apontadores, fiquei muito despercebido, mas depois tentei estudar e comparar com as outras linguagens que eu conheci e, finalmente fez me perceber algo suficiente. E outro problema que surgiu, na fase da compilao na funo main, quando tentei iniciar as estruturas de dados criadas, aparece sempre um aviso de erro segmentation fault (core dumped), como no sei como resolver este erro, ento no consegui execut-lo e no consegui ver o resultado da execuo no terminal. Portanto o trabalho ficou um bocado incompleto em termos da sua finalizao e do seu funcionamento.

Você também pode gostar