Sistemas_Operacionais_Parte4

438
Sistemas Operacionais Faculdade de Informática - PUCRS Prof. Celso Maciel da Costa

Transcript of Sistemas_Operacionais_Parte4

Page 1: Sistemas_Operacionais_Parte4

Sistemas Operacionais

Faculdade de Informática - PUCRSProf. Celso Maciel da Costa

Page 2: Sistemas_Operacionais_Parte4

2

Introdução

Page 3: Sistemas_Operacionais_Parte4

3

Sistemas operacionais– O que são?

» programas que controlam todos os recursos do computador e fornecem a base para o desenvolvimento dos programas de aplicação

– O que fazem?» virtualizam os recursos de hardware

» gerenciam os recursos de hardware

Introdução

Page 4: Sistemas_Operacionais_Parte4

4

Partes básicas de um sistema– hardware

– sistema operacional

– programas de aplicação

– usuários

Introdução

Page 5: Sistemas_Operacionais_Parte4

5

Introdução

Tipos de Sistemas Operacionais– Batch

– Time sharing

– Tempo real

– Distribuídos

– Paralelos

Page 6: Sistemas_Operacionais_Parte4

6

Introdução

Primeiros Sistemas – Totalmente manuais

Sistemas Operacionais Batch– Evolução dos sistemas iniciais (seqüenciamento

automático de jobs, multiprogramação,..)

– Normalmente possui como entrada uma seqüência de jobs a serem processados

– O resultado do processamento é uma saída, normalmente impressa

Page 7: Sistemas_Operacionais_Parte4

7

Monitor

usuário

Sistemas monoprogramados

Introdução

Page 8: Sistemas_Operacionais_Parte4

8

SO

usuário1

usuário2...

Sistemas multiprogramados

Introdução

Page 9: Sistemas_Operacionais_Parte4

9

Sistemas multipro-gramados

Introdução

Sistemas monoprogramados

Page 10: Sistemas_Operacionais_Parte4

10

Introdução

Sistemas Operacionais Batch(cont.)– Grande problema:

» O usuário não interage com o sistema

» O programa é preparado e encaminhado para execução

» Os resultados poderão demorar (minutos, horas, ...)

– A idéia básica é a de centralização do processamento em CPD’s

– A tendência atual é para a distribuição

Page 11: Sistemas_Operacionais_Parte4

11

Introdução

Sistemas Operacionais Time Sharing » Surgiram no início dos anos 60

» Se tornaram populares nos anos 70

» Existe uma comunicação on line entre o usuário e o sistema

» O usuário submete requisições ao sistema, e recebe as respostas imediatamente

» A interação é feita com o uso de terminais

» O sistema possui um Interpretador de Comandos, que lê a linha de comando contendo o nome do programa a ser executado

Page 12: Sistemas_Operacionais_Parte4

12

Introdução

Sistemas Operacionais Time Sharing (cont.)– Após a execução de um comando, o

Interpretador de Comandos volta a ler o terminal

– O usuário imediatamente compila e executa o seu programa

– Muitos usuários compartilham o uso do computador

Page 13: Sistemas_Operacionais_Parte4

13

Introdução

Sistemas Operacionais de tempo Real– Usados para controlar um dispositivo em uma

aplicação dedicada

– Sensores coletam dados que são enviados ao computador

– Os dados são analisados e são enviados sinais de resposta

– Em muitas aplicações o tempo de resposta é vital

Page 14: Sistemas_Operacionais_Parte4

14

IntroduçãoSistemas Operacionais Distribuídos

» Avanço tecnológico (microprocessadores, tecnologias de redes rápidas,..) aproximou as máquinas paralelas e as redes de computadores

» Um SOD é formado por um conjunto de nodos (processador/memória/periféricos?), sendo que em cada nodo existe um núcleo de sistema operacional)

» A comunicação entre os diferentes nodos se faz por troca de mensagens (ambientes sem compartilhamento de memória) ou por operações read remoto e write remoto (com memória virtual compartilhada)

Page 15: Sistemas_Operacionais_Parte4

15

Introdução

Sistemas Operacionais Distribuídos x Paralelos

» Distribuídos: Projetados para muitos usuários trabalharem conjuntamente (compartilhamento de recursos)

» Paralelos: Possui como objetivo obter velocidade na resolução de um único problema

Page 16: Sistemas_Operacionais_Parte4

16

IntroduçãoVisão Esquemática do funcionamento de um SO

SO

Usuário

Hardware

Chamadas de sistema

Interrupções

Page 17: Sistemas_Operacionais_Parte4

17

Organização de Sistemas Operacionais

Page 18: Sistemas_Operacionais_Parte4

18

Organização dos SO

Principais funções– Gerência de Processos

– Gerência de memória

– Escalonamento

– Gerência de recursos (contabilização)

– Proteção (controle de acesso)

Page 19: Sistemas_Operacionais_Parte4

19

Organização dos SO

MonolíticosO SO é organizado como uma coleção de processos seqüenciais cooperantes, que recebem as solicitações dos usuários (chamadas de sistema), as executam e devolvem um resultado

Usuário Usuário

rotina---------

...

Page 20: Sistemas_Operacionais_Parte4

20

Organização dos S.O.

Hierárquica– o sistema operacional é organizado como uma

hierarquia de níveis

– Ex. THE, construído pelo Dijkstra em 1968

Page 21: Sistemas_Operacionais_Parte4

21

Organização dos S.O.

Máquinas virtuais– o kernel do sistema implementa não a

multiprogramação, mas máquinas virtuais

– Ex. VM/370 da IBM

Page 22: Sistemas_Operacionais_Parte4

22

Micro Kernel• Modelo cliente/servidor

• Clientes (programas de aplicação) solicitam serviços

• Os serviços são implementados num nível acima do kernel, por servidores

usuario

resposta

kernel

serviço

...servidor usuario servidor

Organização dos SO

Page 23: Sistemas_Operacionais_Parte4

23

Windows NT

Micro kernelBaseado no modelo cliente/servidorSubsistemas de ambientes (Servidores)Executivo

Page 24: Sistemas_Operacionais_Parte4

24

Windows NT

Subsistemade Ambientes

(Processos Servidores)

Modo Usuário

Modo Kernel

ClienteOs/2

ServidorOs/2

ClientePOSIX

ServidorPOSIX

ClienteWin32

ServidorWin32

EXECUTIVO

Page 25: Sistemas_Operacionais_Parte4

25

Windows NT

Servidores– Subsistemas protegidos

– Processos independentes

– Cada um com sua própria memória

– Comunicação por troca de mensagens (LPC)

– Cada subsistema fornece uma API específica de um SO

– Servidores: POSIX, OS/2, DOS, Win16, Win32

Page 26: Sistemas_Operacionais_Parte4

26

Windows NT

Servidor Win32– Torna disponível aos usuários a API win32

– Fornece a interface gráfica do NT

– Controla as entradas e saídas do Win32

– Controla as entradas e saídas dos demais servidores

Page 27: Sistemas_Operacionais_Parte4

27

Windows NT

Executivo– É o kernel do sistema NT

– Funções:» Gerenciar de objetos

» Gerenciar processos

» Implementar LPC

» Gerenciar memória

» Tratar interrupções, escalonar processos

» Gerenciar I/O

Page 28: Sistemas_Operacionais_Parte4

28

Arquitetura do Sistema

Page 29: Sistemas_Operacionais_Parte4

29

Minix

Compatível com Unix V7Escrito em CRoda em PCEscrito por Tanenbaum

Page 30: Sistemas_Operacionais_Parte4

30

Estrutura interna do Minix

Init user user ...

MM

disktask

TTYtask

clocktask

systemtask

Process management

...

FS NetS

Page 31: Sistemas_Operacionais_Parte4

31

Unix

Visão Geral– Arquitetura

– Shell– Sistema de Arquivos

– Núcleo

Page 32: Sistemas_Operacionais_Parte4

32

Unix

Shell

núcleo

hardware

Page 33: Sistemas_Operacionais_Parte4

33

Unix - Arquitetura do Sistema

Biblioteca

Interface

Comunicação

Hardware

Sub-sistema

de gerência

de processos

Sub-sistema de arquivos

Scheduling

Ger. MemóriaDrivers

Cache

Carac. Blocos

Programas

Nível Núcleo

Nível Usuário

Page 34: Sistemas_Operacionais_Parte4

34

Revisão de Aspectos Básicos

Page 35: Sistemas_Operacionais_Parte4

35

Revisão de Aspectos Básicos Interrupções

Interrupções– permite que módulos interrompam processamento

normal do processador» gerado pelo programa

divisão por zero, referência a memória fora do espaço permitido, etc.

» timer» entrada e saída - sinalização de final de operação de E/S ou

condição de erro» falha de hardware

Page 36: Sistemas_Operacionais_Parte4

36

Funcionamento geral de um periférico

while ( true ){

receber ordem da CPUexecutar a ordemsinalizar a CPU

}

- os periféricos sinalizam a CPUcom o mecanismo de interrupção

Revisão de Aspectos Básicos Interrupções

Tipos de interrupções– externas ou internas

Externas– Originadas por periféricos ou eventos exteriores

(tempo real)

Page 37: Sistemas_Operacionais_Parte4

37

Revisão de Aspectos Básicos Interrupções

Internas– relógio

– erro

– software (chamada do sistema)

Relógio – permite a gerência do tempo pelo sistema

operacional» scheduling» disparo de um programa em um tempo determinado» contabilidade

Page 38: Sistemas_Operacionais_Parte4

38

Revisão de Aspectos Básicos Interrupções

Erro– overflow– violação de memória– instrução inválida– etc.

Software– instrução especial (int, trap, ...)– o programa para de executar– o sistema operacional começa – a executar o serviço solicitado pelo programa

Page 39: Sistemas_Operacionais_Parte4

39

Revisão de Aspectos Básicos Interrupções

Processamento de interrupções– dispositivo interrompe processador

– processador acaba execução da instrução atual

– processador testa existência de interrupção

– transferência de controle» processador salva estado atual

» carrega contador de programa com endereço da rotina de tratamento

» transfere controle para a rotina de tratamento

– rotina de tratamento executa … acaba

– restaura estado anterior

– retorna a execução da rotina interrompida

Page 40: Sistemas_Operacionais_Parte4

40

IntroduçãoVisão Esquemática do funcionamento de um SO

SO

Usuário

Hardware

Chamadas de sistema

Interrupções

Page 41: Sistemas_Operacionais_Parte4

41

Funções de um Sistema Operacional

Page 42: Sistemas_Operacionais_Parte4

42

Gerência de processos

Gerência de memória

Gerência de I/O

Gerência de Arquivos

Sistema de Proteção

Comunicação

Interpretador de Comandos

Funções de um SO

Page 43: Sistemas_Operacionais_Parte4

43

Gerência de processos– processo é um programa em execução

– entidade ativa, tem um program counter associado

– um processo executa sequencialmente até sua terminação

– dois processos podem estar executando mesmo programa -duas sequencias independentes de execução

– sistema consiste de coleção de processos» alguns do SO, outros do usuário

» processos executando de maneira concorrente, disputando CPU

Funções de um SO

Page 44: Sistemas_Operacionais_Parte4

44

Gerência de processos SO é responsável por– criação e deleção de processos

– suspensão e retomada de processos

– prover mecanismos para sincronização de processos

– prover mecanismos para comunicação de processos

– prover mecanismos para tratar deadlock

Funções de um SO

Page 45: Sistemas_Operacionais_Parte4

45

Gerência de memória– programas são carregados em memória, executando em

processos

– para maximizar o uso de CPU, vários processos são mantidos em memória, chaveando o contexto entre eles

– Sistema operacional deve» controlar quais regiões de memória são utilizadas e por qual processo

» decidir qual processo deve ser carregado para memória, quando espaço for disponível

» alocar e desalocar espaço de memória

Funções de um SO

Page 46: Sistemas_Operacionais_Parte4

46

Gerência de I/O– SO deve “esconder” as peculiaridades de

dispositivos de hardware específicos

– device drivers para os dispositivos específicos fazem parte do SO

– atividades» instalação e desinstalação lógica de dispositivo

» leitura, gravação

Funções de um SO

Page 47: Sistemas_Operacionais_Parte4

47

Gerência de Arquivos– oferece a abstração de arquivos (e diretórios)

– atividades suportadas» criação e deleção de arquivos e diretórios

» primitivas para manipulação

» mapeamento para memória secundária

Funções de um SO

Page 48: Sistemas_Operacionais_Parte4

48

Sistema de Proteção– controla acesso de processos ou usuários aos

recursos do sistema» proteção de memória, CPU, operação dual

» controle de acesso

Funções de um SO

Page 49: Sistemas_Operacionais_Parte4

49

Comunicação remota– facilidades para envio/recepção e protocolos de

comunicação

– atividades» criar, deletar conexões

» mandar e receber mensagens

Funções de um SO

Page 50: Sistemas_Operacionais_Parte4

50

Interpretador de Comandos– interface com o usuário

» modo textointerpretador de linha de comando

shell do unix

» gráficomachintosh

windows

Funções de um SO

Page 51: Sistemas_Operacionais_Parte4

51

Chamadas de Sistema

Page 52: Sistemas_Operacionais_Parte4

52

interface entre o programa que está executando e o sistema operacional– funções do SO disponíveis aos programas

geralmente implementadas com o uso de instruções de baixo nível

Chamadas de sistema

Page 53: Sistemas_Operacionais_Parte4

53

Controle de processos– criar, terminar

– carregar, executar

– espera por evento, sinalização

– espera tempo

– alocar e liberar memória

Chamadas de sistema

Page 54: Sistemas_Operacionais_Parte4

54

Manipulação de arquivos– criar, deletar

– abrir, fechar

– ler, escrever

– posicionar

Chamadas de sistema

Page 55: Sistemas_Operacionais_Parte4

55

Manipulação de dispositivos– alocar dispositivos, liberar dispositivo

– ler, escrever

Manutenção de informação do sistema– e.g.: ler, setar a hora

Comunicação– criar, deletar canais de conexão

– transferir informação

Chamadas de sistema

Page 56: Sistemas_Operacionais_Parte4

56

execução emmodo usuário

chamada de sistema retorno

execução emmodo núcleo

bloqueio

desbloqueiopronto

selecionado

Transição de estados de um processo em uma chamada de sistema

Page 57: Sistemas_Operacionais_Parte4

57

Programa………read ( fd, $b, 20)

Biblioteca

read ( int fd, char *b, int l ){

msg m;m->td = fd;m->b = b;m->l = l;m->op = READ;move m, regA;trap #12;

}

Page 58: Sistemas_Operacionais_Parte4

58

do_read

do_read: desabilitar intsalvar contexto…

Vetor interrupções

Page 59: Sistemas_Operacionais_Parte4

59

divididas em dois grandes grupos:– controle de processos, manipulação de arquivos

Chamadas de sistema - Unix

Biblioteca

Interface

Comunicação

Hardware

Sub-sistema

de gerência

de processos

Sub-sistema de arquivos

Scheduling

Ger. MemóriaDrivers

Cache

Carac. Blocos

Programas

Nível NúcleoNível Usuário

Page 60: Sistemas_Operacionais_Parte4

60

Manipulação de arquivos

. open . pipe

. close . link

. read . unlink

. write . lseek

. create

Chamadas de sistema - Unix

Page 61: Sistemas_Operacionais_Parte4

61

Chamadas de sistema - UnixControle de processos

. fork

. wait

. exit

. exec

. kill

. signal

Page 62: Sistemas_Operacionais_Parte4

62

Chamadas de sistema

Implementação– Depende do computador

– Exemplo:» instrução especial transfere o controle para o SO

» chamada de uma rotina especial para executar o serviço

Page 63: Sistemas_Operacionais_Parte4

63

Chamadas de sistema

Passagem de parâmetros– através de registradores

» Problema: o número de parâmetros é limitado ao número de registradores

– através de um bloco de memória» o endereço do bloco de memória é passado em um

registrador

Page 64: Sistemas_Operacionais_Parte4

64

Processos Concorrentes

Page 65: Sistemas_Operacionais_Parte4

65

Em sistemas com multiprogramação

– uso da CPU compartilhado entre os diferentes programas

– ilusão de paralelismo ( pseudo-paralelismo)

um processo é um programa em execução, incluindo os valores dos registradores, o valor do PC, o valor das variáveis, etc.

cada processo tem sua própria CPU virtual

Processos Concorrentes

Page 66: Sistemas_Operacionais_Parte4

66

running

ready blockedevento

interrupção

selecionado

Grafo de transição de estados de processos

Page 67: Sistemas_Operacionais_Parte4

67

Escalonamento

Filas de escalonamento– Sistemas Uniprocessador

um processo running

demais processos aptos a executar esperam pela CPU

» fila ready: contém os processos aptos a rodar

» filas de dispositivos: contém os processos esperando I/O

» filas de eventos: contém os processos bloqueados a espera de eventos (ex. passagem de tempo)

Page 68: Sistemas_Operacionais_Parte4

68

Escalonamento

Filas de escalonamento(cont.)

– Sistemas multiprocessadores» memória comum

Uma única fila de processos aptos à rodar;

Uma fila para cada processador;

» memória distribuídauma fila em cada processador

Page 69: Sistemas_Operacionais_Parte4

69

Exemplos de Implementação de Filas

First

Last

Desc5

First

Last

Desc0 Desc9

Desc7 Desc13

Desc12Last

First

Ready:

Disco0

Disco1

