Kernel cooperativo

413 visualizações

Publicada em

Desenvolvimento de um kernel cooperativo para utilização em sistemas embarcados

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
413
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
11
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Kernel cooperativo

  1. 1. ELT048 - SOEKernel CooperativoRodrigo AlmeidaUniversidade Federal de Itajubá
  2. 2. Revisão● Processostypedef int (*ptrFunc)(void* param);//código antigotypedef struct {char* nomeDoProcesso;ptrFunc funcao;int prioridade;int tempo;}process;
  3. 3. Exercício● Adaptar o código e executá-lo no kit dedesenvolvimento.● Reunir todas as funções relacionadas àoperação com o buffer circular numabiblioteca.● Utilizar o debugger da placa para verificar ofuncionamento do programa.
  4. 4. Exercíciovoid main (void){process p1 = {"F1n",1,func1};process p2 = {"F2n",2,func2};long int i;MCU_init();ini = 0;fim = 0;PTJ = 0x00;for(;;){addProc(p1);addProc(p2);exec();for(i=0;i<10000;i++);removeProc();exec();for(i=0;i<10000;i++);removeProc();}}int func1(void* param){PORTB=0xF0;}int func2(void* param){PORTB=0x0F;}Inicialização do HW
  5. 5. Kernel● Na área de computação o kernel é a partedo código responsável por implementar egerenciar a interface entre o hardware e aaplicação.● Os recursos de hardware mais críticosneste quesito são o processador, amemória e os drivers.
  6. 6. Projeto de um kernel
  7. 7. Kernel● Um kernel possui três responsabilidadesprincipais:● Gerenciar e coordenar a execução dosprocessos através de algum critério● Manusear a memória disponível e coordenar oacesso dos processos a ela● Intermediar a comunicação entre os drivers dehardware e os processos
  8. 8. Kernel● Gerenciamento dos processos● Deve levar em conta um critério para oescalonemento do processo: tempo deexecução, prioridade, criticidade, “justiça”, etc.● Os processos devem ser “armazenados” demodo a ficarem facilmente disponíveis aokernel.● O kernel deve prover funções para ogerenciamento destes processos: adicionar,remover, pausar, etc.
  9. 9. Kernel● Gerenciamento da memória disponível● A gestão do espaço disponível para cadaprocesso é de responsabilidade do kernel● Um ponto crítico é garantir que cada processosó possa acessar sua região de memória. Istosó pode ser feito se houver um hardwarededicado a este ponto: MMU
  10. 10. Kernel● Intermediar a comunicação entre os driversde hardware e os processos● O kernel deve prover uma camada de acessoao hardware.● Esta camada é responsável por implementar asquestões de permissão e segurança, comotambém padronizar as chamadas de aplicação.
  11. 11. Gestão dos processos● A gestão dosprocesso é feitaatravés de umbuffer circular(process pool).● O acesso a estebuffer deve serrestrito ao kernel.http://learnyousomeerlang.com/building-applications-with-otp
  12. 12. Gestão dos processos● O exemplo a seguir apresenta um modelo degerenciamento de processos.● Note que o pool é implementado como um buffercircular utilizando a mesma estrutura das aulasanteriores● Uma das poucas diferenças é a mudança do poolpara ser um vetor de ponteiros para a structprocess● Isto permite uma manipulação mais rápida esimples dos elementos do pool● Uma movimentação nas posições envolve apenasuma cópia de ponteiros e não da estrutura inteira.
  13. 13. //definição do ponteiro de funçãotypedef int (*ptrFunc)(void* param);//definição da estrutura processotypedef struct {char* nome;void* ptr;ptrFunc func;} process;//definição do pool#define POOLSIZE 10process* pool[POOLSIZE];//a utilização de ponteiros de processo//facilita a manipulação dos processosGestão dos processos
  14. 14. //função de adição de “process” no poolvoid addProc(process nProcesso){//checagem de espaço disponívelif ( ((fim+1)%POOLSIZE) != ini){//Atualização da posição atualbuffer[fim] = nProcesso;//incremento da posiçãofim = (fim+1)%(POOLSIZE);}}//função de remoção de um “process” do poolvoidremoveProc (void){//checagem se existe alguem pra retirarif ( ini != fim ){//incremento da posiçãoini = (ini+1)%(POOLSIZE);}}Gestão dos processos
  15. 15. Escalonador● É o responsável por escolher qual é o próximoprocesso a ser executado.● Existem alguns parâmetros a seremconsiderados:● Throughtput: quantidade de processos por tempo.● Latência:– Turnaround time – tempo entre o inicio e fim de umprocesso.– Response time: valor entre uma requisição e a primeiraresposta do processo.● Fairness / Waiting Time – conceder umaquantidade de tempo igual para cada processo.
  16. 16. Escalonador● First in first out● Shortest remaining time● Fixed priority pre-emptive scheduling● Round-robin scheduling● Multilevel queue scheduling
  17. 17. EscalonadorScheduling algorithm CPUOverheadThroughputTurnaroundtimeResponsetimeFirst In First Out Low Low High LowShortest Job First Medium High Medium MediumPriority basedschedulingMedium Low High HighRound-robinschedulingHigh Medium Medium HighMultilevel QueueschedulingHigh High Medium Medium
  18. 18. EscalonadorOperating System Preemption AlgorithmAmiga OS Yes Prioritized Round-robin schedulingFreeBSD Yes Multilevel feedback queueLinux pre-2.6 Yes Multilevel feedback queueLinux 2.6-2.6.23 Yes O(1) schedulerLinux post-2.6.23 Yes Completely Fair SchedulerMac OS pre-9 None Cooperative SchedulerMac OS 9 Some Preemptive for MP tasks, CooperativeScheduler for processes and threadsMac OS X Yes Multilevel feedback queueNetBSD Yes Multilevel feedback queueSolaris Yes Multilevel feedback queueWindows 3.1x None Cooperative SchedulerWindows 95, 98, Me Half Preemptive for 32-bit processes, CooperativeScheduler for 16-bit processesWindows NT (XP,Vista, 7, 2k)Yes Multilevel feedback queue
  19. 19. Escalonadores● Considerações para o ambiente embarcado● Com a escassez de recursos computacionais,um algoritmo muito complexo pode minar acapacidade de processamento muitorapidamente. Algoritmos mais simples sãopreferidos.● Os sistemas de tempo real possuem algumasnecessidades que em geral só são satisfeitaspor escalonadores “injustos” que possamprivilegiar alguns processos. Ex: priority basedscheduler
  20. 20. Kernel● Preempção● Permite ao kernel pausar um processo paraexecutar um segundo sem que as variáveis efluxo de código do primeiro sejam alteradas.● Necessita de suporte de hardware porinterrupções● Só é programado em assembly
  21. 21. Kernel● Cooperativo● É necessário que os processos terminemdando oportunidade para outros processosserem executados pelo processador● Loops infinitos podem travar todo o sistema● Pode ser programado inteiro em C e nãonecessita de hardware especial
  22. 22. Kernel● Reagendamento de processos● Para um kernel cooperativo é importante quetodos os processos terminem voluntariamentepara ceder espaço na CPU para os outrosprocessos.● Nos casos em que o processo precisa serexecutado constantemente ele deve serreagendado na CPU
  23. 23. Exemplo● Exemplo de kernel cooperativo● O código apresentado pode ser compilado emqualquer compilador C● O kernel é composto por três funções:● KernelInit(): Inicializa as variáveis internas● KernelAddProc(): Adiciona processos no pool● KernelLoop(): Inicializa o gerenciador deprocessos– Esta função possui um loop infinito pois ela sóprecisa terminar quando o equipamento/placa fordesligado.
  24. 24. //return code#define SUCCESS 0#define FAIL 1#define REPEAT 2//function pointer declarationtypedef char(*ptrFunc)(void);//process structtypedef struct {ptrFunc function;} process;process* pool[POOLSIZE];Exemplo
  25. 25. char kernelInit(void){ini = 0;fim = 0;return SUCCESS;}char kernelAddProc(process newProc){//checking for free spaceif ( ((fim+1)%POOL_SIZE) != ini){pool[fim] = newProc;fim = (fim+1)%POOL_SIZE;return SUCCESS;}return FAIL;}Exemplo
  26. 26. void kernelLoop(void){int i=0;for(;;){//Do we have any process to execute?if (ini != fim){printf("Ite. %d, Slot. %d: ", i, start);//check if there is need to rescheduleif (pool[start]->Func() == REPEAT){kernelAddProc(pool[ini]);}//prepare to get the next process;ini = (ini+1)%POOL_SIZE;i++; // only for debug;}}}Exemplo
  27. 27. void tst1(void){printf("Process 1n");return REPEAT;}void tst2(void){printf("Process 2n");return SUCCESS;}void tst3(void){printf("Process 3n");return REPEAT;}● Os processosExemplo
  28. 28. void main(void){//declaring the processesprocess p1 = {tst1};process p2 = {tst2};process p3 = {tst3};kernelInit();//Test if the process was added successfullyif (kernelAddProc(p1) == SUCCESS){printf("1st process addedn");}if (kernelAddProc(p2) == SUCCESS){printf("2nd process addedn");}if (kernelAddProc(p3) == SUCCESS){printf("3rd process addedn");}kernelLoop();}Exemplo
  29. 29. Console Output:---------------------------1st process added2nd process added3rd process addedIte. 0, Slot. 0: Process 1Ite. 1, Slot. 1: Process 2Ite. 2, Slot. 2: Process 3Ite. 3, Slot. 3: Process 1Ite. 4, Slot. 0: Process 3Ite. 5, Slot. 1: Process 1Ite. 6, Slot. 2: Process 3Ite. 7, Slot. 3: Process 1Ite. 8, Slot. 0: Process 3...---------------------------Exemplo
  30. 30. Exercício● Criar os arquivos kernel.c, kernel.h,kernel_prm.h e kernel_types.h.● Adaptar os códigos apresentados para aplaca.● Testar o reagendamento dos processos.● Criar um processo para ligar um segmentodo display de cada vez (PORTB).● Criar um segundo processo para mudar dedisplay (PTJ)

×