Buscar

Aula 1 a 10 Sistemas Operacionais

Prévia do material em texto

Aula 1: Introdução a Sistemas Operacionais
Um velho conhecido pelos usuários de microcomputadores é a famosa “tela azul”. Quem já utilizou sistemas operacionais antigos, como o Windows 95, certamente já se deparou com este problema. A “tela azul” era de fato uma violação de acesso que tornava o sistema instável.
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.
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.
Veja as simulações de um aplicativo com erro:
Execução não protegida
Execução protegida
Tipos de estrutura: 
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 e Linus Torvalds.
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.
ATENÇÃO: 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.
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: Processos
Aula 3: 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.
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 contexto de 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.
Vamos entender melhor.
Pense em funções de um mesmo processo onde todas as funções são capazes, por exemplo, de ver e alterar o conteúdo de variáveis globais.
Vamos exemplificar com o seguinte trecho de programa:
Como a variável x é visível por todas as funções,
o valor final da variável x será 12. 
As funções enxergam a mesma área de memória.
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.
ATENÇÃO: 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.
Aula 4: Comunicação entre processos
MOTIVAÇÃO
Processos e threads em sistemas multitarefa compartilham recursos. 
Aprendemos nas aulas anteriores que processos e threads não executam direto, ou seja, desde o inicio até ao fim. Durante o tempo de execução, sofrem interrupções e ficam bloqueados aguardando recursos.
Suponha que um Processo P1 está executando quando é interrompido pelo final da fatia de tempo.
Outro Processo P2 será selecionado para execução e poderá querer utilizar o mesmo recurso que estava sendo utilizado por P1. 
E agora?
Vamos entender o exemplo:
Podemos perceber neste exemplo muito simples que obtivemos 3 resultados diferentes em função da ordem em que os processos ocorrem.
Esse efeito é denominado CONDIÇÃO DE CORRIDA.
Caso 1
Resultado final:  A = 3  B = 3
Caso 2
Resultado final:  A = 4  B = 4
Caso 3
Resultado final:  A = 3  B = 4
Há condição de corrida quando existem recursos compartilhados entre duas ou mais threads ou entre dois ou mais processos sem as devidas precauções.  
Mais uma informação importante:
Sabe aqueles problemas de “erro intermitente” do sistema operacional? 
Não existe erro intermitente de software, já que não existe “mau contato” dentro de um programa.
Erros intermitentes são mesmo erros de programação que ocorrem em determinadas situações. 
Essas situações podem se repetir ou não com frequência. Com a repetição do contexto é impraticável, torna-se muito mais difícil localizar um erro de execução do programa.
Para que um mecanismo de exclusão mútua seja efetivo, deve garantir que:
• Somente um processo por vez possa executar uma região crítica.
• Um processo interrompido fora de uma região crítica não possa impedir que outro processo tenha acesso a essa região crítica.
• Não possa haver nem deadlock nem starvation.
• Quando não houver processo executando uma região crítica, qualquer processo que solicitar acesso deverá obtê-lo imediatamente.
• Um processo deve permanecer executandouma região crítica por tempo finito.
• Nada possa ser assumido sobre a velocidade relativa e dos processos nem o número de processadores.
ATENÇÃO
Atenção para as condições de ocorrência de deadlock.
Aula 5: Sincronização entre Processos
Vamor Recordar
A utilização de mecanismos de exclusão mútua é necessária para impedir o acesso a uma região crítica por mais de um processo evitando, assim, condições de corrida.
Os mecanismos estão divididos em três categorias baseados em:
Algoritmo de Peterson.
Apresenta uma solução para dois processos que pode ser generalizada para N processos.
Antes de acessar a região crítica, o processo sinaliza esse desejo através de uma variável booleana flag.
Porém o processo cede o uso do recurso ao outro processo indicado pela variável vez.
Em seguida, o processo executa um loop até a obtenção da variável vez.
Além de permitirem a implementação de exclusão mútua, os semáforos também podem ser utilizados para sincronização condicional entre processos.
Um problema clássico que exemplifica essa função é o Problema do produtor /consumidor.
Caso 1
Problema do produtor/consumidor com buffer de armazenamento infinito.
 
