Buscar

FSO Aula01

Prévia do material em texto

FUNDAMENTOS DE 
SISTEMAS 
OPERACIONAIS
Apresentação
Prof. Gabriel Fernandes
gfernandes@gmail.com
Bibliografia
• Bibliografia Básica:
• MACHADO, F. B.; MAIA, L. P.. Arquitetura de Sistemas Operacionais. 
4. ed. Rio de Janeiro: LTC, 2007.
• SILBERSCHATZ, A.; GALVIN, P. B.; GAGNE, G.. Sistemas 
operacionais com Java. Rio de Janeiro: Elsevier, 2008.
• TANENBAUM, A. S. Sistemas Operacionais Modernos. São Paulo : 
Prentice-Hall.
• Bibliografia Complementar:
• DEITEL, H. M., DEITEL, P.J., CHOFINES, D.R. Sistemas 
Operacionais. São Paulo : Pearson Prenticce-Hall.
• OLIVEIRA, R. S., CARISSIMI, A. S., TOSCANI, S. S. Sistemas 
Operacionais. Porto Alegre : Instituto de Informática da UFRGS: 
Editora Sagra Luzzatto.
• TANENBAUM, A. S., WOODHULL. Sistemas Operacionais: projeto e 
implementação. 2a. ed.. Porto Alegre : Bookman.
SISTEMAS 
OPERACIONAIS
Parte 1 – Introdução e conceitos
Introdução
• Sistema computacional: conjunto de recursos 
computacionais, parte hardware e parte software
• Essencialmente, um sistema computacional consiste em:
• hardware;
• programas do sistema;
• programas de aplicação.
Motivos
• Sistemas de computadores modernos são compostos por 
diversos dispositivos:
• Processadores;
• Memória;
• Controladoras;
• Monitor;
• Teclado;
• Mouse;
• Impressoras;
• Outros...
Motivos
• Com tantos dispositivos, surge a necessidade de 
gerenciamento e manipulação desses diversos 
dispositivos
• Tarefa difícil à Sistemas Operacionais
Sistema Operacional
• Software responsável por gerenciar dispositivos que 
compõem um sistema computacional e realizar a 
interação entre o usuário e esses dispositivos;
• Hardware
• Processador;
• Memória Principal;
• Dispositivos de Entrada/Saída; 
• Software
• Programas de Aplicação;
• Programas do Sistema;
Sistema Operacional
• Sistema Operacional: software que controla os recursos 
do sistema computacional e oferece ao usuário uma 
interface para interagir com cada um destes recursos.
O que é um SO
• É uma máquina estendida (abordagem top- down, 
“abstração do todo para as partes”)
• Oculta os detalhes complicados que têm quer ser executados;
• Apresenta ao usuário uma máquina virtual, mais fácil de usar;
• É um gerenciador de recursos (abordagem bottom-up 
“abstração das partes para o todo”)
• Gerencia todas as partes de um sistema complexo ◦ Cada 
programa tem um tempo com o recurso;
• Cada programa tem um espaço no recurso.
SO como Máquina Estendida
• Ex.: como é feita a entrada/saída de um disco – tarefa: 
Leitura e Escrita
• SO: baixo nível
• Número de parâmetros;
• Endereço de bloco a ser lido;
• Número de setores por trilha;
• Modo de gravação;
• Usuário: alto nível – abstração simples
• Visualização do arquivo a ser lido e escrito;
• Arquivo é lido e escrito;
• Arquivo é fechado.
SO como Gerenciador de Recursos
• Gerenciar todos os dispositivos e recursos disponíveis no 
computador
• Ex.: se dois processos querem acessar um mesmo recurso, por 
exemplo, uma impressora, o SO é responsável por estabelecer 
uma ordem para que ambos os processos possam realizar sua 
tarefa de utilizar a impressora.
• Uso do HD;
• Uso da memória;
• Coordena a alocação controlada e ordenada dos 
recursos;
Objetivos de um SO
• Apresentar ao usuário do computador uma forma amena 
de utilizar a máquina. Criar uma máquina virtual, de fácil 
compreensão para o usuário, com características 
diferentes da máquina física;
• Realizar o melhor uso possível do hardware disponível, 
aumentando o desempenho do sistema e diminuindo o 
custo.
Histórico de Evolução (1ª Geração)
• Final dos anos 40: primeiro computador eletrônico: 
ENIAC (Electronic Numerical Integrator And Computer);
• 1950: surgem os cartões perfurados
• Os programas eram codificados nos cartões e sua leitura era feita 
por máquina à operadores de máquina;
• John von Neumann propõe uma programação não 
“hardwired”: nasce o Assembler/Assembly;
Histórico de Evolução (2ª Geração)
• Segunda Geração (1955-1965) – Transistores e Sistemas 
em Batch
• O desenvolvimento dos transistores tornou o computador mais 
confiável possibilitando sua comercialização - Mainframes;
• Separação entre projetistas, fabricante, programadores e técnicos 
de manutenção;
• No entanto, devido aos altos custos, poucos tinham acesso a essa 
tecnologia – somente grandes empresas, órgãos governamentais 
ou universidades;
Histórico de Evolução (2ª Geração)
• Surge a idéia de linguagem de programação de alto nível 
– Fortran (desenvolvida pela IBM – 1954-1957);
• Cartões perfurados ainda são utilizados
• Operação: cada programa (job) ou conjunto de programas escrito e 
perfurado por um programador era entregue ao operador da má
quina para que o mesmo fosse processado – alto custo
• Sistemas em Batch (lote)
• Consistia em coletar um conjunto de jobs e fazer a gravação desse 
conjunto para uma fita magnética
Histórico de Evolução (2ª Geração)
• Job em FORTRAN
Histórico de Evolução (3ª Geração)
• Terceira Geração (1965-1980) – Circuitos integrados e 
Multiprogramação
• Produtos incompatíveis
• Máquinas grandes orientadas a palavras (7094);
• Máquinas comerciais orientadas a caracteres (1401).
• Alta carga de desenvolvimento e manutenção
• IBM introduz o System/360
Histórico de Evolução (3ª Geração)
• System/360
• Série de máquinas com software compatível;
• Essas máquinas diferiam apenas no preço e desempenho, 
variando da 1401 até a 7094;
• Foi a primeira a usar circuito integrado em pequena escala, ao invé
s de transistores;
• O sistema operacional era o OS/360
• Sua maior vantagem era também sua maior fraqueza: SO enorme e 
muito complexo, pois precisava realizar as funções de todas as má
quinas. Era ineficiente, cheio de erros (milhões de linhas de código 
assembly escritas por milhares de programadores = milhares de erros)
Histórico de Evolução (3ª Geração)
• Aplicações que eram CPU-bound não tinham problema 
com relação ao tempo que se precisava esperar para 
realizar E/S;
• Aplicações que eram IO-bound gastavam de 80 a 90% do 
tempo realizando E/S
• Enquanto isso, a CPU ficava parada
• Solução: Multiprogramação
Histórico de Evolução (3ª Geração)
• Multiprogramação:
• Dividir a memória em diversas partes e alocar a cada uma dessas 
partes um job.
• Manter na memória simultaneamente uma quantidade de jobs 
suficientes para ocupar 100% do tempo do processador, 
diminuindo a ociosidade.
• Importante: o hardware é que protegia cada um dos jobs contra 
acesso indevidos de outros jobs.
Histórico de Evolução (3ª Geração)
• Spooling (Simultaneous Peripheral Operation On Line):
• Possibilitar que a leitura de cartões de jobs fosse feita direta do 
disco;
• Assim que um job terminava, o sistema operacional já alocava o 
novo job à uma partição livre da memória direto do disco;
• Eliminação de máquinas como as 1401 e a necessidade de se 
ficar andando entre as máquinas.
Histórico de Evolução (3ª Geração)
• Mesmo com o surgimento de novas tecnologias, o tempo 
de processamento ainda era algo crítico. Para corrigir um 
erro de programação, por exemplo, o programador 
poderia levar horas pois cada job era tratado dentro de 
um lote
• Timesharing
Histórico de Evolução (3ª Geração)
• Timesharing: cada usuário tinha um terminal on-line à 
disposição;
• Primeiro sistema Timesharing: CTSS (Compatible Time Sharing 
System) – Sistema 7094 modificado.
• Ex.: se entre 20 usuários,17 estão ausentes ou ociosos, o 
processador é alocado a cada um dos 3 jobs que estão sendo 
executados;
Histórico de Evolução (3ª Geração)
• Surge o MULTICS (Multiplexed Information and 
Computing Service), predecessor do UNIX;
• Fruto de uma idéia do MIT,Bell Labs e General Electric, de 
desenvolver um computador que suportasse centenas de usuários 
simultan̂eos em timesharing
• Codificado em PL/I, o que atrapalhou seu desenvolvimento 
(compilador fraco)
• Apesar do fracasso comercial, teve enorme influen̂cia em SO’s 
futuros
• Família de minicomputadores PDP da DEC;
• Diferente da família System/360, eram incompatíveis;
• Unix original rodava no PDP-7 (Ken Thompson – cientista da Bell 
Labs)
• O PDP-1 custava $120 mil (5% do valor de um 7094)
• Tinha 4K (mil) palavras de 18 bits
Histórico de Evolução (4ª Geração)
• Quarta Geração (1980-1990) – Computadores Pessoais
• Com a tecnologia de circuitos integrados de larga escala (LSI) 
surgem chips com milhares de transistores encapsulados em um 
centímetro quadrado de silício
• Intel – 8080 (1974)
• IBM – PC (início dos anos 80)
• Apple – Apple e Macintosh
Histórico de Evolução (4ª Geração)
• Intel 8080 – CP/M da Digital Research Gary Kildall)
• CP/M (Control Program for MicroComputer) – sistema operacional 
baseado em disco;
• IBMPC- DOS
• Inicialmente, a IBM tentou utilizar o CP/M, mas Kildall não quis 
nenhum acordo;
• IBM procurou Bill Gates pedindo um sistema operacional para 
rodar e ser vendido juntamente com o IBM PC;
• Bill Gates comprou a empresa que desenvolvia o DOS (Disk 
Operating System): Seattle Computer Products; Desenvolvedor: 
Tim Paterson;
Histórico de Evolução (4ª Geração)
• Evolução do DOS: MS-DOS (MicroSoft DOS)
• Tanto o CP/M quanto o MS-DOS eram baseados em comandos;
• Macintosh Apple - Sistemas baseados em janelas (GUI – 
Graphical User Interface)
• Microsoft – Plataforma Windows
• A história deste período da computação está muito bem 
retratada no filme “Piratas da Informática” (“Pirates of 
Sylicon Valley”) e no documentário “O Triunfo dos Nerds”
Histórico de Evolução (5ª Geração, 1990-
hoje)
• Era da computação distribuída: um processo é dividido 
em subprocessos que executam em sistemas 
multiprocessados e em redes de computadores ou 
mesmo em sistemas virtualmente paralelos
Histórico de Evolução (5ª Geração, 1990-
hoje)
• O protocolo de comunicações TCP/IP tornou-se 
largamente utilizado (Depto. de Defesa dos EUA) e as 
LANs (Local Area Networks) tornaram-se mais práticas e 
econom̂icas com o surgimento do padrão Ethernet, 
desenvolvido pela Xerox;
• Desenvolvimento e popularização do modelo 
cliente/servidor;
• Difusão das redes de computadores
• Internet
Histórico de Evolução (5ª Geração, 1990-
hoje)
• Sistemas Operacionais Distribuídos:
• Apresenta-se como um sistema operacional centralizado, mas que, 
na realidade, tem suas funções executadas por um conjunto de má
quinas independentes;
• Sistemas Operacionais em Rede;
• Usuários conhecem a localização dos recursos que estão 
utilizando e não tem̂ a visão de um sistema centralizado;
• Sistema Operacionais para dispositivos móveis;
• Execução de tarefas com economia de energia (baterias limitadas), 
aplicações voltadas principalmente para web
• Unix → Minix → Linux;
• Família Windows (NT, 95, 98, 2000, XP, Vista,7, 8);
• Apple iOS, Android, WinCE → WP 7 → WP 8
Resumo do Histórico
• Primeira geração – anos 50
• Válvulas, painéis de programação; processamento em lotes
• Segunda geração – anos 60
• Multiprogramação, multiprocessamento, timesharing, tempo real
• Terceira geração – meados 60 a meados 70
• Sistemas de propósito geral; desenvolvimento em linguagens de 
alto nível
• Quarta geração – meados 70 a meados 80
• Cliente/servidor, processamento distribuído, interface gráfica
• Quinta geração – meados 80 aos dias atuais
• Redes, computação distribuída, software livre
Tipos de SO
• Sistemas operacionais de computadores de grande porte;
• Sistemas operacionais de servidores;
• Sistemas operacionais de multiprocessadores;
• Sistemas operacionais de computadores pessoais;
• Sistemas operacionais de tempo real;
• Sistemas operacionais embarcados;
• Sistemas operacionais de cartões inteligentes;
• Sistemas operacionais para dispositivos móveis
Arquiteturas de SO
• Arquitetura Monolítica
• Todos os componentes do SO estão contidos no núcleo, 
comunicando-se diretamente entre si;
• Rapidez na comunicação, mas complexidade no código.
• Arquitetura em Camadas
• Componentes autocontidos, em camadas de componentes que 
realizam tarefas similares;
• Pior desempenho que a monolítica.
Arquiteturas de SO
• Arquitetura de Micronúcleo
• Também é uma forma de arquitetura em camadas (modular);
• Somente uma pequena parte dos serviços pode acessar 
diretamente o Hardware
• Aplicações
• Kernel, Chamadas ao Sistema
• Serviços do MicroKernel, MicroKernel
• Hardware
Tipos de serviço do S.O.
• O SO fornece um ambiente para a execução de 
programas através de serviços para os programas e para 
os usuários desses programas
• Apesar da forma como esses serviços são oferecidos 
variar de sistema para sistema, existem algumas classes 
de serviços que são comuns a todos os sistemas 
operacionais
Tipos de Serviço de SO
• Serviços mais comuns gerenciados pelo S.O.:
• Execução de programas;
• Operações de entrada/saída;
• Manipulação de sistema de arquivos;
• Detecção de erros;
• Alocação de recursos;
• Proteção.
Conceitos Básicos de SO
• Principais conceitos:
• Processo;
• Memória;
• Chamadas de Sistema;
Processos
• Processo: chave do SO;
• Caracterizado por programas em execução;
• Cada processo possui:
• Um espaço de endereço;
• Uma lista de alocação de memória (mínimo, máximo);
• Um conjunto de registradores (contador de programa);
• O Sistema Operacional controla todos os processos.
Processos
• Estados básicos de um processo:
Em Execução
ProntoBloqueado
1- Bloqueio aguardando entrada 2 – Escalonador seleciona
outro processo
3 – Escalonador seleciona
esse processo
4 – Entrada disponível
Processos
• Ex: Processo bloqueado (suspenso)
• Quando o SO suspende um processo P1 
temporariamente para executar um processo P2, o 
processo P1 deve ser reiniciado exatamente no mesmo 
estado no qual estava ao ser suspenso.
• Para tanto, todas as informações a respeito do processo 
P1 são armazenadas em uma tabela de processos 
(process table). Essa tabela é um vetor ou uma lista 
encadeada de estruturas.
Processos
• Um processo pode resultar na execução de outros 
processos, chamados de processos-filhos:
• Características para a hierarquia de processos:
• Comunicação (Interação) e Sincronização;
• Segurança e proteção;
• Uma árvore de no máximo três níveis;
• Escalonadores de processos – processo que escolhe 
qual será o próximo processo a ser executado;
• Diversas técnicas para escalonamento de processos.
Processos
• A comunicação e sincronismo entre processos é um 
problema complexo, mas com diversas soluções 
possíveis (e que serão analisadas nas próximas aulas), 
que são:
• Semáforos;
• Monitores;
• Instruções especiais em hardware;
• Troca de mensagens;
Gerenciamento de Memória
• Gerenciamento elementar (década de 60)
• Sistema monoprogramado;
• Sem paginação:
• Apenas um processo na memória;
• Acesso a toda a memória;
• Gerenciamento mais avançado (atualidade)
• Sistema multiprogramado;
• Mais de um processo na memória;
• Chaveamento de processos: por entrada/saída ou por limite de 
tempo (sistema de tempo compartilhado);
Compartilhamento de Memória
• Partições Fixas
• Cada processo é alocado em uma dada partição da memória (pré-
definida);
• Partições são liberadas quando o processo termina;
• Partições Variáveis
• Memória é alocada de acordo com o tamanho e número de 
processos;
• Otimiza o uso da memória;
Comunicação entre usuário e o SO
• Chamadas ao Sistema (system calls) fornecem uma 
interfaceentre um programa em execução e o S.O. 
Estão, geralmente, disponíveis como instruções nas 
linguagens de baixo nível ou até mesmo em linguagens 
de alto nível, como C.
• Podem ser classificadas em duas categorias:
• Controle de processos.
• Gerenciamento de arquivos e de dispositivos de E/S.
Chamadas ao Sistema
• Modos de Acesso:
• Modo usuário;
• Modo kernel ou Supervisor ou Núcleo;
• São determinados por um conjunto de bits localizados no 
registrador de status do processador: PSW (program status word);
• Por meio desse registrador, o hardware verifica se a instrução pode ou 
não ser executada pela aplicação;
• Protege o próprio kernel do Sistema Operacional na RAM contra 
acessos indevidos;
Chamadas ao Sistema
• Modo usuário:
• Aplicações não têm acesso direto aos recursos da máquina, ou 
seja, ao hardware;
• Quando o processador trabalha no modo usuário, a aplicação só 
pode executar instruções sem privilégios, com um acesso 
reduzido de instruções;
• Por que? Para garantir a segurança e a integridade do sistema;
Chamadas ao Sistema
• Modo Kernel:
• Aplicações têm acesso direto aos recursos da máquina, ou seja, 
ao hardware;
• Operações com privilégios;
• Quando o processador trabalha no modo kernel, a aplicação tem 
acesso ao conjunto total de instruções;
• Apenas o SO tem acesso às instruções privilegiadas;
Alternando entre modos
• Se uma aplicação precisa realizar alguma instrução 
privilegiada, ela realiza uma chamada ao sistema 
(system call), que altera do modo usuário para o modo 
kernel;
• Chamadas de sistemas são a porta de entrada para o 
modo Kernel;
• São a interface entre os programas do usuário no modo usuário e 
o Sistema Operacional no modo kernel;
• As chamadas diferem de SO para SO, no entanto, os 
conceitos relacionados às chamadas são similares 
independentemente do SO;
Execução de chamadas ao sistema
• TRAP: instrução que permite o acesso ao modo kernel;
• Exemplo:
• Instrução do UNIX:
count = read(fd,buffer,nbytes);
Arquivo, ponteiro para o buffer, número de bytes
O programa sempre deve checar o retorno da chamada 
de sistema para saber se algum erro ocorreu.
Exemplos de chamadas ao sistema
Exemplos de chamadas ao sistema
Chamadas ao Sistema API (application
program interface) WIN32
ESTRUTURA DOS 
SISTEMAS 
OPERACIONAIS
Estrutura dos SOs
• Principais tipos de estruturas:
• Monolíticos;
• Em camadas;
• Máquinas Virtuais;
• Arquitetura Micro-kernel;
• Cliente-Servidor.
Estrutura dos SOs - Monolítico
• Todos os módulos do sistema são compilados 
individualmente e depois ligados uns aos outros em um 
único arquivo-objeto;
• O Sistema Operacional é um conjunto de processos que 
podem interagir entre si a qualquer momento sempre que 
necessário;
• Cada processo possui uma interface bem definida com 
relação aos parâmetros e resultados para facilitar a 
comunicação com os outros processos;
• Simples;
• Primeiros sistemas UNIX e MS-DOS;
Estrutura dos SOs - Monolítico
Estrutura dos SOs - Monolítico
• Os serviços (chamadas) requisitados ao sistema são 
realizados por meio da colocação de parâmetros em 
registradores ou pilhas de serviços seguida da execução 
de uma instrução chamada TRAP;
59
Estrutura dos Sistemas Operacionais -
Monolítico
Programas de usuário
rodam em modo usuário
Rotinas do SO rodam em 
modo kernelProcedimentos de Serviço
Programa de usuário 2
Programa de usuário 1
Chamada ao sistema (kernel)
M
em
ór
ia
 P