Page 70: Sistemas_Operacionais_Parte4

70

Process Control BlockRepresentação de um processo para o SO:– estado do processo: ready, running, blocked ...

» Estado também pode ser representado através da fila em que o processo se encontra

– program counter

– registradores da CPU

– informação de esclonamento: depende do algoritmo - prioridades, ponteiros para filas ...

– Informação para gerência de memória: valor de registradores base e limite, páginas, ...

– Informação de contabilização: tempo de CPU utilizada, limites, ...

– informação de estado de I/O: lista de dispositivos alocados ao processo, arquivos abertos, ...

Page 71: Sistemas_Operacionais_Parte4

71

Escalonamento da CPUMultiprogramação– Vários programas na memória

– CPU compartilhada pelos mesmos

– A execução de um programa é uma seqüência de execução e espera por I/O

– Quando o programa faz I/O a CPU é entregue a outro programa

Escalonamento – É a troca da CPU entre os vários programas na

memória prontos para executar

Page 72: Sistemas_Operacionais_Parte4

72

EscalonadoresImplementam a Política de Escalonamento– Escalonadores de Longo Termo

» Sistemas Batchprogramas submetidos são armazenados em disco

o escalonador de Longo Termo seleciona programas do disco e os carrega na memória para execução

Não existem em sistemas interativos (Unix, Dos, Windows, ...)

