Baixe o app para aproveitar ainda mais
Prévia do material em texto
* * SISTEMAS OPERACIONAIS SIMONE MARKENSON Rio de Janeiro, maio de 2011 CONTEÚDO DA AULA * CONCEITOS DE PROCESSOS Instância de um programa em execução. É a unidade de carga e alocação de uma tarefa Um programa é carregado para a memória onde aloca uma determinada área para código e dados * ESTADOS DE UM PROCESSO modelo de 5 estados * THEADS São fluxos de execução distintos dentro de um mesmo processo. É a unidade de execução de um sistema. Um processo Um thread Múltiplos processos Um thread por processo Um processo múltiplos threads Multiplos processos Múltiplos threads por processo * Características * Motivação Exemplo do tijolo * THREADS DE KERNEL As threads de kernel são criadas e gerenciadas pelo kernel do sistema operacional mas não podem ser diretamente utilizadas pelo usuário. O suporte a múltiplas threads é uma característica do sistema operacional * As threads de usuário facilitam aspectos de portabilidade e são criadas e gerenciadas por uma biblioteca no nível do usuário. O kernel não enxerga essas threads e, por esse motivo, não podem ser gerenciadas individualmente. Bibliotecas de threads: POSIX Pthreads , Win32 threads, Java threads THREADS DE USUÁRIO * PROCESSOS LEVES A combinação entre os dois tipos de threads promove uma associação entre threads de usuário e de kernel, porém a forma de associação depende do sistema operacional. Esta é a solução mais utilizada nos sistemas modernos. * Para que servem? Melhor aproveitamento da fatia de tempo Compartilhamento de Recursos Economia de tempo de gerenciamento Utilização de Múltiplos Processadores * Para entender sem decorar int x = 10; int main (){ int y; y=soma(); x = x+1; cout << “x=” << x <<”\n”; } int soma (){ x=x+1; return x; } VARIÁVEL GLOBAL FUNÇÃO PRINCIPAL FUNÇÃO SOMA Resultado: x = 12 * Resumindo... Uma thread pode ser imaginada então como uma função de um programa que tem “vida própria” para a execução mas não pode ser criada isoladamente. * int main() { int i; for(i=0;i<THREADS;i++) cnt[i]=0; loop=1; for(i=0;i<THREADS;i++) pthread_create(&id[i],0,thread_conta,(void*)i); sleep(1); loop=0; for(i=0;i<THREADS;i++) pthread_join(id[i],0); for(i=0;i<THREADS;i++) cout << "thread " << i << " executou: " << cnt[i] << " vezes\n} } Sem terror, ok? * Código da thread void* thread_conta(void* id){ int idx = (int)id; while(loop) cnt[idx]++; pthread_exit(0); } * Código da thread alterado void* thread_conta(void* id){ int idx = (int)id; if (idx == 0 ) getchar(); while(loop) cnt[idx]++; pthread_exit(0); } *
Compartilhar