rin
ci
pa
l
1
2
TRAP 3
Tabela de 
Escalonamento
4
Procedimentos de 
Serviços
Implementação de uma Chamada de Sistema
chaveamento da máquina do modo 
usuário para o modo kernel e 
transferência do controle para o Sistema 
Operacional
Sistema Operacional examina os 
parâmetros da chamada para determinar 
qual procedimento deve ser executado
SO indexa em uma tabela um 
ponteiro para o processo 
responsável pela execução
a chamada é concluída e o 
controle volta ao programa do 
usuário
60
Estrutura dos SOs – Em camadas
• Possui uma hierarquia de níveis;
• Primeiro sistema em camadas: THE (idealizado por E.W. 
Dijkstra);
• Possuía 6 camadas, cada qual com uma função diferente;
• Sistema em batch simples;
• Vantagem: isolar as funções do sistema operacional, 
facilitando manutenção e depuração
• Desvantagem: cada nova camada implica uma mudança 
no modo de acesso
• Atualmente: modelo de 2 camadas
61
Estrutura dos SOs – Em camadas
Fornecimento 
de Serviços
Camadas definidas no THE
62
Estrutura dos SOs – Máquina Virtual
• Idéia em 1960 com a IBM à VM/370;
• Modelo de máquina virtual cria um nível intermediário 
entre o SO e o Hardware;
• Esse nível cria diversas máquinas virtuais 
independentes e isoladas, onde cada máquina oferece 
uma cópia virtual do hardware, incluindo modos de 
acesso, interrupções, dispositivos de E/S, etc.;
• Cada máquina virtual pode ter seu próprio SO;
63
Estrutura dos SOs – Máquina Virtual
• Principais conceitos:
• Monitor da Máquina Virtual (VMM): roda sobre o hardware e 
implementa multiprogramação fornecendo várias máquinas 
virtuais à é o coração do sistema;
• CMS (Conversational Monitor System):
• TimeSharing;
• Executa chamadas ao Sistema Operacional;
• Máquinas virtuais são cópias do hardware, incluindo os modos 
kernel e usuário;
• Cada máquina pode rodar um Sistema Operacional diferente;
64
Estrutura dos SOs – Máquina Virtual
Instruções de E/S
Hardware (VMM)
VM/370
CMS CMSCMS
Cópias virtuais do 370s
TRAP
Chamadas ao sistema
TRAP
Monitor da Máquina Virtual
roda sobre o hardware e implementa 
multiprogramação
pTimeSharing;
pChamadas ao Sistema
Cada máquina pode rodar um 
Sistema Operacional diferente
65
Estrutura dos SOs – Máquina Virtual
• A idéia de máquina virtual foi posteriormente utilizada em 
contextos diferentes:
• Programas MS-DOS: rodam em computadores 32bits;
• As chamadas feitas pelo MS-DOS ao Sistema Operacional eram 
realizadas e monitoradas pelo monitor da máquina virtual (VMM);
66
Estrutura dos SOs – Máquina Virtual
• A idéia de máquina virtual foi posteriormente utilizada 
em contextos diferentes:
• Programas JAVA (Máquina Virtual Java-JVM): o compilador Java 
produz código para a JVM (bytecode). Esse código é executado 
pelo interpretador Java:
• Programas Java rodam em qualquer plataforma, independentemente 
do Sistema Operacional;
67
Estrutura dos SOs – Máquina Virtual
• A idéia de máquina virtual foi posteriormente utilizada em 
contextos diferentes:
• Computação em nuvem
• Virtualização dos servidores simula diferentes ambientes em 
servidores físicos
68
Estrutura dos SOs – Máquina Virtual
• Vantagens 
• Flexibilidade;
• Desvantagem:
• Simular diversas máquinas virtuais não é uma tarefa simples à
sobrecarga;
69
Estrutura dos SOs – Kernel
• Kernel é o núcleo do Sistema Operacional
• Provê um conjunto de funcionalidades e serviços que 
suportam várias outras funcionalidades do SO
• O restante do SO é organizado em um conjunto de 
rotinas não-kernel
70
Estrutura dos SOs – Micro-Kernel
Modo k ern e l
Modo u su á rio
Microk ern e l
m
en
sa
ge
m
m
en sagem
H ardw are
71
Estrutura dos SOs – Cliente/Servidor
• Reduzir o Sistema Operacional a um nível mais simples:
• Kernel: implementa a comunicação entre processos clientes e 
processos servidores à Núcleo mínimo;
• Maior parte do Sistema Operacional está implementado como 
processos de usuários (nível mais alto de abstração);
• Sistemas Operacionais Modernos;
72
Estrutura dos SOs – Cliente/Servidor
Cada processo servidor trata de uma tarefa
• Os processosservidores não têm acesso direto ao hardware.
Assim, se algum problema ocorrer com algum desses servidores,
o hardware não é afetado;
• O mesmo não se aplica aos serviços que controlam os
dispositivos de E/S, pois essa é uma tarefa difícil de ser realizada
no modo usuário devido à limitação de endereçamento. Sendo
assim, essa tarefa ainda é feita no kernel.
73
Estrutura dos SOs – Cliente/Servidor
• Adaptável para Sistemas Distribuídos;
74
Estrutura dos SOs – Cliente/Servidor
• Linux
• Monolítico +Módulos
• Windows
• Microkernel + Camadas + Módulos
FUNDAMENTOS DE 
SISTEMAS 
OPERACIONAIS
Aula 01 Parte 02 – Escalonamento de processos
Prof. Gabriel Fernandes
gfernandes@gmail.com
76
Processos 
• Multiprogramação:
• Pseudoparalelismo: coleção de processos sendo executados 
alternadamente na CPU;
• Um processo é caracterizado por um programa em 
execução, mas existe uma diferença sutil entre processo 
e programa:
• Um processo pode ser composto por vários programas, dados de 
entrada, dados de saída e um estado (executando, bloqueado, 
pronto)
77
Criando Processos
• Processos precisam ser criados e finalizados a todo o 
momento:
• Inicialização do sistema;
• Execução de uma chamada ao sistema de criação de processo 
realizada por algum processo em execução;
• Requisição de usuário para criar um novo processo;
• Inicialização de um processo em batch – mainframes com 
sistemas em batch;
78
Criando Processos
• Processos podem ser:
• Específicos para usuários específicos:
• Leitura de um arquivo;
• Iniciar um programa (linha de comando ou um duplo clique no mouse);
• Com funções específicas, que independem de usuários, que são 
criados pelo sistema operacional e que são processados em 
segundo plano (daemons):
• Recepção e envio de emails;
• Serviços de Impressão;
79
Criando Processos
• UNIX: 
• Fork;
• Cria um processo idêntico (filho) ao processo que a chamou (pai), 
possuindo a mesma imagem de memória, as mesmas cadeias de 
caracteres no ambiente e os mesmos arquivos abertos;
• Depois, o processo filho executa uma chamada para mudar sua 
imagem de memória e executar um novo programa
• Windows:
• CreateProcess
• Uma única função trata tanto do processo de criação quanto da carga 
do programa correto no novo processo
80
Criando Processos
• Exemplo UNIX:
• Processo init: gera vários processos filhos para atender os 
vários terminais que existem no sistema;
Outros 
processos
são gerados 
nos terminais
81
Finalizando Processos
• Condições:
• Término normal (voluntário):
• A tarefa a ser executada é finalizada;
• Chamadas: exit (UNIX) e ExitProcess (Windows)
• Término com erro (voluntário):
• O processo sendo executado não pode ser finalizado: gcc filename.c, o 
arquivo filename.c não existe;
82
Finalizando Processos
• Condições (continuação):
• Término com erro fatal (involuntário);
• Erro causado por algum erro no programa (bug): 
• Divisão por 0 (zero);
• Referência à memória inexistente ou não pertencente ao processo;
• Execução de uma instrução ilegal;
• Término causado por algum outro processo (involuntário):
• Kill (UNIX) e TerminateProcess (Windows);
Estados de Processos (relembrando)
• Estados básicos de um processo:
Em Execução
ProntoBloqueado
1- Bloqueio aguardando entrada 2 – Escalonador seleciona
outro processo
3 – Escalonador seleciona
esse processo
4 – Entrada disponível
84
Estados de Processos
Três estado básicos
Executando
Bloqueado Pronto
1 2
3
4
Um processo sendo 
executado não pode 
continuar sua execução, 
pois precisa de algum 
evento (E/S ou semáforo) 
para continuar;
85
Estados de Processos
Um processo é bloqueado 
de duas maneiras:
• chamada ao sistema:
block ou pause;
• se não há entradas 
disponíveis para que o 
processo continue sua 
execução; Executando
Bloqueado Pronto
1 2
3
4
86
Estados de Processos As transições 2 e 3 
ocorrem durante o 
escalonamento de 
processos: o tempo 
destinado àquele 
processo acabou e 
outro processo é 
colocado no 
processador;Executando
Bloqueado Pronto
1 2
3
4
87
Estados de Processos
A transição 4 ocorre quando o evento esperado
pelo processo bloqueado ocorre:
• se o processador está parado, o processo é
executado imediatamente (2);
• se o processador está ocupado, o processo
deve esperar sua vez;
Executando
Bloqueado Pronto
1 2
3
4
88
Processos
• Processos CPU-bound (orientados à CPU): processos 
que utilizam muito o processador;
• Tempo de execução é definido pelos ciclos de processador;
• Processos I/O-bound (orientados à E/S): processos que 
realizam muito E/S; 
• Tempo de execução é definido pela duração das operações de 
E/S;
• IDEAL: existir um balanceamento entre processos CPU-
bound e I/O-bound; 
89
Escalonador de Processos
Escalonador de Processos
0 n... n-11
Processos
• Nível mais baixo do SO;
• Manipulação de 
interrupções e processos;
90
Implementação de Processos
• Tabela de Processos:
• Cada processo possui uma entrada;
• Cada entrada possui um ponteiro para o bloco de controle de 
processo (BCP) ou descritor de processo;
• BCP possui todas as informações do processo à contextos de 
hardware, software, endereço de memória;
91
Implementação de Processos
Tabela de processos
...
BCP – P1
BCP – P2
BCP – Pn
...
92
Implementação de Processos
Algumas informações do BCP
93
Escalonamento de Processos
• Escalonador de Processos escolhe o processo que será 
executado pela CPU;
• Escalonamento é realizado com o auxílio do hardware;
• Escalonador deve se preocupar com a eficiência da CPU, 
pois o chaveamento de processos é complexo e custoso:
• Afeta desempenho do sistema e satisfação do usuário;
• Escalonador de processo é um processo que deve ser 
executado quando da mudança de contexto (troca de 
processo);
94
Escalonamento de Processos
• Mudança de Contexto:
• Overhead de tempo;
• Tarefa cara:
• Salvar as informações do processo que está deixando a CPU em seu 
BCP à conteúdo dos registradores;
• Carregar as informações do processo que será colocado na CPU à
copiar do BCP o conteúdo dos registradores;
95
Escalonamento de Processos
PC = 0BF4h
PID = 2
Estado = pronto
BCP-P2
CPU
PC = 074Fh
PC = 074Fh
PID = 4
Estado = executando
BCP-P4
Próximo processo
Antes da Mudança de Contexto
Processo já 
executou 
algumas 
instruções
96
Escalonamento de Processos
PC = 0BF4h
PID = 2
Estado = executando
BCP-P2
CPU
PC = 0BF4h
PC = 076Fh
PID = 4
Estado = pronto
BCP-P4
Depois da Mudança de Contexto
Salva o 
contexto 
no BCP
97
Escalonamento de Processos
• Situações nas quais escalonamento é necessário:
• Um novo processo é criado;
• Um processo terminou sua execução e um processo pronto deve 
ser executado;
• Quando um processo é bloqueado (semáforo, dependência de 
E/S), outro deve ser executado;
• Quando uma interrupção de E/S ocorre o escalonador deve decidir 
por: 
• executar o processo que estava esperando esse evento; 
• continuar executando o processo que já estava sendo executado;
• executar um terceiro processo que esteja pronto para ser executado.
98
Escalonamento de Processos
• Hardware de relógio fornece interrupções de relógio e a 
decisão do escalonamento pode ser tomada a cada 
interrupção ou a cada k interrupções;
• Algoritmos de escalonamento podem ser divididos em 
duas categorias dependendo de como essas interrupções 
são tratadas:
• Preemptivo: escolhe um processo e o deixa executando por um tempo 
máximo;
• Não-preemptivo: estratégia de permitir que o processoque está sendo 
executado continue sendo executado até ser bloqueado por alguma 
razão (semáforos, operações de E/S-interrupção) ou que libere a CPU 
voluntariamente;
99
Escalonamento de Processos
• Categorias de Ambientes:
• Sistemas em Batch: usuários não esperam por respostas rápidas; 
algoritmos não-preemptivos ou preemptivos com longo intervalo de 
tempo;
• Sistemas Interativos: interação constante do usuário; algoritmos 
preemptivos; Processo interativo à espera comando e executa 
comando; 
• Sistemas em Tempo Real: processos são executados mais 
rapidamente; tempo é crucial à sistemas críticos;
100
Escalonamento de Processos
• Características de algoritmos de escalonamento: 
• Qualquer sistema:
• Justiça (Fairness): cada processo deve receber uma parcela 
justa de tempo da CPU;
• Balanceamento: diminuir a ociosidade do sistema;
• Políticas do sistema – prioridade de processos;
101
Escalonamento de Processos
• Características de algoritmos de escalonamento: 
• Sistemas em Batch:
• Vazão (throughput): maximizar o número de jobs executados por 
hora;
• Tempo de retorno (turnaround time): tempo no qual o processo 
espera para ser finalizado; 
• Eficiência: CPU deve estar 100% do tempo ocupada;
• Sistemas Interativos:
• Tempo de resposta: tempo esperando para iniciar execução;
• Proporcionalidade: satisfação do usuários;
102
Escalonamento de Processos
• Características de algoritmos de escalonamento: 
• Sistemas em Tempo Real:
• Cumprimento dos prazos: prevenir perda de dados;
• Previsibilidade: prevenir perda da qualidade dos serviços oferecidos;
103
Escalonamento de Processos
Sistemas em Batch
• Escalonamento Three-Level
RAM
Escalonador da CPU *
Disco
Fila de entrada
Novo job
Escalonador
Da Memória
Escalonador
de Admissão
CPU
104
Escalonamento de Processos
Sistemas em Batch
• Escalonamento Three-Level
• Escalonador de admissão: decide qual job será admitido no 
sistema. Por exemplo, uma mescla de jobs orientados a CPU e 
orientados à E/S; processos com menor tempo de acesso à CPU e 
maior tempo de interação com dispositivos de E/S;
• Escalonador da Memória: decisões sobre quais processos vão 
para a MP:
• A quanto tempo o processo está esperando?
• Quanto tempo da CPU o processo já utilizou?
• Qual o tamanho do processo?
• Qual a importância do processo? 
• Escalonador da CPU: seleciona qual o próximo processo a ser 
executado;
Escalonamento de Processos
Turnaround
• Tempo de espera + tempo de execução
106
Escalonamento de Processos
Sistemas em Batch
• Algoritmos para Sistemas em Batch:
• First-Come First-Served (ou FIFO);
• Shortest Job First (SJF);
• Shortest Remaining Time Next (SRTN);
107
Escalonamento de Processos
Sistemas em Batch
• Algoritmo First-Come First-Served
• Não-preemptivo (permite que o processo que está sendo 
executado continue sendo executado até ser bloqueado por 
alguma razão); 
• Processos são executados na CPU seguindo a ordem de 
requisição;
• Fácil de entender e programar;
• Desvantagem:
• Ineficiente quando se tem processos que demoram na sua execução;
108
Escalonamento de Processos
Sistemas em Batch
• Algoritmo First-Come First-Served
Interrupção qualquer
(semáforo, E/S)
CPU
0
Fila de entrada
23 1
109
Escalonamento de Processos
Sistemas em Batch
• Algoritmo First-Come First-Served
CPU não controla o tempo dos processos!
(não-preemptivo)
CPU
1
Fila de entrada
30 2
110
Escalonamento de Processos
Sistemas em Batch
• Algoritmo Shortest Job First
• Não-preemptivo;
• Possível prever o tempo de execução do processo;
• Menor processo é executado primeiro;
• Menor turnaround;
• Desvantagem:
• Baixo aproveitamento quando se tem poucos processos prontos para 
serem executados;
111
Escalonamento de Processos
Sistemas em Batch
• Algoritmo Shortest Job First
A à a
B à b+a
C à c+b+a
D à d+c+b+a
__________________________________
Tempo médio-turnaround (4a+3b+2c+d)/4
Contribuição à se a<b<c<d tem-se o mínimo tempo 
médio;
112
Escalonamento de Processos
Sistemas em Batch
• Algoritmo Shortest Job First
A B C D
8 44 4
Em ordem:
Turnaround A = 8
Turnaround B = 12
Turnaround C = 16
Turnaround D = 20
Média à 56/4 = 14
B C D A
4 44 8
Menor job primeiro:
Turnaround B = 4
Turnaround C = 8
Turnaround D = 12
Turnaround A = 20
Média à 44/4 = 11
(4a+3b+2c+d)/4 Número deProcessos
113
Escalonamento de Processos
Sistemas em Batch
• Algoritmo Shortest Remaining Time Next
• Preemptivo (escolhe um processo e o deixa executando por um 
tempo máximo);
• Processos com menor tempo de execução são executados 
primeiro;
• Se um processo novo chega e seu tempo de execução é menor do 
que do processo corrente na CPU, a CPU suspende o processo 
corrente e executa o processo que acabou de chegar;
• Desvantagem: processos que consomem mais tempo podem 
demorar muito para serem finalizados se muitos processos 
pequenos chegarem!
114
Escalonamento de Processos
Sistemas Interativos
• Algoritmos para Sistemas Interativos:
• Round-Robin;
• Prioridade;
• Múltiplas Filas;
• Shortest Process Next;
• Garantido;
• Lottery;
• Fair-Share;
• Utilizam escalonamento em dois níveis (escalonador da 
CPU e memória);
115
Escalonamento de Processos
Sistemas Interativos
• Algoritmo Round-Robin
• Antigo, mais simples e mais utilizado;
• Preemptivo (escolhe um processo e o deixa executando por um 
tempo máximo);
• Cada processo recebe um tempo de execução chamado quantum; 
ao final desse tempo, o processo é suspenso e outro processo é 
colocado em execução;
• Escalonador mantém uma lista de processos prontos;
116
Escalonamento de Processos
Sistemas Interativos
• Algoritmo Round-Robin
Fila de prontos
G
D
A
B F
Fila de prontos
AG B
F D
Processo
corrente
Próximo
Processo
Lista após B utilizar seu
quantum
Processo
corrente
117
Escalonamento de Processos
Sistemas Interativos
• Algoritmo Round-Robin
• Tempo de chaveamento de processos;
• quantum: se for muito pequeno, ocorrem muitas 
trocas diminuindo, assim, a eficiência da CPU; 
se for muito longo o tempo de resposta é 
comprometido; 
118
Escalonamento de Processos
Sistemas Interativos
• Algoritmo Round-Robin:
Exemplos:
Dt = 4 ms
x = 1ms à 20% de tempo de CPU é 
perdido à menor eficiência
Dt = 99 ms
x = 1ms à 1% de tempo de CPU é 
perdido à Tempo de 
espera dos 
processos é 
maior
quantum
chaveamento
quantum razoável: 20-50 ms
119
Escalonamento de Processos
Sistemas Interativos
• Algoritmo com Prioridades
• Cada processo possui uma prioridade à os processos prontos 
com maior prioridade são executados primeiro;
• Prioridades são atribuídas dinâmica ou estaticamente;
• Classes de processos com mesma prioridade;
• Preemptivo (escolhe um processo e o deixa executando por um 
tempo máximo);
120
Escalonamento de Processos
Sistemas Interativos
• Algoritmo com Prioridades
1
2
3
4
mais alta
mais baixa
prioridade
FILAS
processos prontos
(Round-Robin)
121
Escalonamento de Processos
Sistemas Interativos
• Algoritmo com Prioridades
• Como evitar que os processos com maior prioridade sejam 
executado indefinidamente?
• Diminuir a prioridade do processo corrente a cada interrupção do 
relógio, e trocá-lo pelo próximo processo assim que sua prioridade caia 
abaixo da prioridade do próximo processo com prioridade mais alta 
(chaveamento);
• Atribuir um quantum máximo no qual o processo pode executar;
122
Escalonamento de Processos
Sistemas Interativos
• Múltiplas Filas:
• CTSS (Compatible Time Sharing System);
• Classes de prioridades;
• Preemptivo (escolhe um processoe o deixa executando por um 
tempo máximo); 
• Cada classe de prioridades possui quanta diferentes;
123
Escalonamento de Processos
Sistemas Interativos
• Múltiplas Filas:
• Assim, a cada vez que um processo é executado e suspenso ele 
recebe mais tempo para execução mas passa para uma fila com 
menor prioridade de execução
124
Escalonamento de Processos
Sistemas Interativos
• Múltiplas Filas:
• Ex.: um processo precisa de 100 quanta para ser executado; 
• Inicialmente, ele recebe um quantum para execução; 
• Das próximas vezes ele recebe, respectivamente, 2, 4, 8, 16, 32 e 64 
quanta (7 chaveamentos) para execução;
125
Escalonamento de Processos
Sistemas Interativos
• Algoritmo Shortest Process Next
• Mesma idéia do Shortest Job First;
• Processos Interativos: não se conhece o tempo necessário para 
execução;
• Solução: realizar uma estimativa com base no comportamento 
passado e executar o processo cujo tempo de execução estimado 
seja o menor;
126
Escalonamento de Processos
Sistemas Interativos
• Algoritmo Garantido:
• Garantias são dadas aos processos dos usuários
• Exemplo: n processos à 1/n do tempo de CPU para cada 
processo;
• Deve ser mantida taxa de utilização de cada 
processo
• Tem prioridade o que estiver mais distante do 
prometido
• Difícil de implementar
127
Escalonamento de Processos
Sistemas Interativos
• Algoritmo por Loteria:
• Cada processo recebe “tickets” que lhe dão direito de execução;
• A cada troca de processo um “ticket” é sorteado 
• O dono do “ticket” sorteado recebe o direito de ocupar a CPU
• Possível definir prioridade entre os processos por meio do número 
de “tickets” atribuído a cada processo
• Fácil de implementar e de adaptar
128
Escalonamento de Processos
Sistemas Interativos
• Algoritmo por Fração Justa (Fair-Share):
• O escalonamento é feito considerando o dono dos processos
• Cada usuário recebe uma fração da CPU e processos são 
escalonados visando garantir essa fração
• Se um usuário A possui mais processos que um usuário B e os dois 
têm a mesma prioridade, os processos de A demorarão mais que os 
do B
129
Escalonamento de Processos
Sistemas em Tempo Real
• Tempo é um fator crítico;
• Sistemas críticos:
• Aviões;
• Sistemas de suporte a vida (Hospitais);
• Usinas Nucleares;
• Bancos;
• Multimídia;
• Ponto importante: obter respostas em atraso é tão ruim 
quanto não obter respostas;
130
Escalonamento de Processos
Sistemas em Tempo Real
• Tipos de STR:
• Hard Real Time: atrasos não são tolerados;
• Aviões, usinas nucleares, hospitais;
• Soft Real Time: atrasos são tolerados;
• Bancos; Multimídia;
• Programas são divididos em vários processos;
• Eventos causam a execução de processos:
• Periódicos: ocorrem em intervalos regulares de tempo;
• Aperiódicos: ocorrem em intervalos irregulares de tempo;
131
Escalonamento de Processos
Sistemas em Tempo Real
• Algoritmos podem ser estáticos ou dinâmicos;
• Estáticos: decisões de escalonamento antes do sistema começar;
• Informação disponível previamente;
• Dinâmicos: decisões de escalonamento em tempo de execução;
THREADS
133
Processos
• Sistemas Operacionais tradicionais:
• Cada processo tem um único espaço de endereçamento e um 
único fluxo de controle
• Existem situações onde é desejável ter múltiplos fluxos 
de controle compartilhando o mesmo espaço de 
endereçamento:
• Solução: threads
134
Threads
• Um processo tradicional (pesado) possui um contador de programas, 
um espaço de endereço e apenas uma thread de controle (ou fluxo 
de controle);
• Multithreading: Sistemas atuais suportam múltiplas threads de 
controle, ou seja, pode fazer mais de uma tarefa ao mesmo tempo, 
servindo ao mesmo propósito;
a) Três processos b) Um processo com três threads
Thread Processo
• As três threads utilizam 
o mesmo espaço de endereço
135
Threads
• Thread é uma entidade básica de utilização da CPU
• Também são conhecidas como processos leves (lightweight 
process ou LWP);
• Processos com múltiplas threads podem realizar mais de 
uma tarefa de cada vez;
• Processos são usados para agrupar recursos; threads
são as entidades escalonadas para execução na CPU
• A CPU alterna entre as threads dando a impressão de que elas 
estão executando em paralelo;
136
Threads
Cada thread tem sua pilha de execução
137
Threads
Itens por Processo Itens por Thread
p Espaço de 
endereçamento
p Variáveis globais
p Arquivos abertos
p Processos filhos
p Alarmes pendentes
p Contador de programa
p Registradores 
(contexto)
p Pilha
p Estado
§ Compartilhamento de recursos;
§ Cooperação para realização de tarefas;
138
Threads
Processo Unix Threads em um processo Unix
139
Threads
• Como cada thread pode ter acesso a qualquer endereço 
de memória dentro do espaço de endereçamento do 
processo, uma thread pode ler, escrever ou apagar a 
pilha de outra thread; 
• Não existe proteção pois:
• É impossível
• Não é necessário pois, diferente dos processos que podem 
pertencem a diferentes usuários, as threads são sempre de um 
mesmo usuário
140
Threads
• Razões para existência de threads:
• Em múltiplas aplicações ocorrem múltiplas atividades “ao mesmo 
tempo”, e algumas dessas atividades podem bloquear de tempos 
em tempos;
• As threads são mais fáceis de gerenciar do que processos, pois 
elas não possuem recursos próprios à o processo é que tem!
• Desempenho: quando há grande quantidade de E/S, as threads
permitem que essas atividades se sobreponham, acelerando a 
aplicação; 
• Paralelismo Real em sistemas com múltiplas CPUs.
141
Threads
• Considere um servidor de arquivos:
• Recebe diversas requisições de leitura e escrita em arquivos e 
envia respostas a essas requisições;
• Para melhorar o desempenho, o servidor mantém uma cache dos 
arquivos mais recentes, lendo da cache e escrevendo na cache
quando possível;
• Quando uma requisição é feita, uma thread é alocada para seu 
processamento. Suponha que essa thread seja bloqueada 
esperando uma transferência de arquivos. Nesse caso, outras 
threads podem continuar atendendo a outras requisições;
142
Threads
• Considere um navegador WEB:
• O servidor deve atender diferentes requisições dos usuários;
• Cada requisição que chega deve ser tratada, no entanto, o servidor 
não deve ficar impedido de receber novas requisições enquanto 
processa uma das requisições;
• Com múltiplas threads, o servidor pode continuar esperando novas 
requisições, enquanto threads são criadas especificamente para 
tratar as requisições;
143
Threads
• Benefícios:
• Capacidade de resposta: aplicações interativas; Ex.: servidor 
WEB;
• Compartilhamento de recursos: mesmo endereçamento; memória, 
recursos;
• Economia: criar e realizar chaveamento de threads é mais barato;
• Utilização de arquiteturas multiprocessador: processamento 
paralelo;
144
Threads
• Tipos de threads:
• Em modo usuário (espaço do usuário): implementadas por 
bibliotecas no espaço do usuário; 
• Criação e escalonamento são realizados sem o conhecimento do 
kernel;
• Sistema Supervisor (run-time system): coleção de procedimentos que 
gerenciam as threads; 
• Tabela de threads para cada processo;
• Cada processo possui sua própria tabela de threads, que armazena 
todas a informações referentes à cada thread relacionada àquele 
processo;
145
Threads em modo usuário
146
Threads em modo usuário
• Tipos de threads: Em modo usuário
• Vantagens:
• Alternância de threads no nível do usuário é mais rápida do que 
alternância no kernel;
• Menos chamadas ao kernel são realizadas;
• Permite que cada processo possa ter seu próprio algoritmo deescalonamento;
• Tem como vantagem poder ser implementado em Sistemas 
Operacionais que não têm threads
• Principal desvantagem:
• Processo inteiro é bloqueado se uma thread realizar uma chamada 
bloqueante ao sistema;
147
Implementação de threads
• Implementação em espaço de usuário:
• Problemas:
• Como permitir chamadas bloqueantes se as chamadas ao sistema são 
bloqueantes e essa chamada irá bloquear todas as threads?
• Mudar a chamada ao sistema para não bloqueante, mas isso implica em 
alterar o SO -> não aconselhável
• Verificar antes se uma determinada chamada irá bloquear a thread e, se for 
bloquear, não a executar, simplesmente mudando de thread
• Se uma thread não liberar a CPU voluntariamente, ela executa o 
quanto quiser
• Uma thread pode não permitir que o processo escalonador do processo tenha 
sua vez
148
Tipos de Threads
• Tipos de threads:
• Em modo kernel: suportadas diretamente pelo SO; 
• Criação, escalonamento e gerenciamento são feitos pelo kernel;
• Tabela de threads e tabela de processos separadas;
• as tabelas de threads possuem as mesmas informações que as tabelas de 
threads em modo usuário, só que agora estão implementadas no kernel;
149
Threads em modo kernel
150
Threads em modo Usuário x 
Threads em modo Kernel
Threads em modo usuário
Threads em modo kernel
151
Threads em modo kernel
• Vantagem:
• Processo inteiro não é bloqueado se uma thread realizar uma 
chamada bloqueante ao sistema;
• Desvantagem:
• Gerenciar threads em modo kernel é mais caro devido às 
chamadas de sistema durante a alternância entre modo usuário e 
modo kernel;
152
Threads
• Estados: executando, pronta, bloqueada;
• Comandos para manipular threads:
• Thread_create;
• Thread_exit;
• Thread_wait;
• Thread_yield (permite que uma thread desista voluntariamente da 
CPU);
153
Implementação
• Java
• Classe Threads
• A própria linguagem fornece suporte para a criação e o 
gerenciamento das threads, as quais são gerenciadas pela JVM e 
não por uma biblioteca do usuário ou do kernel.
• C
• Biblioteca Pthreads
• Padrão POSIX (IEEE 1003.1c) que define uma API para a criação 
e sincronismo de threads; não é uma implementação
154
Threads em Java
Primeira maneira de criação
• Criação da thread:
• Definir uma nova classe derivada da classe Thread
• Redefinir o método run()
• A definição dessa nova classe não cria a nova thread
• A criação é feita através do método start()
• Aloca memória e inicializa uma nova thread na JVM
• Chama o método run(), tornando a thread elegível para ser executada 
pela JVM
155
Threads em Java
Exemplo
class Worker1 extends Thread
{
public void run() {
System.out.println("Eu sou uma thread criada");
}
}
public class First
{
public static void main(String args[]) {
Thread runner = new Worker1();
runner.start();
System.out.println("Eu sou a thread principal");
}
}
156
Threads em Java
Segunda maneira de criação
• Criação da thread
• Definição de uma classe que implemente a interface Runnable.
public interface Runnable
{
public abstract void run();
}
• Definição de um método run()
• A implementação da classe Runnable é semelhante à 
extensão, exceto que “extends Thread” é substituído por 
“implements Runnable”
157
Threads em Java
Exemplo
class Worker2 implements Runnable
{
public void run() {
System.out.println("Eu sou uma thread criada");
}
}
public class Second
{
public static void main(String args[]) {
Thread thrd = new Thread(new Worker2());
thrd.start();
System.out.println("Eu sou a thread principal");
}
}
158
Threads em C
PThreads
Programa principal
pthread_create( &thread1, NULL, proc1, &arg);
pthread_join( thread1, NULL, *status);
thread1
proc1(&arg);
{
return(&status);
}
Thread pode ser desunid (detached)
join não é necessário
Código da thread
159
Threads em C
PThreads
• pthread_create (thread,attr,start_routine,arg)
• thread: identificador único para a nova thread retornada pela função. 
• attr: Um objeto que pode ser usado para definir os atributos (como 
por exemplo, prioridade de escalonamento) da thread. Quando não 
há atributos, define-se como NULL. 
• start_routine: A rotina em C que a thread irá executar quando for 
criada. 
• arg: Um argumento que pode ser passado para a start_routine. Deve 
ser passado por referência com um casting para um ponteiro do tipo 
void. Pode ser usado NULL se nenhum argumento for passado.
160
Threads em C
PThreads
• PThread Join
• A rotina pthread_join() espera pelo término de uma thread específica
for (i = 0; i < n; i++)
pthread_create(&thread[i], NULL, (void *) slave, (void *) &arg);
// código thread mestre
// código thread mestre
for (i = 0; i < n; i++)
pthread_join(thread[i], NULL);
161
Threads em C
PThreads
• Detached Threads (desunidas)
• Pode ser que uma thread não precise saber do término de uma outra por 
ela criada, então não executará a operação de união. Neste caso diz-se 
que a thread criada é detached (desunida da thread pai)
Programa principal
pthread_create();
pthread_create();
Thread
pthread_create();
Thread
Thread Término
Término
Término
162
Threads em C
PThreads
/******************************************************************************
* FILE: hello.c
* DESCRIPTION:
* A "hello world" Pthreads program. Demonstrates thread creation and
* termination.
* AUTHOR: Blaise Barney
* LAST REVISED: 01/29/09
******************************************************************************/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}
163
Threads em C
PThreads
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0;t<NUM_THREADS;t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
COMUNICAÇÃO E 
SINCRONIZAÇÃO DE 
PROCESSOS
165
Comunicação de Processos
• Processos precisam se comunicar;
• Processos competem por recursos
• Três aspectos importantes:
• Como um processo passa informação para outro processo;
• Como garantir que processos não invadam espaços uns dos 
outros;
• Dependência entre processos: sequência adequada;
166
Comunicação de Processos – Race 
Conditions
• Race Conditions: processos acessam recursos 
compartilhados concorrentemente;
• Recursos: memória, arquivos, impressoras, discos, variáveis;
• Ex.: Impressão: quando um processo deseja imprimir um 
arquivo, ele coloca o arquivo em um local especial 
chamado spooler (tabela). Um outro processo, chamado 
printer spooler, checa se existe algum arquivo a ser 
impresso. Se existe, esse arquivo é impresso e retirado 
do spooler. Imagine dois processos que desejam ao 
mesmo tempo imprimir um arquivo...
167
Comunicação de Processos - Race 
Conditions
abc
prog.c
prog.n
4
5
6
7
.
.
.
.
Processo A
Processo B
in = 7
out = 4 
Próximo slot livre
Próximo arquivo a ser impresso
next_free_slot = 7
Spooler – fila de impressão (slots)
Coloca seu arquivo no slot 7 e 
next_free_slot = 8
next_free_slot = 7
168
Comunicação de Processos - Race 
Conditions
abc
prog.c
prog.n
4
5
6
7
.
.
.
.
Processo A
Processo B
in = 8
out = 4 
Próximo slot livre
Próximo arquivo a ser impresso
checa
next_free_slot = 7
Spooler – fila de impressão (slots)
progB.c
169
abcprog.c
prog.n
4
5
6
7
.
.
.
.
Processo A
Processo B
in = 8
out = 4 
Próximo slot livre
Próximo arquivo a ser impresso
Coloca arquivo a ser 
Impresso no slot 7 e faz
next_free_slot = 8
Spooler – fila de impressão (slots)
progA.c
Processo B não receberá sua impressão!!!!!
Comunicação de Processos - Race 
Conditions
170
Comunicação de Processos – Regiões 
Críticas
• Como solucionar problemas de Race Conditions???
• Proibir que mais de um processo leia ou escreva em recursos 
compartilhados concorrentemente (ao “mesmo tempo”)
• Recursos compartilhados à regiões críticas;
• Exclusão mútua: garantir que um processo não terá acesso à uma 
região crítica quando outro processo está utilizando essa região;
171
Comunicação de Processos – Exclusão 
Mútua
• Quatro condições para uma boa solução:
1. Dois processos não podem estar simultaneamente em regiões 
críticas;
2. Nenhuma restrição deve ser feita com relação à CPU;
3. Processos que não estão em regiões críticas não podem 
bloquear outros processos que desejam utilizar regiões 
críticas;
4. Processos não podem esperar para sempre para acessarem 
regiões críticas;
172
Comunicação de Processos – Exclusão 
Mútua
Processo A
Processo B
Tempo
T1 T2 T3 T4
A entra na 
região crítica
A sai da 
região crítica
B entra na 
região crítica
B sai da 
região crítica
B tenta entrar na 
região crítica - bloqueado
A
173
Soluções
• Exclusão Mútua:
• Espera Ocupada;
• Primitivas Sleep/Wakeup;
• Semáforos;
• Monitores;
• Passagem de Mensagem;
174
Comunicação de Processos – Exclusão 
Mútua
• Espera Ocupada (Busy Waiting): constante checagem por 
algum valor;
• Algumas soluções para Exclusão Mútua com Espera 
Ocupada:
• Desabilitar interrupções;
• Variáveis de Travamento (Lock);
• Estrita Alternância (Strict Alternation);
• Solução de Peterson e Instrução TSL;
175
Comunicação de Processos – Exclusão 
Mútua
• Desabilitar interrupções:
• Processo desabilita todas as suas interrupções ao entrar na 
região crítica e habilita essas interrupções ao sair da região 
crítica;
• Com as interrupções desabilitadas, a CPU não realiza 
chaveamento entre os processos;
• Viola condição 2 (Nenhuma restrição deve ser feita com relação à 
CPU);
• Não é uma solução segura, pois um processo pode não 
habilitar novamente suas interrupções e não ser finalizado;
• Viola condição 4 (Processos não podem esperar para sempre 
para acessarem regiões críticas);
176
Comunicação de Processos – Exclusão 
Mútua
• Variáveis Lock:
• O processo que deseja utilizar uma região crítica atribui um valor a 
uma variável chamada lock;
• Se a variável está com valor 0 (zero) significa que nenhum 
processo está na região crítica; Se a variável está com valor 1 (um) 
significa que existe um processo na região crítica;
• Apresenta o mesmo problema do exemplo do spooler de 
impressão;
177
Comunicação de Processos – Exclusão 
Mútua
• Variáveis Lock - Problema:
• Suponha que um processo A leia a variável lock com valor 0; 
• Antes que o processo A possa alterar a variável para o valor 1, um 
processo B é escalonado e altera o valor de lock para 1;
• Quando o processo A for escalonado novamente, ele altera o valor 
de lock para 1, e ambos os processos estão na região crítica;
• Viola condição 1 (Dois processos não podem estar simultaneamente 
em regiões críticas);
178
Comunicação de Processos – Exclusão 
Mútua
• Variáveis Lock: lock==0;
while(true){
while(lock!=0); //loop
lock=1;
critical_region();
lock=0;
non-critical_region();
}
Processo A
while(true){
while(lock!=0); //loop
lock=1;
critical_region();
lock=0;
non-critical_region();
}
Processo B
179
Comunicação de Processos – Exclusão 
Mútua
• Strict Alternation (Estrita Alternância):
• Fragmentos de programa controlam o acesso 
às regiões críticas;
• Variável turn, inicialmente em 0, estabelece qual processo pode 
entrar na região crítica;
(Processo A)
turn 0
(Processo B)
turn 1
while (TRUE) { 
while (turn!=0); //loop
critical_region();
turn = 1;
noncritical region();} 
while (TRUE){ 
while (turn!=1); //loop
critical_region();
turn = 0;
noncritical region();} 
180
Comunicação de Processos – Exclusão 
Mútua
• Problema do Strict Alternation:
1. Suponha que o Processo B é mais rápido e sai da região 
crítica;
2. Ambos os processos estão fora da região crítica e turn com 
valor 0;
3. O processo A termina antes de executar sua região não crítica 
e retorna ao início do loop; Como o turn está com valor zero, 
o processo A entra novamente na região crítica, enquanto o 
processo B ainda está na região não crítica;
4. Ao sair da região crítica, o processo A atribui o valor 1 à 
variável turn e entra na sua região não crítica;
181
Comunicação de Processos – Exclusão 
Mútua
• Problema do Strict Alternation:
5. Novamente ambos os processos estão na região não crítica e 
a variável turn está com valor 1;
6. Quando o processo A tenta novamente entrar na região 
crítica, não consegue, pois turn ainda está com valor 1;
7. Assim, o processo A fica bloqueado pelo processo B que 
NÃO está na sua região crítica, violando a condição 3;
182
Comunicação de Processos – Exclusão 
Mútua
• Solução de Peterson e Instrução TSL (Test and Set Lock):
• Uma variável (ou programa) é utilizada para bloquear a entrada de 
um processo na região crítica quando um outro processo está na 
região;
• Essa variável é compartilhada pelos processos que concorrem 
pelo uso da região crítica;
• Ambas as soluções possuem fragmentos de programas que 
controlam a entrada e a saída da região crítica; 
183
Comunicação de Processos – Exclusão 
Mútua
• Solução de Peterson
#define FALSE 0
#define TRUE 1
#define N 2
int turn;
int interested[N];
void enter_region(int process)
{
int other;
other = 1 - process;
interested[process] = TRUE;
turn = process;
while (turn == process) && interested[other] == TRUE) ;
}
void leave_region(int process)
{
interested[process] = FALSE;
}
184
Comunicação de Processos – Exclusão 
Mútua
• Instrução TSL: utiliza registradores do hardware;
• TSL RX, LOCK; (lê o conteúdo de lock em RX, e armazena um valor 
diferente de zero (0) em lock – operação indivisível);
• Lock é compartilhada
• Se lock==0, então região crítica “liberada”.
• Se lock<>0, então região crítica “ocupada”.
enter_region:
TSL REGISTER, LOCK | Copia lock para reg. e lock=1
CMP REGISTER, #0 | lock valia zero?
JNE enter_region | Se sim, entra na região crítica,
| Se não, continua no laço
RET | Retorna para o processo chamador
leave_region
MOVE LOCK, #0 | lock=0
RET | Retorna para o processo chamador
185
Soluções
• Exclusão Mútua:
• Espera Ocupada;
• Primitivas Sleep/Wakeup;
• Semáforos;
• Monitores;
• Passagem de Mensagem;
186
Comunicação de Processos – Primitivas 
Sleep/Wakeup
• Todas as soluções apresentadas utilizam espera ocupada 
à processos ficam em estado de espera (looping) até que 
possam utilizar a região crítica: 
• Tempo de processamento da CPU;
• Situações inesperadas:
• Processos H (alta prioridade) e L (baixa prioridade)
• L entra na RC
• H começa a executar e quer entrar na RC
187
Comunicação de Processos – Primitivas 
Sleep/Wakeup
• Para solucionar esse problema de espera, um par de primitivas Sleep 
e Wakeup é utilizado à BLOQUEIO E DESBLOQUEIO de 
processos.
• A primitiva Sleep é uma chamada de sistema que bloqueia o 
processo que a chamou, ou seja, suspende a execução de tal 
processo até que outroprocesso o “acorde”;
• A primitiva Wakeup é uma chamada de sistema que “acorda” um 
determinado processo;
• Ambas as primitivas possuem dois parâmetros: o processo sendo 
manipulado e um endereço de memória para realizar a 
correspondência entre uma primitiva Sleep com sua correspondente 
Wakeup; 
188
Comunicação de Processos – Primitivas 
Sleep/Wakeup
• Problemas que podem ser solucionados com o uso 
dessas primitivas:
• Problema do Produtor/Consumidor (bounded buffer ou buffer
limitado): dois processos compartilham um buffer de tamanho fixo. 
O processo produtor coloca dados no buffer e o processo 
consumidor retira dados do buffer;
• Problemas:
• Produtor deseja colocar dados quando o buffer ainda está cheio;
• Consumidor deseja retirar dados quando o buffer está vazio;
• Solução: colocar os processos para “dormir”, até que eles possam ser 
executados;
189
Comunicação de Processos Sincronização 
Produtor-Consumidor
Proces s o
g ravador
Proces s o
le ito r
dado
Sin cron ização
le i
tu r
a
g ra vação
Bu ffe r
190
Comunicação de Processos – Primitivas 
Sleep/Wakeup
• Buffer: variável count controla a quantidade de dados 
presente no buffer. 
• Produtor: 
Se count = valor máximo (buffer cheio)
Então processo produtor é colocado para dormir
Senão produtor coloca dados no buffer e 
incrementa count
191
Comunicação de Processos – Primitivas 
Sleep/Wakeup
• Consumidor: 
Se count = 0 (buffer vazio)
Então processo vai “dormir”
Senão retira os dados do buffer e decrementa 
count
192
Comunicação de Processos – Primitivas 
Sleep/Wakeup
# define N 100
int count = 0;
void producer(void)
{
int item;
while (TRUE) {
item = produce_item();
if (count == N) 
sleep();
insert_item(item);
count = count + 1;
if (count == 1) 
wakeup(consumer)
}
}
void consumer(void)
{
int item;
while (TRUE) {
if (count == 0) 
sleep();
item = remove_item();
count = count - 1;
if (count == N - 1) 
wakeup(producer)
consume_item(item);
}
}
193
Comunicação de Processos – Primitivas 
Sleep/Wakeup
# define N 100
int count = 0;
void producer(void)
{
int item;
while (TRUE) {
item = produce_item();
if (count == N) 
sleep();
insert_item(item);
count = count + 1;
if (count == 1) 
wakeup(consumer)
}
}
void consumer(void)
{
int item;
while (TRUE) {
if (count == 0) 
sleep();
item = remove_item();
count = count - 1;
if (count == N - 1) 
wakeup(producer)
consume_item(item);
}
}
Problema: se wakeup chega antes do consumidor dormir
Para 
aqui
194
Comunicação de Processos – Primitivas 
Sleep/Wakeup
• Problemas desta solução: Acesso à variável count é 
irrestrita
• O buffer está vazio e o consumidor acabou de checar a variável 
count com valor 0; 
• O escalonador (por meio de uma interrupção) decide que o 
processo produtor será executado; Então o processo produtor 
insere um item no buffer e incrementa a variável count com valor 
1; Imaginando que o processo consumidor está dormindo, o 
processo produtor envia um sinal de wakeup para o consumidor; 
• No entanto, o processo consumidor não está dormindo, e não 
recebe o sinal de wakeup; 
195
Comunicação de Processos – Primitivas 
Sleep/Wakeup
• Assim que o processo consumidor é executado novamente, a 
variável count já tem o valor zero; Nesse instante, o consumidor é 
colocado para dormir, pois acha que não existem informações a 
serem lidas no buffer;
• Assim que o processo produtor acordar, ele insere outro item no 
buffer e volta a dormir. Ambos os processos dormem para 
sempre...
• Solução: bit de controle recebe um valor true quando 
um sinal é enviado para um processo que não está 
dormindo. No entanto, no caso de vários pares de 
processos, vários bits devem ser criados 
sobrecarregando o sistema!!!!
196
Soluções
• Exclusão Mútua:
• Espera Ocupada;
• Primitivas Sleep/Wakeup;
• Semáforos;
• Monitores;
• Passagem de Mensagem;
197
Comunicação de Processos –
Semáforos
• Idealizados por E. W. Dijkstra (1965);
• Variável inteira que armazena o número de sinais 
wakeups enviados;
• Um semáforo pode ter valor 0 quando não há sinal 
armazenado ou um valor positivo referente ao número de 
sinais armazenados;
• Duas primitivas de chamadas de sistema: down (sleep) e 
up (wake);
• Originalmente P (down) e V (up) em holandês;
198
Comunicação de Processos –
Semáforos
• Down: verifica se o valor do semáforo é maior do que 0; 
se for, o semáforo é decrementado; se o valor for 0, o 
processo é colocado para dormir sem completar sua 
operação de down; 
• Todas essas ações são chamadas de ações atômicas;
• Ações atômicas garantem que quando uma operação no 
semáforo está sendo executada, nenhum processo pode acessar o 
semáforo até que a operação seja finalizada ou bloqueada;
199
Comunicação de Processos –
Semáforos
• Up: incrementa o valor do semáforo, fazendo com que 
algum processo que esteja dormindo possa terminar de 
executar sua operação down;
• Semáforo Mutex: garante a exclusão mútua, não 
permitindo que os processos acessem uma região crítica 
ao mesmo tempo
• Também chamado de semáforo binário
200
Comunicação de Processos –
Semáforo Binário
F ila de e spera
de processos
Process o acessa
a reg ião cr í t ica
Process o dese ja en trar
n a região cr ít ica
D OW
N (S= 0)DO
W
N 
(S>
0)
U P (S) - p rocesso sai
da região cr ít ica
L ibe ra proce sso
da f i la de espe ra
Processo é
bloqueado 
sem finalizar
Down(s), pois 
s=0;
Processo executa 
Down(s)
Processo 
finaliza
Down(s), 
pois s>0;
201
Comunicação de Processos –
Semáforos
• Problema produtor/consumidor: resolve o problema de 
perda de sinais enviados;
• Solução utiliza três semáforos:
• Full: conta o número de slots no buffer que estão ocupados; 
iniciado com 0; resolve sincronização;
• Empty: conta o número de slots no buffer que estão vazios; 
iniciado com o número total de slots no buffer; resolve 
sincronização;
• Mutex: garante que os processos produtor e consumidor não 
acessem o buffer ao mesmo tempo; iniciado com 1; também 
chamado de semáforo binário; Permite a exclusão mútua;
202
Comunicação de Processos –
Semáforos
# include “prototypes.h”
# define N 100
typedef int semaphore;
semaphore mutex = 1;
semaphore empty = N;
semaphore full = 0;
void producer (void){
int item;
while (TRUE){
produce_item(&item);
down(&empty);
down(&mutex);
enter_item(item); 
up(&mutex);
up(&full);
}
}
void consumer (void){
int item;
while (TRUE){
down(&full);
down(&mutex);
remove_item(item); 
up(&mutex);
up(&empty);
consume_item(item);
}
}
203
Comunicação de Processos –
Semáforos
• Problema: erro de programação pode gerar um deadlock;
• Suponha que o código seja trocado no processo produtor;
• Se o buffer estiver cheio, o produtor será bloqueado com mutex = 
0; Assim, a próxima vez que o consumidor tentar acessar o buffer, 
ele tenta executar um down sobre o mutex, ficando também 
bloqueado. 
.. ..
down(&empty); down(&mutex);
down(&mutex); down(&empty);
.. ..
204
Soluções
• Exclusão Mútua:
• Espera Ocupada;
• Primitivas Sleep/Wakeup;
• Semáforos;
• Monitores;
• Passagem de Mensagem;
205
Comunicação de Processos –
Monitores
• Idealizado por Hoare (1974) e Brinch Hansen (1975)
• Monitor: primitiva (unidade básica de sincronização) de 
alto nível para sincronizar processos: 
• Conjunto de procedimentos, variáveis e estruturas de dados 
agrupados em um único módulo ou pacote;
• Somente um processo pode estar ativo dentro do monitor 
em um mesmo instante; outros processos ficam 
bloqueados até que possam estar ativos no monitor;
206
Comunicaçãode Processos –
Monitores
monitor example
int i;
condition c;
procedure A();
.
end;
procedure B();
.
end;
end monitor;
Estrutura básica de um Monitor
Dependem da linguagem
de programação à
Compilador é que garante
a exclusão mútua.
§ JAVA
Todos os recursos 
compartilhados entre 
processos devem estar
implementados dentro
do Monitor;
207
Comunicação de Processos –
Monitores
• Execução:
• Chamada a uma rotina do monitor;
• Instruções iniciais à teste para detectar se um outro processo está 
ativo dentro do monitor;
• Se positivo, o processo novo ficará bloqueado até que o outro 
processo deixe o monitor;
• Caso contrário, o processo novo executa as rotinas no monitor;
208
Comunicação de Processos –
Monitores
• Condition Variables (condition): variáveis que indicam 
uma condição; e
• Operações Básicas: WAIT e SIGNAL
• wait (condition) à bloqueia o processo;
• signal (condition)à “acorda” o processo que executou um 
wait na variável condition e foi bloqueado;
209
Comunicação de Processos –
Monitores
• Variáveis condicionais não são contadores, portanto, não 
acumulam sinais;
• Se um sinal é enviado sem ninguém (processo) estar 
esperando, o sinal é perdido;
• Assim, um comando WAIT deve vir antes de um comando 
SIGNAL.
210
Comunicação de Processos –
Monitores
• Como evitar dois processos ativos no monitor ao mesmo 
tempo?
(1) Hoare à colocar o processo mais recente para rodar, 
suspendendo o outro!!! (sinalizar e esperar)
(2) B. Hansen à um processo que executa um SIGNAL
deve deixar o monitor imediatamente;
• O comando SIGNAL deve ser o último de um procedimento do 
monitor;
A condição (2) é mais simples e mais fácil de se 
implementar.
211
Comunicação de Processos –
Monitores
• Devido a exclusão mútua automática dos procedimentos 
do monitor, tem-se:
• o produtor dentro de um procedimento do monitor descobre que o 
buffer está cheio
• produtor termina a operação de WAIT sem se preocupar 
• consumidor só entrará no monitor após produtor dormir 
212
Comunicação de Processos –
Monitores
• Limitações de semáforos e monitores:
• Ambos são boas soluções somente para CPUs com memória 
compartilhada. Não são boas soluções para sistema distribuídos; 
• Nenhuma das soluções provê troca de informações entre processo 
que estão em diferentes máquinas; 
• Monitores dependem de uma linguagem de programação – poucas 
linguagens suportam Monitores;
213
Soluções
• Exclusão Mútua:
• Espera Ocupada;
• Primitivas Sleep/Wakeup;
• Semáforos;
• Monitores;
• Passagem de Mensagem;
214
Comunicação de Processos –
Passagem de Mensagem
• Provê troca de mensagens entre processos rodando em 
máquinas diferentes;
• Utiliza-se de duas primitivas de chamadas de sistema: 
send e receive;
215
Comunicação de Processos –
Passagem de Mensagem
• Podem ser implementadas como procedimentos:
• send (destination,&message);
• receive (source,&message);
• O procedimento send envia para um determinado destino 
uma mensagem, enquanto que o procedimento receive
recebe essa mensagem em uma determinada fonte; Se 
nenhuma mensagem está disponível, o procedimento 
receive é bloqueado até que uma mensagem chegue.
216
Comunicação de Processos –
Passagem de Mensagem
• Problemas desta solução:
• Mensagens são enviadas para/por máquinas conectadas em rede; 
assim mensagens podem se perder ao longo da transmissão;
• Mensagem especial chamada acknowledgement à o 
procedimento receive envia um acknowledgement para o 
procedimento send. Se esse acknowledgement não chega no 
procedimento send, esse procedimento retransmite a mensagem 
já enviada;
217
Comunicação de Processos –
Passagem de Mensagem
• Problemas:
• A mensagem é recebida corretamente, mas o acknowledgement
se perde. 
• Então o receive deve ter uma maneira de saber se uma 
mensagem recebida é uma retransmissão à cada mensagem 
enviada pelo send possui uma identificação – seqüência de 
números; Assim, ao receber uma nova mensagem, o receive
verifica essa identificação, se ela for semelhante a de alguma 
mensagem já recebida, o receive descarta a mensagem!
218
Comunicação de Processos –
Passagem de Mensagem
• Problemas:
• Desempenho: copiar mensagens de um processo para o outro é 
mais lento do que operações com semáforos e monitores;
• Autenticação à Segurança;
219
Comunicação de Processos –
Passagem de Mensagem
220
Comunicação de Processos
Outros mecanismos
• RPC – Remote Procedure Call
• Rotinas que permitem comunicação de processos em diferentes 
máquinas; 
• Chamadas remotas; 
• MPI – Message-passing Interface;
• Sistemas paralelos; 
• RMI Java – Remote Method Invocation
• Permite que um objeto ativo em uma máquina virtual Java possa 
interagir com objetos de outras máquinas virtuais Java, 
independentemente da localização dessas máquinas virtuais; 
• Web Services
• Permite que serviços sejam compartilhados através da Web
221
Comunicação de Processos
Outros mecanismos
• Pipe: 
• Permite a criação de filas de processos;
• ps -ef | grep luciana;
• Saída de um processo é a entrada de outro; 
• Existe enquanto o processo existir;
• Named pipe:
• Extensão de pipe; 
• Continua existindo mesmo depois que o processo terminar;
• Criado com chamadas de sistemas; 
• Socket:
• Par endereço IP e porta utilizado para comunicação entre processos em 
máquinas diferentes;
• Host X (192.168.1.1:1065) Server Y (192.168.1.2:80);
222
Problemas clássicos de comunicação 
entre processos
• Problema do Jantar dos 
Filósofos 
• Cinco filósofos desejam comer 
espaguete; No entanto, para 
poder comer, cada filósofo 
precisa utilizar dois garfo e não 
apenas um. Portanto, os filósofos 
precisam compartilhar o uso do 
garfo de forma sincronizada.
• Os filósofos comem e pensam;
Problemas clássicos de comunicação 
entre processos
• Problema de sincronização 
formulado e resolvido em 
1965 por Dijkstra.
• Problema:
– Cinco filósofos estão 
sentados à mesa.
– Cada filósofo tem um prato 
de espaguete.
– O espaguete é tão 
escorregadio que o filósofo 
precisa de dois garfos para 
comê-lo.
– Entre cada par de pratos 
está um garfo.
224
Problemas clássicos de comunicação 
entre processos
• Problemas que devem ser 
evitados:
• Deadlock – um ou mais 
processos impedidos de 
continuar;
• Starvation – processos 
executam mas não progridem;
4
3
2
1
0
Problemas clássicos de comunicação 
entre processos
• A vida do filósofo consistem em alternar períodos de 
comer e pensar.
• Outras atividades são irrelevantes ao problema.
• Quando um filósofo fica com fome
• Tenta pegar um garfo a direita e a esquerda (um de cada vez em 
qualquer ordem).
• Se conseguir pegar os dois garfos 
• Comerá durante um determinado tempo.
• Colocará os garfos novamente na mesa.
• Continuará a pensar.
Problemas clássicos de comunicação 
entre processos
• Como escrever um programa, para cada filósofo, que 
faça o que deve fazer e nunca trave?
227
Solução 1 para Filósofos 
4
3
2
1
0
Solução 1 para Filósofos 
• A rotina take_fork espera até que o garfo fique disponível 
e então o pega.
• A solução não funciona bem.
• Por que?
229
Solução 1 para Filósofos
• Problema da solução 1:
• Execução do take_fork(i)à Se todos os filósofos pegarem o 
garfo da esquerda, nenhum pega o da direita à Deadlock;
4
3
2
1
0
230
Solução 1 para Filósofos
• Se modificar a solução:
• Pegar o garfo da esquerda
• Verificar se o garfo da direita está disponível. Se não está, devolve o 
da esquerda e começa novamente
• Se tempo para tentativa for fixo à Starvation (Inanição);
• Se tempo for aleatório (abordagem utilizada pela

Continue navegando