Buscar

Resumo do Grau A

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 5 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Sistemas Operacionais: Resumo Grau A
Lucas Klein de Brito
Universidade do Vale do Rio dos Sinos - UNISINOS
Lucasdebrito22@gmail.com
Abstract
This article aims to bring an overview of operating systems, addressing the introductory part on the subject. The paper addresses the definition of operating systems, structure, processes, threads, CPU scheduling and process synchronization, explaining the role of each of these features in the organization of operating systems.
1. Introdução
A evolução da computação pode ser resumida em ciclos de estudos e pesquisas visando a abstração de operações para facilitar a utilização de computadores no dia-a-dia das pessoas. É através dos Sistemas Operacionais que se gerencia com mais eficiência o hardware do computador e o controle de aplicativos a serem executados.
Com este propósito de abstrair ainda mais as operações realizadas pelo hardware de um computador e facilitar a utilização dos mesmos pelos usuários, surgiram os Sistemas Operacionais, que, é um programa que estabelece uma camada intermediária entre o usuário e o hardware de um computador. Para que se possa ter o entendimento do papel deste software, precisamos conhecer suas divisões, ou seja, o hardware, o software e o usuário.
Entre tanto, por maior que seja a complexidade da arquitetura ou de sistemas existentes para organizá-las, todos os Sistemas Operacionais possuem conceitos genéricos com os quais todos irão trabalhar. Dentre as funções existentes destacam-se as de alocação de recursos, de controle, de gerenciamento, de sincronização e armazenamento de processos que são desenvolvidas e estudadas desde os princípios da computação moderna. 
2. Estrutura
Os sistemas computacionais são compostos por quatro componentes, que são:
Hardware: responsável por prover recursos computacionais básicos, tais como, CPU, memória e dispositivos de Entrada/Saída (E/S);
Sistema Operacional: responsável por controlar e coordenar a utilização do hardware entre os vários processos que podem estar em execução;
Programas/Aplicativos: fazem uso dos recursos disponíveis para resolver problemas computacionais dos usuários. Exemplos: jogos, bancos de dados, navegadores e editores de texto;
Usuários: quem efetivamente utiliza as funcionalidades disponíveis, podem ser pessoas, máquinas ou outros computadores.
A seguir é apresentada uma imagem na qual é exposta a maneira como os componentes estão distribuídos no sistema computacional.
Figura 1 - Componentes do Sistema Computacional
O hardware que compõem o sistema computacional é composto por diversos elementos, entre eles estão: a CPU utilizada para processar as operações (pode ser mais de uma), discos de armazenamento, controladores de vídeo, memórias e dispositivos USB.
Todos os elementos se conectam com a memória do computador através de um único barramento, ou seja, as operações com a memória são realizadas individualmente. Cada um dos elementos, exceto a CPU, possui controladoras e buffers próprios, e essas controladoras realizam o processamento das interações realizadas no seu respectivo dispositivo, para então acessar a memória e utilizar a CPU para realizar as operações necessárias. A implementação das controladoras foi uma evolução, pois, inicialmente, todos os processamentos dos dispositivos eram realizados pela CPU. Essa nova abordagem possibilitou que as operações dos dispositivos fossem tratadas separadamente, deixando a CPU apenas para processamento das operações de programas, o que resultou em ganho de desempenho, pois não existe mais a necessidade de esperar o retorno de uma informação para realizar outras operações.
Abaixo podemos observar uma imagem com uma representação da organização do hardware de um computador.
Figura 2 - Hardware do Sistema Computacional
O acesso à memória realizado pelas controladoras é realizado através da funcionalidade chamada de DMA (Direct Memory Access, ou então em português, Acesso Direto à Memória). Essa característica dos sistemas operacionais permite que as controladoras dos dispositivos façam acesso direto à memória do computador sem utilizar o processamento da CPU, o que gera uma economia de recursos computacionais da CPU, que passa a focar seu processamento nas operações dos programas em execução.
Quando as controladoras dos dispositivos concluem a realização de uma determinada tarefa, as mesmas comunicam o termino da atividade ao sistema operacional para que o mesmo faça o que precisa ser feito com os dados disponibilizados pelo dispositivo. Essa comunicação ao sistema operacional é realizada utilizando conceitos de interrupções, que, de uma maneira genérica, são chamadas ao sistema operacional informando que algo foi concluído e algo precisa ser feito. Existem, basicamente, três tipos de interrupções, que são:
Interrupção de Hardware, enviadas pelas controladoras de hardware;
Interrupção de Software, enviadas por softwares para fazer chamadas ao Sistema Operacional;
Interrupção de exceção, enviadas pelo processador/CPU para informar o Sistema Operacional que há algo errado.
Para garantir a segurança e integridade do sistema computacional como um todo os processos executados no hardware ainda possuem uma classificação quanto ao modo de execução do mesmo. Há dois modos de execução de processos, um deles é o Modo Usuário e o outro é o Modo Kernel. No primeiro modo, o processo em execução é privado de realizar certas operações no hardware, isso para preservar a integridade de todos os elementos do sistema computacional. Já no segundo modo, quando o sistema operacional possui o controle do que está em execução, todas as funcionalidades e acessos estão liberados.
Sempre que um programa é executado pelo usuário o modo de execução do processo é mudado para Modo Usuário. Este por sua vez, pode realizar chamadas ao sistema operacional para realizar determinadas operações (leitura de disco, por exemplo), e sempre que essa chamada é realizada o modo de execução muda para Modo Kernel, voltando ao Modo Usuário depois que o processamento pelo sistema operacional é concluído e devolvido ao programa do usuário.
3. Organização
Como já citado, sistemas operacionais possuem o papel de intermediar o hardware e os programas do usuário, criando uma abstração para a execução de programas no hardware e possibilitando mais facilidades no desenvolvimento de software.
Para realizar essa abstração e proporcionar tais facilidades os sistemas operacionais implementam e disponibilizam para uso dos programas diversos pacotes de chamadas de sistemas operacionais. Dessa forma então, sistemas operacionais poderiam ser genericamente definidos como um pacote de bibliotecas com funções disponíveis para a utilização de um hardware, ou seja, uma API de chamadas. Cada sistema operacional implementa e publica suas chamadas de uma maneira diferente, por isso programas compilados nativamente para um sistema operacional não funcionarão em outro, pois possuem as chamadas realizadas de acordo com a documentação daquele sistema operacional em específico.
As bibliotecas também podem estar organizadas de formas diferentes entre os sistemas operacionais. Existem basicamente quatro Estruturas/Tipos de Sistemas Operacionais, que são: Monolítico Simples, Monolítico em Camadas, Micro Kernel, Modular.
Para proporcionar a execução de um mesmo programa em diferentes sistemas operacionais surgiu o conceito de virtualização, que possui a intenção de criar mais uma camada de abstração, assim como as demais evoluções da computação, porém neste caso entre o Sistema Operacional e o programa do usuário. 
Nos próximos tópicos serão abordados conceitos fundamentais sobre sistemas operacionais, que foram definidos há muitos anos, porém continuam válidos e aplicados até hoje.
3.1. Processos
Um processo nada mais é do que um programa que está em execução e precisa ser controlado e gerenciado pelo sistema operacional. O sistema operacional executa uma variedade de programas/processos, que podem ser classificados de duasmaneiras, pelo Sistema de Batch, que são Jobs do sistema operacional, ou então pelo Sistema de Tempo Compartilhado (Time-shared), que é a maneira como os programas do usuário são executados. Neste sistema é realizado um compartilhamento da CPU entre os processos, que ficam com a CPU por um determinado tempo para realizar suas operações.
Durante o ciclo de vida de um processo, este pode possuir diferentes estados, de acordo com o momento atual do processo. O sistema operacional é responsável por gerenciar e alterar o estado de cada processo, sendo que os estados de processos podem variar entre os sistemas operacionais, porém os estados mais comuns encontrados são:
Novo (new): O processo está sendo criado;
Executando (running): As instruções estão sendo executadas;
Esperando (waiting): O processo está esperando algum evento acontecer (como leitura de disco, etc);
Pronto (ready): O processo está esperando ser vinculado a um processador/CPU;
Terminado (terminated): O processo terminou sua execução.
A seguir é apresentada uma imagem na qual pode ser visualizado um diagrama da troca de estados de um processo.
Figura 3 - Diagrama de Estados de Processos
O estado do processo é armazenado em uma estrutura de dados chamada de Process Control Block (PCB). Nessa estrutura de dados são armazenados, além do estado do processo, os seguintes dados:
Contador de Programas;
Registradores da CPU;
Informações de escalonamento da CPU;
Informação de Gerenciamento de memória;
Informação para Contabilidade;
Informações do status de E/S.
Todo processo criado possui um PCB associado para armazenar suas informações, e isso é fundamental para o conceito de compartilhamento de CPU, pois a cada vez que o processo perde a CPU é nesta estrutura do PCB que são salvas as informações de em qual instrução parou a execução do processo e quais os dados dos registradores. Na próxima vez que o processo receber a CPU novamente, os dados do PCB são carregados novamente de acordo com a situação salva quando o processo perdeu a CPU.
Este procedimento realizado de salvar o PCB do processo em execução, escolher o próximo processo a receber a CPU e carregar o PCB do novo processo é chamado de Troca de Contexto.
3.2. Threads
O conceito de threads surgiu com o intuito de proporcionar a programação concorrente de maneira mais eficiente, ou seja, compartilhando recursos comuns de processos e não instanciando estes recursos para cada processo. Desta maneira, os dados de código, dados e arquivos de um processo são compartilhados entre várias threads de execução, que por sua vez, terão registradores e pilhas de maneira exclusiva. Os benefícios na utilização de threads são: Compartilhamento de Recursos, Economia de tempo e energia, Escalabilidade, Utilização de arquiteturas multiprocessadas e multicore.
Existem dois tipos de threads, as de Nível de Usuário e as de Nível de Kernel. A diferença está em quem inicia a execução da mesma, se é um programa do usuário ou se é o Kernel.
3.3. Escalonamento de CPU
O escalonamento de CPU, ou seja, a forma como será distribuída a CPU para os processos serem executados, é uma solução heurística implementada pelos sistemas operacionais para que os mesmos decidam qual será o próximo processo a receber a CPU. Não há consenso e nem definição de qual é a melhor solução. Dentro do cenário de escalonamento, existem diferentes atividades/papéis, e entre estes papéis estão o Escalonador e o Despachante. 
O escalonador é o responsável por selecionar, dentre os processos em estado de pronto, qual receberá a CPU. A decisão de escalonamento pode acontecer nas seguintes situações de troca de estado de um processo:
Muda de executando para esperando.
Muda de executando para pronto.
Muda de esperando para pronto.
Termina. 
Há ainda o conceito de preempção, que são algoritmos capazes de interromper a execução de um processo para entregar a CPU para outro processo. Os algoritmos são então classificados em preemptivos ou não-preemptivos, e das quatro situações listadas acima, a primeira e a última alocação são não-preemptivas enquanto que as demais são preemptivas.
Já o despachante possui o papel de fornecer a CPU ao processo selecionado pelo escalonador, sendo responsável por realizar a troca de contexto e realizar a mudança do modo de execução para Modo Usuário.
As atividades realizadas pelo escalonador e pelo despachante também consomem recursos computacionais como qualquer outro processo, e por isso existe uma preocupação em otimizar essas duas atividades. Os critérios para otimização tentam atingir os objetivos abaixo:
Maximizar utilização da CPU;
Maximizar produtividade;
Minimizar o tempo de processamento;
Minimizar o tempo de espera;
Minimizar o tempo de resposta.
Com isso, surgiram ao longo do tempo diferentes técnicas de escalonamento, que são algoritmos com diversas abordagens de como melhor otimizar as tarefas do escalonador e do despachante. A seguir serão listadas, e brevemente descritas, algumas das técnicas que surgiram estão especificadas nos próximos itens.
3.3.1. Primeiro a chegar, primeiro a ser servido (FCFS)
É uma lista, onde os processos recebem a CPU conforme a chegada na fila. É um algoritmo não-preemptivo.
3.3.2. Menor Trabalho Primeiro (SJF)
Neste algoritmo os processos com menor tempo de execução (ou tempo de rajada) são executados primeiro, e isso propicia um menor tempo médio de espera para um determinado conjunto de processos.
3.3.3. Escalonamento por Prioridade
Neste método, um número de prioridade (inteiro) é definido para cada processo, e processos com mais prioridades possuem a preferência para receber a CPU, passando na frente dos demais processos. Pode ser preemptivo ou não-preemptivo, dependendo da implementação. Essa solução pode ocasionar problemas com processos de baixa prioridade, que podem acabar sem receber a CPU. A solução para isso é, aumentar a prioridade dos processos conforme o passar do tempo sem receber CPU.
3.3.4. Alocação Circular (Round Robin)
Neste algoritmo é percorrida uma lista de processos prontos a receberem a CPU e distribuído um determinado tempo, chamado de quantum, para que o processo realize suas operações. O valor do quantum pode variar entre os sistemas operacionais, porém é comum encontrar-se o valor entre 10 e 100 milissegundos. Quando este tempo termina, o processo perde a CPU que é devolvida ao escalonador para que seja escolhido o próximo processo.
3.3.5. Alocação com Múltiplas Filas
São criadas múltiplas filas com processos que recebem quantum. Cada fila possui uma prioridade diferente a CPU é distribuída primeiro para os processos das filas mais prioritárias.
3.3.6. Múltiplas Filas com Realimentação
Neste método são criadas filas com prioridades diferentes. Os processos da primeira fila, com maior prioridade, recebem um quantum de oito milissegundos, os processos da segunda fila recebem um quantum de dezesseis milissegundos e assim sucessivamente até a última fila, menos prioritária, programa a técnica FCFS, que recebe quantum até o término do processo. Na prática, todos os processos entram na primeira fila, se precisarem mais tempo para terminarem, são movidos para a segunda fila, onde recebem mais quantum, e se mesmo assim não tiverem sido terminados, são movidos para última fila, na qual são executados até o término.
3.4. Sincronização de Processos
O conceito de sincronização de processos surgiu com a necessidade de manter a consistência de dados quando executados processos cooperantes e que acessam recursos compartilhados entre si, como por exemplo, uma variável de contagem.
Esse tipo de problema, quando processos precisam utilizar o mesmo recurso, é conhecido como Condição de Corrida e a solução para o mesmo é chamada de Exclusão Mútua. A Exclusão Mútua nada mais é do que o bloqueio na execução de processos quando estes tentarem utilizar um recurso compartilhado que já está em uso por outro processo. É criada uma fila de espera que garante que apenas um dos processos executedeterminado código que utilize o recurso compartilhado. Este trecho de código é chamado de Seção Crítica.
Durante a história da evolução dos sistemas operacionais e da computação em si, diferentes maneiras e abordagens para solucionar esse problema foram criados, desde bloqueios diretos no hardware até nas diferentes camadas de software que rodam no sistema operacional. 
Atualmente as técnicas mais difundidas são a utilização de Semáforos e Monitores para garantir a chamada segura a seções críticas.
Semáforo, de uma maneira resumida, é uma técnica em que o programador deve mapear as seções críticas de seu software para garantir que cada vez que o software chegar em uma seção crítica seja sinalizado que o software entrou em tal região, e assim que concluído, seja informado que o processo não está mais nessa região, liberando a seção crítica para outros processos que estão na fila. O problema dessa técnica é que a responsabilidade fica a cargo do programador em sempre sinalizar que está entrando e saindo da seção crítica, gerando erros se uma dessas operações não for realizada.
A implementação de Monitores é a técnica mais sofisticada para o tratamento de sincronização de processos e utilização de recursos compartilhados. É uma técnica introduzida pelo Java e cria uma camada de abstração, na qual o programador apenas precisa sinalizar na assinatura do método que este é uma seção crítica. A partir deste momento sempre que chamado um desses métodos o Java, através de sua abstração e máquina virtual, realiza as devidas chamadas de sistema para garantir a exclusão mútua, facilitando o desenvolvimento e diminuindo a possibilidade de erros.
4. Referências
SILBERSCHATZ, A.; GALVIN, P.B; GAGNE, G. Operating Systems Concepts. 7. Ed.John Wiley e Sons, 2004.
KENNER GRINGS, A.; Sistemas Operacionais: Uma visão introdutória.

Outros materiais