Neste problema, serão utilizados dois semáforos: 
s -> exclusão mútua 
n -> controle de consumo.
Inicialmente s=1 e n=0
(região crítica liberada e não há itens para consumo).
Execução:
1. Se o consumidor executar primeiro: ao executar wait(n), decrementará o valor de n (que é zero), ficando negativo. O processo será bloqueado.
2. Quando um produtor executar, obterá acesso à região crítica incluindo um item no buffer e sinalizando que há itens produzidos incrementando o valor de n (signal n). Pelo algoritmo da função signal, o processo que está bloqueado será acordado.
Caso 2
Caso 1: Problema do produtor/consumidor com buffer de armazenamento finito.
Esse problema é semelhante ao anterior, porém será necessário outro semáforo de sincronização que controle os espaços vazios no buffer. Têm-se então três semáforos:  
s -> exclusão mútua 
n -> controle de consumo.
v -> controle de espaços vazios
Inicialmente s=1, n=0 e v=tamanho do buffer (região crítica liberada, não há itens para consumo e todos os espaços estão livres).
Execução:
• O produtor executará v vezes até que o buffer esteja cheio. Ao tentar executar mais uma vez, ficará bloqueado.
• Quando um consumidor executar, obterá acesso a região crítica removendo um item no buffer e sinalizando que há espaço disponível incrementando o valor de v (signal v).
Pelo algoritmo da função signal, o processo que está bloqueado será acordado.
• Suponha que o buffer possua três posições (v=3):
Agora temos um desafio. Tente resolvê-lo.
O Problema do Jantar dos Filósofos
Neste problema, há uma mesa com cinco pratos e cinco garfos posicionados entre cada um dos pratos.
Os filósofos ao redor da mesa estão pensando, mas podem ter fome e querer comer.
Para tal, é necessário utilizar os dois garfos que estão ao lado (direito e esquerdo) de cada prato.
O que aconteceria se cada filósofo que resolvesse comer segurasse o garfo direito para, depois, pegar o garfo esquerdo? Se todos tiverem a mesma ideia haverá um deadlock.
Situção:
1° - Permitir que apenas quatro filósofos sentem à mesa simultaneamente.
Conclusão:
Redução da concorrência.
Situção:
2° - Permitir que um filósofo pegue um garfo apenas se o outro estiver disponível.
Conclusão:
Possibilidade de starvation.
Situção:
3° - Permitir que um filósofo ímpar pegue primeiro o garfo da esquerda e, depois, o da direita  enquanto um filósofo par faça ao contrário.
Aula 6: Gerência de tempo de CPU
Escalonamento
Escalonar é uma função do Sistema Operacional que consiste em escolher (determinar) dentre os processos candidatos aquele que: 
Critérios de escalonamento
Critério de escalonamento: conjunto de regras que indicará qual o próximo processo que será executado.
Aula 7: Gerência de alocação de memória
Aula 8: Memória virtual
O que é Memória Virtual?
Consiste na utilização de espaços do disco rígido como extensão lógica da memória primária.
É transparente para o programador e para o processador.
Expande o tamanho da memória primária limitada ao tamanho da unidade de armazenamento.
Endereçamento
Todas as referências à memória são feitas utilizando endereços lógicos virtuais que são traduzidos em endereços físicos em tempo de execução. 
Essa operação é denominada MAPEAMENTO.
Com a memória virtual, acaba a necessidade de todas as partes de um processo estarem carregadas em memória primária.
 
Uma tarefa pode ocupar diferentes áreas de memória durante a sua execução.
Estudaremos a organização Paginada por ser a implementação mais usual de memória virtual.
Quando um endereço é referenciado, o sistema operacional verifica na tabela de páginas se a página que contém o endereço está ou não na memória:
• Página encontrada - Page Hit
• Página não encontrada - Page fault
Esta ação é chamada de paginação.
Existem alguns algoritmos de estratégia de substituição de páginas.
Os algoritmos básicos são:
Aula 9: Dispositivos de Entrada e Saída
As operações de E/S devem ser o mais simples e transparente possível.
O subsistema de E/S de um sistema operacional deve isolar a complexidade de operações específicas para cada tipo de dispositivo.
 É composto por um conjunto de rotinas que possibilita a comunicação com qualquer dispositivo conectado ao computador sem que o usuário se preocupe com os detalhes do dispositivo.
Aula 10: Sistema de arquivos
Conceitos de Arquivos e Diretórios 
Antes de iniciarmos é importante ressaltar alguns conceitos:
Características de um arquivo
Atributos de um arquivo
Os arquivos podem ser armazenados em diferentes dispositivos físicos como discos magnéticos, óticos, pen drive, fitas magnéticas etc.
ATENÇÃO: A forma como o arquivo é nomeado, armazenado e recuperado é definida pelo sistema de arquivos do sistema operacional.
Funcionalidades de um sistema de arquivo
Critérios para escolha de uma organização de arquivo
Operações sobre arquivos
Criação 
Gravação de dados 
Leitura dos dados 
Exclusão
Organizações
Métodos de Alocação
Vamos estudar três métodos de alocação. São eles:
Contígua
Encadeada
Indexada
Contígua
Encadeada
Indexada
Sistema de arquivos UNIX
Utiliza uma estrutura de controle que contém índices para um determinado arquivo denominada inode (índex node). 
Possui índices com níveis diferentes de indireção:
• Essa estratégia permite o gerenciamento de um arquivo maior.
• Considere o bloco de 1KB que pode conter 256 endereços de bloco.

Continue navegando