– Escalonadores de Pequeno Termo (Escalonadores da CPU

» seleciona um processo, entre os aptos, e o dispara

– Diferença: Freqüência de execução

Page 73: Sistemas_Operacionais_Parte4

73

Escalonadores

Dispatcher– Entrega a CPU para o processo selecionado

pelo Escalonador de Pequeno Termo (Escalonador da CPU)

» carrega os registradores gerais (da pilha, do descritor,..) nos registradores de máquina

» carrega o Program Counter (dispara a execução)

Page 74: Sistemas_Operacionais_Parte4

74

Algoritmos de Scheduling

Critérios para escolha de algoritmos– utilização de Cpu: mantê-la ocupada o máximo de

tempo possível

– No. de jobs executados por unidade de tempo (throughput) (Ex. jobs grandes => 1 por hora, jobspequenos => muitos por segundo)

– tempo ocorrido desde a submissão de um job até seu término (turnaround time) (geralmente limitado por i/o)

Page 75: Sistemas_Operacionais_Parte4

75

Algoritmos de Scheduling

Critérios para escolha de algoritmos. (cont.)– tempo de espera (waiting) (tempo na fila

ready)

– tempo de resposta (sistemas interativos) (tempo de turnaround pode não ser o melhor critério)

Page 76: Sistemas_Operacionais_Parte4

76

Algoritmos de Scheduling

Objetivos de um algoritmo.– maximizar utilização da CPU

– maximizar No. de programas executados por unidade de tempo

– minimizar tempo de turnaround

– minimizar tempo de resposta (melhor minimizar a variância do que a média em sistemas time-sharing)

Page 77: Sistemas_Operacionais_Parte4

77

Algoritmos de Scheduling

Algoritmo 1: First-Come-First-Served– “Primeiro processo que requisita a CPU é o

primeiro que a recebe”» 1. Processo pronto para executar entra no final

da lista ready» 2. Quando a CPU é liberada é alocada para o

primeiro da lista

Page 78: Sistemas_Operacionais_Parte4

78

Algoritmos de Scheduling

Algoritmo 1: First-Come-First-Served

Ex.: Job Tempo1 242 33 3

Chegada: 1, 2, 3Job2 Job3Job1

0 24 27 30

Page 79: Sistemas_Operacionais_Parte4

79

Algoritmos de Scheduling

Algoritmo 1: First-Come-First-Served

Job 1 : 24Job 2 : 27Job 3 : 30

Tempo de turnaround

Média : (24+27+30) = 27

1 Job CPU boundMuitos Jobs I/o bound

Baixa performance.

Page 80: Sistemas_Operacionais_Parte4

80

Algoritmos de Scheduling

Algoritmo 1: First-Come-First-Served

Job 2 Job 3 Job 1 ??

Como seria o tempo de turnaround para chegadas:

Média: ?

E o waiting time ?

Page 81: Sistemas_Operacionais_Parte4

81

Algoritmos de Scheduling

Algoritmo 1: First-Come-First-Served– CPU Bound prende a CPU– Todos os outros Jobs tem seu I/O completado e

esperam na fila ready– enquanto esperam, dispositivos estão desocupados– CPU Bound requisita I/O– os outros Jobs executam rapidamente, requisitam

I/O– CPU Bound recebe o processador

– particularmente problemático para sistemas time-sharing

Page 82: Sistemas_Operacionais_Parte4

82

Algoritmos de Scheduling

Algoritmo 2: Shortest-Job-First– Associa a cada processo o seu próximo tempo de

ocupação de CPU– Quando a CPU esta livre é atribuída ao processo

com o menor tempo de CPU

Ex.:Processo Próximo tempo

1 62 83 74 3

Proc4 Proc1 Proc3 Proc2

0 3 9 16 24. Executando processos pequenos antes diminuimais seus tempos de espera do que aumenta os tempos de espera dos processos grandes

Page 83: Sistemas_Operacionais_Parte4

83

Algoritmos de Scheduling

Algoritmo 2: Shortest-Job-First– waiting time: 7– waiting time se fosse FCFS: 10.35

Page 84: Sistemas_Operacionais_Parte4

84

Algoritmos de Scheduling

Algoritmo 2: Shortest-Job-First– Problema do SJF

» Determinar próximo tempo de CPU para cada processo

Sistemas Batch (Long Term Scheduler)Tempo limite do processo

Scheduling da CPU (Short Term)?

Estimar o tempo

Page 85: Sistemas_Operacionais_Parte4

85

Algoritmos de Scheduling

Algoritmo 2: Shortest-Job-First– Determinar próximo tempo de CPU para

cada processo

– estimar tamanho do próximo cpu burst com base nos tempos passados de cpu

τn+1 = α tn + (1-α) τn

» tn : último tempo de cpu amostrado

≈ τn : último valor previsto

≈ τn+1 : valor previsto para próxima vez

≈ α : fator de peso entre amostrado e passado

Page 86: Sistemas_Operacionais_Parte4

86

Algoritmos de Scheduling

Algoritmo : baseado em Prioridades– cada job tem uma prioridade associada

– cpu alocada ao job de maior prioridade

– caso de prioridades =s, adota FCFS

– SJF é um caso especial» onde burst de cpu estimado é o inverso da

prioridade

Page 87: Sistemas_Operacionais_Parte4

87

Algoritmos de Scheduling

Algoritmo : baseado em Prioridades» existe um campo de variação (0..7), (0..N)» Alguns sistemas 0 é a maior, outros 0 é a menor » podem ser internas ou externas

internas: espaço de memória necessária arquivos abertos, etc. (Ex.: sistema Pascal)externas: externas ao sistema operacional Ex.: tipo do programa, tamanho, fatores políticos, etc.

Page 88: Sistemas_Operacionais_Parte4

88

Algoritmos de Scheduling

Algoritmo : baseado em prioridades– e processos de baixa prioridade

– Problemas ?

Page 89: Sistemas_Operacionais_Parte4

89

Algoritmos de Scheduling

Algoritmo : baseado em prioridades– Problemas: postergação indefinida

– Solução: de tempos em tempos incrementar a prioridade do processo.

– Ex.: de prioridades (0.. 127) => mais alta

– incrementar um processo com prioridade 0 de 1 a cada 15 minutos ==> 32 horas para rodar

Page 90: Sistemas_Operacionais_Parte4

90

Algoritmos de Scheduling

Algoritmos Preemptivos. – FCFS, SJF, prioridades:

» não preemptivos, como descritos

» processo somente perde o processador quando termina ou quando requisita I/O

– Questão: que fazer quando chega na fila ready um processo com prioridade maior do que o que está rodando?

Page 91: Sistemas_Operacionais_Parte4

91

Algoritmos de Scheduling“Preemptar ou não Preemptar”.– Preemptar:

» um processo chegando na fila ready tem sua prioridade comparada com a do processo que está rodando.

» se for maior: ganha a cpu» se for menor: fica na fila

– Em sistemas time-sharing o Scheduler deve ser peemptivo ou não?

» Resposta: Sim, para evitar que um processo possa prender a CPU por muito tempo.

Page 92: Sistemas_Operacionais_Parte4

92

Algoritmos de Scheduling

“Preemptar ou não Preemptar”.– Ex.: de Preempção (SJF)

Processo Chegada Tempo1 0 82 1 43 2 94 3 5

preempção0

proc

1

2 4 1 3

1 5 10 17 26

Page 93: Sistemas_Operacionais_Parte4

93

Algoritmos de scheduling

– Ex.: de Preempção (SJF) (cont.)» Tempo médio de execução:

processo 1 17 - tempo de chegada (0) = 17

processo 2 5 - tempo de chegada (1) = 4

processo 3 26 - tempo de chegada (2) = 24

processo 4 10 - tempo de chegada (3) = 7

tempo médio = (17+4+24+7)/4 = 13

Page 94: Sistemas_Operacionais_Parte4

94

Algoritmos de Scheduling

Ex.: Sem Preempção (SJF) (cont.)

(8-TC)+(12-TC) +( 26-TC) + (17-TC) onde TC=tempo de chegada

1 2 4 3

0 8 12 17 26

(8+11+24 + 14)/4 = 57/4 = 14.25

Page 95: Sistemas_Operacionais_Parte4

95

Round-Robin:– Sistemas time-sharing– quantum ou time slice (10-100 miliseg.)– lista ready é uma fila circular

Algoritmos de Scheduling

Ex.:processo tempo

1 242 33 3

Time-slice:4

1 2 3 1 1 1 1 1

4 7 10 14 18 22 26 30

Média: 47/3 ~16

Page 96: Sistemas_Operacionais_Parte4

96

Algoritmos de Scheduling

Round-Robin– Overhead: salvamento de contexto depende

de :» velocidade de memória» número de registradores» existência de instruções especiais: ex. mover

todos os registradores

– tempo típico: 10-100 microsegundos

Page 97: Sistemas_Operacionais_Parte4

97

Algoritmos de Scheduling

Round-Robin– Quantum: 12 unidades

– tempo de execução do processo: 10 unidades

NÃO TEM OVERHEAD

- Quantum de 6 unidades- Tempo de execução: 10 unidades

1 TROCA DE CONTEXTO

Quantum muito grande ==> FCFS

Page 98: Sistemas_Operacionais_Parte4

98

Algoritmos de Scheduling

Múltiplas filas – processos são classificados em grupos

– uma fila para cada grupo

– cada fila pode ter seu próprio algoritmo

– cada fila pode ter prioridade absoluta sobre as demais filas com prioridades menores

– alternativa: haver um slice entre as filas

Page 99: Sistemas_Operacionais_Parte4

99

Algoritmos de scheduling

Múltiplas filas com reavaliação– os processos se movem entre as filas

– parâmetros: » no. de filas

» método para aumentar processos nas filas

» método para diminuir processos nas filas

» método para determinar em que fila o processo deve entrar

Page 100: Sistemas_Operacionais_Parte4

100

Scheduling no sistema Pascal Concorrente

três filas de prioridades– alta: prioridade 0

– média: prioridade 1

– baixa: prioridade 2

prioridade 2: qdo. o processo é criado

prioridade 1: qdo. o processo pede I/O

prioridade 0: qdo. o processo pede acesso a um monitor

Page 101: Sistemas_Operacionais_Parte4

UNIX

Scheduling

Page 102: Sistemas_Operacionais_Parte4

102

UNIX - Diagrama de Estados de Processo

Page 103: Sistemas_Operacionais_Parte4

103

Estados de processos no UNIX

Criação de um processo:– processo pai executa fork

– filho é criado e entra no estado created

– quando decidido sobre sua alocação entra no estado ready to run, em memória ou swaped

Page 104: Sistemas_Operacionais_Parte4

104

Estados de processos no UNIX

Criação de um processo:– processo 1, init, é criado no início do sistema

– quando um usuário interativo entra no sistema, o processo init cria um processo para tratar do usuário

– este processo do usuário atende os pedidos do usuário, criando outros processos

Page 105: Sistemas_Operacionais_Parte4

105

Estados de processos no UNIX

Escalonamento do processo recém criado:– escalonador escolhe processo para executar

– processo escolhido sai de ready to run e passa para kernel running

– processo acaba processamento da chamada forkfeita pelo pai

– retorna para o modo user running

– prossegue execução

Page 106: Sistemas_Operacionais_Parte4

106

Estados de processos no UNIX

Chamada de sistema:– quando processo executa chamada de sistema

» sai do modo user running e passa para kernel running

» no caso de pedido de IO processo entra no modo asleep

– quando IO está pronto» interrupção acontece e o processo bloqueado é

passado para ready to run

» antes de retornar a user running, o processo interrompido pode perder o processador (ser preemptado)

Page 107: Sistemas_Operacionais_Parte4

107

Estados de processos no UNIX

Interrupção e preempção:– relógio do sistema pode interromper, ou IO fica

pronto e interrompe

– o processo entra no modo kernel running

– o tratador de interrupções acaba o tratamento da mesma

– antes de retornar para user running,núcleo pode preemptar o processo em favor de outro com maior prioridade

– primeiro processo entra no modo preempted(mesmo que ready to run)

Page 108: Sistemas_Operacionais_Parte4

108

Estados de processos no UNIX

Preempção:– só pode acontecer quando o processo está para

retornar para user running

– chamada de sistema de um processo (kernelrunning) não pára no meio em favor de outro processo

– como algumas chamadas de sistema são “pesadas” - o sistema não é adequado para tarefas tempo real

Page 109: Sistemas_Operacionais_Parte4

109

Estados de processos no UNIX

Saída de processo:– quando processo completa, ele faz chamada de

sistema exit

– processo passa para kernel running e então para zombie

– eventos externos podem indicar que processo tem que sair (exit)

Page 110: Sistemas_Operacionais_Parte4

110

Scheduling no UNIX

Round robin com múltiplos níveis e feedback

vários níveis de prioridades

níveis básicos:– kernel

– usuário

estes são ainda subdivididos

Page 111: Sistemas_Operacionais_Parte4

111

Scheduling no UNIX

Níveis do kernel– prioridades altas, não interrompíveis

» processos não perdem CPU por tempo (preemptados)

» ex.:swaper, waiting for disk IO, waiting for buffer, waiting for inode,

– prioridades baixas, interrompíveis» ex.: waiting for tty input, …output, waiting for child

exit

Níveis do usuário– user level 0, …, user level n

Page 112: Sistemas_Operacionais_Parte4

112

Scheduling no UNIX

Política:– políticas normais: fairness

– incentivar a liberação de recursos

Page 113: Sistemas_Operacionais_Parte4

113

Scheduling no UNIX

Política de prioridades para processos no modo núcleo– associa prioridade ao processo antes de ir para

estado asleep

– relaciona valor fixo de prioridade à razão do processo ir para asleep

– quando processo é escalonado » considera a prioridade do modo kernel

» entra em kernel running

» quando passa para user running, restaura prioridade do processo para modo usuário

Page 114: Sistemas_Operacionais_Parte4

114

Scheduling no UNIX

Política de prioridades para processos no modo núcleo– níveis de prioridade

» associados de forma que maior prioridade dada a processos com maior probabilidade de liberar recursos

» evitar gargalos no sistema

Page 115: Sistemas_Operacionais_Parte4

115

Scheduling no UNIX

swapper

Waiting for disk io

Waiting for buffer

Waiting for inode

Não interrom-

píveis

Waiting for tty input

Wait for tty output

Wait for child exit

Waiting for inode

Interrom-píveis

User level 0

User level 1

User level n

prio

rida

de

Priori-dades

no modokernel

Priori-dades

no modousuário

Níveis de prioridades Processos

Page 116: Sistemas_Operacionais_Parte4

116

Scheduling no UNIX

Política de prioridades para processos no modo usuário– em cada segundo, clock interrompe 60 vezes

– contador de uso de CPU é incrementado a cada vez

– a cada segundo:» ajusta o uso recente da CPU

decay(CPU) : uso de CPU = uso de CPU/2

recalcula prioridades dos processos ready to run

– priority = uso de CPU/2 + prioridade base do processo de usuário

Page 117: Sistemas_Operacionais_Parte4

117

Scheduling no UNIXPriority CPU

60 012…60

75 30

3067 15

63 789..67

76 33

68 16

Priority CPU

60 0

60 012...60

75 30

67 15

63 789…67

76 33

Priority CPU

60 0

60 0

60 012…60

75 30

67 15

63 7

Proc A Proc B Proc C

Page 118: Sistemas_Operacionais_Parte4

118

Scheduling no UNIXPriority CPU

60 012…60

75 30

3067 15

63 789..67

76 33

68 16

Priority CPU

60 0

60 012...60

75 30

67 15

63 789…67

76 33

Priority CPU

60 0

60 0

60 012…60

75 30

67 15

63 7

Proc A Proc B Proc C

decay

60 + CPU/2

60 + CPU/2

decay

Page 119: Sistemas_Operacionais_Parte4

119

Scheduling no UNIX

Extensão: Fair share Scheduler– Dividir capacidade computacional da máquina

– Grupos» processos pertencem a grupos

» além de contabilizar uso da CPU por processo, contabiliza por grupo

decay(CPU) : uso de CPU = uso de CPU/2

decay(Group) : uso de CPU do grupo = uso de CPU do grupo/2

recalcula prioridades dos processos ready to run

– priority = uso de CPU/2 + uso de CPU do grupo /2+ prioridade base do processo de usuário

Page 120: Sistemas_Operacionais_Parte4

120

Scheduling no UNIXPriority CPU Group

60 0 01 12 2… ...60 60

90 30 30

74 15 1516 1617 17… ...75 75

96 37 37

78 18 1819 1920 20… ...78 78

98 39 39

Priority CPU Group

60 0 0

60 0 01 12 2… ...60 60

90 30 30

74 15 151617...75

81 7 37

70 3 18

Priority CPU Group

60 0 0

60 0 012...60

75 0 30

67 0 151 162 17… ...60 75

93 30 37

76 15 18

Proc A Proc B <- mesmo grupo -> Proc C

Page 121: Sistemas_Operacionais_Parte4

MINIX

Scheduling

Page 122: Sistemas_Operacionais_Parte4

122

Processos

Process management

Init

Memorymanager

Disktask

Userprocess

Filesystem

Ttytask

Networkserver

Clocktask

Userprocess

Userprocess

Systemtask

Ethernettask

...

...

...

Layer

User processes

Server processes

I/O tasks

3

2

1

4

Kernel

Page 123: Sistemas_Operacionais_Parte4

123

Scheduling

Rdy_head Rdy_tail

USER_Q USER_Q

SERVER_Q SERVER_Q

TASK_Q TASK_Q

2

1

0

2

1

0

3 5 4

FS MM

Clock

Page 124: Sistemas_Operacionais_Parte4

124

Scheduling

TASK_Q– fila de prioridade máxima

– o(s) processo(s) não perdem o processador por tempo.

Page 125: Sistemas_Operacionais_Parte4

125

SERVER_QFila de prioridade média na qual executam os servidores do sistema. Os processos nesta fila não perdem o processador por tempo.

Scheduling

Page 126: Sistemas_Operacionais_Parte4

126

USER_Qfila de prioridade mais baixa na qual executam os processos dos usuários. O algoritmo usado nesta fila é o round-robin.

Scheduling

Page 127: Sistemas_Operacionais_Parte4

127

proc.c - Principais funções

void pick_proc()– decide qual processo deverá ser executado no

momento. Percorre as filas de processos a procura de um processo a ser executado conforme a prioridade.

Page 128: Sistemas_Operacionais_Parte4

128

void ready(struct proc *rp)•adiciona o processo rp em uma das filas de processos para torná-lo runnable. •Esta função verifica em qual fila o processo se encaixa e adiciona-o no final da fila correspondente.

proc.c - Principais funções

Page 129: Sistemas_Operacionais_Parte4

129

void unready(struct proc *rp)•retira o processo rp da sua fila de processos. •Esta função descobre a qual fila pertence o processo rp, procura-o na fila e retira-o, tirando a sua condição de runnable.

proc.c - Principais funções

Page 130: Sistemas_Operacionais_Parte4

130

void sched()•escalona a fila de processos do usuário. •esta função retira o processo indicado pela rdy_head na fila de processos de usuário, •faz com que rdy_head aponte para o próximo processo e •aloca o processo anterior (rodando) no final da fila do usuário.

proc.c - Principais funções

Page 131: Sistemas_Operacionais_Parte4

131

void sched()

USER_Q USER_Q

rdy_head rdy_tail

3 5 4

USER_Q USER_Q

rdy_head rdy_tail

5 4 3

.

.

.

.

.

.

proc.c - Principais funções

Page 132: Sistemas_Operacionais_Parte4

132

Multiprocessor Scheduling

Sistemas multiprocessadores– fracamente acoplados, ou clusters

» cada sistema tem memória própria e canais de IO

– processadores especializados» como processadores de IO

» existe um processador mestre de propósito geral que controla os escravos

– processadores fortemente acoplados» conjunto de processadores que compartilham

memória principal sob controle integrado de um sistema operacional

Page 133: Sistemas_Operacionais_Parte4

133

Multiprocessor Scheduling

Fortemente acoplados - homogeneos – tratar processadores como recurso conjunto e

associar processos a processadores sob demanda

– associação estática ou dinâmica» estática: processo roda no mesmo processador

» dinâmica: em diferentes CPU burts processo pode ocupar diferentes processadores

Page 134: Sistemas_Operacionais_Parte4

134

Multiprocessor Scheduling

Abordagens mestre-escravo e pares– mestre escravo:

» funções do kernel rodam sempre em um processador

» outros processadores rodam só processos de usuário

» mestre faz escalonamento

» se escravo precisa serviço (chamada de sistema), faz pedido ao mestre

» desvantagens:mestre pode ser gargalo de desempenho

falha do mestre pára sistema

Page 135: Sistemas_Operacionais_Parte4

135

Multiprocessor Scheduling

Abordagens mestre-escravo e pares– pares:

» SO executa em qualquer processador

» cada processador faz escalonamento para si da fila ready comum

» mais complicado:garantir que dois processadores não escolham mesmo processo

sincronização no acesso a estruturas comuns

Page 136: Sistemas_Operacionais_Parte4

136

Processos Concorrentes

Page 137: Sistemas_Operacionais_Parte4

137

Processos Concorrentes

Processos pesados – Processos tradicionais

– Possuem uma thread inicial que começa a sua execução (ex. main de um programa C)

– Normalmente carregados do disco para execução

– Executam um código seqüencial

Page 138: Sistemas_Operacionais_Parte4

138

Controle de Processos

Processos leves (threads)– Criados para permitir paralelismo

– cada um roda um código seqüencial

– Possuem sua própria pilha de execução e o seu próprio programcounter

– Compartiham o uso do processador

– Podem criar processos (threads) filhos

– Compartilham o mesmo espaço de endereçamento (dados globais)

– Podem estar em um dos estados ready, running, blocked

Page 139: Sistemas_Operacionais_Parte4

139

Controle de Processos

Hierarquia de processos– um grafo de processos é uma árvore cujos

nodos correspondem a um processo» uma aresta de um nodo Pi para um nodo Pj significa

que Pj foi criado por Pi

» Pi é o pai de Pj

» Pj é filho de Pi

» cada processo possui um pai, exceto o inicial (ancestral)

» cada processo pode ter muitos filhos

Page 140: Sistemas_Operacionais_Parte4

140

P1

P2 P3

P4 P5 P6

Árvore de processos

Controle de Processos

Page 141: Sistemas_Operacionais_Parte4

141

Controle de Processos

Operações em processos– criação de processos

» possibilidades de execução:o pai executa concorrente com o filho

o pai espera que o filho acabe

» possibilidades de compartilhamento de dadospai e filho compartilham todas as variáveis

pai e filho compartilham um subconjunto das variáveis do pai

Page 142: Sistemas_Operacionais_Parte4

142

Controle de Processos

Exemplos – UNIX

» filho é duplicata do pai

» execução concorrente de pai e filho

– DEC VMS» carga de código do novo processo na criação

– NT» ambos modelos

Page 143: Sistemas_Operacionais_Parte4

143

Controle de Processos

Término de processos– um processo termina quando acaba a execução

de seu último comando» pede ao SO para removê-lo com a chamada exit

– em circunstâncias especiais um processo pode acabar antes de executar o seu último comando

– um processo pode causar a morte de outros processos com primitivas especiais

Page 144: Sistemas_Operacionais_Parte4

144

Controle de Processos

abort (id), kill (id)– id é a identificação do processo à terminar– abort e kill são chamadas pelo pai do processo

id– para poder matar, o pai necessita conhecer a

identidade do filho, que retorna na operação de criação.

– id = fork()» retorna em id a identificação do processo criado

Page 145: Sistemas_Operacionais_Parte4

145

Especificação de Concorrência

Construções fork e join– Connway 1963

– Dennis e Van Horn 1966

– primeiras notações de linguagem para especificar concorrência

Page 146: Sistemas_Operacionais_Parte4

146

Especificação de Concorrência

P0

fork

P1 P2

Construção fork

Page 147: Sistemas_Operacionais_Parte4

147

Especificação de Concorrência

P1 ;fork l ;..

l: p3 ;

- fork produz duas execuções concorrentes no programa- uma começa no rótulo “l”- a outra continua no comando seguinte ao fork- divide uma computação em duas independentes

FORK

Page 148: Sistemas_Operacionais_Parte4

148

Especificação de ConcorrênciaJOIN

– combina várias execuções concorrentes em uma

– cada execução deve requisitar um join com as demais

– algumas computações terminam antes de outras

– as que executa o join antes terminam, a última continua

– existindo três computações, as duas primeiras terminam, enquanto à última é permitido continuar

– join tem um parâmetro que especifica o número de computações

– deve ser executada atomicamente

Page 149: Sistemas_Operacionais_Parte4

149

Especificação de Concorrência

join com parâmetro

count = count - 1 ;if count != 0then quit ;

Page 150: Sistemas_Operacionais_Parte4

150

Especificação de Concorrência

Exemplo:s1

s2 s3

s4

s5 s6

s7

Grafo de precedência de execução dos comandos s1 a s7

Page 151: Sistemas_Operacionais_Parte4

151

Especificação de Concorrência

s1;count = 3 ;fork l1 ;s2 ;s4 ;fork l2 ;s5 ;go to l3 ;

l1: s3 ;go to l3 ;

l2: s6 ;go to l3 ;

l3: join count ;s7 ;

Exemplo de programa usando fork/join

Page 152: Sistemas_Operacionais_Parte4

152

Especificação de ConcorrênciaFork no sistema Unix– Forma: id = fork() ;

– Duplica o processo que executa a chamada

– Ambos executam a instrução seguinte à chamada de sistema

– Id, no retorno da chamada, contém no processo pai, o identificador do processo filho criado

– Para o processo filho o valor da variável id será zero

– Pode-se selecionar o trecho de código que será executado pelos processos com o comando if

– Não existe o comando join (a sincronização é feita com wait())

Page 153: Sistemas_Operacionais_Parte4

153

Exemplo de programa com forkno Unix

main() {

int id ;

id = fork () ;if (id != 0) {

printf(“Eu sou o pai\n”) ;

wait(0) ;

}

else

printf(“Eu sou o filho\n”) ;

}

Page 154: Sistemas_Operacionais_Parte4

154

Especificação de Concorrência

fork/join

– desestruturam um programa

– são semelhantes à comandos go to

– tornam difícil a compreensão do programa

Page 155: Sistemas_Operacionais_Parte4

155

Especificação de Concorrência

Comando concorrente– Dijkstra 1965

– construção de mais alto nível

– Forma:» parbegin s1, s2, ... sn parend ;

todos os comandos entre o parbegin e o parend são executados concorrentemente

o comando seguinte ao parend somente é executado após todos os anteriores terem terminado

Page 156: Sistemas_Operacionais_Parte4

156

Programa que copia um arquivo f para um arquivo g usando comando concorrente

varf, g file of T ;r, s of T ;begin

reset (f)read (f, r) ;while (not EOF ) do

begins = r ;parbegin

write (g, s) ;read (f, r) ;

parend ;end ;

write (g, r) ;end ;

Page 157: Sistemas_Operacionais_Parte4

157

Grafo de precedência apresentado anteriormenteprogramado com parbegin/parend

s1 ;parbegin

s3 ;begin

s2 ;s4 ;parbegin

s5 ;s6 ;

parend ;end ;

parend ;s7 ;

s1

s2 s3

s4

s5 s6

s7

Page 158: Sistemas_Operacionais_Parte4

158

Especificação de Concorrência

Comparação entre comando concorrente e fork/join

– fork/join é mais poderosa

– comando concorrente é estruturado

– comando concorrente pode ser mais facilmente adicionado a uma linguagem de programação

Page 159: Sistemas_Operacionais_Parte4

159

Simulação de comando concorrente com fork/join

count = n ;fork l2 ;fork l3 ;...fork ln ;s1 ;go to lj ;

l2: s2 ; go to lj ;l3: s3 ; go to lj ;...ln: sn ;lj: join count ;

parbegins1;s2;s3;s4 ;...

Sn;parend;

Page 160: Sistemas_Operacionais_Parte4

160

Exercício

?

s1

s2 s3

s4

s5 s6

s7

s8

Page 161: Sistemas_Operacionais_Parte4

161

Resposta

count1 = 2;count2 = 3;s1;fork P1;s2;s4;fork P2;s5;go to P4;

P2: fork P3;s6;go to P4;

P1: s3;P3: join count1;

s8;P4: joint count2;

s7;

s1

s2 s3

s4

s5 s6

s7

s8

Page 162: Sistemas_Operacionais_Parte4

162

Multithreading

Page 163: Sistemas_Operacionais_Parte4

163

Processos Concorrentes

Processos leves (threads)

– cada um roda um código seqüencial

– Possuem sua própria pilha de execução e o seu próprio programcounter

– Compartiham o uso do processador

– Podem criar processos (threads) filhos

– Compartilham o mesmo espaço de endereçamento (dados globais)

– Podem estar em um dos estados ready, running, blocked

Page 164: Sistemas_Operacionais_Parte4

164

Threads e Processos pesados

Page 165: Sistemas_Operacionais_Parte4

165

Processos pesados

Acesso protegido a processador, outrosprocessos, arquivos, e recursos de IO

Page 166: Sistemas_Operacionais_Parte4

166

ThreadsTêm estado de execução (running, ready, etc.)

Salva contexto da thread quando não executando

Tem stack de execução por thread

Acessa endereços de memória e recursos do processo pesado que pertence– todas threads pertencentes ao processo pesado

compartilham

– quanto uma thread altera um valor compartilhado, todaspercebem esta mudança

– arquivo aberto por uma thread está disponível a outras

Page 167: Sistemas_Operacionais_Parte4

167

Modelos de Processos Mono e Multithreaded

Thread Control Block contém informações de prioridade e de estado da thread

Page 168: Sistemas_Operacionais_Parte4

168

Benefícios de Threads vsProcessos Pesados

menor tempo para criar thread queprocesso – processo pesado: carregar código

– thread: código já em memória

menor tempo para terminar …

menor tempo para chavear contexto entreduas threads (do mesmo processo) do quechavear processos pesado diferentes

Page 169: Sistemas_Operacionais_Parte4

169

Benefícios de ThreadsExemplo: servidor de arquivos em uma LAN

servir vários pedidos em curto período

mais eficiente criar e destruir threads porpedido que processos pesados

em máquinas SMP threads podem executarparalelamente em diversos processadores

Page 170: Sistemas_Operacionais_Parte4

170

Benefícios de threads

Aplicação consiste de várias partesindependentes que não precisam rodar emseqüênciacada parte - uma threadquando uma thread estiver bloqueada porIO, execução pode chaver para outra thread da mesma aplicação - ao invés de chavearpara outro processo

Page 171: Sistemas_Operacionais_Parte4

171

Benefícios de Threads

Compartilhamento de memória e arquivos: comunicação possível entre elas seminvocar chamada de sistema

Necessidade de sincronizar atividades das diversas threads para não causarinconsistência nos dados compartilhados

Page 172: Sistemas_Operacionais_Parte4

172

Estados de Threads

Três estados chave: running, ready, blocked

Não tem estado swapped– não existe swap de thread mas sim de todo

processo pesado

Terminação do processo pesado terminatodas as threads do mesmo

Page 173: Sistemas_Operacionais_Parte4

173

Threads a nível de usuárioUser-Level Threads (ULT)

Núcleo do sistema tratasomente processos pesados

Gerência de threads feita poraplicação utilizando umabiblioteca

Chaveamento de threads nãorequer privilégios do modokernel

escalonamento é específico daaplicação

Ex.: biblioteca Pthreads (ex.: sobre linux)

Page 174: Sistemas_Operacionais_Parte4

174

Bibliotecas de threads

Código para:– criar e destruir threads

– passar mensagens entre threads

– escalonar a execução de threads

– salvar e retomar contexto

Page 175: Sistemas_Operacionais_Parte4

175

Atividades do Kernel parathreads a nível de usuário

Núcleo não trata threads mas processospesados

Quando thread faz chamada de sistema, todoprocesso pesado será bloqueado

… para a biblioteca de threads, a thread rodando estará ainda no estado running

… o estado das threads é independente do estado do processo pesado

Page 176: Sistemas_Operacionais_Parte4

176

Vantagens e desvantagens de threads a nível de usuário

Vantagens– Chaveamento de

threads não envolvekernel: não troca de modo

– Escalonamento podeser dependente daaplicação: escolha de algoritmo

– Pode rodar em qualquerSO, precisa dabiblioteca

Desvantagens– Maioria das chamadas de

sistema são bloqueantes - e o kernel bloqueia todo processopesado - apesar de outra thread do processo poder continuar

– O núcleo só associa processospesados a processadores - duasthreads do mesmo processopesado não podem rodar emprocessadores diferentes

Page 177: Sistemas_Operacionais_Parte4

177

Threads a nível de núcleo -Kernel-Level Threads (KLT)

Gerência de threads feita no núcleo

ao invés de uma biblioteca de threads -> interface (chamadas) para facilidades de threads

núcleo mantém informação de contexto para threads e processospesados

chaveamento entre threads envolve o núcleo

escalonamento baseado emthreads

Ex: Windows NT and OS/2

Page 178: Sistemas_Operacionais_Parte4

178

Vantagens e desvantagens de thread no núcleo

Vantagens– núcleo pode escalonar

simultaneamente váriasthreads do mesmoprocesso pesado emdiferentes processadores

– bloqueio a nível de thread e não todo processopesado

– rotinas do SO podem ser também multithreaded

Desvantagens– chaveamento de threads

dentro do mesmoprocesso pesadoenvolve o núcleo

– impacto significante

Page 179: Sistemas_Operacionais_Parte4

179

Abordagem combinadaCriação de thread no modousuário

escalonamento e sincronização no modousuário

programador pode ajustarnúmero de threads a nívelde núcleo

combinar melhor das abordagens

Exemplo: Solaris

Page 180: Sistemas_Operacionais_Parte4

180

SolarisThreads a nível de usuário - User-level threads – invisíveis ao SO– são a interface de programação– uso de biblioteca

Threads do núcleo– a unidade que pode ser despachada em um

processador e suas estruturas mantidas pelo núcleo

Processos leves: Lightweight processes (LWP)– cada LWP suporta uma ou mais treads do usuário

(ULT) e mapeia para exatamente uma thread a nívelde núcleo (KLT)

– LWP são visíveis pela aplicação

Page 181: Sistemas_Operacionais_Parte4

181

Processo 2 é equivalente a abordagem ULT Processo 4 is equivalente a abordagem KLT

Page 182: Sistemas_Operacionais_Parte4

182

SolarisVárias Threads em um LWP– > ULT

Uma thread por LWP– -> KLT

Várias threads em várias LWPs– criação, escalonamento e sincronização de threads a nível

de usuário

– número de LWPs conforme aplicação

– threads podem executar em paralelo em diferentes CPUs

– chamada de sistema bloqueante não pára toda task

Page 183: Sistemas_Operacionais_Parte4

183

SolarisVárias Threads em um LWP– > ULT

Uma thread por LWP– -> KLT

Várias threads em várias LWPs– criação, escalonamento e sincronização de threads a nível

de usuário

– número de LWPs conforme aplicação

– threads podem executar em paralelo em diferentes CPUs

– chamada de sistema bloqueante não pára toda task

Page 184: Sistemas_Operacionais_Parte4

184

Solaris: user-level thread states

(attached to a LWP)

Page 185: Sistemas_Operacionais_Parte4

185

Solaris: Lightweight Process States

LWP states are independent of ULT states(except for bound ULTs)

Page 186: Sistemas_Operacionais_Parte4

186

Programação Concorrente

Exemplos de programas concorrentesparbegin

R := max(a, b);S := max(c,d);

parend;% nenhuma variável compartilhada pelos dois processos, independentes

Page 187: Sistemas_Operacionais_Parte4

187

Programação Concorrente

Exemplos de programas concorrentes(cont.)j := 10;parbegin

print j;j := 20;

parend;» j é compartilhada pelos 2 processos; dependentes

» qual o valor impresso por print j? 10 ou 20?

“indeterminado”

Page 188: Sistemas_Operacionais_Parte4

188

#include <thread.h>thread_t tid1,tid2;int a ;void * p0 (){int i ;for(i=0; i<1000000; i++)

{a = a + 2 ;

}}void * p1 (){ int i ;

for (i=0; i<1000000; i++) {a = a + 5 ;

}}main(){int result ;result=thr_create(NULL,0, p0,NULL,THR_NEW_LWP,&tid1);result=thr_create(NULL,0, p1,NULL,THR_NEW_LWP,&tid2);thr_join((thread_t)0,NULL,NULL);thr_join((thread_t)0,NULL,NULL);

}

