O que é um processo
Um processo é um programa (código objeto armazenado em alguma mídia) em execução.
Processo é composto por:
I código do programa em execução I arquivos abertos
I sinais pendentes
I dados internos do núcleo do SO I estado do processador
Bloco de controle do processo
Process Block Control (PCB)
Processo é composto por:
I código do programa em execução I arquivos abertos
I sinais pendentes
I dados internos do núcleo do SO I estado do processador
I espaço de endereço
I uma ou mais threads de execução I seção de dados contendo variáveis
globais
Bloco de Controle do Processo estado do processo número do processo contador de programa
registradores limites de memória lista de arquivos abertos
. . .
Figura : Bloco de controle do processo.
I código do programa em execução I arquivos abertos
I sinais pendentes
I dados internos do núcleo do SO I estado do processador
I espaço de endereço
Estados de um processo
Estados
Novo O processo está sendo criado.
Executando As instruções estão sendo executadas.
Esperando O processo está esperando pela ocorrência de algum
evento (como um término de E/S ou uma interrupção).
Pronto O processo está esperando para ser designado a um
processador.
Transição dos estados de um processo novo cria PCB pronto enviado para a fila
novo
cria PCB
Transição dos estados de um processo novo cria PCB pronto executando enviado
para a fila para execuçãoescalonado
escalonado para a fila
novo cria PCB executando esperando escalonado para a fila requisição E/S
Transição dos estados de um processo novo cria PCB pronto executando esperando enviado
para a fila para execuçãoescalonado
escalonado para a fila
requisição E/S
novo cria PCB executando esperando término apaga PCB escalonado para a fila requisição E/S término E/S término do processo
Sequência dos PCBs processo 0 processo 1 cria PCB0 salva PCB0 recarrega PCB0 recarrega PCB1 apaga PCB1 . . . pronto executando terminado esperando
Modelos
Única thread
processo
dados
código arquivos
registradores pilha (stack)
dados código arquivos registrador stack registrador stack registrador stack Benefícios I Responsividade; I Compartilhamento de recursos; I Economia; I Utilização de arquiteturas
Espaço de endereçamento do usuário sem threads
espaço de endereçamento do usuário
escreve_saida: FILE ∗arquivo char ∗conteudo stack main() { escreve_saida(); calcula(); } código
calcula:
int resultado int numero
Espaço de endereçamento do usuário com threads
espaço de endereçamento do usuário
escreve_saida: FILE ∗arquivo char ∗conteudo Thread1: stack executando calcula: int resultado int numero Thread2: stack main() { escreve_saida(); calcula(); } código
escreve_saida: FILE ∗arquivo char ∗conteudo Thread1: stack calcula: int resultado int numero executando Thread2: stack
Sequência de escalonamento
Sem threads
escreve_saida()
calcula()
Com threads, um processador thread 1
escreve_saida() thread 2 calcula()
Com threads, vários processadores thread 1, CPU 1
escreve_saida() thread 2, CPU 2 calcula()
calcula()
Com threads, um processador thread 1
escreve_saida() execução
thread 2 calcula()
Sequência de escalonamento
Sem threads
escreve_saida() execução bloqueio: requisiçãode E/S
calcula()
Com threads, um processador thread 1
escreve_saida() execução bloqueio: requisiçãode E/S
thread 2 calcula()
Com threads, vários processadores thread 1, CPU 1
escreve_saida() execução bloqueio: requisiçãode E/S
thread 2, CPU 2 calcula()
calcula()
Com threads, um processador
thread 1
escreve_saida() execução bloqueio: requisiçãode E/S execução
thread 2 calcula()
Sequência de escalonamento
Sem threads
escreve_saida() execução bloqueio: requisiçãode E/S execução fim
calcula()
Com threads, um processador thread 1
escreve_saida() execução bloqueio: requisiçãode E/S execução fim
thread 2 calcula()
Com threads, vários processadores thread 1, CPU 1
escreve_saida() execução bloqueio: requisiçãode E/S execução fim
thread 2, CPU 2 calcula()
calcula() execução
Com threads, um processador thread 1
escreve_saida() execução bloqueio: requisiçãode E/S execução fim
thread 2
calcula()
Sequência de escalonamento
Sem threads escreve_saida() execução
calcula()
Com threads, um processador
thread 1
escreve_saida() execução
thread 2 calcula()
Com threads, vários processadores thread 1, CPU 1
escreve_saida() execução
thread 2, CPU 2 calcula()
calcula()
Com threads, um processador
thread 1
escreve_saida() execução bloqueio: requisiçãode E/S
thread 2 calcula()
Sequência de escalonamento
Sem threads
escreve_saida() execução bloqueio: requisiçãode E/S
calcula()
Com threads, um processador
thread 1
escreve_saida() execução bloqueio: requisiçãode E/S
thread 2
calcula() execução
Com threads, vários processadores thread 1, CPU 1
escreve_saida() execução bloqueio: requisiçãode E/S
thread 2, CPU 2 calcula()
calcula()
Com threads, um processador
thread 1
escreve_saida() execução bloqueio: requisiçãode E/S
thread 2
calcula() execução fim
Sequência de escalonamento
Sem threads
escreve_saida() execução bloqueio: requisiçãode E/S execução
calcula()
Com threads, um processador
thread 1
escreve_saida() execução bloqueio: requisiçãode E/S execução
thread 2
calcula() execução fim
Com threads, vários processadores thread 1, CPU 1
escreve_saida() execução bloqueio: requisiçãode E/S execução
thread 2, CPU 2 calcula()
calcula()
Com threads, um processador
thread 1
escreve_saida() execução bloqueio: requisiçãode E/S execução fim
thread 2
calcula() execução fim
Sequência de escalonamento
Sem threads escreve_saida() execução
calcula()
Com threads, um processador thread 1
escreve_saida() execução
thread 2 calcula()
Com threads, vários processadores
thread 1, CPU 1
escreve_saida() execução
thread 2, CPU 2
calcula()
Com threads, um processador thread 1
escreve_saida() execução bloqueio: requisiçãode E/S
thread 2 calcula()
Sequência de escalonamento
Sem threads
escreve_saida() execução bloqueio: requisiçãode E/S execução
calcula()
Com threads, um processador thread 1
escreve_saida() execução bloqueio: requisiçãode E/S execução
thread 2 calcula()
Com threads, vários processadores
thread 1, CPU 1
escreve_saida() execução bloqueio: requisiçãode E/S execução
thread 2, CPU 2
calcula()
Com threads, um processador thread 1
escreve_saida() execução bloqueio: requisiçãode E/S execução fim
thread 2 calcula()
Sequência de escalonamento
Sem threads
escreve_saida() execução bloqueio: requisiçãode E/S execução fim
calcula() execução
Com threads, um processador
thread 1
escreve_saida() execução bloqueio: requisiçãode E/S execução fim
thread 2
calcula() execução fim
Com threads, vários processadores
thread 1, CPU 1
escreve_saida() execução bloqueio: requisiçãode E/S execução fim
thread 2, CPU 2