Baixe o app para aproveitar ainda mais
Prévia do material em texto
BIOS: É escrita em linguagem de máquina, mas é atualizável. • SO atuais são "gordurosos" - Já vem com muitos drivers pré-instalados. (Plug and Play) ○ Driver é aplicação, fala com o SO e outra aplicação. Ex.: driver de impressora, Word chama o driver que fala com o SO, que fala com os níveis mais baixos da máquina (dispositivos físicos). • Antes do SO a programação era feita por perfuração de cartões.• Shell - Interpretadores de comandos (terminal)• Há SO em quase tudo, até no chip do cartão, para validar a senha.• Arquitetura de Von Neumann é mantida até hoje graça a evolução dos processadores. • Cluster: Um cluster, ou agregado de computadores, é formado por um conjunto de computadores, que utiliza um tipo especial de sistema operacional classificado como sistema distribuído. Muitas vezes é construído a partir de computadores convencionais (personal computers), os quais são ligados em rede e comunicam-se através do sistema, trabalhando como se fossem uma única máquina de grande porte. Há diversos tipos de cluster. • Controlador de Vídeo = Placa de Vídeo• Kernel: Centro do SO, aloca o tempo e memória para os programas, cuida do armazenamento de arquivos e a comunicação em resposta ao chamado do sistema. Onde os quatro gerenciamentos so implementados • Shell: Age como uma interface entre o usuário e o Kernel. Quando um usuário loga, o programa de login checa o nome de usuário e senha e então inicia outro programa chamado shell. Shell é um interpretador de linhas de comandos (CLI). Ele interpreta os comandos que o usuário digita e organiza para que eles sejam levados.("casca, escudo") CPU é o processador.• IRQ é abreviação de "Interrupt Request Line". Os endereços de IRQ são interrupções de hardware, canais que os dispositivos podem utilizar para chamar a atenção do processador. • O registrador de uma CPU (unidade central de processamento) é uma unidade de memória capaz de armazenar n bits. Os registradores estão no topo da hierarquia de memória, sendo assim, são o meio mais rápido e caro de se armazenar um dado. • Em arquitetura de computadores, um barramento é um conjunto de linhas de comunicação (condutor elétrico ou fibra ótica) que permitem a interligação entre dispositivos de um sistema de computação (CPU; Memória Principal; HD e outros periféricos), ou entre vários sistemas de computação. • Buffer: endereço de memória para armazenamento. • Read: scanf - quando executado, todo programa fica na memória.• SP- System Pounter -> ler linha por linha (ponteiro)• Pilha: Ultimo que entra primeiro que sai (processos)• Fd: identificador de arquivos. • Fork: Comando no qual a partir de um processo pai, cria-se um processo filho. • Liga o hardware (linguagem de baixo nível/ nível de máquina) com as aplicações (linguagem de alto nível);○ Controla/Organiza a distribuição de memória RAM (gerência de memória);○ O que é o Sistema Operacional• Quanto mais baixo, mais próximo da máquina, quanto mais acima, mais próximo as aplicações e dos usuários. ○ Tudo que está abaixo da camada sendo analisada é desnecessário saber. ○ (0, 1) - Abstração de impulsos elétricos Abstração = mais longe, sem preocupar com detalhes.○ Em computação é comum usar modelo de organização em camadas.• Kernel (núcleo duro): Core do SO (Cérebro) escrito em Assembly, se desligar acabou.○ Partes principais do SO são escritos em Assembly.○ Kernel é o "miolo da cebola".○ Partes periféricas do SO são escritas em C. ○ O sistema operacional fica acima da linguagem de máquina, boa parte é escrita em Assembly.• Escrito em Assembly: Nível mais próximo do Hardware, para ser compreendido melhor pelo Hardware, melhor desempenho (melhor velocidade). • Máquina Virtual -> Simulador de hardware -> Abstração;○ Tempo -> Processos = Programa em execução; Espaço -> Memória. Gerencia recursos:○ Vírus: Ocupa o espaço que o SO deveria ocupar, congelando o sistema.○ Sistema Operacional• Mainframes: Computadores de grande porte;• Antes era analógico: Por cartões, monousuário.○ PC (Personal Computer): Depois da década de 80, Multiusuários;• Sistema multiusuário, mas com um processador estão em desuso, pois sobrecarrega quando vário usuários estão acessando os terminais; ○ Sistema Central (faz todo o processamento)---------> Terminal dumb (Sem processamento), Multiusuário, mas monoprocessado, diferente do em rede, onde é multiusuário mas multirpocessado (o processamento é feito no terminal). • Multiusuário : Vários usuários na mesma máquina, operando ao mesmo tempo;• Monousuário: Um usuário operando de cada vez;• Monoprocessado (Monotarefa): exerce um processo por vez (um processador);• Multiprocessado (Multitarefa) :Exerce várias tarefas ao mesmo tempo (um processador), porém as tarefas saem sem terminar (diferente do monprocessado). Entra, roda um pouco, sai (pipeline ou fila circular).É rápido, para o usuário parece tudo ao mesmo tempo. Ainda com várias tarefas ao mesmo tempo, mas não termina todas ao mesmo tempo. • Multiprogramação = Multitarefas, multiprocessos• Multiusuário não significa ter várias contas, mas sim vários usuários utilizando ao mesmo tempo (remotamente).• Mutiprocessadores: Muitas CPU's, ou uma com vários núcleos, dificulta para o SO (Multiprocessadores é diferente de Multitarefas) • Celular: Pode ser multiusuário, mas não é multitarefa. Executa uma tela por vez, e as atrás estão congeladas.• Servidores: para usuários em rede;○ Multiprocessadores: mais de uma CPU ou Multi-core (diferente de multitarefa);○ PC: comuns;○ Tempo Real: SO feito especificamente para o Hardware. Automóveis com computador de bordo, freio ABS. Dado uma tarefa ela vai ser executada naquele tempo determinado. (tempo constante. Realizados vários testes, não há espaço para erros. ) ○ Embarcados : Sistemas internos, fechados.○ Cartão inteligente: Uma classificação do embarcado, chip.○ Tipos de SO• Capítulo 1 - Introdução quinta-feira, 8 de outubro de 2015 19:00 Página 4 de Sistemas Operacionais Tecla enter no teclado ---> joga no controlador---> joga no barramento----> vai para a CPU --->vai ao registrador ---> IR (Interrupt request) o teclado pede para parar a atividade atual e processar a ação RQ3 ---> O SO recebe o enter e põe pra rodar na CPU ---> Joga ele de volta. • SWAP - Processo diretamente ligado ao gerenciamento de memória.• Gerenciador de memória é responsável em liberar memória para a execução de processos, estes são gerenciados pelo gerenciamento de processos. • Atualmente o SO cuida desse gerenciamento, antes o desenvolvedor da aplicação tinha que se preocupar com isso. ○ Em sistemas antigos (ex: Windows 95), não havia limites para o espaço que a aplicação poderia ocupar, assim, ela acabava ocupando muita RAM, invadindo até mesmo o SO. Dando a tela azul. • Hoje, para liberar memória, o SO retira quem está ocupando memória e coloca em disco. Quando precisa da aplicação , a mesma é recolocada na memória para ser executada. • O SO é um processo, mas ele é fixo, não pode ser liberado da RAM. Se for mal projetado, ocupa boa parte da RAM. Ele tem que ser otimizado. • Permite a manipulação de arquivos e cria infraestrutura lógica na memória, na RAM ou no HD.○ Pode ser guardado em ordem sequencial ou em posições livres. -> gerenciamento de arquivos -> blocos com endereços diferentes (fragmentação de disco) Quando um arquivo muito grande é baixado, o SO divide em blocos nas trilhas do HD de tamanho previamente definidos pelo gerenciador de arquivo. ("Fragmentar o arquivo"), a cada bloco locado, é mapeado seu local; ○ Desfragmentar: Junta os pedaços dos arquivos em blocos mais próximos;○ Os blocos são muito pequenos, pela otimização do aproveitamento do espaço em disco. Blocos menores evitam o desperdício de espaço, pois apenasum arquivo é colocado em cada bloco, se não for ocupado por completo o espaço é desperdiçado. ○ O arquivo em transferência primeiro mapeia os blocos, traça o caminho de resgate do arquivo e depois a transferência. Transferir um arquivo grande é mais rápido que transferir vários arquivos que tenham o mesmo tamanho do grande. Pois no primeiro caso é só um processo (apenas um mapeamento), já no segundo , tem que começar vários processos do zero, demorando mais. ○ Sistema gerenciador de arquivos cria blocos de tamanho fixo no HD. ("Chão da sala.")• Arquivos são organizados em árvores• Mais estática que a árvore de processos. Apesar de ter arquivos temporários, que são criados e apagados, e da memória SWAP que é um arquivo. Pois a árvore de processos é mais dinâmica, criam processos de pais e filhos. O processo A gera dois filhos, B e C, depois B cria D , E, F. ○ Ex.: Abriu o terminal (processo pai), abriu um editor de texto pelo console (processo filho). Se fechar o console, fecha o editor de texto. ○ Obs.: Quando abre o editor de texto, o console fica parado , só volta a executar comandos quando o editor é fechado. ○ Obs. 2: Quando coloca & depois do nome do programa que deseja abrir no console, o programa é aberto em segundo plano, não travando o console. ○ Pipeline : fluxo de passos, entrando e saindo.○ Pipe "|" - colocado entre dois processos. Quando o primeiro termina e produz dados na saída, o processo que está depois dele (direita) ligado pelo pipe recebe esses dados. • Página 5 de Sistemas Operacionais Espaço do usuário O SO impede comandos diretos no núcleo por segurança.□ Espaço do sistema (Kernel) : Apenas comandos que tratam diretamente com desemprenho, algoritmo e hardware. Nem usuários, nem programadores mexem nesse espaço (não faz chamada ao usuário). Ele loca um espaço para guardar, armazenar no buffer (memória) , identifica o tipo de arquivo, az a chamada da instrução, transfere o pedido para o registrador na CPU, manda para a área do núcleo, recebe, escalona, organiza, executa, recebe os resultados e devolve para a área do usuário, retorna para quem chamou e incrementa o SP para executar o próximo processo. ○ Scanf : ler (loca espaço) o comando, faz (preparando) o buffer (o digitado vai para a área do buffer), chama o scanf, coloca código no registrador (pequeno buffer para ponteiro), manda para o SO na área do Kernel, escalona e prioriza, executa no SO, trata a comunicação com o usuário (área) recebendo os resultados e devolvendo, retorna pata quem chamar, vai para o próximo comando. □ Chamada a nível usuário para o kernel: Duas áreas de execução:○ Processo chamada ao sistema (System Calls) - mapeamento• Página 6 de Sistemas Operacionais Shell: faz a comunicação entre o kernel e os utiliarios.• Unix é a base do Linux• Linux tem vários sabores. Open Suse, ubuntu, etc.. Cada tipo chamado de uma distribuição (os tipos, são distribuições, no SO's). O que muda entre as distribuições é a interface gráfica, o shell (a casca) e os comandos. O Kernel permanece o mesmo. (Fedora, ubuntu, Debian - O Kernel é o mesmo, muda as versões, atualizações) • Vários shells, uma das populares é o bash. .Abriu um processo que retornar no prompt dizendo que o comando esta disponível. • Ao abrir o terminal/ console (cmd) (terminal no tem processamento próprio, tem entrada e saída, mas no há processamento), uma interface gráfica, com interface texto. Escreve comandos, o interpretador e o shell(interpretador de comandos). • Quando abre uma aplicação é aberta pelo terminal, o terminal foca travado até que a aplicação seja finalizada • Configurar uma máquina virtual (simulador de máquina)○ Baixar ubuntu (.iso)○ Virtual Box ou VMWare (máquinas virtuais), ou faz dual boot• ls => mostra os diretórios (diretório )de arquivos ;○ #halt => desliga o pc;○ /dev => (devices) mapeia diretórios/arquivos;○ Ctrl+C => limpa o terminal;○ Pwd => mostra diretório atual;○ Cd => entra no diretório;○ Mkdir => cria diretório○ Rmdir => exclui diretório;○ Cat => mostra conteúdo do arquivo;○ Cp => copia arquivos de diretório;○ Vi => editor; Comandos(todos os comandos são em minúsculo): • Aula de Laboratório quarta-feira, 14 de outubro de 2015 19:06 Página 7 de Sistemas Operacionais Vi => editor;○ Comando -- help => parâmetros de cada comando;○ Sudo => executa comando como root (superusuário);○ Mount => monta um dispositivo;○ Unmount => desmonta um despositivo;○ O d no console indica que um diretório○ Quando pluga um pendrive e coloca alguma coisa nele, primeiro o linux grava em um arquivo, depois para o pendrive. Quando manda desconectar o pendrive o linux passa o arquivo salvo no HD para o pendrive. Se tirar o pendrive antes de mandar ejetar pode perder o arquivo. ○ Cebola e camadas ajudam a abstrair a computação, facilitando sua compreensão○ O Linux mapeia todas as entradas de dispositivos como arquivos.• SWAP (troca/mudança) - memória swap (memória virtual, memória RAM no disco, lenta), espaço em disco reservado no hd que vai receber o trafego que está ocupando a RAM, para liberar a mesma. Esse processo e lento. Se tirar um pedaço necessário, tem que voltar como o mesmo pedaço. O vai e vem de aplicações na RAM, deixa o computador mais lento. ○ Quando a memória RAM fica muito ocupada, o SO começa a ficar lento, porque tem que ficar tirando um programa para colocar outro. • Não há vírus para Linux até hoje, ele te protege dele mesmo• Parte da raiz○ Diretório raiz: contém todos os diretórios• Endereço absoluto: parte do diretório raiz até onde você quer (início \home)• Endereço relativo: parte do diretório corrente.• Tarefa: baixar virtual box, configurar máquina virtual, baixar ubuntu. http://pt.wikihow.com/Instalar-o-Ubuntu-no-VirtualBox http://www.ubuntu.com/download Fazer um scrip que copia todos os arquivos de um diretório para o outro Emulador de msdos http://www.pcjs.org/devices/pc/machine/5160/cga/256kb/win101/ Página 8 de Sistemas Operacionais Verificar diretório atual: pwd• Criar diretorio: mkdir ./...• Voltar para o diretorio anterior: cd -○ Voltar para o diretório raiz: cd○ Entrar em um diretorio: cd ./nome do diretorio• Criar um arquivo: cat > nomedoarquivo (o que vier nas linhas depois é o que terá no arquivo)• Duplicar arquivo: cp nomedoarquivoatual nomedonovoarquivo• Copiar todos os arquivos com uma certa extensão: cp *.extensão caminhododiretórioquedesejaenviarascopias• Exibir os arquivos e seus detalhes: ls -l• Mudar permissão dos arquivos chmod numero da permissão nome do arquivo• Deletar um arquivo: rm nomedoarquivo• Deletar uma pasta vazia: rmdir nomedodiretório• Deletar uma pasta que não esteja vazia: rm -Rf nomedapasta• Renomear um arquivo: mv nomeatualdoarquivo novonomedoarquivo• Mover um arquivo: mv caminhodoarquivoatual paraondequermandaroarquiv• Listar arquivos de uma pasta e salvar em um arquivo: find //bin > listabin.txt• Abrir um programa: digitar o nome do programa (ex: gedit)• Compilar e executar um programa: gcc nomedoprograma -o nomedesaidadoprograma | ./nomedesaidadoprograma• Imprimir na tela: echo• Ler entrada do teclado: read• Testar se é um diretório: test -d "$nomedaentrada"• Testar se é um arquivo: test -f "$nomedaentrada"• Loop do If : if / elif/ else/ fi• Limpar o prompt: clear• Criar inúmeros arquivos no diretório atual: • for i in {0..10} do touch arq$i.txt done Contar as linhas de algo: wc-l• Listar todos os diretórios e subdiretórios de um diretório: ls -R nomedodiretorio• Para fazer contas: =$(echo "conta(())"• Formatar saída de dados: printf "%.quantidadedecasasdecimais tipodevariavel" $variavel• Quantas casas decimais a considerar: scale: nº | bc -l• Somar dois valores: resultado=$(( $a+$b))•Falar se um valor é maior que o outro: [ $a -gt $b ]• Falar se um usuário está cadastrado no sistema:• function _getUserEx() { grep "^$1\:x\:" /etc/passwd | \ cut -d ':' -f 1 | \ wc -c | \ sed 's/[^0-9]//g' } if [ $( _getUserEx $USR_EX ) -gt 3 ]; then SHELL SCRIPT Comandos quarta-feira, 18 de novembro de 2015 15:09 Página 9 de Sistemas Operacionais if [ $( _getUserEx $USR_EX ) -gt 3 ]; then echo " $USR_EX é um usuário cadastrado." exit 0 else echo "$USR_EX não é um usuário cadastrado". exit 2 fi Lista arquivos do diretório e falar se é arquivo ou diretório• clear echo -n "Digite o caminho do diretorio a partir do seu diretorio atual: " read nome cd ./$nome for i in $(ls -d */); do echo ${i%% }" (dir)"; done ls -p | grep -v / Imprimir todos os números até o valor dado:• cont=0 while [ $cont -le $numero ]; do printf "$cont " cont=$((cont +2)) done echo "" Verificar se é um arquivo e dizer seu tamanho:• echo "Digite um nome de arquivo no diretório atual" read arq test -f $arq if test -f "$arq" then echo "É um arquivo" else echo "não existe" fi du -hsb $arq Shell com diversas funções• # !bin/bash pergunta(){ echo "" echo "Pressione ENTER para voltar" echo "" read VOLTAR } while true do clear echo "" echo "1 - Exibir status da utilização das partições do sistem; (df- h)" echo "2 - Exibir relação de usuário logados; (who)" echo "3 - Exibir data/hora; (date)" echo "4 - Sair." read op case $op in 1) while true; do clear df -h pergunta while [ -n "$VOLTAR" ]; do clear df -h pergunta Página 10 de Sistemas Operacionais pergunta done if [ -z "$VOLTAR" ]; then break fi done ;; 2) while true; do clear who -Hum pergunta while [ -n "$VOLTAR" ]; do clear who -Hum pergunta done if [ -z "$VOLTAR" ]; then break fi done ;; 3) while true; do clear echo "" echo "Data Horário" date "+%d/%m/%y - %H:%M:%S" pergunta while [ -n "$VOLTAR" ]; do clear echo "" echo "Data Horário" date "+%d/%m/%y - %H:%M:%S" pergunta done if [ -z "$VOLTAR" ]; then break fi done ;; 4) clear ; echo "" ; echo "Finalizando Programa" ; sleep 1; clear; break ;; *) echo "" ; echo "Opção Inválida" ; sleep 1 ; echo "" ;; esac done Página 11 de Sistemas Operacionais Processos: processos, threads, comunicação entre processos e threads, escalonamento;○ Memória: Monoprogramação, máquina virtual○ Gerenciadores:• O sistema pós win 95 : Entrada e saída dos processos da memória, escalonamento.○ Quando o processo atinge o limite, o SO aloca o espaço da aplicação em segundo plano, substituindo-o por outro processo. Quando o outro retorna, o espaço anterior é relocado, e entra novamente em execução. ○ Memória dividida em slots, gerenciados por base e limites para cada processo. • Roda um programa por vez dentro da CPU, mas parece simultâneo com outros processos.○ Processo é um programa em execução. Programa executando o algoritmo e utilizando recursos da CPU, da memória, entrada e saída. • Determina os pontos de troca de processos, quando sai da CPU, as informações são congeladas no disco.○ São marcadores dos pontos de parada do processo para a recuperação quando voltar para a CPU.○ Se o programa tem alguma parte de entrada/saída (i/o) o programa/processo é tirado e posto no disco (sempre). Quando da o enter na entrada, o processo fica pronto e entra na fila para ser executado. ○ Alteração entre o uso da CPU pelos processos:○ Tempo de processador = todo o tempo que o processo fica na CPU (mesmo saindo e entrando na CPU. )○ Algoritmo de quantum: normatiza o tempo que o processo permanece na CPU, determina esse intervalo.○ Contador de programa: ajuda o SO a lembrar onde o processamento terminou e depois onde ele tem que retomar.• Quando o processo faz entrada e saída ele entra e sai da pilha de escalonamento (entra e sai da CPU)• 1 - Inicio do Sistema;○ 2 - Execução de chamada ao sistema de criação de processos○ 3 - Solicitação do usuário○ Cria serie de instruções, em lote, para executar uma função ou várias funções.▪ 4 - Início de job (processo com muitas operações, em lote, em segundo plano) em lote○ Eventos que levam a criação de processos.• 1 - Saída normal (voluntário)○ 2 - Saída por erro (voluntario )○ 3 - Erro fatal (involuntário)○ 4 - Cancelamento por outro processo (involuntário)○ Condições de término• Porque ultrapassou limite de tempo ou I/O. Não significa que finalizou○ Por que o processo sai da CPU?• Um processo pai, cria um processo filho e este pode criar seu próprio processo (grupo de processos - UNIX)○ Windows não tem hierarquia de processos, todos os processos são criados iguais.○ Hierarquia de processos:• Estados de Processos• Execução - quando está usando a CPU efetivamente○ Bloqueado - aguarda I/O (não está na CPU) ○ 1 - Processo bloqueia aguardando entrada e saída;▪ 2 - Escalonador seleciona outro processo;▪ 3 - Escalonador seleciona este processo;▪ 4 - Entrada disponível;▪ Pronto - Pronto para executar, concorrendo com outros na fila (pronto para ser escalonado)○ Algoritmo de escalonamento▪ Em execução para pronto: Passou o tempo previamente determinado. ○ Quando o processo dá erro ele "finaliza" não passa para nenhum estado○ Executando para bloqueado: Espera de I/O○ Bloqueado para pronto: Recebeu/Saiu I/O○ Pronto para executando: Foi escalonado na fila○ Rodando: Pode estar em qualquer um dos estados acima.○ Memória: Espaço para armazenar dados em tempo de processo • Gerenciador de processos: Tarefas;• Gerenciador de memória: espaço• Só para impressão (fila)○ Locação de espaço em um dispositivo intermediário para compensar a falta de velocidade. Na impressão o terminal manda um sinal ao mainframe e ele faz uma cópia do resultado no HD para mandar a imagem na impressora, é um buffer. ○ É também o controlador de fluxo de impressões. ○ Spooling: Spoon • Processos de E/S não necessitam passar pelo SO, não atrapalham os outros processos. ○ É um atalho direto para o E\S○ Acesso direto sem passar pelo processador ou memória ○ DMA:• Algoritmo Time - Slice = Quantun : Algoritmo que defini quanto tempo o processo fica na CPU • Processo executando: pode estar em qualquer um dos estados de processo. • Sempre há concorrência pelo recurso (CPU, Memória, I/O) ○ Concorrência: Quando dois processos querem acessar, mexer no mesmo endereço de memória (região), é necessário tratar a concorrência. • Multitarefa = Multiprocessado• Multiprocessador = Quad-Core• GPU: Processador gráfico• JVM: Maquina Virtual Java - Exemplo de VM de software (figura 2.8) • Buffer: Qualquer espaço de armazenamento de dados, temporária. • Bloco de controle de Processos - 2.1.6 - página 55• Capítulo 2 - Processos e Threads segunda-feira, 19 de outubro de 2015 11:27 Página 12 de Sistemas Operacionais Rodando: Pode estar em qualquer um dos estados acima.○ Concorrência pelo recurso é diferente de ser escolhido para ser executado.○ Trata interrupção, escalonamento (IRQ);○ Motor do gerenciamento de processos.○ Os processosmudam de estado, usam a CPU ou não, usam a memória ou não, usam I/O ou não. O escalonador que cuida disso. ○ SO cria e gerencia todo o escalonamento de processos.○ Escalonador • A cada interrupção gerada, o escalonador é executado e alterna a execução entre os programas de usuário.○ Relação escalonar processo X Interrupções• Página 13 de Sistemas Operacionais Threads (2.2 - Livro)• Executam dentro de outro, não é processo filho. ▪ Um processo pode ser quebrado em mini processos. Esses mini processos são threads (sub processos) ○ Linhas de execução, executam operações distintas;○ O objetivo dos threads é diminuir o tempo de processamento do processo em um todo○ Overhead: Operações que ao final não tem resultado satisfatório (o tempo gasto);○ Ex.: Aplicativo Firefox -> Cada aba é um thread - até as threads são escalonadas. ○ Escrever ▪ Imprimir ▪ Cada uma é um thread, que ocorrem QUASE paralelamente• Não podem ser dependentes uma da outra, pois ficariam esperando a finalização da thread anterior. • O editor de texto é o processo, e suas ações são os threads.• O escalonamento das threads é programado por quem criou a aplicação.• Salvar▪ Ex.2: Word -> mais de uma ação ○ Esses SO's multi-thread tem o overhead (excesso, ruim, desnecessário)▪ SO's comuns são multiprocessos, multiprogramação, multitarefa. Enxerga escalonamento de processos ▪ SO não conhece o escalonamento de threads, apenas SO's multi-threads tem isso, mas não são os SO's comuns. ○ Processos e threads são manipulados dentro do espaço do usuário. ○ Em java o método main é uma thread;▪ Cada método é um thread▪ A própria JVM escalona as threads, simulando um SO multithread. ▪ JVM é o processo:○ Para um processo rodar ele tem que estar todo na RAM• Contexto: Toda a informação gerada pelo processo que depois retornara a ser executado. ▪ O SO salva o contexto do processo (toda a informação que o processo estava processando, e o contador de programa - onde parou a execução) no disco ou em outro local. ○ Antes estava tudo na RAM. Pode até ficar na RAM, desde que seja garantido que ○ Quando o processo atinge o tempo quantum, o SO mexe no hardware , interrompendo a CPU. • Threads sexta-feira, 13 de novembro de 2015 10:02 Página 14 de Sistemas Operacionais Quando o espaço da RAM que está guardando o programa não executando, é necessária para outro processo, o que está nesse pedaço da RAM passa para o disco rígido. ▪ Antes estava tudo na RAM. Pode até ficar na RAM, desde que seja garantido que nenhum processo mexa naquela região de memória. ○ Página 15 de Sistemas Operacionais Gera inconsistência de dados.▪ Garantir que apenas um acesse essa região por vez é uma função do SO;▪ Dois programas que necessitam da mesma variável (mesma área de memória)○ Sincronização e Comunicação de Processos:• Processo gravador = Produtor = Editor de Texto = Alimenta o Buffer;▪ Processo leitor = Consumidor = Impressora = Consome do Buffer;▪ Entre o processo gravador e o Processo Leitor deve haver Sincronização;▪ Controle de Fluxo, pois a velocidade do processador é maior que da impressora, o que pode causar perda de dados. ▪ Impressão;▪ Rede de computadores;▪ Transferência de dados;▪ Processos que precisam de buffer:○ Sincronismo entre Processos• Encher o buffer = Produtor mais rápido que o consumidor;• Esvaziar o buffer = Consumidor mais rápido que o produtor;• Se o buffer encher, o produtor tem que parar, até que o consumidor consuma até o buffer esvaziar e então para. ▪ Para o consumidor ou o produtor pararem, eles saem da CPU, vão para o estado bloqueado, aguardando I/O ▪ Tem que se evitar que o Consumidor e o Produtor acessem o mesmo espaço de memória quase ao mesmo tempo, pois pode causar inconsistência. Concorrência. ▪ Tudo em computação tem limite, até mesmo o buffer○ Mutualmente exclusiva;○ Nem o escalonador de processos pode tirar um thread que esteja executando na região crítica até que ele termine de ser executado ▪ Se a região crítica tiver um loop infinito, nunca sairá de lá.▪ Protocolo de Entrada - Verificar se está ocupado;• Protocolo de Saída - Avisar que saiu;• Antes de entrar e depois de sair tem sempre que fazer o protocolo de entrada/saída▪ O próprio buffer tem uma região crítica;▪ Trecho do código que não pode ser executado por mais de um processo ao mesmo tempo, para assim, garantir a consistência (Protege o trecho); ○ Dois processos simultaneamente na região crítica;1 Não importa a velocidade da CPU, nem quantas há;2 Se o processor estiver fora da região crítica ele não pode bloquear outro processo;3 O processo não deve esperar eternamente para entrar na região crítica.4 Condições para a exclusão mutua:○ Caixas de Bancos são threads, executando o mesmo código, rotina, região crítica. ○ Flag: Acesso a único processo - Exclusão Mútua○ Região crítica:• Não generalizável(escalável);▪ O rápido fica preso no Loop (espera ocupada) e o lento prende na região crítica por processamento demorado. ○ Processo rápido morre de fome (starvation) quando o processo lento entra na zona crítica; • Incompatibilidade de velocidade de execução de processos;▪ 1º Exclusão Mutua - Espera Ocupada○ Nem sempre garante a exclusão mútua porque as variáveis iniciam de maneira a manterem fora do loop ocupado e entram na região crítica, gerando uma exceção. ▪ 2º - Exclusão mútua○ Faz verificação antes de entrar no loop;▪ Processo tenta alocar um recurso, outro processo também, mas um terceiro já ocupa o recurso. • Os dois podem entrar em espera ocupada (deadlock)▪ 3º - Algoritmo○ Dois processos entram na região crítica ao mesmo tempo;▪ Starvation;▪ Deadlock;▪ Algoritmo de Peterson: resolve todos os problemas da exclusão mutua. Graças a variável VEZ. Problemas: ○ Processos não se comunicam▪ É necessário que se sincronizarem e comunicar▪ Para otimizar o processo que estava na espera ocupada dorme. O processo acordado, manda o outro acordar quando for a hora. (Comunicação entre porcessos) ▪ Espera ocupada ainda é um problema○ Algoritmos que tentam proteger a região crítica:• Função sem retorno = procedimento;○ Função com retorno = função.○ Em programação:• CPU está processando nada, o processo está preso.○ Loop de entrar na região crítica - Algoritmo de Peterson○ Loop que não faz nada -> Espera ocupada• Processo que está na CPU e sai tem que salvar o contexto.• Starvation: Um processo rápido passa fome de recurso esperando um processo lento que está rodando na região crítica • Deadlock: Um processo tenta alocar um recurso, outro processo tenta alocar o mesmo recurso, mas o recurso está ocupado, os processos ficam bloqueados eternamente. • PAREN: Em Pascal significa que os processos são disparados para rodar quase simultaneamente • Rotina = Função• Condição de Corrida: Quando mais de uma thread quer acessar a região crítica - Tem que ser tratado. • Ponteiros: Ajudam a dinamizar o tamanho da alocação. Passa o valor por inferência. • Sincronização e Comunicação entre Processos sexta-feira, 13 de novembro de 2015 10:02 Página 16 de Sistemas Operacionais Gabri Máquina de escrever Gabri Máquina de escrever Uma thread manda a outra dormir/acordar• Buffer cheio;○ Outro processo na região crítica○ Sleep: Sai da CPU e fica no estado de pronto, quando sai salva o contexto;• Buffer tiver espaço - Basta 1 - Consumidor consome e avisa;○ Região crítica livre - Consumidor avisa que saiu da região crítica○ Wakeup: Volta para a CPU de onde parou - contexto;• Ainda há deadlock• Sleep e Wakeup▪ 1965 - Dijkstra - Multithread• Enfileira wakeups - Base do semáforo. Wakeup WaitingBits○ Usa uma variável para contar quantos wakeup foram disparados, serão usados depois• São atômicos ("região crítica"), o que significa que não tem como serem interrompidos pela CPU (Foram implementados nos SO's assim) ○ (Protocolo de entrada) Down (P) - Entrar na região crítica, (Protocolo de saída) Up (V) sair da região e avisa que o próximo pode entrar • Podem ser binários (mutexes - exclusão mútua) ou contadores (valor > 0)• Semáforos• Permitia erro de programação.○ Aprimora os semáforos.• Tem como motivação evitar que ocorram erros de programação.• Torna mais fácil a escrita de programas corretos.• Não é necessário como o semáforo, mas é muito usado.• Monitores• Mecanismos de sincronização acabam com o problema da espera ocupada, pois há a comunicação entre as threads. ○ Sincronização Condicional• Página 17 de Sistemas Operacionais BEGIN Cont:=0; CP:=false; CC:=false; PARABEGIN Produtor; Consumidor; PAREND; END. PROGRAM Produtor_Consumidor_1; CONST TamBuf = (* Tamanho qualquer*); TYPE Tipo_Dado = (* Tipo qualquer *); VAR Buffer : ARRAY [1..TamBuf] OF Tipo_Dado; Dado_1 : Tipo_Dado; Dado_2 : Tipo_Dado; Cont : 0..TamBuf; VEZ : CHAR PROCEDURE Produtor; BEGIN REPEAT Produz_Dado (Dado_1); WHILE (Cont = TamBuf) DO (* Não faz nada*); CP := true; VEZ:= C; WHILE (CC and VEZ=C) DO (* Não faz nada*); Grava_Buffer (Dado_1, Buffer); Cont := Cont +1; CP:= false; UNTIL False; END; PROCEDURE Consumidor; BEGIN REPEAT WHILE (Cont = 0) DO (* Não faz nada*); CC := true; VEZ:= P; WHILE (CP and VEZ=P) DO (* Não faz nada*); Le_Buffer (Dado_2, Buffer); Cont := Cont -1; CC:= false; Consome_Dado (Dado_2); UNTIL False; END; Algoritmo Produtor-Consumidor + Algoritmo de Peterson sexta-feira, 13 de novembro de 2015 08:31 Página 18 de Sistemas Operacionais Sistema de tempo real;○ Sistema dos PC's comuns; Sistema interativo: respostas rápidas, questão de milissegundos, segundos;○ Sistema em lotes(batch): demora horas, dias○ Escalonador funciona de maneira diferente em cada tipo de sistema• Algoritmo justo com os processos mais caro (lento) para a CPU(muitos chaveamentos de contexto) ou o inverso. Não há um algoritmo perfeito. TRADE - OFF : Dilema○ Escalonador é justo: escalona de acordo com o critério mais justo• Age no começo e no fim do processo (Criação e termino) A CPU está livre e há mais de um processo no estado de Pronto○ Processos de baixa prioridade podem entrar em starvation Quando um processo de alta prioridade ficar apto a executar○ Tempo do processo terminou, tem que entrar outro Interrupção de tempo: Algoritmo de tempo○ O processo sai da CPU, escalonador tem que escolher outro Interrupção de E/S: O processo aguarda E/S○ Cada pedaço de memória é chamado de página Isso ocorre quando parte do processo sai da RAM (SWAP) e vai para o disco. Recuperar as informações do processo no disco demora, então o processo sai da CPU. Escalonador tem que escolher outro processo para substituir o mesmo Interrupção por falta de segmento de memória: Endereço acessado não está carregado na memoria virtual ○ Interrupção de erro○ Escalonador age quando:• Escalonador: define qual processo deve ser executado, toma a decisão○ Expedidor (dispacher): efetua a troca de contexto (salvar e recuperar)○ Escalonador dividido em duas partes:• Quando estão na fila de prontos e aptos a executar Curto prazo:○ Quando o processo sai da CPU e controla os eventos que estão na fila de bloqueados em situação que não seja I/O (por concorrência, swap, tempo ...) Médio prazo:○ Escolhe alguém para entrar na fila de processos com outro estado que não seja pronto Longo prazo:○ Escalonador de • Até que seja concluída; I/O; De maneira não preemptiva:○ O SO decido quando o processo/thread sai da CPU Todos os sistemas interativos são preemptivos. De maneira preemptiva:○ Uma vez escalonado utiliza o processador até que :• Folha de pagamentos, conta, estoque .... Usados em ambientes coorporativos ○ Não há demanda para interatividade○ FIFO; Tarefa mais curta primeiro; Próximo menor tempo restante (Variação do segundo); O algoritmo mais usado é o S.J.F. Tipos de escalonamentos:○ Sistema em lote• Fila de pronto: conjunto de processos que estão no estado de pronto, a ponto de serem executados. • Swap : tira o processo da memória RAM e manda para o disco, quando a memória está cheia• Processo que fica mais tempo na CPU, surtos longos, demora a sair da CPU.○ Processo orientado a CPU: CPU Bound• Processo que fica pouco tempo na CPU, fica boa parte do tempo fazendo surtos de I/O○ Processo orientado A I/O: I/O Bound• Escalonamento de Processos/Threads domingo, 29 de novembro de 2015 19:43 Página 19 de Sistemas Operacionais http://www.uniriotec.br/~morganna/guia/shell.html SHELL quarta-feira, 4 de novembro de 2015 19:27 Página 20 de Sistemas Operacionais Ligar o hardware (linguagem baixo nível) às aplicações (alto nível);○ Gerenciar a memoria RAM (Controla/Organiza);○ Tempo: Processos(Programa em execução);▪ Espaço: Memória;▪ Gerenciar recursos:○ SO é responsável por:• Quanto mais baixo, mais próximo da máquina, quanto mais acima, mais próximo das aplicações/ usuários; ○ Computação usa o modelo de organização em camadas:• Boa parte é escrito em Assembly, mais próximo do Hardware, é melhor compreendido pelo mesmo, gerando um melhor desemprenho; ○ Kernel (miolo da cebola/ Core do SO) - Cérebro do SO, se desligar acabou;○ Partes periféricas do SO são escritas em C;○ SO fica logo acima da maquina(camadas):• Multiusuário: Vários usuários na mesma maquina, operando ao mesmo tempo (Não significa ter varias contas no computador, mas sim, varias pessoas utilizando ao mesmo tempo - remotamente); ▪ Monousuário: Um usuário operando de cada vez;▪ Quanta a usuários:○ Monoprocessado: Monotarefa - Exerce apenas um processo por vez;▪ Multiprocessado: Multiarefa - Multiprogramação - Exerce varias tarefas ao mesmo tempo, no mesmo processador, porém as tarefas saem sem terminar (diferente do monoprocessado). O processo entra na CPU, roda um pouco, sai e depois volta. Ocorre tudo muito rapidamente, para o usuário parece ao mesmo tempo. ▪ Quando ao Processamento:○ Monoprocessador: Apenas uma CPU, com apenas um núcleo, que pode ser mono ou multiprocessado; ▪ Multiprocessador: Mais de uma CPU, ou uma com mais de um núcleo, dificulta o controle do SO. ▪ Quanto ao Processador:○ Classificações:• Mainframes: Computadores de grande porte;○ Antes eram analógicos, por cartões, monousuários;▪ PC: Computadores pessoais que surgiram depois dos anos 80, são multiusuários.○ Sistemas monoprocessados multiusuários estão em desuso, pois sobrecarrega o processador. ▪ Sistema Central: Sistema que faz todo o processamento, ligado à um terminal dumb (Sem processamento), é Multiusuário, mas monoprocessado, diferente de em rede onde é multiusuário e multiprocessado (O processamento é feito no terminal); ○ Tipos de Computadores:• Servidores: Para usuários em redes;○ Multiprocessadores: Multi-core;○ PC: Comuns;○ Automóveis com computador de bordo, freio ABS, é dado uma tarefa e ela será executada em um tempo constante. São realizados vários testes, não há espaços para erros; ▪ Tempo Real: SO feito especificamente para o hardware.;○ Cartões inteligentes - Uma classificação do embarcado, chip.▪ Embarcados: Sistemas internos, fechados;○ Tiposde SO's:• Capitulo 1 - Observações: Máquina Virtual é um simulador de Hardware, uma abstração;○ Abstração: Olha de um ângulo mais geral, sem se preocupar com os detalhes. (Ex.: 0 e 1 - São abstrações de impulsos elétricos) - Facilita a compreensão. • Vírus ocupam o espaço que o SO deveria ocupar, congelando o sistema;• Um programa/SO mal projetado(Sem aplicação de controle), pode fazer com que um programa ocupe o espaço do SO gerando a Tela Azul; • Tecla enter no teclado ---> joga no controlador---> joga no barramento----> vai para a CPU --->vai ao registrador ---> IR (Interrupt request) o teclado pede para parar a atividade atual e processar a ação RQ3 ---> O SO recebe o enter e põe pra rodar na CPU ---> Joga ele de volta. • Estudo para a 1ª Prova quarta-feira, 25 de novembro de 2015 09:52 Página 21 de Sistemas Operacionais A parte ocupada pelo SO tem que ser protegida, não pode ser acessada indevidamente. ○ Delimitam as partições da memória identificando os endereços de memória de cada partição. São endereços de memória especiais controlados pelo SO. Registradores:○ Memória principal: parte é ocupada pelo SO, a outra parte é ocupada pelos programas (onde vamos estudar)• Memória continua sem divisões○ Sempre há uma área livre na memória (problema)○ Alocação Contígua Simples• Depende do programador modularizar o programa. Técnica do Overlay: sobreposição de módulos na memória, um módulo de cada vez quando não cabe todo o programa dentro da memória. ○ Módulo principal: função main é executada, essa chama as outras funções que são executadas na area do overlay ○ 1ª Técnica utilizada em memória pequenas• O SO define o tamanho das partições no BOOT. ○ Menos complexa que a dinâmica.○ A tabela define o tamanho das páginas e se elas estão livres ou não. Há uma tabela que define o tamanho das partições○ Registrador separa logicamente os endereços de memória Apenas um programa por partição○ Toda vez o SO tem que checar se o programa está em sua faixa de memória permitida.○ Baseado no endereço de memória absoluto, não reloca o endereço dos registradores. O SO consegue enxergar o tamanho dos processos que estão na fila de processos. Coloca o processo na fila para ser executado na menor partição que couber, para diminuir a perda de memória. Os processos que estão na fila de partições menores não são executados nas partições maiores, mesmo que elas estejam livres. Absoluto:○ Realocável: Alocação Particionada Estática:• Memória não virtual = memória RAM, não utiliza o HD • Função GOTO não modulariza e dificulta a leitura do código. • Fragmentação interna: dentro da partição há espaço livre inutilizado. • Fragmentação externa: fora da partição, na memória. • Bloco de controle de processos: tem qual a posição da memória que o processo ocupa. Tem que corresponder ao mapa de bits. • Arquitetura de Von Neumann: CPU, memórias, registradores. Definiu que o programa tem que ficar na memória para ser executado. • Quantidade de combinações de bits de endereço. ○ Questão de prova: Diferença entre SO de 32 e 64 bits. Detalhadamente. De exemplos. • Overhead: Tem algo a mais, produz benefício, mas tem custo. • Frame: físico• Página: virtual• A memória normalmente é dividida em blocos de 4 K • Memória virtual é sempre maior que a Real. • Page in: página entrando na memória principal. • Page out: Página saindo da memória principal. • Bit de Validade: presente/ausente. • SO cria e mantem a tabela de página na RAM. Quando o SO da BOOT, o a tabela de páginas está vazia. Ela vai sendo preenchida/criada quando novos processos são criados. • Quanto mais pesado o aplicativo, maior é a tabela de páginas. • SO atual usa o algoritmo do menos usado recentemente. • Capítulo 3- Gerenciamento de Memória segunda-feira, 25 de janeiro de 2016 20:22 Página 22 de Sistemas Operacionais É mais esperto que o absoluto. Os processos podem ser executados a partir de qualquer partição que couberem. Gera a fragmentação interna: fragmentação dentro da partição, pois sobra espaço livre. Realocável:○ Partições são criadas sob a demanda dos processos. ○ Registradores são criados sob demanda. ○ Uma vez alocado um processo, o tamanho da partição não muda, não conseguindo alocar mais memória para o programa caso seja necessário. ○ Quando um processo sai da memória e libera a partição, fica um espaço vazio na memória, gerando a fragmentação externa. ○ Ficar realocando processos - desfragmentado - gera custos de potência.○ ○ □ Mapa de bits: Técnica do SO para controlar onde cada processo está na memória. Em qual endereço de memória há processos fica 1, onde não há, fica 0. Não sabe o endereço, só sabe que está ocupado. □ Listas ligadas: ponteiros apontam para a próxima partição. Desfragmentar: registradores são relocáveis, mas custa para a execução, gera lentidão, pois tem que se mudar todos os endereços de memória e o SO tem que saber todos os novos endereços. □ Durante a compactação é lento. □ É possível compactar para solucionar o problema de fragmentação externa . Estratégias do SO para alocação de memória:○ Alocação Particionada Dinâmica:• Página 23 de Sistemas Operacionais □ Best-Fit: menor espaço possível - ideal. Se na fila de processos tiver um processo de tamanho maior, com essa técnica fica maior espaço livre contiguo. □ Worst-Fit: maior espaço disponível. First-Fit: Primeiro espaço livre - nada é analisado. Técnicas de alocações de processos○ Técnica de retirar um processo da memória e colocar no disco - memória virtual- (swap out) para inserir um novo programa. Recolocar um antigo programa é swap in. As movimentações são com partições inteiras. Swapping: ○ Instrução = endereço final○ Endereço inicial = Endereço inicial que a instrução irá ocupar no swap in.○ Deslocamento = diferença da posição inicial para a final. ○ ○ Registrador de relocação: endereço inicial da partição; o registrador que pega a instrução retirada de memória e reloca no espaço anterior ideal, guardando o deslocamento. • Processador é o único a acessar o endereço físico. Endereço físico (real): endereço efetivo da memória no chip.○ Os endereços que o processador pode endereçar efetivamente dependem se o sistema é 64 bits ou 32 bits (Máximo 4GB de RAM) ○ Processos conhecem apenas memória virtual (espaço lógico) - HD, pendrive, etc. - Precisa mapear com a memória real. ○ Tabela de mapeamento grava os endereços de memória, tanto da física quanto da virtual para correspondência de acesso uma à outra. Mapeamento: Correspondência da alocação da memória virtual na física. ○ Gerencia de Memória Virtual:• Uma página de um endereço virtual corresponde à um frame da memória física• Falta de página: Endereço mapeado pela memória virtual na memória real não é encontrado, dados estão no disco. • O espaço de endereçamento são tabelas de endereço, contem endereços para o hardware. Essas tabelas ficam na memória RAM, na parte reservada para o SO. • Há apenas um espaço de endereçamento real, o virtual acompanha a quantidade de processos. ○ Cada processo tem um espaço de endereçamento, uma tabela de mapeamento, assim, não consegue invadir o espaço de endereço (virtual) de outro processo. • MMU: parte do hardware que faz o mapeamento. Encontra o endereço a partir do endereçamento virtual. As tabelas são mantidas pelo SO. - faz trabalho de mapeamento com os dados gerados pelo SO. • Página 24 de Sistemas Operacionais ETP: Entrada de tabela de página Tabela de página tem várias ETP O processo na tabela de páginas pode apontar para a memória principal(dados já estão na RAM) ou para a memória secundária (falta pagina) Dentro do Endereço do Frame: Endereço do Frame + deslocamento O endereço virtual é diferente do real, mas o deslocamento é igual. Aproveita- se ele. Dentro do NPV: ETP + Endereço do Frame◊ NPV (nº da página virtual- índice) + deslocamento; Endereço virtual□ Página virtual Se a RAM estiver cheia. O SO tem que escolher um frame para tirar (swap). O restante dos bits é chamado do deslocamento e são iguais no endereço real que é passado para o MMU. A tabela mapeia uma página virtual que contém uma parte do endereço real e indica se está na memória principal ou não. Se não estive o SO vai no disco e leva para a RAM □ Os primeiros 4 bits dos 16 do endereço virtual são o índice da tabela de entrada de página - mundo virtual Um programa de 4 GB não rodaria na memória de 2 GB - Com a tabela de página, fica-se mapeando os 4 GB em 2 GB. □ Se não tivesse a tabela de página, o processo ficaria limitado ao tamanho da RAM, a memória virtual perderia seu propósito de gerar mais endereços. O endereço de memória física é menor que o endereço virtual, pois o espago de endereçamento é menor. Modificado - valor mudado na memória ou na página. Presente/Ausente - dados estão na memória ou não Proteção - Se desligado está tentando invadir a área de outro processo. Referenciado - Processo usou esse endereço (É marcado o tempo da última vez que foi referenciado) - Se tiver muito tempo que foi referenciado da última vez, o frame será retirado se necessário. □ Entrada típica de página Substituição de página: Processo gera um endereço virtual que quando mapeado não está na memória principal. Acha a página no disco e a leva para a RAM - ela está cheia, precisa-se substituir uma página que está lá. Retira-se uma página da memória principal e a leva para o disco. □ A primeira vez que o processo referência um frame dá falta de página porque ainda não está na memória. É a primeira vez que inicia um processo, é mais lento por isso. Paginação:○ Técnicas de Mapeamento• Falta de página força uma escolha Antes de tirar da memória RAM o frame tem que ser salvo no disco para não pegar uma página antiga. □ Página modificada deve primeiro ser salva Tira-se a que está mais tempo sem uso. □ Melhor não escolher uma página que está sendo muito usado Substitui o frame, mas faz um ajuste na tabela de páginas○ Algoritmos de Substituição de Página - Escolhe um frame para sair. • FIFO: Substitui a página mais antiga da lista, em relação a entrada na memória RAM, não se importa se foi recentemente modificada ou usada. ○ Segunda Chance: Usa o bit referenciada. Variação do FIFO, mas se a página mais antiga tiver sido referenciada (bit 1) ela não é retirada, o bit é zerado e a página é colocada no fim da fila, vira jovem novamente, mas se todas as páginas tiverem sido referenciadas, volta-se para FIFO. Minimiza-se o risco de tirar uma página que está sendo usada. - Passa de página em página testando o R. ○ Relógio: As páginas não ficam mais em fila (gera custo para percorrer). Cria-se um ponteiro, fila circular. As páginas ficam onde devem e o ponteiro aponta para elas. As páginas não são reorganizadas como no algoritmo segunda-chance, mas a substituição é igual. Só tira o custo de percorrer a fila - vetor- Ponteiro é um custo menor. ○ Classe 0: Não referenciada nem modificada. Classe 1: Não referenciada, mas modificada. Classe 2: Referenciada, mas não modificada. Classe 3: Referenciada e modificada. Páginas são retiradas aleatoriamente - sem estrutura de dados, estruturação ruim - não por lista ou vetor. Segue da classe mais baixa para a mais alta. NUR (Não usado recentemente): Página tem bit referenciado e modificado. Páginas são classificadas em:○ LRU ou MRU (Menos usada recentemente): Assume que página usada recentemente logo serão usadas novamente. Lista encadeada de página deve ser mantida; página mais recentemente usada vai para o início da fila, tira-se a página do final da fila. ○ Página 25 de Sistemas Operacionais da fila, tira-se a página do final da fila. Algoritmo determina qual página sai. Memória está cheia, uma página (processo) é retirada para que seja colocado uma nova página. ○ Algoritmo de substituição de página:• Nem sempre que há falta de página há substituição de página, a memória principal pode ter espaço para a nova página. Processo requisita determinado endereço de memória, este não está na memória principal - falta de página, tem que buscar na memória secundária. ○ Falta de página:• Página 26 de Sistemas Operacionais Problemas: Quando um processo sai, fica um buraco no espaço, que pode não caber outro processo, gerando a fragmentação. □ Pode ser em alocação contígua - vetor Lista ligada relaciona os blocos espalhados que o processo ocupa, não é contígua, diminui a fragmentação. Sistema encadeado. FAT: não tem na memória primária, é o mais conhecido. Há uma tabela com blocos. Gravar na memória RAM○ Como a memória é alocada:• Deve ser possível armazenar uma quantidade muito grande de informação - GB1 Persistência - A informação deve sobreviver ao término do processo que a usa. 2 Múltiplos processos devem ser capazes de acessar a informação concorrentemente. 3 Armazenamento de longo prazo - memória secundária. • Indiferente para o SO, facilita para as aplicações que os rodam. ○ Linux determina se um arquivo é executável pelos modificadores de arquivos. (-x)○ Extensão de arquivo• O arquivo não passa de um amontoado de bytes organizados em diretórios. i. Organização não estruturada - Utilizada pelo SO. I. Há uma preocupação com a busca de um arquivo, que se torna mais rápida. i. Árvore binária: Tem como objetivo criar uma árvore de busca, rápida. ii. Organização indexada - Utilizada em Bancos de Dados. II. Organização dos Arquivos:• Sequência de bytes - SOa. Sequência de registro - Struct em Cb. Árvore - Banco de Dados. c. Formas de se ver um arquivo• Lê todos os bytes/registros desde o início Não pode saltar ou ler fora de sequência Conveniente quando o meio era a fita magnética Acesso sequencial - Fita VHS○ Bytes/registros lidos em qualquer ordem Essencial para sistemas de base de dados Mover marcador do arquivo - seek - e então ler, ou...□ Ler e então mover marcador de arquivo. □ Ler pode ser: Aceso aleatório - CD - Acesso direto○ Acesso aos arquivos• Atributos de um arquivo -• Recorte de tela efetuado: 24/02/2016 14:44 Operações de E/S - Rotinas de E/S • Recorte de tela efetuado: 24/02/2016 14:45 Create: SO aloca blocos. ○ Open: Torna o arquivo pronto para acesso. SO enxerga o arquivo no processo. Processo sabe onde está pelo menos o primeiro bloco do arquivo. ○ Função OPEN/CLOSE - garantem a consistência . Um app por vez no arquivo. Arquivo aberto não é deletado. Close: Fecha a permissão, concretiza as informações no disco. ○ Apagar um bloco significa sobrescreve-o todo com zeros. Se o espaço for requisitado, vai sendo sobreposto. ->. Qualquer sistema de persistência. Delete: SO não deleta o arquivo, é marcado como deletado. É uma operação muito cara para deletar. ○ Se um arquivo estiver fechado e ele for criado de novo, é sobrescrito.○ Quando manda copiar um arquivo par ao pendrive, usa-se RAM como buffer, quando manda ejetar que realmente é salvo no pendrive. ○ Diretório: Pasta - forma de organizar arquivos.○ Sistema de diretórios em nível único• O primeiro bloco armazena onde o outro bloco está. Guarda informação e há mais o endereço para o próximo. ○ O último bloco tem que ter o controle de que é o último bloco. Alocação Encadeada:• Curto prazo = RAM• Dado persistente = armazenadoem longo prazo. Persistido = gravado. • SO busca arquivo com força bruta = SO olha de arquivo em arquivo. • Em questão de gerenciamento de arquivos - SO é diferente de Banco de Dados. • Cartucho de videogame é similar ao cartucho que backup - Estende o hardware. • Arquivos são divididos em blocos - Blocos menores são mais fáceis de controlar do que blocos grandes. • Formatação Lógica -Destrói o MBR - primeira trilha do disco que diz as partições de um disco • I-NODE - Aponta para o diretório○ FAT - Blocos de tamanhos variados. ○ MS-DOS○ NT-FS - Windows ○ Pesquisas:• Desfragmentação: Usando o computador ao mesmo tempo gera lentidão, o SO fica analisando qual parte está sendo usada pelo usuário. • 10- Quanto mais unidos os blocos, principalmente no início do disco, mais longe do eixo onde a leitura é mais rápida. ○ Ler capítulo 4 do livro e fazer exercícios.• Diferenças entre as implementações - prós e contras. ○ Fragmentação○ Espaço Ocupado○ Questão de prova:• Fica na parte do SO na RAM○ Mapa de Bits, Tabela de Espaço livre: • Capítulo 4 - Sistemas de Arquivos domingo, 14 de fevereiro de 2016 10:19 Página 27 de Sistemas Operacionais O último bloco tem que ter o controle de que é o último bloco.○ Se desfragmentar ainda melhora o desempenho, pois os ponteiros ficam mais próximos. Diminui a fragmentação pois os blocos estão espalhados e são ordenados por ponteiros.○ Parte dos blocos é gasta com os ponteiros - Alocação encadeada de blocos○ FAT na RAM: navega na RAM, não no disco, não gasta espaço do bloco. Não há ponteiros nos disco. Alocação encadeada com tabela de alocação: ○ Há uma tabela que diz onde um arquivo começa. Há uma tabela na RAM onde dentro de cada arquivo há o endereço de outro bloco.• Cada bloco sabe onde está o outro, se der algum erro, tem que se iniciar novamente. ○ Perde-se espaço do bloco para guardar o endereço do próximo bloco. ○ Lista Encadeada:• A tabela tem os endereços dos processos○ FAT fica no disco, quando em execução vai para a RAM para aumentar o desempenho. Quanto mais RAM, melhor Alocação encadeada com a tabela - FAT○ Ponto negativo: Ocupa RAM○ Ponto positivo: O acesso é direto, mais rápido○ Bloco de indice - arvore leva a informação. Alocação indexada○ Alocação em tabela:• Acesso rápido ao arquivo. Cada arquivo tem os endereços dos blocos que o arquivo ocupa.○ Quando um arquivo é criado, já é definido seus atributos e seu endereço inicial - bloco no disco. ○ Levado para a RAM, que enche - quanto mais RAM melhor Cada bloco lógico contém um ponteiro para um bloco real - físico○ Desvantagem: Quanto maior o arquivo, maior o I-node do arquivo. ○ Quando um arquivo é aberto seu I-node é carregado para a RAM pelo SO○ No Unix diretórios também tem I-nodes, mas ocupam pouquíssimo espaço no disco○ I-node tem bloco físico, leva ao conteúdo do bloco, onde há o subdiretório que tem seu I-node.○ Quanto mais sub I-node, mais devagar o acesso. I-node tem limite de tamanho. Quando atinge o limite, são criados novos I-nodes apontados por ponteiros no I-node inicial. ○ I-nodes: Unix • SuperBloco : onde fica o FAT• Bloco de BOOT: da o Start Inicial - há o MBR• Diretório-raiz: se for corrompido não há como navegar pelos arquivos. • Gera muito overhead ao SO○ Lista Encadeada○ Tabela/contador = quantos blocos livres há sequencialmente a frente do bloco inicial○ Dado um bloco quer saber quantos há livres depois deles○ Há uma confusão -> fragmentação - livre e ocupados bagunçados. SO de tempos em tempos junta os espaços livres Gerenciador começa procurando pelo início e descendo - percorrendo até achar outros blocos livres para alocar○ O bloco livre pode estar só marcado como livre - deletado○ Tabela não é atualizada o tempo todo. ○ Gerencia de Espaço Livre• O I-node teria que ser lido no disco, muito mais lento que na RAM - se não houvesse o open. Open: I-node vai para a RAM - UNIX○ Chamada de Sistema• Página 28 de Sistemas Operacionais O Problema do Jantar dos Filósofos (com threads) Em ciência da computação, o problema do jantar dos filósofos é um exemplo ilustrativo de um problema comum de programação concorrente. É mais um problema clássico de sincronização multi-processo. O problema pode ser resumido como cinco filósofos sentados ao redor de uma mesa redonda, cada qual fazendo exclusivamente uma das duas coisas: comendo ou pensando. Enquanto está comendo, um filósofo não pode pensar, e vice-versa. Cada filósofo possui um prato cheio de spaghetti à sua frente. Além disso, um garfo é posicionado entre cada par adjacente de filósofos (portanto, cada filósofo tem exatamente um garfo à sua esquerda e exatamente um garfo à sua direita). Como spaghetti é uma comida díficil para se servir e comer com um único garfo, assume-se que um filósofo necessita de dois garfos para poder comer. E, além disso, um filósofo só pode utilizar um garfo que esteja imediatamente à sua esquerda ou imediatamente à sua direita. A falta de disponibilidade de garfos é uma analogia à falta de recursos compartilhados em programação de computadores (situação conhecida como concorrência). Travar (lock) um recurso é um técnica comumemente utilizada para assegurar que o recurso está sendo acessado somente por um programa ou trecho de código, por vez. Quando um programa está interessado em um recurso que já foi travado por outro, o programa espera até que ele seja destravado. Quando existem vários programas envolvidos no travamento de recursos, um deadlock pode acontecer, dependendo das circunstâncias. Para exemplificar, podemos citar um programa que necessita processar dois arquivos. Quando duas instâncias desse programa travam um arquivo cada, ambos os programas esperam o outro destravar o arquivo que falta, o que nunca irá ocorrerá. Em geral, o problema do jantar dos filósofos é um problema genérico e abstrato que é utilizado para explicar diversas situações indesejáveis que podem ocorrer em problemas que tem como principal idéia a exclusão mútua. Por exemplo, assim como no caso acima, deadlock/livelock é um conceito que pode ser bem explicado através do problema dos filósofos. Abaixo encontra-se uma possível solução para o problema. A solução apresentada é livre de deadlocks e permite o máximo de paralelismo a um número arbitrário de filósofos. Ela usa um arranjo, state, para controlar se um filósofo está comendo, Jantar dos Filósofos domingo, 31 de janeiro de 2016 09:59 Página 29 de Sistemas Operacionais arbitrário de filósofos. Ela usa um arranjo, state, para controlar se um filósofo está comendo, pensando ou faminto (tentando pegar garfos). Um filósofo só pode mudar para o estado 'comendo' se nenhum dos vizinhos estiver comendo. Os vizinhos do filósofo i são definidos pelas macros LEFT e RIGHT. Em outras palavras, se i for 2, LEFT será 1 e RIGHT será 3. O programa usa um arranjo de semáforos, um por filósofo; assim, filósofos famintos podem ser bloqueados se os garfos necessários estiverem ocupados. Observe que cada thread executa o procedimento philosopher como seu código principal, mas os outros procedimentos - take_forks, put_forks e test - são procedimentos ordinários, e não processos separados. Figura1: Saída do Programa (clique na figura para melhor visualização) Código: #include "stdio.h" #include "stdlib.h" #include "unistd.h" #include "fcntl.h" #include "sys/types.h" #include "pthread.h" #include "semaphore.h" #define N 5 /* número de filósofos*/ #define LEFT (i+N-1)%N /* número do vizinho à esquerda de i*/ #define RIGHT (i+1)%N /* número do vizinho à direito de i*/ #define THINKING 0 /* o filósofo está pensando*/ #define HUNGRY 1 /* o filósofoestá tentando pegar garfos*/ #define EATING 2 /* o filósofo está comendo*/ #define TRUE 1 < int state[N]; /* arranjo para controlar o estado de cada um*/ sem_t mutex; /* exclusão mútua para as regiões críticas*/ sem_t s[N]; /* um semáforo por filósofo*/ /* protótipos */ void* philosopher(void* arg); void take_forks(int i); Página 30 de Sistemas Operacionais void take_forks(int i); void put_forks(int i); void test(int i); void eat(int i); void think(int i); int main() { int i; sem_init(&mutex, TRUE, 1); for(i = 0; i < N; i++) { sem_init(&s[i], TRUE, 1); } pthread_t tphil[5]; /* criando os 5 filósofo - 1 thread para cada*/ for(i = 0; i < N; i++) { pthread_create(&tphil[i], NULL, (void *) philosopher, (void *) &i); } for(i = 0; i < N; i++) { pthread_join(tphil[i], NULL); } return 0; } void* philosopher(void * arg) { /*i: o número do filósofo, de 0 a N-1*/ int i = *((int *) arg); while(TRUE) { /* repete para sempre*/ think(i); /* o filósofo está pensando*/ take_forks(i); /* pega dois garfos ou bloqueia*/ eat(i); /* o filósofo está comendo*/ put_forks(i); /* devolve os dois garfos à mesa*/ } pthread_exit(NULL); } void take_forks(int i) { /*i: o número do filósofo, de 0 a N-1*/ sem_wait(&mutex); /* entra na região crítica*/ state[i] = HUNGRY; /* registra que o filósofo está faminto*/ test(i); /* tenta pegar dois garfos*/ sem_post(&mutex); /* sai da região crítica*/ sem_wait(&s[i]); /* bloqueia se os garfos não foram pegos*/ } void put_forks(int i) { /*i: o número do filósofo, de 0 a N-1*/ sem_wait(&mutex); /* entra na região crítica*/ state[i] = THINKING; /* o filósofo acabou de comer*/ test(LEFT); /* vê se o vizinho da esquerda pode comer agora*/ test(RIGHT); /* vê se o vizinho da direito pode comer agora*/ sem_post(&mutex); /* sai da região crítica*/ } void test(int i) { if (state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING) { state[i] = EATING; Página 31 de Sistemas Operacionais state[i] = EATING; sem_post(&s[i]); } } void eat(int i) { /*i: o número do filósofo, de 0 a N-1*/ printf("Filosofo %d estah comendo!\n", i); sleep( rand()%5 ); } void think(int i) { /*i: o número do filósofo, de 0 a N-1*/ printf("Filosofo %d estah pensando!\n", i); sleep( rand()%10 ); } De <http://ces33.blogspot.com.br/2009/05/o-problema-do-barbeiro-dorminhoco-com.html> Página 32 de Sistemas Operacionais programmerinterview.com February 9, 2016 The reason that semaphores and monitors are needed is because multi-threaded applications (like Microsoft Word, Excel, etc) must control how threads access shared resources. This is known as thread synchronization – which is absolutely necessary in a multi-threaded application to ensure that threads work well with each other. If applications do not control the threads then it may result in corruption of data and other problems. Do I use a monitor or a semaphore? Monitors and semaphores are both programming constructs used to accomplish thread synchronization. Whether you use a monitor or a semaphore depends on what your language or system supports. What is a Monitor? A monitor is a set of multiple routines which are protected by a mutual exclusion lock. None of the routines in the monitor can be executed by a thread until that thread acquires the lock. This means that only ONE thread can execute within the monitor at a time. Any other threads must wait for the thread that’s currently executing to give up control of the lock. However, a thread can actually suspend itself inside a monitor and then wait for an event to occur. If this happens, then another thread is given the opportunity to enter the monitor. The thread that was suspended will eventually be notified that the event it was waiting for has now occurred, which means it can wake up and reacquire the lock. What is a Semaphore? A semaphore is a simpler construct than a monitor because it’s just a lock that protects a shared resource – and not a set of routines like a monitor. The application must acquire the lock before using that shared resource protected by a semaphore. Example of a Semaphore – a Mutex A mutex is the most basic type of semaphore, and mutex is short for mutual exclusion. In a mutex, only one thread can use the shared resource at a time. If another thread wants to use the shared resource, it must wait for the owning thread to release the lock. Differences between Monitors and Semaphores Both Monitors and Semaphores are used for the same purpose – thread synchronization. But, monitors are simpler to use than semaphores because they handle all of the details of lock acquisition and release. An application using semaphores has to release any locks a thread has acquired when the application terminates – this must be done by the application itself. If the application does not do this, then any other thread that needs the shared resource will not be able to proceed. Another difference when using semaphores is that every routine accessing a shared resource has to explicitly acquire a a lock before using the resource. This can be easily forgotten when coding the routines dealing with multithreading . Monitors, unlike semaphores, automatically acquire the necessary locks. Is there a cost to using a monitor or semaphore? Yes, there is a cost associated with using synchronization constructs like monitors and semaphores. And, this cost is the time that is required to get the necessary locks whenever a shared resource is accessed. Monitors vs Semaphores quarta-feira, 10 de fevereiro de 2016 11:39 Página 33 de Sistemas Operacionais stackoverflow.com February 9, 2016 A Monitor is an object designed to be accessed from multiple threads. The member functions or methods of a monitor object will enforce mutual exclusion, so only one thread may be performing any action on the object at a given time. If one thread is currently executing a member function of the object then any other thread that tries to call a member function of that object will have to wait until the first has finished. A Semaphore is a lower-level object. You might well use a semaphore to implement a monitor. A semaphore essentially is just a counter. When the counter is positive, if a thread tries to acquire the semaphore then it is allowed, and the counter is decremented. When a thread is done then it releases the semaphore, and increments the counter. If the counter is already zero when a thread tries to acquire the semaphore then it has to wait until another thread releases the semaphore. If multiple threads are waiting when a thread releases a semaphore then one of them gets it. The thread that releases a semaphore need not be the same thread that acquired it. A monitor is like a public toilet. Only one person can enter at a time. They lock the door to prevent anyone else coming in, do their stuff, and then unlock it when they leave. A semaphore is like a bike hire place. They have a certain number of bikes. If you try and hire a bike and they have one free then you can take it, otherwise you must wait. When someone returns their bike then someone else can take it. If you have a bike then you can give it to someone else to return --- the bike hire place doesn't care who returns it, as long as they get their bike back. Semaphore vs. Monitors - what's the difference? quarta-feira, 10 de fevereiro de 2016 11:40 Página 34 de Sistemas Operacionaispaulomotta.pro.br August 25, 2009 Os computadores com mais de um processador chegaram para ficar. Existem pesquisas no sentido de substituir o silício usado para construir os processadores por outra substância, mas enquanto isso não se torna economicamente viável a saída para o silício, uma vez que chegamos ao limite de velocidade que podemos atingir, a alternativa é aumentar a quantidade de núcleos executando. Isso significa na prática que agora o sistema operacional pode colocar mais de um programa efetivamente executando ao mesmo tempo. Embora possam executar ao mesmo tempo porque haverá mais de um processador, as aplicações vão concorrer pelos outros recursos, porque de acordo com nossas arquiteturas baseadas no modelo von Neuman, usamos um barramento para fazer as trocas de informações e para acessar canais de entrada e saída. Essa característica já é estudada nos cursos de sistemas operacionais há tempos, até porque quando só havia um núcleo disponível (e isso ainda acontece em diversas plataformas) as aplicações concorrem também pelo uso do processador. A parte interessante é que este problema, típico da área de sistemas, foi trazido para a área de aplicações inicialmente quando tivemos acesso à criação de novos processos (via fork por exemplo) e à threads. Neste último caso, as novas linguagens já trazem suporte ao trabalho com threads de forma nativa o que ajudou muito a difundir seu uso, no entanto talvez não tenhamos dado devida atenção ao domínio das técnicas para usar esse tipo de ferramenta. Existe muito material disponível sobre threads, mas por hora podemos entender como sendo as linhas de execução de um programa, ou seja, mais de uma tarefa do próprio programa acontece (ou tenta acontecer) ao mesmo tempo. Com isso temos que nos preocupar com os problemas de concorrência, originalmente da área de sistemas, dentro da nossa aplicação. Condições de corrida (race conditions) – dois ou mais participantes (aplicações) disputam entre si por um recurso, ou seja, se assemelha a uma corrida por um troféu. • Regiões críticas (critical regions) – são as regiões ou seções do programa em que fazemos uso do recurso que é compartilhado, identificando essas partes do programa torna-se possível isolá-las de forma que possamos controlar o início e fim do uso de algum recurso compartilhado. • Para isso vale a pena rever os conceitos ensinados em sistemas operacionais referentes a: Tendo relembrado desses conceitos a primeira coisa que temos a falar é da exclusão mútua, que significa que dois ou mais participantes excluem-se entre si, ou seja, só um pode acessar o recurso compartilhado por vez. O problema então é: como conseguir sinalizar isso? Para responder essa pergunta temos uma série de técnicas que foram propostas também para a área de sistemas operacionais, até porque são técnicas de mais baixo nível. O ideal é que o mecanismo ou estratégia de exclusão mútua seja fornecido pelo ambiente (ou pela linguagem, ou pela biblioteca) usado. A primeira forma que pensamos é a espera ocupada (busy wait), onde o processo que está esperando gasta seus ciclos de processador sem fazer nada, basicamente equivale a fazer um laço (while ou for) onde testamos a condição para saber se já pode ser executado. Como o sistema operacional faz a troca de processos de tempos em tempos, eventualmente o processo que tem controle do recurso vai terminar de usar e liberar, e alguém da fila de espera vai ser colocado para executar. Quando essa nova troca acontece o laço encerra uma vez que a condição de recurso livre foi atingida. Esses turnos vão se alterando, o que percebemos é que essa estratégia desperdiça ciclos de processador sem realizar uma tarefa útil, logo só serve como exemplo. Em alguns casos de máquinas com vários processadores (ou vários núcleos) pode ser necessário usar essa técnica para sincronizar a leitura de registradores compartilhados ou para verificar se um outro núcleo já disponibilizou o conteúdo esperado, encontramos exemplos disso em vários dos manuais da IBM para programação do Cell Broadband Engine, processador que equipa o Playstation 3 da Sony. Uma outra alternativa mais de baixo nível (especificamente no nível da máquina exatamente) é ter uma instrução capaz de testar uma variável (ou registrador) e no mesmo ciclo trocar seu valor. A ideia aqui é que se a variável não estiver com alguma das aplicações concorrentes então quem executou essa instrução consegue o recurso, se não estiver disponível então simplesmente retorna. Bom a questão aqui é como disponibilizar essa instrução para as linguagens de mais alto nível Por outro lado se usarmos uma solução baseada no sistema operacional ao invés de uma instrução de Exclusão Mútua, Semáforos e Monitores quarta-feira, 10 de fevereiro de 2016 11:40 Página 35 de Sistemas Operacionais Por outro lado se usarmos uma solução baseada no sistema operacional ao invés de uma instrução de máquina, torna-se mais simples de torná-la acessível para as linguagens de programação de alto nível A alternativa é usar duas chamadas do sistema SLEEP (dormir) e WAKEUP (acordar), dessa forma quando testamos a variável e verificamos que a condição que precisamos não está disponível, executamos a chamada SLEEP para que o processo possa esperar até que o recurso esteja disponível De forma simétrica quando liberamos um recurso, chamamos WAKEUP dizendo qual processo deve executar agora (de forma que vá conseguir o recurso que tem interesse.) Quando usamos semáforos, essas chamadas de sistema são encapsuladas em chamadas que realizam um controle extra. Isso é necessário porque as chamadas SLEEP e WAKEUP não conseguem por si só garantir a exclusão mútua. Um semáforo é uma variável especial sobre a qual podemos executar as operações DOWN (abaixar) e UP (levantar.) Como chamadas de sistemas, precisam ser implementadas com algum código, dentro desse código, além de verificar o valor da variável passada (o semáforo) também trocamos o valor se for o caso, como se fosse uma instrução de baixo nível Para garantir que o processo executando não vai ser interrompido antes da variável trocar o valor as interrupções da máquina são desligadas, isso garante a execução atômica, ou seja, como se fosse uma única instrução, logo em seguida as interrupções de máquinas são ligadas e o processo já pode ser trocado pelo sistema operacional. Uma outra característica importante é que o uso de semáforos permite tornar a concorrência uma tarefa de mais alto nível já que elimina o uso de referências direta aos outros processos. Se for necessário um conjunto grande de processos executando o uso de semáforos permite conhecer apenas uma variável, enquanto a referência direta necessitaria de um vetor para armazenar todas as referências. O problema surge quando usamos mais de um semáforo para controlar tanto a exclusão mútua quanto o uso do recurso compartilhado. Neste caso se não nos concentrarmos na ordem de execução das operações podemos acabar bloqueados Uma solução para isso é o uso de monitores, que na verdade é uma construção mais ampla composta de funções e estruturas de dados próprias. Normalmente o compilador conhece essa estrutura e é o compilador que ordena as questões referentes as garantias de exclusão mútua e sincronização, isto porque um monitor é construído sobre as soluções oferecidas pelos semáforos. A vantagem disso é que o programador passa a usar um mecanismo de mais alto nível e só precisa conhecer as operações WAIT (esperar) e SIGNAL (sinalizar,) usadas sobre uma variável que é o monitor, ou seja, quando o programador declara a variável, o compilador intervem colocando as instruções necessárias para as garantias. Do ponto de vista conceitual, as soluções
Compartilhar