Page 189: Sistemas_Operacionais_Parte4

189

Seção crítica

Produtor-consumidor com buffer limitado

int buffer [n] ;int i=0, j=0 ; int k ;

parbeginprodutor::

repeat“ produz um novo elemento k”while (( i + 1) mod n = j) do {} % buffer cheiobufffer[i] := k ;i = i + 1 mod n ; % uso circular do buffer

until false; % loop infinito

Page 190: Sistemas_Operacionais_Parte4

190

Seção crítica

Produtor-consumidor com buffer limitado(cont.)

consumidor:

repeatwhile i = j do {} ; % buffer vazio

y =buffer[j];j = j + 1 mod n;...“consome o item em y”

until false;parend

Page 191: Sistemas_Operacionais_Parte4

191

Seção crítica

Produtor/consumidor com lista encadeada

type ITEM = ...BUFFER = record

INFO: ITEM;NEXT: pointer para buffer

var P: pointer para buffer;C: pointer para buffer;FIRST: pointer para bufferNETXP, NEXTC: ITEM;

Page 192: Sistemas_Operacionais_Parte4

192

parbeginPRODUCER::

new(P);P.INFO := NEXTP;P.NEXT := FIRST;FIRST := P;

end;CONSUMER::

while FIRST = NILL do skip;C := FIRST;FIRST := FIRST.NEXT;NEXTC := C.INFO;DISPOSE(C);

end;parend;

Page 193: Sistemas_Operacionais_Parte4

193

Dada a situação acima e a seqüência de passos abaixoCONSUMER: C := FIRST => C = 4PRODUCER: P.NEXT := FIRST => P.NEXT = 4PRODUCER: FIRST := P => FIRST = 5CONSUMER: FIRST : = FIRST.NEXT => FIRST = 4

– estado final:

» o elemento adicionado (5) foi perdido

» C e FIRST estão com o mesmo valor

» FIRST aponta para elemento consumido

FIRST = ^4

44 3 2 1

5

Page 194: Sistemas_Operacionais_Parte4

194

Seção Crítica de Código

Causa do problema:acesso “simultâneo” à lista por PRODUCER e

CONSUMER

Código de acesso é uma

SEÇÃO CRÍTICA (SC)

Solução: execução da SC de forma mutuamente exclusiva

Page 195: Sistemas_Operacionais_Parte4

195

Seção Crítica de Código

Definição geral do problema da seção crítica

– sistema com N processos, N > 1

– cada processo pode ter um código próprio

– os processos compartilham dados variáveis, de qualquer tipo

– cada processo possui SC’s, onde atualizam os dados compartilhados

– a execução de 1 SC deve ser de forma mutuamente exclusiva no tempo

Page 196: Sistemas_Operacionais_Parte4

196

Seção Crítica de Código

Forma da solução: protocolo de entrada e saída na SC

entry-sectioncódigo-seção-crítica

exit-section

– entry-section: garante que somente 1 processo executa SC

– exit-section: permite que outro processo entre na SC

Page 197: Sistemas_Operacionais_Parte4

197

Seção Crítica de Código

Requisitos para solução do problema da SC– prover exclusão mútua

– progresso» processos fora da SC não devem bloquear outros

processos

» somente os processos querendo entrar na SC devem participar da seleção do próximo a entrar

» a seleção não deve ser postergada indefinidamente

Page 198: Sistemas_Operacionais_Parte4

198

Seção Crítica de Código

Requisitos para solução do problema da SC(cont.)

– espera limitada» um processo espera um tempo limitado na entry-

section

– velocidades indeterminadas» não se faz suposições sobre a velocidade relativa

dos processos

Page 199: Sistemas_Operacionais_Parte4

199

Soluções por SW para 2 processos – algoritmo 1

varTURNO: integer; % variável compartilhada; 0 ou 1EU, OUTRO: integer; % constantes locais, com valores opostos (0,1 e 1,0)

repeatwhile TURNO ≠ EU do skip; % mutexbegin

código-da-seção-crítica;TURNO := OUTRO % mutexend

resto-do-código;

until false;

– resolve ?

Page 200: Sistemas_Operacionais_Parte4

200

#include <thread.h>thread_t tid1,tid2;int turn = 0 ;int shared ;

void * p0 (){int i ;for(i=0; i<10; i++)

{while(turn != 1 ) {} /* entra se turn = 1 */shared =shared + 50 ;printf("Thread1: INCREMENTEI \n");turn = 0 ;

}}void * p1 (){ int i ;

for (i=0; i<10; i++) {while(turn != 0 ) {} /* entra se turn = 0 */printf("Thread2: SHARED: %d \n",shared);turn = 1 ;

}}main(){

int result ;result=thr_create(NULL,0, p0,NULL,THR_NEW_LWP,&tid1);result=thr_create(NULL,0, p1,NULL,THR_NEW_LWP,&tid2);thr_join((thread_t)0,NULL,NULL);thr_join((thread_t)0,NULL,NULL);

}

Page 201: Sistemas_Operacionais_Parte4

201

Soluções por SW para 2 processos – algoritmo 2

varvar flag[0..1] of boolean % variável compartilhada, inicializado com false

repeat

while flag[j] do skip; % mutexbeginflag[i] := true ;

código-da-seção-crítica

flag[i] := false % mutexend

resto-do-código;

until false;

– resolve ?

Page 202: Sistemas_Operacionais_Parte4

202

#include <thread.h>thread_t tid1,tid2;int shared ; int flag [2];

void * p0(){int i ;for(i=0; i<1000000; i++){

while(flag [1] == 1 ) {} /* entra se flag [1] = 0 */flag[0] = 1 ;shared =shared + 5 ;flag [0] = 0 ; }

}void * p1(){ int i ;for (i=0; i<1000000; i++) {

while(flag [0] == 1 ) {} /* entra se flag [0] = 0 */flag [1] = 1 ;shared = shared + 2 ;flag [1] = 0 ;}

}main(){int result ;shared = 0 ; flag [0] = 0 ; flag [1] = 0 ;result=thr_create(NULL,0,p0,NULL,THR_NEW_LWP,&tid1);result=thr_create(NULL,0,p1,NULL,THR_NEW_LWP,&tid2);thr_join((thread_t)0,NULL,NULL); thr_join((thread_t)0,NULL,NULL);printf(“O valor de shared e : %d\n”, shared) ;

}

Page 203: Sistemas_Operacionais_Parte4

203

Soluções por SW para 2 processos – algoritmo 3

varvar flag[0..1] % variável compartilhada, inicializado com false

repeat

flag[i] := true ;

while flag[j] do skip; % mutexbegincódigo-da-seção-crítica;

flag[i] := false % mutexend

resto-do-código;

until false;

– resolve ?

Page 204: Sistemas_Operacionais_Parte4

204

Soluções por SW para 2 processos – algoritmo 3

varvar flag[0..1] % variável compartilhada, inicializado com false

repeat

flag[i] := true ;

while flag[j] do skip; % mutexbegincódigo-da-seção-crítica;

flag[i] := false % mutexend

resto-do-código;

until false;

– propriedades

» satisfaz exclusão mútua

» não satisfaz requisito PROGRESSO;T0: P0 faz flag[0] = true

T1: P1 faz flag[1] = true =====> P0 e P1 ficam em um loop eterno

Page 205: Sistemas_Operacionais_Parte4

205

#include <thread.h>#thread_t tid1,tid2;int shared ;int flag [2];void * p0(){

int i ;for(i=0; i<1000000; i++) {

flag[0] = 1 ;printf("Thread0%d\n", shared) ;while(flag [1] == 1 ) {} /* entra se flag [1] = 0 */shared =shared + 5 ;flag [0] = 0 ;

}}void * p1(){

int i ;for (i=0; i<1000000; i++){

flag [1] = 1 ;printf("Thread1%d\n", shared) ;while(flag [0] == 1 ) {} /* entra se flag [0] [0] = 0 */shared = shared + 2 ;flag [1] = 0 ;

}}main(){

int result;shared = 0 ; flag [0] = 0 ;flag [1] = 0 ;result=thr_create(NULL,0,p0,NULL,THR_NEW_LWP,&tid1);result=thr_create(NULL,0,p1,NULL,THR_NEW_LWP,&tid2);thr_join((thread_t)0,NULL,NULL); thr_join((thread_t)0,NULL,NULL);printf(“O valor de shared e %d\n", shared) ;

}

Page 206: Sistemas_Operacionais_Parte4

206

Soluções por SW para 2 processos – algoritmo de Peterson

var flag[0..1] of boolean; % variável compartilhada, inicializada com falsevar turn of integer;repeat

flag[i] := true ;

turn := j ;

while flag[j] and turn = j do nop; % mutexbegincódigo-da-seção-crítica;

flag[i] := false; % mutexend

resto-do-código;

until false;

– resolve ?

Page 207: Sistemas_Operacionais_Parte4

207

Soluções por SW para 2 processos – algoritmo de Peterson

var flag[0..1] of boolean; % variável compartilhada, inicializada com falsevar turn of integer;repead

flag[i] := true ;

turn := j ;

while flag[j] and turn = j do nop; % mutexbegincódigo-da-seção-crítica;

flag[i] := false; % mutexend

resto-do-código;

until false;

– propriedades

» satisfaz exclusão mútua

» satisfaz a condição de progresso

» Satisfaz a condição de espera limitada

Page 208: Sistemas_Operacionais_Parte4

208

#include <thread.h>thread_t tid1,tid2;int turn ; int shared ; int flag [2];void * p0(){

int i ;printf("Thread P0\n");for(i=0; i<10000; i++){

flag[0] = 1 ;turn = 0 ;while(flag [1]==1 && turn == 0 ) /* entra se flag[1]=0 ou turn=0 */shared =shared + 5 ;flag [0] = 0 ;}

}void * p1(){

int i ;printf("Thread P1\n");for (i=0;i<10000; i++) {

flag[1] = 1 ;turn = 1 ;while(flag [0]==1 && turn == 1) /* entra se flag[0]=0 ou turn =1*/shared =shared + 2 ;flag [1] = 0 ;}

}main(){

int result,i ; shared = 0 ; turn = 0 ;flag [0] = 0 ; flag [1] = 0 ;result=thr_create(NULL,0,p0,NULL,THR_NEW_LWP,&tid1);result=thr_create(NULL,0,p1,NULL,THR_NEW_LWP,&tid2);thr_join((thread_t)0,NULL,NULL);thr_join((thread_t)0,NULL,NULL);printf(" O valor de shared e: %d\n", shared) ;

}

Page 209: Sistemas_Operacionais_Parte4

209

Soluções por SW para 2 processos – algoritmo de Dekker

var flag[0..1] of boolean; % variável compartilhada, inicializada com falsevar turn of integer; repeat

flag[j] := true ;

turn := j ;

repeat nop until not(flag[j]) or turn = i do nop; % mutexbegincódigo-da-seção-crítica

flag[i] := false; % mutexend

resto-do-código;

until false;

propriedades

» satisfaz exclusão mútua

» satisfaz a condição de progresso

» Satisfaz a condição de espera limitada

Page 210: Sistemas_Operacionais_Parte4

210

Soluções por SW para N processos – algoritmo da padaria

» na entrada da padaria, cliente recebe número

» cliente com menor número é servido

» clientes podem receber mesmo númeronúmero de processo menor tem preferência

Page 211: Sistemas_Operacionais_Parte4

211

Soluções por SW para N processos – algoritmo da padaria: variáveis compartilhadas

var choosing: array [0..n-1] of boolean;

number: array [0..n-1] of integer;

– algoritmo da padaria: estrutura do processo Pirepeat

choosing[i]:= true;

number[i]:= max(number[0], number[1], ..., number[n-1])+1;

choosing[i]:=false;

for j:=0 to n-1

do begin

while choosing[j] do skip;

while (number[j] ≠ 0) and (number[j],j)<(number[i],i) do skip;

end;

código-da-seção-crítica

number[i] = 0;

resto-do-código;

until false;(a,j)<(b,i) if a<b or a=b and j<i

Page 212: Sistemas_Operacionais_Parte4

212

Soluções de Hardware – Instruções Especiais

» TAS: Testa e modifica o conteúdo de uma variável de forma não interrompível

» Swap: Troca o conteúdo de duas variáveis de forma não interrompível

Page 213: Sistemas_Operacionais_Parte4

213

Soluções de Hardware - tas

int lock = 0; % globalint tas (){

r = lock ;

lock = 1 ;

return (r) ;

}

Page 214: Sistemas_Operacionais_Parte4

214

Soluções de Hardware - tas

pi() {

for(;;) {

while(tas(lock)) {}

“seção crítica”

lock = 0 ;

}

}

Page 215: Sistemas_Operacionais_Parte4

215

Soluções de Hardware - swap

int lock = 0; % global inicializada com falseswap (lock, key){

int r ;

r = lock ;

lock = key ;

key = r ;

}

Page 216: Sistemas_Operacionais_Parte4

216

Soluções de Hardware - swappi() {

int key = 1 ;for(;;) {

repeat swap(lock, key) ;

until key = false ; “seção crítica”

lock = 0 ;}

}

Page 217: Sistemas_Operacionais_Parte4

217

Soluções de Hardware - possível implementação

– Instruções especiais disponíveis no modo supervisor

– Uso correto das instruções» oferecer enter_region e exit_region

– tsl: Testa e modifica o conteúdo de uma variável de forma não interrompível

– Swap: Troca o conteúdo de duas variáveis de forma não interrompível

Page 218: Sistemas_Operacionais_Parte4

218

Soluções de Hardware - tasint lock = 0; % globalenter_region (){

/* implementada como chamada de sistema (salva contexto, entra no modo supervisor) */

L: tsl register, #lock /* copia o valor de lock para register

seta valor do lock - atomicamente */

cmp register, #0 /* compara com 0 */jne L /* se não for 0 a SC está ocupada, loop */

ret}

Page 219: Sistemas_Operacionais_Parte4

219

Soluções de Hardware - tasleave_region (){

move lock, #0 /* atribui 0 a variável lock - libera a SC */

ret

}

Page 220: Sistemas_Operacionais_Parte4

220

