A maior rede de estudos do Brasil

Grátis
16 pág.
Aula_03

Pré-visualização | Página 1 de 1

*
*
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);
}
*