Escolar Documentos
Profissional Documentos
Cultura Documentos
Operating System Concepts – 9th Edition Silberschatz, Galvin and Gagne ©2013
Sobre a apresentação (About the slides)
The slides and figures in this presentation are copyright Silberschatz, Galvin
and Gagne, 2009. This presentation has been modified by Cristiano Costa
(cac@unisinos.br). Basically it was translated to Brazilian Portuguese. This
presentation has been updated to the 9th edition of the book released in 2013.
You can access the original slides at http://www.os-book.com
The 2009 version can be downloaded at http://www.inf.unisinos.br/~cac
Operating System Concepts – 9th Edition 3.2 Silberschatz, Galvin and Gagne ©2013
Capítulo 3: Processes
! Conceito de Processo
! Escalonamento de Processos
! Operações com Processos
! Processos Cooperativos
! Comunicação entre Processos
! Comunicação em sistemas Cliente-Servidor
Operating System Concepts – 9th Edition 3.3 Silberschatz, Galvin and Gagne ©2013
Conceito de Processo
Operating System Concepts – 9th Edition 3.4 Silberschatz, Galvin and Gagne ©2013
Processo na Memória
Operating System Concepts – 9th Edition 3.5 Silberschatz, Galvin and Gagne ©2013
as shown in Figure 3.1, with a few differences:
to the main() function.
• The global data section is divided into different sections for (a) initialized
high
emory
Organização de Memória de um Programa C
argc, agrv
#include <stdio.h>
data and#include
(b) uninitialized
<stdlib.h>data.
• A separate section is provided for the argc and argv parameters passed
stack int x;function.
to the main()
int y = 15;
#include <stdio.h>
high intargc,
main(int argc, char #include
*argv[])<stdlib.h>
agrv
memory {
int *values;
stack int x;
int i; int y = 15;
heap
uninitialized int main(int argc, char *argv[])
values = (int *)malloc(sizeof(int)*5);
data {
initialized for(i = 0; i < 5; i++) int *values;
int i;
data heap values[i] = i;
low return 0;
text uninitialized
emory } values = (int *)malloc(sizeof(int)*5);
data
initialized for(i = 0; i < 5; i++)
data values[i] = i;
he GNU size command can low be used to determine the sizereturn
(in bytes)
0;
of
text
e of these sections. Assuming the name of the executable}file of the above
memory
ogram is memory, the following is the output generated by entering the
mand •O comando
size memorysize
: lista
The GNUosize
tamanho can be used• toO
dessas
command campo
determine the data indica
size (in bytes) of dados
some of these sections. Assuming the name of the executable file of the above
seções
C program is memory , the following
inicializados e bss indica dados
is the output generated by entering the
text data bss dec hex filename
1158 284 8command 1450 5aa :
size memory memory
não inicializados. bss significa
block started by symbol.
text data bss dec hex filename
data• field refers to uninitialized
O comando ulimit 1158 –sdata, and bss8 refers1450
lista284
o tamanho da to initialized
pilha5aa data.
(padrão em Linux = 8MB)
memory
is a historical term referring to block started by symbol.) The dec and
values are the sum ofThe thedata
three
fieldsections
refers to represented in decimal
uninitialized data, and to initialized data.
and bss refers
decimal, respectively. (bss is a historical term referring to block started by symbol.) The dec and
hex values are the sum of the three sections represented in decimal and
hexadecimal,
Operating System Concepts – 9th Edition respectively. 3.6 Silberschatz, Galvin and Gagne ©2013
Estados de Processo
Operating System Concepts – 9th Edition 3.7 Silberschatz, Galvin and Gagne ©2013
Diagrama de Estados de Processos
Operating System Concepts – 9th Edition 3.8 Silberschatz, Galvin and Gagne ©2013
Process Control Block (PCB)
Operating System Concepts – 9th Edition 3.9 Silberschatz, Galvin and Gagne ©2013
Process Control Block (PCB)
Operating System Concepts – 9th Edition 3.10 Silberschatz, Galvin and Gagne ©2013
Troca de CPU entre Processos
Operating System Concepts – 9th Edition 3.11 Silberschatz, Galvin and Gagne ©2013
Filas de Escalonamento de Processos
Operating System Concepts – 9th Edition 3.12 Silberschatz, Galvin and Gagne ©2013
Fila de Processos Prontos e Várias Filas de E/S
Operating System Concepts – 9th Edition 3.13 Silberschatz, Galvin and Gagne ©2013
Representação de Escalonamento de Processos
Operating System Concepts – 9th Edition 3.14 Silberschatz, Galvin and Gagne ©2013
Escalonador
Operating System Concepts – 9th Edition 3.17 Silberschatz, Galvin and Gagne ©2013
Troca de Contexto
Operating System Concepts – 9th Edition 3.18 Silberschatz, Galvin and Gagne ©2013
Criação de Processos
! Processo pai cria processo filho, o qual, por sua vez, pode criar outros
processos, formando uma árvore de processos.
! Geralmente, processos são identificados e gerenciados via um
Identificador de Processos (Process IDentifier - PID)
! Compartilhamento de Recursos
" Pai e filho compartilham todos os recursos.
" Filho compartilha um subconjunto dos recursos do pai.
" Pai e filho não compartilham recursos.
! Execução
" Pai e filho executam concorrentemente.
" Pai espera até filho terminar.
Operating System Concepts – 9th Edition 3.19 Silberschatz, Galvin and Gagne ©2013
Criação de Processos (Cont.)
! Espaço de endereçamento
" Filho duplica espaço do pai.
" Filho tem um programa carregado no seu espaço.
! Exemplos no UNIX
" Chamada de sistemas fork cria um novo processo.
" Chamada de sistemas exec é usada após o fork para sobrescrever o
espaço de memória do processo com um novo programa.
Operating System Concepts – 9th Edition 3.20 Silberschatz, Galvin and Gagne ©2013
Criação de Processos (Cont.)
Operating System Concepts – 9th Edition 3.21 Silberschatz, Galvin and Gagne ©2013
Programa em C Criando Processos Separados
int main()
{
pid_t pid;
/* cria outro processo */
pid = fork();
if (pid < 0) { /* ocorrência de erro*/
fprintf(stderr, “Criação Falhou");
exit(-1);
}
else if (pid == 0) { /* processo filho*/
execlp("/bin/ls", "ls", NULL);
}
else { /* processo pai */
/* pai irá esperar o filho completar execução */
wait (NULL);
printf (“Filho Completou Execução");
exit(0);
}
}
Operating System Concepts – 9th Edition 3.22 Silberschatz, Galvin and Gagne ©2013
Programa Java Criando Processos Separados
import java.io.*;
public class OSProcess {
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println(“Usage: java OSProcess <command>”);
System.exit(0);
}
// args[0] is the command
ProcessBuilder pb = new ProcessBuilder(args[0]);
Process proc = pb.start();
// obtain the input stream
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
// read what is returned by the command
String line;
while ( (line = br.readLine()) != null)
System.out.println(line);
br.close();
}
}
Operating System Concepts – 9th Edition 3.23 Silberschatz, Galvin and Gagne ©2013
Uma Árvore de Processos em Linux
Operating System Concepts – 9th Edition 3.24 Silberschatz, Galvin and Gagne ©2013
Encerramento de Processos
! Processo executa última declaração e pede ao sistema operacional para
terminar (exit).
" Dados de saída passam do filho para o pai (via wait).
" Recursos do processo são desalocados pelo sistema operacional.
! Pai pode terminar a execução do processo filho (abort).
" Filho se excedeu alocando recursos.
" Tarefa delegada ao filho não é mais necessária.
" Pai está terminando.
4Alguns sistemas operacionais não permitem que um filho continue sua
execução se seu pai terminou.
4Todos os filhos terminam - Terminação em cascata.
! Se o pai não está esperando (não chamou wait()), o processo vira zumbi
(zombie).
! Se o pai terminou sem chamar wait(), o processo vira órfão (orphan).
Operating System Concepts – 9th Edition 3.25 Silberschatz, Galvin and Gagne ©2013
Arquitetura Multiprocessos - Chrome
! Muitos navegadores rodam como um único processo (alguns ainda rodam
assim).
" Se um site causar um problema, o navegador inteiro congela ou morre.
! O navegador Google Chrome é multiprocessado com três tipos diferentes
de processos:
" Browser: gerencia a interface do usuário, acessos a disco e rede.
" Renderer: renderiza páginas web, lida com HTML e Javascript. Um
novo renderer é criado para cada website visitado.
4Roda em sandbox com restrições de acesso ao disco e rede,
minimizando assim os efeitos de ataques de segurança.
" Plugin: um processo para cada tipo de plug-in.
Operating System Concepts – 9th Edition 3.26 Silberschatz, Galvin and Gagne ©2013
Comunicação entre Processos (IPC)
! Processos em um sistema podem ser Independentes ou Cooperantes
! Processos Independentes não podem afetar ou ser afetados pela
execução de outro processo.
! Processos Cooperantes podem afetar ou ser afetados pela execução de
outro processo
! Razões para cooperação entre processos:
" Compartilhamento de Informações
" Aumento na velocidade da computação
" Modularidade
" Conveniência
! Processos cooperantes precisam de Comunicação entre Processos (IPC
– interprocess communication)
! Dois modelos de IPC: memória compartilhada e troca de mensagens
Operating System Concepts – 9th Edition 3.27 Silberschatz, Galvin and Gagne ©2013
Modelos de Comunicação
(a) Troca de mensagens. (b) memória compartilhada
process A process A
process B
message queue
m0 m1 m2 m3 ... mn
kernel
kernel
(a) (b)
Operating System Concepts – 9th Edition 3.28 Silberschatz, Galvin and Gagne ©2013
Comunicação entre Processos –
Memória Compartilhada
! Uma área de memória compartilhada entre processos que desejam
se comunicar
! A comunicação fica sob o controle dos processos de usuário e não
do sistema operacional.
! O maior problema para o SO é oferecer mecanismos que permitam
que os processos de usuário sincronizem suas ações quando eles
acessam a memória compartilhada.
! Sincronização de processos é um tópico que será discutido em
detalhes no Capítulo 5.
Operating System Concepts – 9th Edition 3.29 Silberschatz, Galvin and Gagne ©2013
Problema do Produtor-Consumidor
Operating System Concepts – 9th Edition 3.30 Silberschatz, Galvin and Gagne ©2013
Solução Buffer Tamanho Fixo - Memória Compartilhada
! Dados Compartilhados
#define BUFFER_SIZE 10
typedef struct {
...
} item;
item buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
Operating System Concepts – 9th Edition 3.31 Silberschatz, Galvin and Gagne ©2013
Buffer Tamanho Fixo – Produtor
while (true) {
/* Produz um item */
Operating System Concepts – 9th Edition 3.32 Silberschatz, Galvin and Gagne ©2013
Buffer Tamanho Fixo – Consumidor
while (true) {
while (in == out)
; /* não faz nada -- nada para consumir */
/* Remove um item do buffer */
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
/* Consome um item */
}
Operating System Concepts – 9th Edition 3.33 Silberschatz, Galvin and Gagne ©2013
E se quisermos preencher o buffer todo?
! Suponha que queiramos desenvolver uma solução para o problema do
produtor-consumidor que preencha todos os buffers
! Podemos fazer isso usando um contador inteiro que mantém o número
de buffers utilizados
! O contador é inicializado com 0.
! O contador é incrementado pelo produtor depois que ele produz um
novo item.
! O contador é decrementado depois que o consumidor consome um item.
Operating System Concepts – 9th Edition 3.34 Silberschatz, Galvin and Gagne ©2013
Produtor
while (true) {
/* produce an item in next produced */
Operating System Concepts – 9th Edition 3.35 Silberschatz, Galvin and Gagne ©2013
Consumidor
while (true) {
while (counter == 0)
; /* do nothing */
next_consumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
counter--;
/* consume the item in next consumed */
}
Operating System Concepts – 9th Edition 3.36 Silberschatz, Galvin and Gagne ©2013
Condição de Corrida
! counter++ pode ser implementado como
register1 = counter
register1 = register1 + 1
counter = register1
! counter-- pode ser implementado como
register2 = counter
register2 = register2 - 1
counter = register2
! Considere a seguinte ordem de execução com “counter = 5” inicialmente:
S0: producer execute register1 = counter {register1 = 5}
S1: producer execute register1 = register1 + 1 {register1 = 6}
S2: consumer execute register2 = counter {register2 = 5}
S3: consumer execute register2 = register2 - 1 {register2 = 4}
S4: producer execute counter = register1 {counter = 6 }
S5: consumer execute counter = register2 {counter = 4}
Operating System Concepts – 9th Edition 3.37 Silberschatz, Galvin and Gagne ©2013
Condição de Corrida (Cont.)
! Pergunta – por que não há condição de corrida na primeira
solução (em que no máximo N – 1) podem ser preenchidos?
! Mais sobre sincronização de processos no Capítulo 5.
Operating System Concepts – 9th Edition 3.38 Silberschatz, Galvin and Gagne ©2013
Comunicação entre Processos –
Troca de mensagens
! Mecanismo para processos se comunicarem e sincronizarem suas ações.
! Sistema de mensagens – processos se comunicam uns com os outros sem
utilização de variáveis compartilhadas.
! Suporte a IPC (InterProcess Communication) provê duas operações uma
para envio outra para recebimento:
" send(mensagem) – tamanho da mensagem fixo ou variável
" receive(mensagem)
! Se P e Q querem se comunicar, eles necessitam:
" Estabelecer um link de comunicação entre eles
" Trocar mensagens via send/receive
! Implementação de links de comunicação
" Físico (ex. Memória compartilhada, barramento de hardware, rede)
" Lógico (ex. Propriedades lógicas: direto ou indireto, síncrono ou
assíncrono, buferização automática ou explícita)
Operating System Concepts – 9th Edition 3.39 Silberschatz, Galvin and Gagne ©2013
Comunicação Direta
! Processos devem nomear o outro explicitamente:
" send (P, mensagem) – envia uma mensagem ao processo P
" receive(Q, mensagem) – recebe uma mensagem do processo Q
Operating System Concepts – 9th Edition 3.41 Silberschatz, Galvin and Gagne ©2013
Comunicação Indireta
Operating System Concepts – 9th Edition 3.42 Silberschatz, Galvin and Gagne ©2013
Comunicação Indireta (Cont.)
! Operações
" Criar uma nova caixa postal
" Enviar e receber mensagens através da caixa postal
" Destruir uma caixa postal
Operating System Concepts – 9th Edition 3.43 Silberschatz, Galvin and Gagne ©2013
Comunicação Indireta (Cont.)
! Compartilhamento de Caixa Postal
" P1, P2, e P3 compartilham caixa postal A.
" P1, envia; P2 e P3 recebem.
" Quem recebe a mensagem?
! Soluções:
" Permitir que um link esteja associado com no máximo dois processos.
" Permitir somente a um processo de cada vez executar uma operação
de recebimento.
" Permitir ao sistema selecionar arbitrariamente por um receptor.
Remetente é notificado de quem foi o receptor.
Operating System Concepts – 9th Edition 3.44 Silberschatz, Galvin and Gagne ©2013
Sincronização
! Troca de Mensagens pode ser bloqueante ou não-bloqueante
Operating System Concepts – 9th Edition 3.45 Silberschatz, Galvin and Gagne ©2013
Sincronização
! O problema do produtor-consumidor se torna trivial
Produtor:
message next_produced;
while (true) {
/* produce an item in next produced */
send(next_produced);
}
Consumidor:
message next_consumed;
while (true) {
receive(next_consumed);
/* consume the item in next consumed */
}
Operating System Concepts – 9th Edition 3.46 Silberschatz, Galvin and Gagne ©2013
Bufferização
! Fila de mensagens associada ao link; implementada em uma dentre três
formas.
1. Capacidade Zero – 0 mensagens
Remetente deve esperar pelo receptor (rendezvous).
2. Capacidade Limitada – tamanho finito de n mensagens
Remetente deve aguardar se link está cheio.
3. Capacidade Ilimitada – tamanho infinito
Remetente nunca espera.
Operating System Concepts – 9th Edition 3.47 Silberschatz, Galvin and Gagne ©2013
Exemplos de Sistemas IPC - POSIX
! Memória Compartilhada no POSIX
" Processo cria primeiro um segmento de memória compartilhado
segment id = shmget(IPC PRIVATE, size, S IRUSR | S
IWUSR);
" Processo que deseja acesso a essa memória compartilhada
deve se anexar a ela
shared memory = (char *) shmat(id, NULL, 0);
" Agora o processo pode escrever na memória compartilhada
sprintf(shared memory, "Writing to shared
memory");
" Quando terminar, um processo pode desanexar a memória
compartilhada do seu espaço de armazenamento
shmdt(shared memory);
Operating System Concepts – 9th Edition 3.48 Silberschatz, Galvin and Gagne ©2013
Produtor – IPC POSIX
Operating System Concepts – 9th Edition 3.49 Silberschatz, Galvin and Gagne ©2013
Consumidor – IPC POSIX
Operating System Concepts – 9th Edition 3.50 Silberschatz, Galvin and Gagne ©2013
Fim do Capítulo 3