Soluções de Hardware – tslpi() {

for(;;) {enter_region() ;

“seção crítica”leave_region() ;}

}

Page 221: Sistemas_Operacionais_Parte4

221

Soluções de Hardware - swapint lock = 0; % global inicializada com falseenter_region() {

/* implementada como chamada de sistema (salva contexto, entra no modo supervisor) */

L: swap #lock, #key /* troca o conteúdo de lock e key -atomicamente */

cmp #key, 0 /* compara o conteúdo de key com 0 */

jne L /* se for 0 a SC está ocupada, loop */

rte}

Page 222: Sistemas_Operacionais_Parte4

222

Soluções de Hardware - swap

leave_region() {

move #lock, 0 /* libera a SC */

rte

}

Page 223: Sistemas_Operacionais_Parte4

223

Soluções de Hardware – swap

pi() {for(;;) {

int key = 1 ;

enter_region() ;

“seção crítica”

leave_region() ;

}

}

Page 224: Sistemas_Operacionais_Parte4

224

Semáforos

Dijkstra - 1965– Um semáforo s é uma estrutura de dados,

formada por um contador e um apontador para uma fila de processos bloqueados no semáforo

– Somente pode ser acessado por duas operações atômicas (P e V)

– As modificações no valor do semáforo são executadas atomicamente

Page 225: Sistemas_Operacionais_Parte4

225

Semáforos

Cont.– Se dois processos tentam, simultaneamente,

executar P(s) ou V(s), essas operações irão ser executadas seqüencialmente, em uma ordem arbitrária

– Semáforos podem ser usados para exclusão mútua com n processos, quando inicializados com o valor 1

Page 226: Sistemas_Operacionais_Parte4

226

Semáforos

Cada processo Pi

repeat

P(mutex) ;

“seção crítica”

V(mutex)

“seção não crítica”

until false ;

Page 227: Sistemas_Operacionais_Parte4

227

Semáforos

Uso de Semáforos para sincronizar processos – Ex.: p1: comando s1; p2: comando s2

– Condição: somente executar s2 depois de s1 ter terminado

semaphore sync = 0 ;

processo p1 processo p2

--- ---

s1 ; P(sync) ;

V(sync) ; ---

Page 228: Sistemas_Operacionais_Parte4

228

Semáforos

Implementação

P(s): s.value = s.value - 1 ;

if (s.value < 0 ) {

“adicionar o processo na lista s.l”block(p) ; /*bloqueia o processo p*/

}

V(s): s.value = s.value + 1 ; if (s.value < =0 ) {

“remover o processo “p” da lista s.l”

wakeup(p) ; /*acorda o processo p*/}

Page 229: Sistemas_Operacionais_Parte4

229

Semáforos

Problema clássico: buffer limitado– conjunto de “n”buffers”

– cada buffer com capacidade para um ítem

– semáforos usados:

» mutex: para exclusão mútua

» empty: contador do número de buffers vazios

» full: contador do número de buffers cheios

Int buffer [20] ;

semaphore mutex, empty, full ;

info info-p, info-c ;

full = 0 ; empty = 20 ; mutex = 1 ;

Page 230: Sistemas_Operacionais_Parte4

230

main() {

parbegin{

produtor: repeat

“produz um ítem”

info-p = item ;

p(empty) ;

p(mutex) ;

“adicionar info-p ao buffer”

v(mutex) ;

v(full) ;

until false ;

consumidor: repeat

p(full) ;

p(mutex) ;

“remover o item para info-c”

v(mutex) ;

v(empty) ;

until false ;

}

}

Page 231: Sistemas_Operacionais_Parte4

231

Programação com threads no Solaris

Thr-create ( void* stack-base, size-t stack-size,void * start-newtime, void * arg,long flajs, thread-t * new-thread);

thr-join (thread-t wait-for, thread-t* deported,void ** status) ;

thr-self ( );retorna a identificação da thread criada

Page 232: Sistemas_Operacionais_Parte4

232

Semáforos

OperaçõesSema-init ( sema-t * sp, unsigned int count, int type, void * arq);

sp: identificador do semáforocount: valor a ser atribuído ao semáforo type:

usync_process: sincronizar threads neste e em outros processosusync_threads- sincronizar threads neste processo

arq: sem uso

sema-wait ( sema-t * sp );sema-post (sema-t * sp);sema-trywait (sema-t * sp );sema-destroy (sema-t * sp);

Page 233: Sistemas_Operacionais_Parte4

233

Exemplo de programa* include < thread.h >thread_t th0, th1;void * t0 ( );void * t1 ( );main ( ) {

int r, I ;thr-create ( null, 0, t0, NULL, THR_NEW_LWP, &th0);thr-create ( null, 0, t1, NULL, THR_NEW_LWP, &th0);thr_join [( thread_t ) 0, null, null);thr_join [( thread_t ) 0, null, null);printf(“ eu sou o main\ m”);}

Page 234: Sistemas_Operacionais_Parte4

234

Void * t0 ( ){int k = 0;for (;; )

{print f (“thread: % d % d \ m”, thr_self ( ), K );k ++ ;

}}

void * t1 () {int k = 0 ;for (;;)

{print (“thread: % d % d \ m” , thr_self ( ), K );k ++ ;}

}

Page 235: Sistemas_Operacionais_Parte4

235

Exemplo de programa* include < thread.h >thread-t t0, t1 ;void * thread-0 ( );void * thread-1 ( );int k = 0;

main ( ) {int r, f;r = thr_create ( null,0, thread0, NULL, THR_NEW_LWP, &t0 );r = thr_create ( null, 0, thread1, NULL, THR_NEW_LWP, &t1 );thr_join [(thread-t ) 0, null, null );thr-_oin [( thread-t ) 0, null, null );print f ( “eu sou o main \n “ );}

Page 236: Sistemas_Operacionais_Parte4

236

Exemplo de programa

Void * thread-0 ( ) {for (;; ) {

k = k + s;}

}void * thread-1 ( ) {

for ( ;; ) {print + ( “valor de k = %d\n”, k );}

}

Page 237: Sistemas_Operacionais_Parte4

237

Exercício

Escrever um programa que define e inicializa, com valores quaisquer, duas matrizes. A seguir, cria duasthreads, th0 e th1, para identificar e imprimir o maior elemento de cadauma das matrizes. Th0 opera sobre a matriz m0 e th1 opera sobre a matrizm1.

Page 238: Sistemas_Operacionais_Parte4

PTHREADS

Page 239: Sistemas_Operacionais_Parte4

Regiões Críticas (pthreads )

pthread_create(&th, NULL, proc, &args) ;pthread_exit(void *value_ptr) ;pthread_join(pthread_t thr, void **ptr) ;pthread_mutex_t mutex1;pthread_mutex_init(&mutex1, NULL) ;pthread_mutex_lock(mutex1) ;pthread_mutex_unlock(mutex) ;

Page 240: Sistemas_Operacionais_Parte4

Variáveis condição (pthreads )

pthread_cond_t cond1;

pthread_cond_init(&cond1, NULL) ;

pthread_cond_wait(&cond1, &mutex1) ;

pthread_cond_timewait(&cond1, &mutex1, time) ;

pthread_cond_signal(&cond1) ;

pthread_cond_broadcast(&cond1) ;

Page 241: Sistemas_Operacionais_Parte4

Variáveis condição (pthreads )

EX.

pthread_mutex_lock(&my_lock);

while(not condition)

pthread_cond_wait(&w, &my_lock);

“executar comandos”

pthread_mutex_unlock(&my_lock);

Page 242: Sistemas_Operacionais_Parte4

Variáveis condição (pthreads )

EX.

pthread_mutex_lock(&my_lock);

“executar comandos”

pthread_cond_signal(&w);

pthread_mutex_unlock(&my_lock);

Page 243: Sistemas_Operacionais_Parte4

Regiões CríticasRegiões Críticas CondicionaisMonitores

Construções de Alto Nível

( Brinch Hansen, Hoare ) 72 - 74

Page 244: Sistemas_Operacionais_Parte4

Regiões Críticas ( 72 )Uso de Semáforos:

Type semaphore = 0;p ( mutex );

secão críticav ( mutex );

Type semaphore = 1;p ( mutex );

secão críticap ( mutex );

Type semaphore = 1;v ( mutex );secão crítica.P ( mutex );

Page 245: Sistemas_Operacionais_Parte4

Regiões Críticas ( 72 )Variável V:– Somente pode ser acessada dentro de

um comando region– garante exclusão mútua

Varshared T V;

po() { po() {

region V do s0; region V do s1;} }

Page 246: Sistemas_Operacionais_Parte4

Regiões Críticas ( 72 )

Exemplo de Região Crítica:– Var free: shared array [ 1..N ] of

Boolean;Procedure acquire ( var index: integer )

Beginregion free do

for index: = 1 to N doif ( free[ index ] then

beginfree[ index]: = false;

exit ;end ;

index: = -1 ;end;

Page 247: Sistemas_Operacionais_Parte4

Regiões Críticas ( 72 )Implementação da Região Crítica com Semáforos:– para cada declaração: var shared T V

;» o compilador gera um semáforo

– para cada comando Region v do S ;» o código gerado pelo compilador é o

seguinte:

P ( mutex );S ;

V ( mutex );

Page 248: Sistemas_Operacionais_Parte4

Regiões Críticas ( 72 )

Alinhamento de Regiões Críticas:– P0: region x do region y do s1;– P1: region y do region x do s2;

Deadlock

Page 249: Sistemas_Operacionais_Parte4

Região Crítica Condicional (Hoare) 72

Region V when b do S;– b: expressão booleana avaliada quando o

processo entra na região crítica.– Se b é verdadeira, o comando S é executado– senão:

» o processo libera a exclusão mútua e é suspenso até que a expressão booleana se torne verdadeira

Page 250: Sistemas_Operacionais_Parte4

Exemplo de Programa Usando Região Crítica Condicional:Var

buffer = shared recordelemento: array [ 0…N] integercount, in, out : integer;

end;Produtor:

region buffer when count < N dobegin

elemento [ in ]: = inf;in: = in + 1 mod N;count: = count + 1;

end;

Consumidor:region buffer when count > 0 do

begininf: = elemento [out ];out: = out + 1 mod N;

. Count : = count -1 ;end;

Page 251: Sistemas_Operacionais_Parte4

Região Crítica Condicional (Hoare) 72

Operação Await ( exb ):– permite a um processo se bloquear

dentro de uma região crítica a espera de uma condição

Region V do beginS1;

await ( b );S2 ;

end ;

Page 252: Sistemas_Operacionais_Parte4

Implementação de Região Crítica Condicional com Semáforos:

Var mutex, wait: semaphore;count, temp: intefer;P ( mutex );

if ( not b ) then {count : = count + 1 ;V ( mutex ) ;P ( wait ) ;while ( not b ) do {temp: = temp + 1 ;if ( temp < count ) then

V ( wait ) ;else

V ( mutex ):P ( wait ) ;}

count : = count - 1 ;}

“comandos”

if ( count > 0 ) then {temp : = 0 ;

V ( wait ) ;}

elseV ( mutex ) ;

Page 253: Sistemas_Operacionais_Parte4

Monitor( Brinch Hansen, Hoare ) 73, 74

– É um modelo que permite o compartilhamento de dados

– possui valores que representam o estado do objeto e as procedures que manipulam os valores

– as procedures são executadas de forma mutuamente exclusiva

– variáveis especiais ( condição ) permitem a um processo se bloquear a espera de uma condição (wait)

– a condição é sinalizada por um outro processo (operação signal)

Page 254: Sistemas_Operacionais_Parte4

Monitor( Brinch Hansen, Hoare ) 73, 74

Visão Esquemática de um Monitor:

Dadoscompartilhados

Código de inicialização

operações

Filas deentrada

Page 255: Sistemas_Operacionais_Parte4

Monitor( Brinch Hansen, Hoare ) 73, 74

Variáveis Condição:– ex.: var x, y : condition ;– x.wait:

» o processo que executa essa operação é suspenso até que um outro processo execute a operação x.signal

– x.signal:» acorda um único processo » se não existem processos bloqueados, a operação

não produz efeitos

Page 256: Sistemas_Operacionais_Parte4

Monitor( Brinch Hansen, Hoare ) 73, 74

Se a operação x.signal é executada por um processo P0 e existe um processo P1 bloqueado, P0 e P1 podem executarse P1 é acordado, P0 e P1 ficam ativos simultaneamente no monitorPossibilidades:– a) P0 acorda P1 e espera que P1 libere o

monitor, ou se bloqueia a espera de outra condição

– b) P1 espera que P0 libere o monitor, ou espera por outra condição

Brinch Hansen (Pascal Concorrente):– P0 executa signal e libera o monitor ( o signal

é a última instrução da procedure )

Page 257: Sistemas_Operacionais_Parte4

Monitor( Brinch Hansen, Hoare ) 73, 74

Programa Pascal Concorrente:type resource = monitor

varfree : boolean ;

x : queue ;procedure entry request ;

beginif not free themdelay ( x ) ;

free : = false ;end

procedure entry release ;begin

free : = true ;continue ( x ) ;

endbegin

ree : = true;end.

Page 258: Sistemas_Operacionais_Parte4

Programa Pascal Concorrente:Type user = process ( r = resource );begin

r.request ;……

r.release ;end;

Type user1 = process ( r = resource );begin

r.request ;……

r.release ;end;

Beginvar

p0 : user ;p1 : user1 ;m : resource ;

init po ( m ) ;init p1 ( m ) ;

end.

Page 259: Sistemas_Operacionais_Parte4

Monitor( Brinch Hansen, Hoare ) 73, 74

Implementação de Semáforo:Type semaphore = monitor ;

var busy = boolean ;nonbusy : condition ;

procedure entry Pbegin

if busy than nonbusy.wait ;

busy = free ;end;

Procedure entry Vbegin

busy = false ;nonbusy.signal ;

end ;begin

busy = false ;end.

Page 260: Sistemas_Operacionais_Parte4

Monitor( Brinch Hansen, Hoare ) 73, 74

Implementação de Semáforo n bin:Type semaphore = monitor ;

var nproc = int ;non_busy : condition ;

procedure entry Pbegin

nproc--;if nproc<0 then

non_busy.wait ;end;

Procedure entry Vbegin

nproc++;non_busy.signal ;

end ;procedure semaInit(int I)begin

nproc = i;end.

Page 261: Sistemas_Operacionais_Parte4

Monitor( Brinch Hansen, Hoare ) 73, 74

Solução para o Problema dos Filósofos:

Type philosophers = monitorvar

state : array [ 0…4 ] of ( thinking, hungry, eating ) ;self : array [ 0…4 ] of condition ;

procedure entry pickup ( I = 0…4 )begin

state [ 1 ] = hungry ;test ( I ) ;if state [ I ] =/ eating them self [I ]. Wait ;

end ;procedure entry putdown ( I : 0…4 )

begin state [ I ] = thinking ;test ( I-1 mod5 ) ;test ( I + 1 mod5 ) ;

end;

Page 262: Sistemas_Operacionais_Parte4

Monitor( Brinch Hansen, Hoare ) 73, 74

Solução para o Problema dos Filósofos:

Procedure test ( k : 0…4 )begin

if ( state [ k-1 mod5 ] =! eatingand state [ k ] = hungryand state [ k + 1 mod 5 ] =! eating ) thembegin

state [ k ] = eating ;self [ k ] . Signal ;

end ;end ;

begin for I = 0 to 4 do

state [ I ] = thinking ;end.

Page 263: Sistemas_Operacionais_Parte4

Implementação de Monitor com Semáforo:– cada monitor é representado por um semáforo mutex

inicializado com 1. P( mutex ): entrar no monitor V ( mutex ): liberar monitor

– semáforo next inicializado com 0 para um processo sinalizador se bloquear

– next count : contém o No. de processos bloqueados em next

Monitor( Brinch Hansen, Hoare ) 73, 74

P ( mutex ) ;“ corpo da procedure entry”

if next-count > 0 themv ( next ) ;

elseV ( mutex ) ;

Page 264: Sistemas_Operacionais_Parte4

Monitor( Brinch Hansen, Hoare ) 73, 74

– Para cada variável condition, associar um semáforo x-sem e uma variável inteira x-count

X.wait : x-count = x.count + 1 ;if next-count > 0 them

V ( next ) ;else

V ( monitor ) ;P ( x-sem ) ;x-count = x-count-1 ;

X.signal : if x-count > 0 thembegin

next-count = next-count + 1 ;V ( x-sem ) ;P ( next ) ;next-count = next-count - 1 ;

end ;

Page 265: Sistemas_Operacionais_Parte4

265

Software de entrada esaída

Page 266: Sistemas_Operacionais_Parte4

266

Software E/S

Uma das principais funções do SO é controlar os dispositivos de E/S– Para isso deve:

» emitir comandos para os dispositivos

» tratar interrupções

» tratar erros

» prover uma interface entre os dispositivos e o resto do sistema

Page 267: Sistemas_Operacionais_Parte4

267

Software E/S

Estruturação do software de E/S– quatro níveis

» tratamento de interrupções

» drivers dos dispositivos

» software do SO independente do dispositivo

» software ao nível do usuário

Page 268: Sistemas_Operacionais_Parte4

268

Software E/S

Tratamento de interrupções– quando uma interrupção ocorre, uma procedure

específica é ativada de modo a desbloquear o driver

– o efeito de uma interrupção é que um processo que estava previamente bloqueado está agora apto a rodar

Page 269: Sistemas_Operacionais_Parte4

