Baixe o app para aproveitar ainda mais
Prévia do material em texto
Aula 1 Conceitos fundamentais de sistema operacionais O que é um sistema operacional? É um conjunto de programas (software) responsável por: Fazer a interface com os usuários; Gerenciar recursos; Fazer a interface com o hardware. (Segurança e estabilidade) É um intermediário entre o usuário e o hardware. Cada parte (módulo ou função) de um sistema operacional é responsável pelo gerenciamento de um recurso específico. Que recursos são esses? Tempo da CPU Espaço em memória Espaço em disco Acesso aos dispositivos de comunicação Bibliotecas de software Gerenciar recursos é garantir a utilização compartilhada do recurso sem que ocorram erros que possam gerar instabilidade ou falha no sistema. Na visão do usuário, o sistema operacional fornece: Acesso ao sistema; Possibilidade de criar e gerir arquivos e diretórios; Ambiente para execução de programas Acesso aos dispositivos de entrada e saída. Acesso ao conteúdo de arquivos Detecção de erros. Classificação de sistemas operacionais A classificação é utilizada como uma forma sintética de apresentar, em poucas palavras, as características de um sistema operacional. Sistemas monotarefa x Sistemas multitarefa o Monotarefa: Admite e gerencia apenas uma tarefa em execução por vez. Ex: DOS o Multitarefa: Admite e gerencia várias tarefas em Processamento concorrente. Ex: Windows XP, Windows 2003, Linux, MacOS Sistemas monousuário x sistemas multiusuário o Monousuário: Admite e gerencia apenas um usuário – não permite que mais de um usuário esteja “logado” simultaneamente. Ex: Windows XP, Windows NT (exceto versão com Terminal Server). o Multiusuário: Sistema Multiusuário: Admite e gerencia vários usuários – permite que mais de um usuário esteja “logado” simultaneamente. Ex: Linux, VMS OBS: Todo sistema operacional multiusuário é obrigatoriamente multitarefa, pois cada usuário representa, no mínimo, uma tarefa para ser executada. Sistemas monoprocessadores x Sistemas multiprocessadores o Monoprocessadores: Somente reconhecem e utilizam um processador. Ex. Windows 98 o Multiprocessadores: Sistemas multiprocessados: Reconhecem e utilizam mais de um processador. Ex. Windows XP, Windows Vista, Windows 7, Linux. OBS.: Sistemas com suporte a multiprocessamento podem executar mais de uma tarefa ao mesmo tempo; uma em cada processador. Sistema de tempo real e sistema embarcado: o Tempo Real: Sistemas que possuem um forte vínculo com o tempo. O resultado só é considerado correto se a execução acontecer no tempo previsto. O sistema deve garantir que uma tarefa possua todos os recursos necessários para sua execução em um intervalo de tempo pré-definido. OBS.: Não se trata de velocidade de processamento e sim garantia de tempo de resposta. o Embarcado: Sistemas inseridos em produtos com funções específicas como telefones celulares. OBS.: Nem todo dispositivo eletrônico possui um microcontrolador e nem todo aparelho com icrocontrolador possui um sistema operacional. EXTRA: Os SO multiprogramaveis ou multitarefa, podem ainda ser classificados pela forma com que suas aplicações são gerenciadas, podem ser divididos em sistema bath, de tempo compartilhada ou de tempo real. Um SO pode suporte um ou mais destes tipos de processamento, dependendo de sua implementação Estruturas dos sistemas operacionais modernos A partir do 80386, esse problema foi solucionado em termos de hardware através da possibilidade de 2 modos de execução: o modo protegido e o modo real. Ficava a cargo do sistema operacional a comutação entre esses dois modos por questões de compatibilidade. A instabilidade evidenciada pela “tela azul” tem razões históricas. Os primeiros processadores da linha x86 possuíam um único modo de operação: o modo real. Dessa forma, todas as operações poderiam ser executadas diretamente pelas aplicações que, ao produzir erros, geravam panes no sistema. Modo Usuário x Modo Kernel: Modo usuário é o que trabalhamos normalmente onde não tenho acesso as função do sistema operacional que podem comprometer o sistema. (Instruções não privilegiadas). System Call = Porta de acesso ao Kernel. Verifica se o modo de usuário pode executar determinada tarefa sem comprometer o sistema. Modo Kernel s (Instruções Privilegiadas) As aplicações são executadas em modo usuário, ou seja, modo que não possui privilégios para operações que coloquem o sistema em risco tais como escrever no disco, criar novas tarefas etc. Quando essas aplicações precisam executar tarefas críticas, é necessário que haja uma mudança para modo Kernel. Essa mudança ocorre através de uma “system call” ou chamada ao sistema. Chamadas ao sistema (system call): Mecanismo responsável pela mudança de modo usuário para modo kernel. Ao invés de executar diretamente funções do kernel a aplicação executa uma função intermediária que verifica se o acesso ao kernel é seguro e, só então, completa a operação. Voltando à “tela azul”: As aplicações podiam executar diretamente as funções do kernel sem a proteção da mudança de modo, ou seja, o erro acontecia após a execução de uma função do kernel. Com a mudança de modo, se a execução não for segura, a aplicação será impedida de continuar a execução e o sistema permanecerá estável. Exemplo: Chama uma função XYZ que chama uma biblioteca de funções, que chama o modo kernel. O system call verifica se está tudo ok e aciona a função ou retorna um erro. Execução não protegida: dá tela azul porque acessa diretamente ao kernel. o Execução protegica: não dá tela azul, apresenta um erro do programa, pois ocorre a mudança do modo de usuário para o modo kernel, pela chamada ao sistema (system call) o Tipo de estruturas: Os sistemas são classificados em relação às atribuições do kernel e a relação entre seus módulos em monolíticos, camadas e microkernel. Os sistemas modernos são divididos em dois grandes grupos: arquitetura monolítica e microkernel. A diferença entre elas está nas atribuições do núcleo do sistema operacional, denominado KERNEL. Essa característica é muito importante no projeto de um Sistema Operacional e foi alvo de discussão entre dois grandes nomes da computação: Andrew Tanenbaum (autor de sistema minix para fins educacionais) e Linus Torvalds (Autor do Linux) Arquitetura monolítica: Todo o kernel é compilado e “linkado” em um único bloco, tornando o código eficiente, porém de difícil manutenção. A inclusão ou exclusão de um módulo requer que todo o kernel seja recriado. Arquitetura microkernel: Somente as funções críticas fazem realmente parte do kernel. Demais funções são tratadas como tarefas e executam em modo usuário fazendo chamadas ao kernel quando necessário. Essa arquitetura simplifica a manutenção, inclusão e exclusão de módulos do sistema operacional não sendo necessário gerar um novo kernel a cada modificação e nem mesmo reiniciar o computador para ativação e desativação do módulo. Interrupções São sinais de hardware fundamentais para a existência de sistemas multitarefa, pois provocam a suspensão da tarefa em execução pela ocorrência de um evento externo permitindo que outras tarefas compartilhem o tempo de uso do processador. Neste caso, o que está sendo compartilhado é o TEMPO DE USO do processador e NÃO o processador em si. Cada tarefa utiliza 100% do processador. Parte do mecanismo é executada pelo hardware (identificação do dispositivo, empilhamento dos registradores de sistema) e parte é feita por software através da rotina de tratamento da interrupção (interrupt handler). Tipo de interrupções As interrupçõessão geradas por dispositivos de hardware e podem ocorrer de forma síncrona ou assíncrona. Relógio (temporizador) -> síncrona Dispositivos de E/S (sinalização de conclusão) -> assíncrona Falha de hardware (paridade de memória, erro de disco etc.) -> assíncrona O termo interrupção é muitas vezes utilizado para qualquer atividade que suspenda a execução de uma tarefa, mesmo que seja solicitada pelo próprio programa. Utilizaremos, para este fim, o termo “estado de exceção”. Estados de exceção: são provocados pela própria aplicação. Estouro aritmético. Divisão por zero. Instrução ilegal. Acesso não permitido. Chamadas ao sistema. ATENÇÃO: Mascaramento de interrupções: Capacidade de inibir a ação de uma interrupção. As interrupções de segurança não podem ser mascaradas. As Interrupções podem acontecer de forma sequencial ou em cascata. Sequencial: uma interrupção só poderá ser atendida se nenhuma outra estiver em atendimento. A Rotina de Serviço desabilita as interrupções. Uma nova interrupção só é tratada após o retorno. A interrupção pode demorar a ser tratada, o que pode eventualmente ocasionar uma perda de dados. Finalizada a Rotina de Serviço de interrupção, o processador verifica por interrupções adicionais. Cascata: Uma interrupção pode interromper a ação de uma rotina de tratamento de outra interrupção. Interrupções têm prioridade. Interrupções com alta prioridade interrompem rotinas de serviço de interrupções de menor prioridade. Exemplos de prioridade: Impressora, disco, comunicação Conceitos de concorrência. Compartilhar recursos significa que diferentes usuários ou programas usam os recursos de forma concorrente. Como administrar recursos compartilhados? Os recursos são limitados e, assim, o uso dos mesmos pelos diferentes programas ou usuários precisa ser controlado e administrado de forma a evitar possíveis conflitos ou uma alocação por tempo indeterminado de algum recurso. Concorrência É a capacidade de execução concorrente de tarefas permitindo um melhor aproveitamento de recursos. Uma tarefa pode deixar a CPU por vontade própria, quando precisa aguardar por um recurso, ou por uma interrupção. Em particular, uma interrupção de temporizador provoca a substituição da tarefa em execução criando uma alternância entre as tarefas. Atenção: A alternância entre as tarefas pode dar a impressão de execução simultânea de tarefas, mas não é o que ocorre. Aula 2 - Processo Conceito: Processo é a instância de um programa em execução. É a unidade de carga e alocação de uma tarefa. Em sistemas mais antigos, também é considerado a unidade de execução, mas veremos, na próxima aula, que isso não é verdade nos sistemas modernos. Cada processo é único em um sistema. O processo é criado quando o programa é carregado para a memória principal para ser executado. Um programa é carregado para a memória onde aloca uma determinada área para código e dados. Componentes Um processo é dividido em partes que são armazenadas na memória em uma estrutura denominada PCB (process control block). Ciclo de vida de um processo: CRIAÇÃO -> EXECUÇÃO -> TÉRMINO CRIAÇÃO Quando um processo é criado? Quando executamos um programa. Quando um usuário acessa o sistema. Quando um processo gera um processo-filho. (mouse over em processo-filho com o seguinte texto: processo gerado internamente por outro processo) Etapas de criação Atribui um identificador único. Aloca uma entrada na tabela de processos. Aloca espaço para o processo. Inicializa o PCB (Process Control Block). Coloca o processo na fila apropriada. Cria estruturas auxiliares EXECUÇÃO DE UM PROCESSO A execução concorrente de processos leva às seguintes situações: Trocas de Contexto: substituição do processo em execução. Causas: Interrupção: Reação a um evento assíncrono. Trap: Associado a erro na execução de uma instrução. System Call: Requisição explícita. Ações: Salva o estado do processador. Muda o estado do processo. Muda o processo para a fila apropriada. Seleciona o novo processo. Atualiza o PCB do novo processo. Modifica os mapeamentos de memória. Restaura o estado do processador. Trocas de Modo de Execução É uma troca menor e mais rápida que a troca de contexto. O estado do processo corrente não é alterado. Ocorre geralmente quando o processador, ao final de um ciclo de instrução, detecta a existência de interrupção pendente. Nesses casos, o processador realiza os seguintes passos: Salva o contexto do processo em execução. Carrega o PC com o endereço inicial da rotina de interrupção. Troca o modo de execução de usuário para kernel (privilegiado) para que instruções privilegiadas do tratador de interrupções possam ser executas. TÉRMINO DO PROCESSO • Quando acaba o programa que está em execução. • Quando ocorre um erro. • Quanto é forçado pelo usuário a terminar. Estados No que diz respeito aos estados de um processo, o diagrama mais comum possui cinco estados e é suficiente para o entendimento dos demais estados intermediários. Observe-o abaixo: • Novo o Estado de admissão onde são geradas as estruturas de dados e alocado espaço para o processo. O processo recém-criado é configurado como “pronto”; • Pronto o Após a admissão, o processo está pronto para ser executado, mas aguarda sua vez. • Bloqueado o Um processo é bloqueado quando precisa aguardar um recurso. Esse bloqueio é síncrono, ou seja, sempre que o programa executar um determinado trecho, o bloqueio acontecerá (Ex.: Acesso a disco) • Executando o Apenas um processo por vez pode estar nesse estado. Após ser selecionado, o processo recupera seu contexto que é guardado após ter sua execução interrompida. • Fim o Ao terminar a execução do processo, as estruturas criadas são removidas e a área alocada é liberada. Atenção: A substituição do processo em execução é denominada troca de contexto. Quando o processo é interrompido seu contexto é armazenado. Quando o processo retorna para o estado de execução, seu contexto é recuperado. O sistema operacional NÃO pode provocar troca de contexto, uma vez que é um software e para gerar uma ação precisaria estar em execução. Tipos Os processos podem ser classificados em função de características de execução: • Processos CPU-Bound: São processos que passam a maior parte do tempo em estado de execução ou pronto. Realiza poucas operações de E/S. • Processo I/O-Bound: São processos que passam a maior parte do tempo em estado de espera, pois realizam um elevado número de operações de E/S. • Processos em foreground: Permitem a comunicação direta do processo com o usuário durante sua execução. Em geral, o canal de entrada está associado ao teclado/mouse e de saída a um monitor. • Processos em background: Processos em que não existe interação direta com o usuário. A estratégia utilizada para ordenar a execução de processos pode variar em função dos tipos de processo em um sistema. Aula 3 - Threads Conceito de threads Threads são fluxos de execução distintos dentro de um mesmo processo, um executável. Atualmente, uma thread é considerada a unidade de execução de um sistema ao invés do processo como um todo. Um processo pode ter uma ou mais threads. Veja o exemplo. Estrutura Um processo que contenha threads é composto pelo seu PCB (Process Control Block) e pelos blocos específicos para cada thread que contém uma estrutura de contextode software e uma estrutura de contexto de hardware. Cada thread possui contextos próprios de hardware e software, porém compartilham o mesmo espaço de endereçamento alocado ao processo. Tipo de threads As threads podem ser classificadas em: Threads de KERNEL: As threads de Kernel são criadas e gerenciadas pelo Kernel do sistema operacional, mas não podem ser diretamente utilizadas pelo usuário. O suporte a múltiplas threads é uma característica do sistema operacional. Exemplo: Bibliotecas de threads: POSIX Pthreads , Win32 threads, Java threads. Threads de USUÁRIO: As threads de usuário facilitam aspectos de portabilidade e são criadas e gerenciadas por uma biblioteca no nível do usuário. O Kernel não enxerga essas threads e, por esse motivo, não podem ser gerenciadas individualmente. Processo leve ou LWP. A combinação entre os dois tipos de threads promove uma associação entre threads de usuário e de Kernel, porém a forma de associação depende do sistema operacional. Esta é a solução mais utilizada nos sistemas modernos.Pois o uso combinado de threads de usuário e de Kernel permite melhor aproveitamento do tempo de CPU, possibilidade de paralelismo e facilidade de programação. Vamos conhecer agora os modelos de associação entre threads de usuário e de Kernel. Muitos para um: • Gerenciamento da thread é feito no espaço do usuário; • Usadas em sistemas que não suportam threads; • Uma thread bloqueada bloqueia todo o processo. • Um para um: • Cada thread de usuário é mapeada para uma Kernel thread; • Criar uma user thread requer a criação de uma thread de Kernel; • Algumas implementações restringem o número de threads suportada pelo sistema; • É utilizada pelo Windows e pelo Linux. • Muitos para muitos: • Permite que várias threads de usuário sejam mapeadas para um número menor ou maior de threads de Kernel dinamicamente; • Permite que o SO crie um número suficiente de threads de Kernel. • Motivação para o uso de threads Imagine a seguinte situação: Precisamos armazenar os tijolos produzidos por um equipamento que, ao término da fabricação de um tijolo, espera que haja alguém no final da esteira para pegá-lo. Se o procedimento de pegar o tijolo e levá-lo até o depósito for feito por uma única pessoa, provavelmente diversos tijolos caíram no chão enquanto essa pessoa leva um dos tijolos para o depósito. O que fazer? Se houver uma pessoa que fique na saída da esteira retirando os tijolos e os entregando para seus assistentes, a chance de que um tijolo caia no chão será muito reduzida, pois cada tijolo será entregue em um período de tempo constante ao assistente que o levará ao depósito. O encarregado de pegar os tijolos está “a postos” em um tempo conhecido, permitindo, assim, calibrar o equipamento. Pode haver muitos assistentes congestionando o caminho? Sim, identificando que o caminho não é suficiente para a demanda. Pensando agora em uma aplicação, como um servidor para transferências de arquivos. Uma thread fica “a postos” para receber requisições que serão entregues a novas threads criadas sob demanda para atender a cada uma das requisições. A cada requisição, uma nova thread é criada e a thread principal retorna imediatamente para aguardar novas requisições, evitando (ou reduzindo muito) o descarte de mensagens. Poderemos ter várias threads sendo executadas concorrentemente, podendo gerar um tempo de resposta maior, mas as requisições não serão perdidas. Só para registrar: esse tipo de servidor é chamado de servidor concorrente. As threads contribuem para o melhor uso dos recursos com: • Melhor aproveitamento da fatia de tempo - Permite que a execução do processo continue mesmo que algumas de suas Threads estejam bloqueadas. • Compartilhamento de Recursos - Threads compartilham memória e outros recursos do processo. • Economia de tempo de gerenciamento - Threads são mais econômicas de serem criadas e o custo da troca de contexto é menor. Todas as threads de um mesmo processo compartilham o mesmo espaço de endereçamento. • Utilização de Múltiplos Processadores - Cada Thread pode ser executada em paralelo em um processador distinto. AULA 04 – COMUNICAÇÃO ENTRE PROCESSOS Caso 2 Espera ocupada: O processo em espera ocupada continua no estado de pronto e, a cada execução, tenta continuamente o acesso à região crítica. Esse procedimento consome tempo de CPU desnecessariamente. Bloqueio: O processo será bloqueado e, é acordado quando o acesso a região crítica estiver liberado. Deadlock (impasse) : situação em que dois ou mais processos entram em um impasse aguardando um recurso que nunca estará disponível. Essa situação so é desfeita por um agente externo (ex.: interromper um dos processos). Starvation: Condição em que não há garantia de execução de um processo. A execução pode ser adiada por um tempo inderteminado. AULA 05 – SINCRONIZAÇÃO ENTRE PROCESSOS AULA 06 – GERENCIA DE TEMPO DE CPU Escalonador AULA 07 – GERENCIA DE ALOCAÇÃO DE MEMÓRIA Estratégias de organização lógica do espaço de memória - Paginado Quando um processo é carregado, suas páginas são alocadas em quaisquer molduras disponíveis, não necessariamente contíguas. O S.O. precisa manter uma tabela de páginas por processo e uma lista de molduras disponíveis. Cada processo pode ter fragmentação interna APENAS NA ÚLTIMA PÁGINA. AULA 08 – MEMÓRIA VIRTUAL Princípio da localidade As referências de memória tendem a ser agrupadas em termos espaciais e/ou temporais. Em um programa bem construído, a probabilidade média da próxima instrução a ser executada ser a seguinte ou estar nas redondezas da instrução corrente é mais elevada do que outras hipóteses. Somente alguns trechos do código são necessários para a execução num curto espaço de tempo. É possível ter uma razoável noção dos trechos de código que serão utilizados num futuro próximo, reduzindo os riscos de trashing. Redução de trashing: Poderia ser traduzido como “fazendo lixo” Ocorre quando o sistema passa a maior parte do tempo removendo e trazendo partes de processos ao invés de executar instruções dos mesmos. A memória normalmente está toda ocupada com partes de diversos processos; então, quando o SO precisa carregar uma nova parte, outra parte precisará ser removido para abrir espaço. Se for removida uma parte que seja referenciada logo a seguir, esta precisará ser carregada novamente. PAGINAÇÃO Estudaremos a organização Paginada por ser a implementação mais usual de memória virtual. AULA 09 – DISPOSITIVOS DE ENTRADA E SAÍDA AULA 10 – SISTEMA DE ARQUIVOS.
Compartilhar