269

Software E/S

Drivers dos dispositivos– todo código dependente do dispositivo está em

um driver do dispositivo

– o trabalho do driver é aceitar requisições e providenciar para que sejam executadas

– se o driver esta disponível, a requisição é processada imediatamente, caso contrário, entrará em uma fila de requisições

Page 270: Sistemas_Operacionais_Parte4

270

Software E/S

Execução de uma requisição para um disco– determinar o posicionamento do braço no

cilindro próprio

– determinar as operações que são requeridas:» Ex. leitura, escrita, etc.

– escrever as operações nos registradores do controlador

Page 271: Sistemas_Operacionais_Parte4

271

Software E/SSoftware independente do dispositivo– Funções básicas

» desenvolver as funções de E/S que são independentes do dispositivo

» prover interface uniforme para o nível usuário

– Funções:» mapeamento do nome simbólico no driver apropriado

» interface uniforme para os drivers

» identificação dos dispositivos

» prover tamanho de bloco independente do dispositivo

» etc.

Page 272: Sistemas_Operacionais_Parte4

272

Software E/S

Software à nível do usuário– Rotinas de biblioteca

» read

» write

» open

» close

» etc.

Page 273: Sistemas_Operacionais_Parte4

273

Software E/S

Processos dousuário

Software independentedo dispositivo

Tratamento de interrupções

Hardware

Níveis lógicos de um sistema de entrada e saída

Page 274: Sistemas_Operacionais_Parte4

274

Software E/S

Exemplo de requisição para um dispositivo blocado– Tipo: operação

– dispositivo: menor número

– posição: endereço do dispositivo

– número de processo: requisitante da e/s

– endereço: do processo requisitante

– contador: bytes a transferir

Resposta– número do processo: requisitante

– status: bytes transferidos ou erro

Page 275: Sistemas_Operacionais_Parte4

275

Software E/SEstrutura principal de um driver

message msg; /* buffer de msg */

IO_task (){int r, caller ;initialize ;while (true) {

RECEIVE(any, &msg) ;caller = msg.source ;switch (msg.type) {

case read: r = do_read(); break ;case write: r = do_write()); break;case other: r = do_other(); break; default: r = error;}

}}

Page 276: Sistemas_Operacionais_Parte4

276

Gerência de Memória

Page 277: Sistemas_Operacionais_Parte4

277

Gerência de memória

Memória:» central em sistemas de computador

» CPU e sistema de I/O interagem com a memória

» é um conjunto (array) de bytes ou palavras, cada um com seu próprio endereço

» CPU faz busca e armazenamento na memória

» um programa deve ser carregado na memória para ser executado

Page 278: Sistemas_Operacionais_Parte4

278

Gerência de memória

Memória

CPU memória sistemaI/o

Page 279: Sistemas_Operacionais_Parte4

279

Conceitos Básicos

UCP– é composta de circuitos eletrônicos

– coordena e controla todas as operações do sistema

– é formada por processador e memória» processador:

unidade de controle (UC)

unidade lógica-aritmética (ULA)

» memória unidade de armazenamento de instruções e dados

Page 280: Sistemas_Operacionais_Parte4

280

Unidade aritmética elógica

UCP

Memória

Registradoresespeciais

012345...

N

Representação esquemática da UCP

unidade de controle

Page 281: Sistemas_Operacionais_Parte4

281

Conceitos Básicos

Unidade de controle– controla todas as operações do computador

– é formada por:» registrador de controle

» registrador de instrução

» decodificador

» relógio

» sequenciador

Page 282: Sistemas_Operacionais_Parte4

282

Conceitos Básicos

Registrador de controle (contador de programa - PC)– contém o endereço de memória da próxima

instrução a executar

Registrador de instrução (RI)– contém a instrução que está sendo executada a

cada momento

– cada instrução contém:» código da operação

» operandos ou endereços de memória dos mesmos

Page 283: Sistemas_Operacionais_Parte4

283

Conceitos Básicos

Decodificador– extrai e analisa o código de operação da

instrução que está em execução (que está no RI)

– emite os sinais necessários para a sua execução

Relógio– proporciona uma sucessão de impulsos elétricos

a intervalos constantes que sinalizam os instantes de inicio de execução dos passos que constituem cada instrução

Page 284: Sistemas_Operacionais_Parte4

284

Conceitos Básicos

Sequenciador– gera ordens sincronizadas pelos impulsos do

relógio que fazem com que a instrução carregada no RI seja executada passo a passo

Page 285: Sistemas_Operacionais_Parte4

285

Conceitos Básicos

Memória Principal– é a parte da UCP que armazena instruções e

dados necessários para que um programa seja executado

– é constituída por células ou posições de memória numeradas de forma consecutiva

– é volátil

– permite acesso direto

Page 286: Sistemas_Operacionais_Parte4

286

Conceitos Básicos

Memória Principal (cont.)– palavra de memória: conjunto de células de

memória que podem ser lidas ou escritas de uma só vez

– em geral é endereçada por byte

– possui dois registradores para as operações de leitura e gravação: Registrador de endereço de memória e Registrador intermediário (buffer)

Page 287: Sistemas_Operacionais_Parte4

287

Conceitos Básicos

Memória Principal (cont.)– Registrador de endereço de mémória

» contém o endereço de memória onde se encontra ou onde vai ser gravada a informação (instrução ou dado)

– Registrador Intermediário (buffer)» leitura: recebe a informação da memória

» escrita: contém a informação a ser gravada

– Seletor: seleciona a célula de memória cujo endereço se encontra no registrador de endereços para a transferência (leitura/escrita)

Page 288: Sistemas_Operacionais_Parte4

288

1

2

3

...

...

32

33...

N

Registrador de endereço de memória

Registrador intermediário (buffer)

Seletor Memória principal

Visão esquemática da memória principal de um computador

Page 289: Sistemas_Operacionais_Parte4

289

Conceitos Básicos

Execução de um programa– o programa deve estar na memória

– as instruções são executadas uma a uma

Fases do processamento de uma instrução– Busca

» a instrução é levada da memória para a unidade de controle

– Execução» realização das ações internas contidas na instrução

Page 290: Sistemas_Operacionais_Parte4

290

Conceitos Básicos

» Fase de Busca de uma instrução a unidade de controle (UC) envia uma microordem para que o conteúdo do program counter (PC), seja transferido para o registrador de endereço de memória (MAR)

o seletor transfere o conteúdo do endereço de memória constante no MAR para o registrador intermediário de memória (MBR)

a instrução é transferida do MBR para o registrador de instrução (RI)

o decodificador interpreta a instrução que acaba de chegar no RI

o program counter se auto-incrementa (com o uso da unidade aritmética e lógica)

Page 291: Sistemas_Operacionais_Parte4

291

Conceitos Básicos

Ex. Instrução de três operandos– possui o código da operação e três operandos:

os dois primeiros contém os operandos, e o terceiro o lugar onde será armazenado o resultado da operação.

– EX. ADD a, b, c

operador operando1 operando2 operando3

Page 292: Sistemas_Operacionais_Parte4

292

Conceitos Básicos

» Fase de Execução de uma instrução (com três operandos)

o end. do primeiro operando do RI é transferido para o MAR

o seletor faz a leitura da posição de memória apontada por MAR e deposita seu conteúdo no MBR

esse valor é transferido para o registrador de operando 1 (RO1) da unidade aritmética e lógica

Page 293: Sistemas_Operacionais_Parte4

293

Conceitos Básicos

» Fase de Execução de uma instrução (com três operandos)

o end. do segundo operando é transferido do RI para o MAR

o seletor faz a leitura da posição de memória apontada por MAR e deposita seu conteúdo no MBR

esse valor é transferido para o registrador de operando 2 (RO2) da unidade aritmética e lógica

o sequenciador envia uma micro-ordem para a unidade aritmética e lógica para que seja executada a operação, e o resultado fica armazenado no registrador de resultados (RR)

Page 294: Sistemas_Operacionais_Parte4

294

Conceitos Básicos

» Fase de Execução de uma instrução (com três operandos)

O conteúdo do registrador de resultados (RR) é transferido para o registrador intermediário de memória (MBR)

é transferido do registrador de instrução (RI) para o registrador de endereço de memória (MAR) o endereço de memória onde o resultado deverá ser armazenado

o reultado é transferido do MBR para o endereço constante no registrador de endereço de memória (MAR)

Page 295: Sistemas_Operacionais_Parte4

295

Gerência de memória

Memória física e Memória virtual:– Física:

» é a memória do hardware

» começa geralmente no endereço físico 0 e continua até um endereço qualquer

» certas posições são reservadas pelo hardware para objetivos especiais (ex. vetor de interrupções)

Page 296: Sistemas_Operacionais_Parte4

296

Gerência de memória Memória física e Memória virtual (cont.)– Virtual:

» é a memória que o processo enxerga

» é o espaço virtual de um processo

» o maior endereço virtual é limitado pela arquitetura da máquina (No. de bits usados para endereçar). EX.

PDP-10 (18 bits)==>256 k

PDP-11 (16 bits)==> 64 k

» o espaço virtual pode ser maior que o espaço físico, especialmente se é usada paginação/segmentação

» um processo pode acessar qualquer parte de seu espaço virtual

Page 297: Sistemas_Operacionais_Parte4

297

Gerência de memória

memória física e memória virtual (cont.)– Virtual:

» um processo pode acessar qualquer parte de seu espaço virtual

código

dados

pilha

0

n

Page 298: Sistemas_Operacionais_Parte4

298

Gerência de memória

Tradução de endereço:– processo trata com endereços virtuais

– em todo acesso deve haver uma tradução de endereços

– isto significa que a tradução não deve ser feita por software - desempenho

Page 299: Sistemas_Operacionais_Parte4

299

Gerência de memória

Tradução de endereço (cont.)

memória física

kernel

proc a proc b0 10 k13 k

tradução de endereço

0 19 k

tradução de endereço

0

Page 300: Sistemas_Operacionais_Parte4

300

Gerência de memória

Monoprogramação– existe um único processo na memória em

execução e ao mesmo é permitido usar toda a memória

Multiprogramação– existem vários processos na memória aptos à

executar e um em execução

Page 301: Sistemas_Operacionais_Parte4

301

Gerência de memória

Monoprogramação:– esquema mais simples possível

– um processo por vez na memória

– o processo pode usar toda a memória

– a memória é dividida entre o sistema operacional e o processo do usuário

Page 302: Sistemas_Operacionais_Parte4

302

Gerência de memória

Monoprogramação (cont.)

operatingsystem in Ram

userprogam

operatingsystem inRam

user

program

devicedrivers inRomuserprogramoperatingsystem inRam

Formas de organizar a memória com o sistema operacionale um programa de usuário

Page 303: Sistemas_Operacionais_Parte4

303

Sistemas que suportam Multiprogramação

Proteção de hardware:A. registradores limite0

monitor

usuário 1

usuário 2

usuário 3

usuário 4

limite inferior

limite superior

128 k

limiteinferior

limitesuperior

end sim sim

não não

CPU > < mem.

trap parao sistema operacional

Page 304: Sistemas_Operacionais_Parte4

304

Sistemas que suportam Multiprogramação

Proteção de hardware: (cont.)b: registradores base e limite

CPU

limite base

+< mem.

end sim

não

trap para osistema operacional

mem.

Page 305: Sistemas_Operacionais_Parte4

305

Sistemas que suportam Multiprogramação

Proteção de hardware:– com registradores limite muitos processos

podem residir na memória simultaneamente

– divisão da memória entre os processos (partições fixas, partições variáveis)

Page 306: Sistemas_Operacionais_Parte4

306

Sistemas que suportam Multiprogramação

Partições Fixas– tamanho fixo das partições,

– ex.: memória de 32K, dividida em:

10K - monitor residente04K - processos pequenos06K - processos médios12K - processos grandes

– quando o processo entra no sistema, é colocado emuma fila de processos

Page 307: Sistemas_Operacionais_Parte4

307

Sistemas que suportam Multiprogramação

Partições Fixas (cont.)– o scheduler verifica sua necessidade de

memória, que partições estão disponíveis e carrega o processo em uma das partições

– o grau de multiprogramação é determinado pelo No. de partições

Page 308: Sistemas_Operacionais_Parte4

308

Sistemas que suportam Multiprogração

Partições Fixas: (cont.)– alocação de memória para os processos

» a) classificá-los de acordo com suas necessidades de memória (especificada pelo usuário ou pelo sistema)

» b) cada região tem sua própria fila

2K 1K 2K

3K 4K

7K 11K 8K

f 2

f 6

f 12

......

...............

.......

Page 309: Sistemas_Operacionais_Parte4

309

Sistemas que suportam Multiprogramação

Partições Fixas (cont.)– alocação de memória para os processos

» c) uma única fila

5K 2K 3K 7K 7K .........monitor

2K

6K

12K

Page 310: Sistemas_Operacionais_Parte4

310

Sistemas que suportam Multiprogramação

Fragmentação– interna: tamanho da partição maior que o

tamanho do processo

– externa: partição não usada é menor que o tamanho do processo esperando

Page 311: Sistemas_Operacionais_Parte4

311

Sistemas que suportam Multiprogramação

Partições variáveis – o sistema operacional mantém uma tabela

indicando que partes da memória estão disponíveis e quais estão ocupadas

– inicialmente toda a memória esta disponível, considerada como um bloco único

– quando um processo chega e necessita memória é pesquisado um bloco com tamanho suficiente para contê-lo

Page 312: Sistemas_Operacionais_Parte4

312

Sistemas que suportam Multiprogramação

Partições variáveis (cont.)– quando um processo termina libera sua

memória, que é reincorporada ao conjunto disponível

– características:» existem blocos livres de diferentes tamanhos

» se um bloco é muito grande para um processo, é dividido em dois, um alocado para o processo e o outro retorna para os blocos livres

Page 313: Sistemas_Operacionais_Parte4

313

Sistemas que suportam Multiprogramação

Partições variáveis (cont.)– características:

» quando um processo termina libera a memória, sendo esta colocada no conjunto de blocos livres

» se o bloco liberado é adjacente à outo livre, podem ser agrupados formando um único

– Que bloco alocar?» first-fit: o primeiro com tamanho suficiente

» best-fit: o menor com tamanho suficiente

» worst-fit: o maior

Page 314: Sistemas_Operacionais_Parte4

314

Sistemas que suportam Multiprogramação

O software determina a diferença entre Partições Fixas e Partições Variáveis

dois registradores contém os limites (superior e inferior)

» quando um processo é selecionado, o dispatchercarrega os valores nos registradores

– a utilização de memória é geralmente melhor no mvt que no mft

Page 315: Sistemas_Operacionais_Parte4

315

Sistemas que suportam Multiprogramação

Compactação:– unir os blocos de memórias disponíveis em um

único bloco

– somente possível se o sistema suporta relocação dinâmica, em tempo de execução (registradores base e limite)

Page 316: Sistemas_Operacionais_Parte4

316

Sistemas que movimentam processos entre a memória principal e o disco

Swapping– O esquema de gerência de memória de sistemas

monousuário foi usado por dois dos primeiros sistemas timesharing: CTSS e Q-32

– memória dividida em duas partes:» 1. monitor residente

» 2. processo do usuário sendo executado correntemente

Page 317: Sistemas_Operacionais_Parte4

317

Swapping

Swapping (cont.)– quando o processo executando perde o

processador:» conteúdo da memória do usuário é gravado no disco

» novo processo é lido para a memória

“Swapping”

Page 318: Sistemas_Operacionais_Parte4

318

Swapping

Swapping: (cont.)

monitor

área dousuário

swap outlimite

memória

“swapping”

swap in

Disco

usuário1

usuário2

Page 319: Sistemas_Operacionais_Parte4

319

Swapping

memória auxiliar:– swapping requer memória auxiliar

– normalmente um disco

– deve ser grande o bastante para acomodar cópia de todas as “imagens de memória dos processos dos usuários”

– lista “ready” contém processos que estão em disco e que estão aptos para rodar

Page 320: Sistemas_Operacionais_Parte4

320

Swapping

memória auxiliar: (cont.)– uma variável indica o processo que está em

execução

– quando o scheduling decide executar um processo chama o dispatcher

Dispatcher:– verifica se o processo selecionado está na

memória

Page 321: Sistemas_Operacionais_Parte4

321

Swapping

Dispatcher: (cont.)– se não estiver, faz swap out do processo na

memória

– faz swap in do processo selecionado

– restaura os registradores

– transfere o controle para o processo selecionado

Page 322: Sistemas_Operacionais_Parte4

322

Swapping

Tempo de swap– maior parte do tempo de swap é o tempo de

transferência

– proporcional ao tamanho de memória a ser transferida

Page 323: Sistemas_Operacionais_Parte4

323

Swapping

Tempo de swap: (cont.)– o S.O deve ser informado com exatidão do

tamanho da memória do usuário

– o tempo de transferência diminui com o aumento da velocidade de transferência dos dispositivo

Page 324: Sistemas_Operacionais_Parte4

324

Paginação

Endereço gerado pela CPU contém duas partes:– No. da página: (p)

» endereça uma tabela de páginas

– deslocamento: (d)» combinado com o endereço base da página define o

endereço físico de memória

Page 325: Sistemas_Operacionais_Parte4

325

Tradução de endereço

f dd p

f

endereço físicoendereço lógico

CPU

memóriafísica

Page 326: Sistemas_Operacionais_Parte4

326

Paginação

tradução de endereço:– memória física: dividida em frames

– memória lógica: pages

– um programa para ser executado tem suas pages carregadas em quaisquer framesdisponíveis

– o tamanho da página é definido pelo hardware

Page 327: Sistemas_Operacionais_Parte4

327

Paginação

Tradução de endereço: (cont.)

u: endereço lógicoP: tamanho da páginap: número da páginad: deslocamento

p = u div Pd = u mod P

4 words

ex.: memória física = 32 wordsP : 4 words

total de páginas : 8

Page 328: Sistemas_Operacionais_Parte4

328

Paginação

tradução de endereço: (cont.)endereço lógico0 - p = 0 div 4 = 0 (page)

d = 0 mod 4 = 0 (deslocamento)1 - p = 1 div 4 = 0 (page)

d = 1 mod 4 = 1 (deslocamento)4 - p = 4 div 4 = 1 (page)

d = 4 mod 4 = 0 (deslocamento)15 - p = 15 div 4 = 3 (page)

d = 15 mod 4 = 3 (deslocamento)

Page 329: Sistemas_Operacionais_Parte4

329

Paginação

scheduling:– quando o processo chega, o scheduling verifica

o No. de páginas de que ele precisa

– verifica na lista de frames disponíveis se existe um número suficiente

– existindo, aloca para o processo o No. que ele necessita

Page 330: Sistemas_Operacionais_Parte4

330

Paginação0 a1 b2 c3 d4 e5 f6 g7 h8 i9 j10 l11 m 12 n13 o14 p15 q

memórialógica

o 51 62 13 2

tabela depáginas

0

4 ijkl

8 mnop

12

16

20 abcd

24 efght

28

memóriafísica

Page 331: Sistemas_Operacionais_Parte4

331

Paginação

implementação da tabela de páginas:– conjunto de registradores:

» recarregados como qualquer outro

» carregados/modificados por instruções especiais

» somente se a tabela de páginas é pequena

– na memória principal (um registrador-pagetable base register-(ptbr) aponta para a tabela de páginas)

» o tempo de acesso a uma posição de memória é o problema

Page 332: Sistemas_Operacionais_Parte4

332

Paginação

implementação da tabela de página: (cont.)– acessar end. i

» acessar tabela de páginas (uso do ptbr+ No.pagedesloc.) (1o. acesso à memória)

» produz um No. de frame, combinado com deslocamento produz end i

» acessar a posição i na memória física (2o. acesso)

» dois acessos para acessar uma palavra

Page 333: Sistemas_Operacionais_Parte4

333

Paginação

implementação da tabela de página: (cont.)– hardware especial: (memória associativa,

memória endereçável pelo conteúdo)» mais rápida que a memória

» contém poucas entradas da tabela de páginas

» um endereço lógico gerado pela CPU é comparado com todas as entradas da tabela de páginas simultaneamente, a qual contém número de página/número de frame (na memória associativa)

Page 334: Sistemas_Operacionais_Parte4

334

Paginação

implementação da tabela de páginas: (cont.)– hardware especial: (memória associativa,

memória endereçável pelo conteúdo)» se o número da página é encontrado, o No. da frame é usado

imediatamente para acessar a memória

» se o número da página não é encontrado, é feito um acesso a tabela de páginas, na memória principal, para obter o No. da frame que é usado para acessar a memória

» o No. da página e o No. da frame são colocados na memória associativa, de modo a ser encontrado rapidamente na próxima referência

Page 335: Sistemas_Operacionais_Parte4

335

Paginação

compartilhamento de páginas:– particularmente importante em sistemas time-

sharing

– permite compartilhamento de código

proteção:» um bit de proteção em cada página

» o bit define se a página é read-only ou read-write

Page 336: Sistemas_Operacionais_Parte4

336

Paginação

ED1ED2ED3D1P1

3461

ED1ED2ED3D3P3

3468

012345678910

D1D3

ED1ED2

ED3D2

compartilhamentode

código

ED1ED2ED3D2P2

3467

Page 337: Sistemas_Operacionais_Parte4

337

Segmentação

um programa é um conjunto de:– subrotinas

– funções

– estruturas de dados (tabelas, etc.) referidos pelo nome

– cada um é um segmento de tamanho variável

– segmentação é um esquema de gerência de memória que suporta esta visão

Page 338: Sistemas_Operacionais_Parte4

338

Segmentação (cont.)

– cada segmento tem um nome e um tamanho (end. é especificado pelo nome do segmento e pelo deslocamento)

– compilador pascal cria segmentos para:» variáveis globais

» código de cada procedure

» código de cada function

» variáveis locais de procedures

» variáveis locais de functions

Page 339: Sistemas_Operacionais_Parte4

339

Segmentação

(s d)

s

<d

+yes

trap; addressing error

CPU

segment table

memory

limite base

segmentation hardware

Page 340: Sistemas_Operacionais_Parte4

340

Segmentação

Hardware:– end => No. seg e deslocamento

» a tab. seg é um array de par de registradores base e limite

– Implementação:» registradores:

ex.: pdp-11/45 => 8 registradores de segmento

Page 341: Sistemas_Operacionais_Parte4

341

Segmentação

– Implementação: (cont.)» registradores:

endereço de 16 bits

15

13 12s d

0

No.segmento

3 bits => 8seg.13 bits => 8K desloc.muitos segmentos??

desloc.

Page 342: Sistemas_Operacionais_Parte4

342

Segmentação

Hardware: (cont.)– tabela de segmentos na memória

» uso de dois registradores:STBR: segment table base register

STLR: segment table length register

» endereço: (s,d)

deslocamento

segmento

Page 343: Sistemas_Operacionais_Parte4

343

Segmentação

Hardware: (cont.)– tabela de segmentos na memória (cont.)

» para um endereço lógico (s,d) a. s < STLR ? não => erro b. s + STBR c. endereço = (end. base do segmento) + d

» requer dois acessos à memória (como na paginação)

Page 344: Sistemas_Operacionais_Parte4

344

Segmentação

Hardware: (cont.)– uso de memória associativa para manter as

entradas da tabela de segmentos mais recentemente usadas

» proteção:bits de proteção para cada entrada na tabela de segmentos

existência de segmentos na tabela read only (código), tentativa de escrita verificada pelo hardware

limites de um array (se for um segmento) verificados pelo hardware

Page 345: Sistemas_Operacionais_Parte4

Sistemas Operacionais

Arquivos

Page 346: Sistemas_Operacionais_Parte4

346

Arquivos

Entidades lógicas mapeadas pelo S.O. em dispositivos físicos

Contém informações definidas pelo proprietário (dados e programas)

Possui um nome e é referenciado pelo mesmo

O sistemas operacional possui suporte (chamadas de sistema) para manipulação de arquivos.

Page 347: Sistemas_Operacionais_Parte4

347

Tipos de Arquivos

Regulares : contém informações dos usuários

Diretórios : são arquivos mantidos pelo sistema e que possuem a estrutura do sistema de arquivos

Caractere especial : são arquivos relacionados ao I/O serial (terminais, impressoras, linhas de comunicação, etc)

Bloco especial : são relacionados ao I/O de blocos (discos)

Page 348: Sistemas_Operacionais_Parte4

348

Arquivos Regulares

Ex : executável UNIX» n mágico identifica arquivo como

executável

Nro mágicoText sizeData sizeBss sizS. table sreEntry point//////////////////////////TextDataRelocaçãoT. símbolos

16 bits

header

Page 349: Sistemas_Operacionais_Parte4

349

Operações sobre arquivos

create

delete

open

close

read

write

append

seekget attributesset attributesrename

Page 350: Sistemas_Operacionais_Parte4

350

Chamadas de sistema

Exemplo de programa que utiliza chamadas de sistema

/* copia source para destino */#include <sys/types.h>#include <fcntl.h>#include <stdlib.h>#include <unistd.h>

#define DUP_SIZE 4096 /* unidade de R/W */#define MODE 0666 /* modo de RW-RW-RW- */

main (int argc, char *argv[]){

int src,dst,in,out;char buf[BUF_SIZE];if(argc!=3) exit();

/* abre src e cria dest */

src = open(argv[1],O_rdONLY);if(src<0) exit();dst = create(argv[2],MODE);if(dst<0) exit();

/*copia do arquivo*/

while(1){in = read(src,buf,BUF_SIZE);if(in<=0) break;out = write(dst,buf,in);if(out<=0) break;

}close(src);close(dst);}

Page 351: Sistemas_Operacionais_Parte4

351

Diretórios

Contém informações que permitem acessar aos arquivos

Possui várias entradas, uma por arquivo

Informações sobre cada arquivo:

nometipotamanhoproprietárioproteção

data de criaçãodata da última modificaçãolista de blocos usados

Page 352: Sistemas_Operacionais_Parte4

352

Organização de diretórios

Cada entrada contém o nome e os atributos do arquivo

Cada entrada contém o nome do arquivo e um ponteiro para uma estrutura de dados com os atributos

Page 353: Sistemas_Operacionais_Parte4

353

Organização de diretórios

games atribmail atribprogs atrib

gamesmailprogs

Estrutura de dadoscontendo os atributos

Page 354: Sistemas_Operacionais_Parte4

354

Quantidade de diretórios

Um único diretório contendo os arquivos de todos os usuários

Um diretório por usuário

Page 355: Sistemas_Operacionais_Parte4

355

Quantidade de diretórios

C

A

D

B

A

root

B

E F

root

C

G

...

Page 356: Sistemas_Operacionais_Parte4

356

Quantidade de diretórios

Normalmente existe um diretório por usuário

Cada usuário pode criar diretórios

Page 357: Sistemas_Operacionais_Parte4

357

Quantidade de diretórios

R

A B C

B2A1 B1 C1 C2 C3

Sistema de arquivos hierárquico

Page 358: Sistemas_Operacionais_Parte4

358

UNIX

Estrutura hierárquica– Ex : abrir o diretório /usr/ast/cap1

1 .1 ..4 bin7 dev

14 lib9 etc6 usr8 tmp

root

modotamanho

data132…………

6 .1 ..

726 ast

I-node 6/usr Bloco 132

Page 359: Sistemas_Operacionais_Parte4

359

UNIX

modotamanho

data406…………

26 .6 ..64 cap111 cap2

102 cap381 cap413 cap5

modotamanho

data191…………

I-node 26/ast Bloco 406

I-node 64cap1

Page 360: Sistemas_Operacionais_Parte4

360

Nomes

Absolutos: consiste do caminho desde o root até o arquivo

Relativo: utilizado juntamente com o conceito de diretório corrente. Todos os nomes de arquivo que não começam com o separador (/,\), são considerados relativos ao diretório corrente. Ex. Se o diretório corrente é mail, o comando cpusu1 usu1_message copia o arquivo /usr/spool/mail/usu1 para o arquivo /usr/spool/mail/usu1_message

Page 361: Sistemas_Operacionais_Parte4

361

Operações em diretórios

Create

delete

list

rename

Page 362: Sistemas_Operacionais_Parte4

362

Armazenamento de Arquivos

Alocação Contígua– Ex: arquivo com 150k, blocos de 1k, seriam

alocados 150 blocos consecutivos ao arquivo» simples de implementar

» o arquivo pode ser lido de maneira eficiente

– Problemas: determinar o tamanho do arquivo a priori

– fragmentação externa

Page 363: Sistemas_Operacionais_Parte4

363

Armazenamento de arquivos

Lista encadeada– Ex: bloco de 1k, 1022 bytes armazenam

informações, 2 bytes endereçam o próximo bloco

– Problema : ? - acesso randômico

Page 364: Sistemas_Operacionais_Parte4

364

Lista encadeada com tabela na memória

Cada apontador de bloco de disco é armazenado em uma tabela na memória

Para identificar um bloco não é necessário nenhum acesso a disco (acesso randômico)

Page 365: Sistemas_Operacionais_Parte4

365

Armazenamento de arquivos

Bloco físico

Arquivo A

Arquivo B

0

1

2 10

3 11

4 7

5

6 3

7 2

8

9

10 12

11 14

12 0

13

14 0

15

Lista encadeada com tabela na memória

Page 366: Sistemas_Operacionais_Parte4

366

Armazenamento de arquivos

Nós-I - nós índice– associa a cada arquivo uma tabela

– nó-I - tem atributos do arquivo endereços de blocos

– primeiros blocos - endereço no nó-I

– arquivos grandes» bloco indireto simples

» bloco indireto duplo

» bloco indireto triplo

Page 367: Sistemas_Operacionais_Parte4

367

Armazenamento de arquivos

UNIX– cada arquivo possui uma tabela (i-node) no

disco

– cada i-node possui informações sobre o arquivo e o endereço de 10 blocos (os primeiros)

– possui um bloco de indireção

– possui um bloco de dupla indireção

– possui um bloco de tripla indireção

Page 368: Sistemas_Operacionais_Parte4

368

Armazenamento de arquivos

Indireção: se bloco possui 1M, e são necessários 4 bytes para endereçar um bloco, contém 256 blocos: tamanho do arquivo: 266 blocos

Dupla Indireção: aponta para um bloco que contém 256 ponteiros (de 256 blocos cada) tamanho do arquivos:

. 266 + 2562 = 65.802 blocos

Tripla Indireção: 16 Gigabytes

Page 369: Sistemas_Operacionais_Parte4

369

Compartilhamento de arquivos

O diretório contém a lista dos blocos que pertencem ao arquivo– é feita uma cópia dos blocos para o diretório do

arquivo “link”

– Problema: não existe compartilhamento, mudanças em uma versão não são vistas em outra

Page 370: Sistemas_Operacionais_Parte4

370

Compartilhamento de arquivos

Soluções– 1a. Solução: os blocos não fazem parte do

diretório, mas sim de estruturas de dados associadas aos descritores. O diretório aponta para essa estrutura de dados

– 2a. Solução: “link” simbólico - o diretório contém o nome do arquivo “linkado”

Page 371: Sistemas_Operacionais_Parte4

371

Problema da primeira solução

Owner: Ccount: 1

Owner: Ccount: 2

C C B

arquivo arquivo

Page 372: Sistemas_Operacionais_Parte4

372

Problema da primeira solução

Se C deleta o arquivo:

Owner: Ccount: 1

B

arquivo

problema

Page 373: Sistemas_Operacionais_Parte4

373

Compartilhamento de arquivos

Segunda solução– não existe o problema de deleção do arquivo

por parte do proprietário

– Problema: número de acessos a disco pode ser elevado

– Vantagem: link de arquivos em máquinas diferentes

Page 374: Sistemas_Operacionais_Parte4

374

Problemas dos “links”

Ex: copiar um diretório completo para gerar um backup (um arquivo “link” será copiado mais de uma vez)

Page 375: Sistemas_Operacionais_Parte4

375

Gerência de blocos livres

Lista de blocos livres– consiste em manter uma lista linkada de blocos

livres

– Ex: Bloco de 1k, 2 bytes para identificar bloco livre, cada bloco contém 512 entradas. Quantos blocos são necessários para manter a lista de um disco de 80M?

Page 376: Sistemas_Operacionais_Parte4

376

Gerência de blocos livres

Mapa de bits– um disco com n blocos necessita um mapa de n

bits

– blocos livres representados por 1, ocupados por 0.

– Quantos blocos de 1k são necessários para um disco de 80M?

Page 377: Sistemas_Operacionais_Parte4

377

Deadlock

Page 378: Sistemas_Operacionais_Parte4

378

Deadlock

Modelo de sistema

Um sistema consiste de um número finito de recursos a ser distribuído entre um número de processos competindo pelos mesmos

Recursos

São quaisquer entidades que puderem ocasionar bloqueio de processos. Um bloqueio ocorre quando um recurso não está disponível e é requisitado por um processo. Ex. de recursos:

Dispositivos de E/SMemóriaregião crítica

Page 379: Sistemas_Operacionais_Parte4

379

Deadlock

Deadlock

É uma situação na qual processos estão bloqueados à espera de recursos que jamais serão liberados

Exemplo clássico de deadlock

P1: ... R (R1); ... R(R2); ... L(R1,R2)P2: ... R (R2); ... R(R1); ... L(R1,R2)

O deadlock ocorre quando os dois processos adquirem o primeiro recurso que necessitam

Page 380: Sistemas_Operacionais_Parte4

380

Deadlock

Tipos de recursos

Serialmente reusáveisConstituídos de um número fixo de unidades idênticas,

cada uma podendo ser utilizada de forma independente das demais. Após uma unidade ter sido utilizada por um processo, pode ser reutilizada por outro, de forma serial. Cada unidade pode estar em um dos seguintes estados:

alocadadisponível

Page 381: Sistemas_Operacionais_Parte4

381

Deadlock

Recursos consumíveis

São constituídos por um número variado de unidades que são criadas e consumidas dinamicamente pelos processos. Os processos que produzem as unidades são denominados produtores e os processos que consomem as unidades são denominados consumidores.

São características dos sistemas de processos cooperantes (trocas de mensagens, sinas de sincronização)

Page 382: Sistemas_Operacionais_Parte4

382

Deadlock

Condições necessárias para a ocorrência de dealock

Quando um processo que já tem um recurso puder requisitar um outro recurso

Quando os recursos não puderem ser confiscados temporariamente para serem alocados a outros processos

Quando for possível a formação de um ciclo no qual cada processo está bloqueado à espera de recursos que estão alocados para outros processos de mesmo ciclo

Page 383: Sistemas_Operacionais_Parte4

383

Deadlock

RepresentaçãoP1

P2

alocação

alocaçãorequisição

R2R1

P1

P2 possui uma unidade de R1

R1

P2

P1

R1

P2

P1 requisita duas unidades de R1R1

P2P1

P1 adquire duas unidades deR1

Page 384: Sistemas_Operacionais_Parte4

384

Deadlock

Métodos para tratamento de deadlock

1- Detectar2- Eliminar as condições necessárias3- Evitar4- Recuperar

Page 385: Sistemas_Operacionais_Parte4

385

Deadlock

Detecção de deadlocks

É possível, pela análise dos grafos, determinar se existe um deadlock.“ Existe deadlock se as requisições para alguns processos nunca serão atendidas ”

Redução de grafos

É uma maneira simples de examinar grafos para determinar se existe deadlock“ Um grafo pode ser reduzido em relação a um processo se todas as requisições do processo podem ser garantidas ”

Page 386: Sistemas_Operacionais_Parte4

386

Deadlock

“ Os processos que não podem ser reduzidos são os que estão em deadlock “

Teorema:“ Não existe processos em deadlock se e somente se o grafo é completamente redutível “

Page 387: Sistemas_Operacionais_Parte4

387

Deadlock

Podemos reduzir o grafo por P1 porque suas requisições podem ser garantidas a redução é feita retirando-se as arestas de/para o processo

P1

P2

R2R1

P1

P2

R2R1

O grafo foi completamente reduzido

P1

P2

R2R1

P2 pode, agora, ter suas requisições atendidas

Page 388: Sistemas_Operacionais_Parte4

388

Deadlock

Algoritmo de detecção de deadlock

um único recurso com muitas unidadesestruturas de dados

REQ

1 number of processes

.......

ALLOC

1 number of processes

.......

REDUCED

1 number of processes

.......

AVAIL: número de unidades presentemente disponíveis

Page 389: Sistemas_Operacionais_Parte4

389

DeadlockAlgoritmo

beginfor (i=1 to numberofprocess)

reduced(i) := false,reducedprocess:=0;

“ Repeti até que não seja mais possível reduzir “loop

exit when not reductionreduction := false;for ( P = 1 to numberofprocess) {

if (not reduced(P)) {if (req(P) <= avail) then {

reduced(P) := true;reducedprocess := reducedprocess +1;reduction := true;avail := avail + aloc(P);

}}

}end loopcompletelyreduced := (reducedprocess = numberofprocess);

end;

Page 390: Sistemas_Operacionais_Parte4

390

DeadlockAlgoritmo para vários recursos com várias unidades por recurso

req : matrizalloc : matrizavail : vetor

R0 R1 R2

P0P1P2

P0

P1P2

0 1 2

Requisição

Alocação

0

10

11

0

000

100

Avail

110

000

Page 391: Sistemas_Operacionais_Parte4

391

DeadlockAlgoritmo para vários recursos com várias unidades por recurso

req : matrizalloc : matrizavail : vetor

A linha if (req(P) <= avail) then é substituída porreducedbyp := truefor (R = 1; R <= numberofressources; R++) {

if req(P)(R) > avail(R) then {reducedbyp := false;

}if (reducedbyp) then

A linha avail := avail + aloc(P); é substituída porfor (R = 1; R <= numberofressources; R++) {

avail(R) := avail(R) + aloc(P)(R);}

Page 392: Sistemas_Operacionais_Parte4

392

Deadlock

Quando executar o algoritmo

Quando uma requisição não pode ser satisfeitaQuando existe suspeita de deadlock

Ex: Um processo está bloqueado há muito tempo

Page 393: Sistemas_Operacionais_Parte4

393

DeadlockRecuperação de deadlock

Quando o algoritmo de detecção de deadlock determina a existência de um deadlock, muitas ações são possíveis:a) Terminação de processos

Terminar todos os processosreexecução

escolher uma vítima por vez até que o deadlock seja eliminado

escolher criteriosamentereexecutar o algoritmo de detecção

Problema da reexecução de um processonem sempre é possívelex. atualização de base de dados

Page 394: Sistemas_Operacionais_Parte4

394

Deadlock

Recuperação de deadlock

b) Preempção de recursosRecursos são retirados de processos no ciclo e entregues a outros, no mesmo ciclo, até que o deadlock seja eliminado.Problema: A escolha da vítima

c) RollbackOs processos possuem checkpoints, em que,

periodicamente, o estado é gravado em um arquivo (imagem de memória, recursos)

quando um deadlock é detectado, o processo é rolledback até antes de pedir um recurso

o recurso é atribuído a um outro processo no ciclo

Page 395: Sistemas_Operacionais_Parte4

395

Deadlock

Eliminar condições necessárias

Previne-se situações de deadlock eliminando-se pelo menos uma das condições necessárias para sua ocorrência

a) Quando um processo que já tem um recurso pode solicitar outro

esta condição é eliminada se todo processo solicitar todos os recursos necessários antes de iniciar a execução

Page 396: Sistemas_Operacionais_Parte4

396

Deadlock

Eliminar condições necessáriasb) Quando os recursos não podem ser confiscados temporariamente para serem alocados a outros processos

Um processo pode requisitar e liberar recursos, mas quando requisitar um recurso não disponível deve liberar os que estava utilizando e, então solicitar todos coletivamente

c) Quando é possível a formação de um ciclo no qual cada processo esta bloqueado a espera de recursos que estão alocados para outros processos do mesmo ciclo

esta condição é eliminada se os recursos existentes são hierarquizados e os processos são obrigados a solicitá-los na ordem crescente dessa hierarquia

Page 397: Sistemas_Operacionais_Parte4

397

Deadlock

Conj. recursos

r = { r1, r2, r3, ... ,rn}função f = r -> N onde N é o conjunto dos números naturaisf(disco) = 1f(fita) = 2f(impressora) = 3

Processo que requisita r(I) somente pode requisitar r(j) se e somente se f(rj) > f(ri) ou somente requisita rj após liberar rise f(ri) > f(rj)

Page 398: Sistemas_Operacionais_Parte4

398

Deadlock

Evitar deadlocksabordagem: aumentar informação sobre o uso de recursos

Os recursos são requisitados quando necessáriosO sistema deve decidir se a requisição pode ser atendida

sem gerar deadlockOs algoritmos necessitam que os processos declarem o

máximo de recursos, de cada tipo, necessários

Page 399: Sistemas_Operacionais_Parte4

399

Deadlock

Estado seguro/não seguro

Se o sistema consegue alocar recursos para cada processo, em alguma ordem, e ainda evitar deadlock, o estado é seguro“ O estado é seguro se existe uma seqüência segura ““ O estado é não seguro se não existe uma seqüência segura ““ O estado de deadlock é um estado não seguro ““ Nem todo estado não seguro é um estado de deadlock “

Page 400: Sistemas_Operacionais_Parte4

400

Deadlock

Estado seguro/não seguro

Com a informação de número máximo de recursos necessários para cada processo é possível construir um algoritmo que assegura que o sistema nunca entrará em deadlock

O algoritmo examina dinamicamente o estado de alocaçãode recursos para assegurar que não existe uma espera circular

O estado de alocação é definida pelo número de disponíveis, alocados e demanda máxima de cada processo

Page 401: Sistemas_Operacionais_Parte4

401

DeadlockExemplo

Possui MáximoP0 3 10P1 2 4P2 2 8Número de unidades do recurso:12, disponível:5

Possui MáximoP0 5 10P1 2 4P2 2 8Número de unidades do recurso:12, disponível:3

Possui MáximoP0 5 10P1 2 4P2 3 8Número de unidades do recurso:12, disponível:2

Page 402: Sistemas_Operacionais_Parte4

402

Deadlock

Suponhamos que:

P1 solicita duas unidades, é atendido e termina, liberando as quatro unidades que possuía

O número de unidades disponíveis é 4P0 solicita 5 unidadesP2 solicita 5 unidades

DEADLOCK

O sistema passou de um estado seguro para não seguro

Page 403: Sistemas_Operacionais_Parte4

403

Deadlock

Algoritmo para evitar deadlocks

Baseado no estadoDijkstra 1965Banker`s algorithm

Page 404: Sistemas_Operacionais_Parte4

404

DeadlockProc Tape Printer DriverP0 2 0 0P1 0 0 0P2 1 1 1P3 1 1 0

Matriz alocaçãoP0 1 1 1P1 2 1 1P2 0 0 0P3 1 0 1

Matriz necessidadeP0 3 1 1P1 2 1 1P2 1 1 1P3 2 1 1

Matriz máximo1 0 0vetor disponível

Page 405: Sistemas_Operacionais_Parte4

405

Deadlock

Estrutura de dados

Available: Vetor que indica o número de unidades disponíveis de cada tipo de recurso

Max: Matriz que define, para cada processo, o número máximo de unidades, de cada tipo de recurso, necessárias

Allocation: Matriz que define o número de unidade, de cada tipo de recurso, alocadas presentemente para cada processo

Need: Matriz que indica o número de unidades, de cada recurso, necessárias para cada processo (Max_Allocation)

Page 406: Sistemas_Operacionais_Parte4

406

Deadlock

Deadlock

Para uma requisição request (P,i) = k o processo P esta solicitando k unidades do recurso iif (request(P,i) <= need(P,i)) {

if (request(P,i) <= available(i)) {available(i) = available(i) - k;allocation(P,i) = allocation(P,i) + k;need(P,i) = need(P,i) - k;

}safe_state();

} elseerro;

Page 407: Sistemas_Operacionais_Parte4

407

Deadlock

Safe_state: Estrutura de dados:temp: vetorFinish: vetortemp[i] = available[i];finish[i] = false; “para todo i “continue = true;while(continue) {

continue = false;if (need(i) <= temp(i) and finish(i) = false) {

temp(i) = temp(i) + allocation(i);finish(i) = true;continue = true;

}}if finish(i) = true para todo i then

o sistema esta em um estado safe

Page 408: Sistemas_Operacionais_Parte4

408

Estudo de Casos

Page 409: Sistemas_Operacionais_Parte4

UNIX

Page 410: Sistemas_Operacionais_Parte4

410

Unix

Shell

núcleo

hardware

Page 411: Sistemas_Operacionais_Parte4

411

Conteúdo

1 - Histórico

2 - Visão do Usuário

3 - Serviços do sistema

4 - Arquitetura do sistema

Entidades: Arquivos

Processos

5 - Bibliografia

Page 412: Sistemas_Operacionais_Parte4

412

Visão do usuário

Sistema de arquivos– Hierárquico– Criação / destruição de arquivos– Crescimento dinâmico de arquivos– Proteção

Exercício: fazer um programa COPY

Page 413: Sistemas_Operacionais_Parte4

413

Visão do usuário (cont.)

Ambiente de execução– Programa: arquivo executável– Processo: programa em execução– Processos solicitam os serviços do núcleo

com o uso de chamadas de sistema. Ex.: fork, exec, etc.

Exercício: fazer um programa com fork

Page 414: Sistemas_Operacionais_Parte4

414

Shell

Interface entre o usuário e o sistemaInterpretador de comandosExecuta:– comandos simples– comandos compostos– redirecionamento de I/O– pipe– if then else; for; while;– etc;

Page 415: Sistemas_Operacionais_Parte4

415

Shell (cont.)

Funcionamento: (detalhar)while (1) {

ler comando;criar filho para executar;}

Exercício: fazer um shell simplificado

Page 416: Sistemas_Operacionais_Parte4

416

Serviços do Sistema

Controlar processos;Escalonar;Alocar / liberar memória;Gerenciar memória secundária;E / S.

Page 417: Sistemas_Operacionais_Parte4

417

Arquitetura do Sistema

Biblioteca

Interface

Comunicação

Hardware

Sub-sistema

de gerência

de processos

Sub-sistema de arquivos

Scheduling

Ger. MemóriaDrivers

Cache

Carac. Blocos

Programas

Nível Núcleo

Nível Usuário

Page 418: Sistemas_Operacionais_Parte4

418

Arquivos

Page 419: Sistemas_Operacionais_Parte4

419

Representação Interna dos Arquivos

Fornecida por um i-node;I-node: contém a descrição do arquivo;Cada arquivo contém um i-node;Mais de um nome pode estar associado a um i-node;O sistema gerencia os arquivos com três tabelas:– Tabela de arquivos abertos: uma por processo– Tabela de arquivos: global – Tabela de i-nodes: global

Page 420: Sistemas_Operacionais_Parte4

420

Tabelas usadas para acesso aos arquivos

Tab. I-nodesTab. Arq. Abertos Tab. Arquivos

Page 421: Sistemas_Operacionais_Parte4

421

I-nodes

Proprietário;Tipo de arquivo (ordinário, diretório, bloco especial, caracter especial, fifo(pipe));Direitos de acesso;Datas de acesso (acesso, modificação, modificação de i-node);Número de links;Lista de blocos;Tamanho do arquivo;

Page 422: Sistemas_Operacionais_Parte4

422

I-nodes (cont.)

– Proprietário– Grupo

– Tipo– Permissões

– Acessado– Modificado

– Tamanho– Blocos de dados

JoséParsysOrdinárioRWX R_X R_X08 July 1999 21:0008 July 1999 21:007820 bytes32,27,85,31,84,92,23,55,30,77IndireçãoDupla indireçãoTripla indireção

Page 423: Sistemas_Operacionais_Parte4

423

I-node na Memória

Estado do I-node– Bloqueado / não bloqueado– Processos bloqueados

Número do periférico;Número do i-node;Contador de referências;

Page 424: Sistemas_Operacionais_Parte4

424

Estrutura do sistema de arquivos

Boot: contém o código de boot;Super bloco: descreve o sistema de arquivos (lista de blocos livres, número de arquivos, tamanho das outras áreas);Lista de i-nodes: configurável pelo administrador, referenciados por um índice.

boot super bloco lista i-nodes blocos dados

Page 425: Sistemas_Operacionais_Parte4

425

Tamanho dos arquivos

10 blocos diretos (1 K) = 10 K1 indireto c/ 256 diretos = 256 K1 duplo indireto c/ 256 diretos = 64 M1 tripla indireção c/ 256 dupla indireção= 16 G

Page 426: Sistemas_Operacionais_Parte4

426

Conversão de um caminho de acesso em um i-node

(/usr/parsys/ep/artigo)

/

ctc

pass

usr 12

I-node 12proprietário

134

bloco 134

ep 25

jn

im

Direitos de acesso

Page 427: Sistemas_Operacionais_Parte4

427

Conversão de um caminho de acesso em um i-node (cont.)

Bloco 256

(artigo)

pum 5

mpi 11

artigo 13

aulas 27

prog 89

I-node 25

prop

direitos

tipo

256

I-node 13(artigo)

prop

direitos

tipo

bloco 0

bloco 1

Page 428: Sistemas_Operacionais_Parte4

428

Chamadas de Sistema

open

closeread

writecreate

mkdircd

pipe

Page 429: Sistemas_Operacionais_Parte4

429

open

fd = open ( nome, modo );transformar “nome” em i-nodeif (ñ existe ou acesso ñ permitido)

return (erro);Alocar uma entrada da Tabela de ArquivosAtribuir à Tabela de Arquivos o i-nodeInicializar contador de deslocamentoAlocar uma entrada na Tabela de AAAtribuir à TAA o índice da Tabela de ArquivosReturn( índice da TAA )

Page 430: Sistemas_Operacionais_Parte4

430

open (cont.)

TAA T-Arquivos T-Inodes

012

T-Arquivos: - apontador p/ tabela de i-nodes- deslocamento (byte corrente)- direito (leitura / escrita)- contador de referências

Page 431: Sistemas_Operacionais_Parte4

431

pipe

Alocar um i-nodeAlocar um elemento da tabela de arquivos (em escrita)Alocar um elemento da tabela de arquivos (em leitura)Inicializar o contador de referência do i-node em 2Alocar um par de entradas em TAA (processo)Atribuir os elementos da tabela de arquivosRetornar (elementos da TAA)

Page 432: Sistemas_Operacionais_Parte4

432

Exemplo de Programamain() {

int fds (2);

char c ;pipe (fds);

pid = fork () ;

if pid != 0 {for ( ; ; ){

c = getchar () ;

write (fds (1),&c, sizeof (char)));}

else {

read ( fds (0), &c, sizeof (char));printf (“%c\n”, c) ;

}

}

Page 433: Sistemas_Operacionais_Parte4

433

Processos

Page 434: Sistemas_Operacionais_Parte4

434

Controle de processos

fork

kill

exec

exit

wait

Page 435: Sistemas_Operacionais_Parte4

435

exec

acessar o arquivoverificar se é executávelalocar memória (código, dados, pilha)efetuar a carga liberar a região de memória usada anteriormente

Page 436: Sistemas_Operacionais_Parte4

436

fork

fork()– Cria uma cópia exata do processo original,

incluindo registradores, descritores de arquivos, etc;

– Cada processo tem seu próprio espaço de endereçamento;

– Retorna um valor (zero para o filho, o piddo filho para o pai);

Page 437: Sistemas_Operacionais_Parte4

437

fork (cont.)

Procurar uma entrada livre na tabela de processos;Alocar memória;Copiar a imagem do pai para o filho;Colocar no descritor o mapa de memória do filho;Fabricar um pid para o filho;Sinalizar ao pai final de operação;

Page 438: Sistemas_Operacionais_Parte4

438

Exemplo de uso: shell

While (1){

read_command ( command, par );pid = fork();

if (pid != 0)if not background wait();

else exec(command, par);

}