Buscar

Sistemas Operacionais

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 74 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

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 6, do total de 74 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

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 9, do total de 74 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

Prévia do material em texto

Sistemas Operacionais
Objetivo
Ementa
História e funções dos Sistemas Operacionais. Estrutura dos Sistemas Operacionais. Gerência de processos. Gerência de memória. Gerência de E/S. Sistemas de Arquivos. Estudo de Caso (Linux e Windows).
Objetivos
Objetivo Geral:
Ao final do semestre, o aluno deverá compreender o que é e como funcionam os Sistemas Operacionais, como são suas estruturas, o gerenciamento de processos, memória e dispositivos de entrada e saída, além das implementações mais conhecidas (Linux e Windows).
Objetivos Específicos:
· compreender os tipos de sistemas operacionais existentes e como estão estruturados;
· estudar o que são processos e o que são threads, sendo capaz de diferenciá-los;
· perceber os aspectos associados à comunicação interprocessos, em especial as questões associadas a sincronismo;
· entender o funcionamento da memória, em especial swapping, paginação e segmentação;
· entender o funcionamento dos sistemas de entrada e saída, além do armazenamento em disco e em mídias removíveis;
· visualizar o que são sistemas de arquivos e seus princípios de funcionamento; e
· reconhecer os aspectos principais associados aos sistemas operacionais Linux e Windows.
Contextualização
Há alguns anos, os sistemas operacionais estavam restritos aos grandes e caros computadores, tais como mainframes. Operados por uma quantidade limitada de empresas, que os utilizavam em seus negócios, esses sistemas poderiam ir desde rodar a folha de pagamento, executar o sistema de vendas ou controle de estoque, até a execução de cálculos e simulações (químicas, biológicas, geológicas, meteorológicas, aeroespaciais etc.).
Atualmente os sistemas operacionais estão cada vez mais presentes em nosso cotidiano. Pessoalmente, você os utiliza em uma grande variedade de equipamentos, seja por necessidade, lazer ou ambos. Como exemplo, podemos citar: telefones celulares e consoles de videogames. Profissionalmente, o uso se dá por meio de computadores ou equipamentos específicos que auxiliam as atividades no ambiente empresarial, como equipamentos de rastreamento. Para onde quer que você olhe, os equipamentos eletrônicos necessitam desses sistemas para executar seus programas, estando estes presentes desde em um pequeno PDA até em uma grande aeronave.
A miniaturização dos equipamentos, associada a outros fenômenos, tais como a proliferação da Internet e de redes sem fio, possibilita uma participação cada vez maior de equipamentos eletrônicos em nossa vida. Esses equipamentos interagem, por meio de seus programas, entre si e com seus usuários, o que é sempre possibilitado pelos sistemas operacionais neles presentes.
Tais sistemas controlam o acesso desses programas ao hardware, seja pela permissão de utilização do processador ou dos dispositivos de entrada e saída, promovendo uma utilização que deve sempre levar em consideração aspectos de: desempenho, consumo de energia, segurança e usabilidade, entre outros.
Desse modo, o funcionamento adequado da solução utilizada, seja para uso pessoal ou profissional, depende desses sistemas. Logo, entender como funcionam, suas vantagens e limitações permitirá que o aluno possa obter o máximo de seu equipamento e dos programas utilizados. O que, em última instância, refletirá no cumprimento adequado da tarefa, a um custo razoável.
Introdução
Conteúdo
Aula 1 – História e Funções dos Sistemas Operacionais
· História dos Sistemas Operacionais
· Os Diversos Tipos de Sistemas Operacionais
· Alguns Conceitos Comuns aos Sistemas Operacionais
Aula 2 – Estrutura dos Sistemas Operacionais
· System Calls
· Modos de Acesso
· Arquitetura
· Monolítica
· Em Camadas
· Microkernel
· Máquina virtual
Aula 3 – Gerência de processos
· Processos
· Conceito de Processos
· Escalonamento
· Processos Cooperativos
· Processos Independentes, Subprocessos
· Threads
· Conceito de Threads
· Múltiplas Threads
· Threads no Windows e Linux
· Comunicação Interprocessos
· Segundo Plano
· Seção Crítica
· Semáforos
· Problemas Típicos de Sincronismo
· Monitores
· Transações Atômicas
· Deadlocks
· Conceito de Deadlock
· Prevenção de Deadlock
· Detecção de Deadlock
· Recuperação de Deadlock
Aula 4 – Gerência de Memória
· Conceitos Iniciais de Gerência de Memória
· Troca de Processos (Swapping)
· Alocação de Memória Contígua
· Alocação de Memória
· Fragmentação de Memória
· Memória Virtual
· Paginação
· Substituição de Página
· Segmentação
Aula 5 – Gerência de E/S
· Conceitos de Entrada e Saída
· Subsistema de Entrada e Saída
· Drivers
· Controladores
· Dispositivos de Entrada e Saída
· Discos
Aula 6 – Sistemas de Arquivos
· Visão do Usuário
· Conceitos de Arquivo
· Estrutura de Diretório
· Métodos de Acesso
· Montagem
· Compartilhamento
· Proteção
· Visão do Implementador
· Estrutura do Sistema de Arquivos
· Implementação
Aula 7 – Estudo de Caso (Linux)
· Histórico do Linux
· Visão Geral do Linux
· Arquitetura
· O Kernel do Linux
· Distribuições Linux
· Gerenciamento de Processos
· Gerenciamento de Memória
· Gerenciamento do Sistema de Arquivos
· Entrada e Saída
· Segurança
Aula 8 – Estudo de Caso (Windows)
· Histórico do Windows
· Visão Geral do Windows
· Estrutura do Sistema
· Gerenciamento de Processos
· Gerenciamento de Memória
· Gerenciamento do Sistema de Arquivos
· Entrada e Saída
· Segurança
Aula 01 - História e Funções dos Sistemas Operacionais
Entender a origem e a cronologia da evolução dos sistemas operacionais ajudará bastante na compreensão desse importante assunto dentro da computação. Desse modo, faremos um rápido estudo dessa evolução, o que nos permitirá perceber como foram sendo utilizados, à medida que evoluíam.
Estudaremos ainda seu relacionamento com o hardware, além de conceitos importantes que utilizaremos ao longo da disciplina.
Esta aula é, portanto, um ponto de partida para o entendimento das características, funcionamento e possibilidades na utilização dos sistemas operacionais.
Ao iniciar o estudo dos sistemas operacionais devemos procurar respostas para duas questões bem importantes: qual a função do sistema operacional? Como esse sistema operacional se relaciona com o hardware?
O objetivo do usuário é executar programas que irão auxiliá-lo no cumprimento de suas tarefas. Esses programas podem ter as finalidades mais diversas possíveis. Logo, ao sistema operacional cabe a tarefa de facilitar e coordenar o acesso aos recursos computacionais disponíveis.
Mas quais são esses recursos?
Podemos classificar esses recursos em três grupos: de entrada/saída; de armazenamento; de processamento. O primeiro tem a função de fornecer ao computador os dados a serem processados e de externar o resultado desse processamento. O segundo tem por função armazenar, de modo permanente ou temporário, os dados utilizados. Por último, aos recursos de processamento, cabe a função de executar as rotinas necessárias ao cumprimento das tarefas.
Figura 1.1 – Visão do Sistema Operacional.
Mas, e a relação do sistema operacional com o hardware?
Para responder essa questão, vamos considerar a sua experiência com computadores. Em geral, você utiliza algum programa – editor de textos, planilha eletrônica, navegador, aplicativo de uso empresarial etc. Todos esses programas estão instalados em um sistema operacional e este, por sua vez, foi instalado previamente no computador.
A Figura 1.2 permite uma visão geral do que está sendo mencionado. Nela, podemos ver os usuários interagindo com os aplicativos que, por seu turno, estão apoiados no sistema operacional, executado em um hardware.
O detalhamento do sistema operacional, seu relacionamento com os aplicativos e o hardware serão vistos ao longo das próximas aulas.
Figura 1.2 – Visão dos Componentes de um Computador.
Uma outra visão completa é mostrada na Figura 1.3, onde podemos visualizar os programas em uso, o sistema operacional e os elementos de hardware nos quais este se apóia.
Figura 1.3 – Sistema Computacional Consistindo em Hardware, Sistema e Aplicações.
História dos Sistemas Operacionais
Os sistemas operacionais foram evoluindo na medida em que os computadoresforam se desenvolvendo; junto com estes, foram adquirindo características associadas à evolução do hardware e de conectividade.
Período anterior aos anos de 1940
Em 1642, Blaise Pascal inventou uma máquina de somar, visando auxiliar seu pai, que trabalhava com arrecadação de impostos. Em 1673, Gottfried Leibnizcriou uma máquina que somava e multiplicava. Em 1820, Charles Colmar inventou uma máquina que realizava as quatro operações.
O primeiro computador de que se tem notícia foi projetado por Charles Babbage, em 1822. Era puramente mecânico, com engrenagens, polias e correias. Esse computador não possuía sistema operacional, sendo considerado uma máquina analítica.
Em 1854, George Boole criou a lógica booleana, na qual se baseia todo modelo de computação digital.
Em 1890, Herman Hollerith criou o mecanismo de cartões perfurados para ajudar o processamento do censo dos EUA. Hollerith fundou, em 1896, a empresa que posteriormente se tornou a IBM.
Década dos anos de 1940
Nessa década, surgiu o que é chamado de primeira geração de computadores, onde eram utilizados válvulas e painéis de programação. Nessa época foi criado o Electronic Numerical Integrator and Calculator (ENIAC), criado na Universidade da Pensilvânia e utilizado em cálculos balísticos e, posteriormente, no desenvolvimento da bomba de hidrogênio.
Década dos anos de 1950
Nos anos de 1950 surgiu a segunda geração, com a utilização de transistores e de sistemas em lote (ou batch).
O processamento em lote consistia em uma maneira de otimizar a utilização dos computadores até então disponíveis, os denominados mainframes. Nesse tipo de processamento, o programa a ser executado era preparado previamente. Inicialmente por meio de cartões perfurados e, em evoluções posteriores, previamente digitados. O mainframe processava um a um os programas. Essa era uma forma de otimizar a utilização desse caro recurso.
Figura 1.4 – Processamento em Lote.
Década dos anos de 1960
Na década dos anos de 1960, chegou-se à terceira geração de computadores, com a disseminação dos circuitos integrados e da multiprogramação.
Nessa época ocorreu um problema, pois existiam duas linhas de produtos totalmente incompatíveis. Os computadores de grande porte – utilizados em cálculos de engenharia e ciência, tal como o 7094 – e os orientados a caracteres, como o 1401, utilizados por bancos e demais instituições financeiras. A IBM lançou então o System/360, que cobria desde máquinas menores até as de grande porte. Nessa época, a empresa lançou séries subseqüentes, denominadas 370, 4300, 3080 e 3090.
A multiprogramação surgiu nesse momento, para diminuir a ociosidade da CPU, a partir da qual a memória era dividida em partes, onde, em cada uma, colocava-se um job (trabalho) a ser executado. Desse modo, vários jobs poderiam ser preparados para que fossem utilizados em seqüência pela CPU.
A seguir (Figura 1.5), pode ser visto um mainframe da série 4.300, o IBM 4341, fabricado entre os anos de 1979 e 1986.
Figura 1.5 – Mainframe da Série 4.300
Outras imagens podem ser vistas no IBM – Mainframe Photo Álbum.
Década dos anos de 1970
Nessa década surgiram os minicomputadores, tais como o PDP-11. Em 1971, a Intel produziu o processador Intel 4004 e, em 1974, o Intel 8080. Estes foram seguidos pela Zilog, que lançou o Z80. Com a evolução dos processadores, surgiram então os microcomputadores. Em 1976, Steve Jobs e Steve Wozniak produziram o Apple II que, rapidamente, se tornou um sucesso. O sistema operacional utilizado predominantemente, nesses computadores, é o CP/M (Control Program Monitor), da Digital Research. Na outra extremidade do mercado, o de grande porte, era lançado o supercomputador Cray-1 capaz de realizar 100 milhões de operações de ponto flutuante por segundo (100 MFLOPS).
Década dos anos de 1980
Foi o início da quarta geração, marcada pela entrada da IBM no mercado de microcomputadores que, em 1981, lançou o IBM PC. Esse primeiro microcomputador utilizava processador Intel 8088 de 16 bits e sistema operacional Microsoft DOS (Disk Operating System). Em 1982, foi fundada a Sun Microsystems, que lançou as estações de trabalho SUN, que se utilizavam do SunOS (posteriormente, Sun Solaris).
Nessa década a Universidade de Berkeley criou sua própria versão de Unix, o BSD, introduzindo várias melhorias, em especial, associadas ao TCP/IP.
Ao longo dessa década, surgiram os sistemas operacionais com interface gráfica, tais como o Microsoft Windows e OS/2.
Década dos anos de 1990
Nessa década se consolidaram os sistemas operacionais com interface gráfica. Com o surgimento da Internet, a arquitetura cliente/servidor passou a ser utilizada também fora de redes locais.
Surgiram ainda os softwares abertos (open source), com destaque para os sistemas operacionais FreeBSD e o Linux.
Década dos anos de 2000
Essa década caracteriza-se por: demanda cada vez maior por processadores e sistemas cada vez mais eficientes, surgimento de variadas interfaces de interação entre o usuário e a máquina; miniaturização e mobilidade crescentes, o que, aliado às tecnologias de redes sem fio, têm levado a computação a locais e atuações antes não utilizados, o que tem possibilitado uma informatização sem precedentes. Os sistemas operacionais estão cada vez mais presentes, sendo aplicados em dispositivos diversos, tais como PDA, telefones celulares, eletrodomésticos etc.
Os Diversos Tipos de Sistemas Operacionais
Um sistema operacional pode ser aplicado nos mais diversos tipos de dispositivos existentes. Nesse item, mencionamos os mais comuns e que fazem parte de nosso dia-a-dia, desde sistemas de grande porte até pequenos cartões inteligentes (smart cards), relacionados a seguir.
Sistemas operacionais para computadores de grande porte
Computadores de grande porte são utilizados por grandes empresas e centros de pesquisa. A finalidade desses computadores é lidar com grandes volumes de processamento, tais como análise de crédito por grandes bancos ou simulações como as efetuadas para prospecção de petróleo e gás ou para fins meteorológicos.
Sistemas operacionais para computadores pessoais
Computadores pessoais visam oferecer ao usuário boas condições de interação na realização de suas tarefas, sejam estas de trabalho ou lazer, sendo utilizados para uso geral. Permitem: acesso à Internet – para fins diversos, inclusive interação com outras pessoas, via mensageiros instantâneos; utilização de suítes de escritório - editores de texto, planilha eletrônica etc.; uso de programas multimídia, como vídeos e músicas; interagir com variados tipos de dispositivos de E/S – gravadores de mídias diversas, joysticks para jogos etc.
Sistemas operacionais para servidores
Sistemas operacionais para servidores podem ser executados em servidores de grande porte, servidores, estações de trabalho ou mesmo computadores pessoais. Podem fornecer diversos serviços, podendo atuar como: servidores web; servidores de arquivos; servidores de impressão, entre outros.
Sistemas operacionais para aplicações em tempo real
Sistemas operacionais para aplicações em tempo real têm o tempo como um fator crítico. São aplicados em equipamentos que possuem prazos rígidos para a execução das tarefas, tais como máquinas empregadas em processos industriais.
Sistemas operacionais embarcados
Sistemas operacionais embarcados têm seu uso associado a pequenos dispositivos. Como exemplos, podem ser citados: PDA, telefones celulares e eletrodomésticos. Os dispositivos que os utilizam geralmente têm sérias limitações quanto à capacidade de processamento, memória e energia que podem utilizar.
Existem vários casos de sistemas operacionais embarcados que possuem também características de tempo real.
Sistemas operacionais para cartões inteligentes
Os sistemas operacionais para cartões inteligentes são utililizados em dispositivos de tamanho similar a um cartão de crédito. Esses dispositivos possuem uma restrição de consumo de memória e energia bem menores que os do tipo embarcado. Em geral, dedicam-se a uma única função como, por exemplo, executar pagamentos bancários.Alguns Conceitos Comuns aos Sistemas Operacionais
As características de um sistema operacional estão associadas ao hardware em que é executado. Desse modo, a maneira como gerenciam processos, memória, entrada/saída, arquivos e a segurança, varia entre os sistemas. Apesar disso, os conceitos básicos associados aos diversos sistemas operacionais existentes são os mesmos. Neste item, começaremos abordando alguns desses conceitos, os quais serão detalhados ao longo das próximas aulas.
Processos
Um processo é um programa que está sendo executado. Um sistema operacional deve lidar com muitos processos, ou seja, deve executar vários deles, inclusive ao mesmo tempo. O detalhamento de como isso é feito será visto na Aula 3.
Por enquanto, considere “fatias de tempo”; a cada fatia, um processo é executado. Terminada uma fatia, o processador passa a executar outro processo, alternando, desse modo, todos os processos a executar.
Quando um processo é interrompido, é posteriormente retomado a partir de onde havia parado. A velocidade com que alterna todos os processos e retorna ao primeiro é tão elevada que a impressão causada é que o sistema operacional está executando várias tarefas ao mesmo tempo.
Um processo é composto de seu espaço de endereçamento e de uma entrada na tabela de processos.
Deadlocks
Deadlock é uma situação que ocorre durante a execução de vários processos ao mesmo tempo. Isso ocorre quando dois processos ficam bloqueados, um esperando pelo outro. Considere, para isso, dois processos: o primeiro processo (P1) aloca um recurso A para uso; enquanto isso, o segundo processo (P2) aloca um recurso B para uso.  Em um dado momento, o processo P1 solicita acesso também ao recurso B, porém, sem ainda liberar o recurso A. Nesse mesmo instante, o processo P2, por coincidência, solicita acesso ao recurso A, sem liberar o uso de B. Ocorre então o deadlock. Nesse instante, o processo P1 vai ficar esperando a liberação do recurso B, enquanto o processo P2 fica aguardando o recurso A, sendo que nenhum deles liberou o recurso já em uso.
A prevenção, detecção e recuperação de deadlocks serão vistas na Aula 3.
Gerenciamento de memória
Todo computador utiliza uma memória para apoio aos programas que estão em execução. Em um sistema operacional simples, somente um programa por vez pode ocupar a memória. Logo, para alternância de um processo a outro, todas as informações devem ser salvas e o processo removido da memória, sendo em seguida colocado o próximo em memória.
Os sistemas operacionais que utilizamos na prática possuem a capacidade de manter em memória vários processos ao mesmo tempo. Devem, portanto, controlar o acesso à área de memória ocupada por cada um, prevenindo que outros acessem esses espaços reservados.
É desejável que todo o espaço de endereçamento a ser utilizado pelos programas seja menor do que a memória disponível, permitindo que todos sejam mantidos em memória. Caso o espaço seja maior do que a memória disponível, será utilizada uma técnica denominada de memória virtual (swap). Nesse caso, parte do espaço de endereçamento será mantida em disco. Todo o assunto relativo à memória será visto com mais detalhes na Aula 4.
Entrada e saída
Os computadores possuem dispositivos de entrada e saída. O primeiro é aquele por meio do qual passamos ao computador as informações ou dados a serem processados enquanto, pelo dispositivo de saída, o computador apresenta o resultado das operações solicitadas.
O dispositivo de entrada mais comum é o teclado e o dispositivo de saída mais comum é o monitor. Entretanto, existem muitos outros dispositivos, tais como: mouse; impressora; unidades de disco ou fita; relógio; placa de rede; porta serial; porta paralela etc. Esse assunto será abordado na Aula 5.
Arquivos
Sistema de arquivos é outro conceito muito importante no estudo dos sistemas operacionais. Os arquivos guardam informações que são manipuladas pelos programas e pelo próprio sistema.
Para que um arquivo possa ser lido, deve primeiramente ser localizado e, depois, aberto. Após ser manipulado, podendo inclusive ter seu conteúdo alterado, deve ser salvo e fechado.
Ao sistema operacional cabe a organização e manipulação desses arquivos. Uma forma muito comum de os sistemas operacionais organizarem seus dados é sob a forma de diretórios. Cada diretório (ou pasta) agrupa vários arquivos. Esse assunto será abordado em detalhes na Aula 6.
Segurança
Uma vez que muitas informações estão armazenadas em um computador, é necessário um controle quanto ao acesso e modificação dos dados. Isso é necessário tanto para proteger o sistema operacional quanto os próprios dados dos usuários de acessos indevidos, inclusive os causados por vírus e outras pragas virtuais. A forma de controle de acesso aos dados será abordada nas Aulas 7 (Estudo de Caso Linux) e 8 (Estudo de Caso Windows).
Shell
É função do sistema operacional a execução de chamadas ao sistema. Vários programas que não fazem parte do sistema operacional, necessitam de acesso a variados recursos; entre estes estão editores, compiladores, ligadores e interpretadores.  Analisando o caso dos interpretadores, eles possuem algumas características.
Tomemos como exemplo o Shell do Unix/Linux. O usuário, quando se conecta, tem um interpretador de comandos (Shell) iniciado; este se torna a entrada e saída padrão do usuário. É por meio dele que o usuário digita seus comandos e recebe seus resultados, podendo, se for o caso, modificar a entrada ou saída dos dados. Por exemplo: pode utilizar como entrada um arquivo e como saída a impressora. A utilização desse tipo de programa será abordada nos estudos de caso das Aulas 7 e 8.
Nesta aula, estudamos a história dos sistemas operacionais, podendo acompanhar sua evolução e utilização ao longo do tempo. Vimos os diferentes tipos de aplicações para os sistemas operacionais que podem ser utilizados desde em um pequeno dispositivo móvel, até em um grande computador, incluindo sistemas de tempo real.
Em seguida, foram mencionados alguns conceitos importantes e comuns a todos os sistemas operacionais, que serão estudados em detalhes mais adiante por enquanto, estes conceitos nos permitirão avançar no estudo desta disciplina.
Os itens estudados serviram como preparo para o próximo conteúdo a ser estudado – Estrutura dos Sistemas Operacionais – que, por sua vez, servirá de base para o estudo do gerenciamento de processos, de memória e de entrada/saída, três conceitos primordiais ao entendimento do funcionamento dos sistemas operacionais existentes.
Aplicando o Conhecimento
1. O que você entende por sistema operacional? Quais são suas principais funções?
2. Quais os principais componentes de um sistema operacional?
3. Quais os tipos principais de sistemas operacionais que você conhece? Onde podem ser aplicados?
Para Refletir
a. Como seria um computador sem sistema operacional? Isso é possível?
b. Qual é o sistema operacional dos dispositivos a sua volta (computadores, celulares, etc.)?
Aula 02 - Estrutura dos Sistemas Operacionais
O sistema operacional provê uma série de serviços aos usuários e programas que o utilizam. Para realizar essas ações, o sistema operacional precisa realizar várias atividades internamente, bem como interagir adequadamente com o hardware no qual se apóia.
Nesta aula, você verá quais são essas ações e como elas funcionam. O objetivo é que, a partir dos tópicos aqui abordados, você já possa ter uma visão geral do funcionamento dos sistemas operacionais.
Para que possamos estudar a arquitetura de um sistema operacional, é oportuno que vejamos os principais elementos associados a ele.
Iniciando pelo ponto de vista do usuário, temos as aplicações. Ligados a estas temos os utilitários, que permitem uma interação dos usuários e aplicações com o sistema operacional. Em seguida, temos o próprio sistema operacional, que se apóia ainda sobre o hardware. A Figura 2.1 apresenta esses elementos.
Figura 2.1 – Arquitetura de um Sistema Computacional.
Mas o que o sistema operacional faz realmente?
Para que você possa entender a realfunção do sistema operacional, é necessário visualizar os elementos que interagem com ele.
Na aula anterior, você viu que o sistema operacional lida com o processador, os dispositivos de entrada e saída, a memória e os dispositivos de armazenamento. O funcionamento de todos esses elementos não é seqüencial, havendo momentos em que existe disputa por recursos, ou mesmo enfileiramento. Logo, cabe ao sistema operacional gerenciar tudo isso.
Entre as atividades gerenciadas pelo sistema operacional estão:
· criar e eliminar processos e threads;
· sincronizar a comunicação entre processos e threads;
· escalonar e controlar processos e threads;
· gerenciar a memória;
· gerenciar dispositivos de entrada e saída;
· gerenciar o sistema de arquivos;
· efetuar a segurança do sistema.
System Calls
Neste item, começaremos por um elemento presente em todo sistema operacional: as “chamadas ao sistema”, denominadas System Calls, em ambiente Unix ou Application Program Interface (API), em ambiente Windows.
As System Calls funcionam como uma interface para acesso ao núcleo do sistema operacional. Desse modo, quando um usuário ou aplicação solicitam algum serviço, uma chamada de sistema é realizada.
Cada serviço possui uma chamada de sistema associada. Cada sistema operacional possui seu próprio conjunto de chamadas e formas de fazê-lo.
A figura a seguir mostra o esquema de interação entre aplicações, System Calls, núcleo do sistema operacional e o hardware.
Figura 2.2 – Esquema de Interação das System Calls no Hardware.
Uma tentativa de padronização das chamadas, denominada POSIX, foi proposta. O objetivo era permitir que aplicações desenvolvidas conforme as chamadas padronizadas pudessem ser executadas em qualquer sistema operacional que suportasse POSIX.
Para que você possa entender adequadamente a localização e função dessas chamadas ao sistema, considere o seguinte exemplo:
O programador, ao escrever o código de um programa, o faz utilizando uma linguagem de programação alto nível (por exemplo: Pascal, C ou C++). O compilador então converte esse código de alto nível em chamadas ao sistema apropriadas à arquitetura do hardware onde será utilizado.
Existem muitas chamadas ao sistema que, como se disse, variam conforme o sistema operacional. Todavia, podemos reuni-las em quatro grupos:
· Gerenciamento de processos e threads – criação, eliminação, sincronização, comunicação e informações.
· Gerenciamento de memória - alocação e liberação de memória.
· Gerenciamento de arquivos – abrir, ler, gravar, fechar ou eliminar arquivos; criar, alterar e eliminar diretórios; obter informações de arquivos e diretórios.
· Gerenciamento de dispositivos – alocar ou liberar operações de entrada ou saída e obter informações sobre dispositivos.
Modos de Acesso
O acesso aos arquivos, a memória e aos dispositivos deve ser controlado. A razão para isso é que um acesso indevido pode causar sérios problemas. Imagine se cada aplicação resolve que vai acessar determinado setor do disco rígido, cada uma quando bem entender. Quais problemas isso poderia causar?
Como os recursos do computador são todos compartilhados, faz-se necessário um controle desse acesso. Esse controle pode ser efetuado de dois modos diferentes:
· No primeiro modo, algumas instruções mais críticas, ou privilegiadas, somente podem ser executadas pelo sistema operacional. Nesse caso, os aplicativos devem solicitar ao sistema que execute determinada operação. O sistema então a executa, após verificar a validade de tal solicitação, encaminhado o resultado a quem a solicitou. Evitam-se assim problemas de segurança ou de integridade dos dados. É o denominado modo kernel (ou supervisor).
· No segundo modo, as instruções não críticas, ou não privilegiadas, somente podem ser executadas se o usuário ou aplicação possuírem autorização para tal. É o denominado modo usuário.
A melhor maneira de controle da segurança é permitir que somente o sistema operacional tenha acesso às instruções encaminhadas. Desse modo, as chamadas de sistema são todas encaminhadas ao sistema operacional. Essa abordagem vale tanto para acesso ao processador quanto aos demais dispositivos.
Alguns sistemas operacionais permitem que a aplicação efetue uma chamada de sistema ao kernel que, então, altera o acesso do modo usuário para o modo kernel; daí, a aplicação ganha acesso ao recurso (por exemplo: processador). Após executada a rotina, o modo usuário é reativado, retirando os privilégios de acesso.
O sistema operacional MS-DOS, por exemplo, não possuía esse recurso de utilização de modo usuário ou modo kernel, uma vez que foi desenvolvido para a arquitetura Intel 8088. Já a arquitetura Intel x86 possui esse recurso, utilizado pelos sistemas operacionais Windows 2000 e outros mais recentes, além do Linux e Solaris.
Arquitetura
Monolítica
A arquitetura monolítica se refere a um único programa que pode ter até sido compilado em separado, mas foi unificado (linkado) em um programa executável. O desenvolvimento ou manutenção desse tipo de código é complicado. O sistema operacional DOS da Microsoft é monolítico.
Em Camadas
A arquitetura em camadas surgiu com a necessidade de melhorar o processo de desenvolvimento e manutenção de um código mais complexo. Nessa abordagem, o sistema é organizado em camadas, onde cada uma exerce um conjunto bem determinado de funções.
Além de facilitar a escrita e manutenção do código, permite a organização de modos de acesso associados às camadas.
Tanto o Unix quanto o Windows, em suas versões mais recentes, utilizam essa arquitetura, que apresenta duas camadas: a primeira, como acesso não privilegiado (modo usuário) e a segunda, com acesso privilegiado (modo kernel).
Microkernel
O conceito de microkernel surgiu em 1980, na Universidade Carnegie-Mellon. A idéia era possuir um kernel (núcleo) menor. Atualmente essa é uma tendência na maior parte dos sistemas operacionais.
Para isso, os serviços disponibilizados pelo sistema são executados como processos, onde cada um coordena as funções de gerenciamento de arquivos, memória, processos e escalonamento.
Os serviços, nesses casos, são todos executados no modo usuário, sem acesso direto ao sistema. Os processos se comunicam entre si e com o microkernel, por meio de mensagens. Quando determinado processo deseja acessar o hardware, ele o faz por meio de uma mensagem ao microkernel.
Figura 2.3 – Arquitetura Computacional e o Microkernel.
Essa abordagem propicia algumas vantagens. A primeira diz respeito à segurança propiciada pelo acesso restrito, já que somente o microkernel possui acesso direto ao hardware. Eventuais conflitos nos processos podem causar somente a parada dos processos envolvidos, permanecendo então os demais processos e o servidor em execução normal.
A utilização de microkernel facilita a utilização de múltiplos processadores, seja através de uma única máquina com diversos processadores ou de um ambiente distribuído em que as máquinas podem estar distantes umas das outras.
Porém, a implementação desse tipo de solução é difícil. Na prática, o que existe atualmente é uma combinação entre o modelo em camadas e o de microkernel.
Máquina Virtual
Máquina virtual é um assunto bem atual. Possivelmente você já deve ter ouvido falar sobre isso ou, então, lido algo a respeito.
Mas você sabe do que se trata? E como funciona?
Nos itens anteriores, você já pôde estudar que o sistema operacional funciona sobre um hardware específico. Sabe também que, quando um programa é criado, é feito para um determinado sistema operacional.
Ocorre que, atualmente, tem-se freqüentemente a necessidade de executar mais de um sistema operacional, ao mesmo tempo, em um determinado computador ou servidor. Qual a razão dessa necessidade?
Existem dois grandes motivos para isso. O primeiro pode ser a necessidade de suportarmos em um dado servidor aplicações que foram feitas para sistemas operacionais diferentes. Suponha, por exemplo, que você tenha dois aplicativos, um desenvolvido para ambiente Windows e um outro desenvolvido para ambiente Linux. Considereainda que, por limitações diversas, você precise instalá-los no mesmo computador.
A solução então é a utilização do recurso de máquinas virtuais.
Máquina virtual é um recurso que adiciona uma camada extra entre o sistema operacional e o hardware. Essa camada adicional emula um hardware. Desse modo, o sistema operacional instalado sobre a máquina virtual “pensa” que está interagindo diretamente com o hardware.
Assim, podemos instalar mais de um sistema operacional sobre essa camada adicional. Cada uma dessas instalações acessa a máquina virtual como se estivesse acessando o hardware. Cabe a essa máquina virtual a interação com o hardware.
Figura 2.4 – Sistema com três Instâncias de Máquina Virtual.
O segundo motivo diz respeito às questões de segurança e/ou gerenciamento de ambientes complexos. Você pode ter várias instalações de um determinado sistema operacional em execução em um dado computador. Cada uma desas instalações terá somente o que for necessário para atender ao programa que for ser executado ali. Pense nas vantagens de segurança e de gestão que pode oferecer.
Se sua empresa for um Datacenter, prestando serviços de hospedagem variados (servidores web, email, ftp, banco de dados etc.) aos seus clientes, você pode alocar cada cliente em um dos ambientes em execução.
Se, por outro lado, todos os serviços são hospedados em sua própria empresa, você pode optar por colocá-los separadamente em máquinas virtuais diferentes. O impacto dessa decisão é que um eventual problema de segurança em uma máquina (tal como uma invasão) não compromete as outras. Além disso, você pode ligá-las e desligá-las separadamente. Pode ainda efetuar uma cópia completa de uma instalação em poucos minutos, colocando-a para executar no mesmo servidor ou em outro.
Máquinas virtuais podem ser utilizadas em computadores pessoais, em servidores ou mesmo em mainframes. A única limitação é a capacidade de processamento e de memória do hardware.
Existem atualmente soluções de virtualização que podem ser instaladas diretamente sobre o hardware, sem a necessidade de instalar o sistema operacional previamente, enquanto outras podem ser instaladas sobre o sistema operacional já presente no computador.
Entre as soluções de virtualização existentes podemos citar: VirtualBox – solução de virtualização de código livre (licença GPL) e disponível para instalação em ambientes Windows, Linux e OpenBSD; VMWare – soluções diversas de virtualização para instalação direta sobre o hardware e sobre os sistemas operacionais mais utilizados; XEN – solução de virtualização para instalação em ambiente Linux; Virtual PC – Solução de virtualização da Microsoft, criada pela mesma equipe do VirtualBox.
Outro exemplo de máquina virtual é a Java Virtual Machine (JVM), desenvolvida pela Sun Microsystems. A idéia foi a criação de um ambiente que possibilitasse aplicações desenvolvidas em Java de executar em qualquer sistema operacional que possua a JVM instalada. Foram então criadas JVM para os sistemas operacionais mais utilizados atualmente.
As características de portabilidade e segurança, entre outras, possibilitaram ao Java uma grande inserção no mercado de soluções em software.
Figura 2.5 – Sistema com Máquina Virtual Java.
Nesta aula, você pôde estudar a estrutura de um sistema operacional, podendo perceber como se relaciona com os usuários, seus aplicativos e com o hardware. Em seguida, viu as funções que devem ser realizadas pelo sistema operacional, tais como gerenciar a utilização do processador, da memória, dos dispositivos de entrada e saída e do sistema de arquivos.
Na seqüência, abordou-se o tema “chamada de sistema” ou system calls e seu funcionamento como uma interface entre o usuário, seus aplicativos e o sistema operacional. Entre as chamadas existentes foram mencionadas algumas como: manipulação de processo; alocação de memória; acesso a arquivos; gerenciamento de dispositivos.
Então, você estudou o modo de acesso, por meio do qual se pode controlar melhor o acesso ao sistema operacional e, em especial, ao hardware; isso é feito por meio do acesso em modo usuário ou acesso em modo privilegiado (modo kernel), sendo que, nesse último, as aplicações encaminham as solicitações ao sistema para que sejam efetuadas. Assim, adiciona-se um recurso a mais de segurança ao sistema operacional.
Mencionaram-se ainda a arquitetura monolítica e a multicamada, com as vantagens desta última. Ao conceito de multicamada acrescentou-se o conceito de microkerne, possibilitando uma visão da estruturação dos sistemas operacionais atuais.
Por último, foram vistos os conceitos associados a máquinas virtuais, descrevendo-se suas aplicações e vantagens.
A partir da próxima aula, você começará a estudar como são gerenciados os processos e threads, passando em seguida ao gerenciamento de memória e ao gerenciamento de entrada e saída.
Aplicando o Conhecimento
1. Quais os principais elementos na arquitetura de um sistema operacional? Qual a função de cada um deles?
2. O que é uma system call? Qual o seu relacionamento com o núcleo do sistema operacional?
3. O que significa modo kernel e modo usuário em um sistema operacional? Qual a vantagem na utilização desses dois modos?
4. O que é uma máquina virtual? Qual a sua finalidade?
5. Quais são as camadas em uma solução que se utilize de máquina virtual?
Para Refletir
a. Considere os sistemas operacionais utilizados em dispositivos a sua volta, tais como computadores, celulares etc. Quais são monolíticos? Quais são em camadas?
b. As soluções de virtualização mais comuns atualmente envolvem a instalação de máquinas virtuais sobre um sistema operacional hospedeiro. É possível a instalação de máquinas virtuais diretamente sobre o hardware sem a utilização de um sistema operacional hospedeiro?
Aula 03 - Gerência de processos
Os primeiros dispositivos computacionais permitiam que somente um programa fosse executado de cada vez. Esse programa, além dos cálculos que fazia, ainda tinha acesso e controlava todo o dispositivo.
Atualmente, nos sistemas operacionais utilizados, vários programas são executados simultaneamente. Desse modo, precisa haver um controle do acesso aos recursos de processamento (processador) que são sempre limitados.
O controle do acesso ao processador pode se dar tanto para evitar conflitos quanto para melhorar a utilização da capacidade de processamento, evitando-se a ociosidade do processador. Assim, somente é disponibilizado o acesso ao processador para aquela aplicação que já está pronta para utilizá-lo.
Nesta aula, você verá os conceitos associados a processos e threads. O objetivo é compreender como é feita a alternância na utilização do processador, bem como tratar dos problemas decorrentes.
Processos
Conceito de Processos
O que é um processo?
Inicialmente faz-se necessário definirmos o que é um processo. O entendimento que você deve ter é que um processo nada mais é do que um programa em execução.
No computador que você possa estar utilizando, vários programas podem estar em execução simultaneamente, como: editor de textos; planilha eletrônica; navegador; mensageiro instantâneo; reprodutor de músicas ou vídeo. Além desses, outros programas presentes no sistema operacional também podem estar em execução. Entre esses, podemos citar os que controlam o relógio que aparece na tela; a otimização no consumo de energia; e a interação com outros dispositivos que possam vir a ser conectados pelo usuário.
Estado de um processo
Um processo passa por várias fases, também denominadas de estado, do momento em que é criado até o momento em que se encerra. Os estados em que um processo pode estar são:
· Criação – momento em que esta sendo criado.
· Execução – instruções do programa estão sendo executadas.
· Espera ou bloqueado – processo esperando a ocorrência de algum evento, por exemplo, o retorno de um dispositivo de entrada ou saída.
· Pronto – processo pronto aguardando sua vez de ter acesso ao processador.
· Terminado – o processo encerrou a execução.
Estrutura de um processo
O processo, como vimos, é um programaem execução. Todavia, para que ele seja executado adequadamente pelo sistema operacional, fazem-se necessários três elementos: contexto de hardware; contexto de software; espaço de endereçamento. À estrutura composta por esses três contextos é dado o nome de bloco de controle do processo.
Figura 3.1 – Estrutura de um Processo.
O contexto de hardware armazena o conteúdo dos registradores da CPU, como: contador de programas (program counter); pilha (stack pointer); status. Quando em execução, o conteúdo do contexto de hardware está armazenado nos registradores do processador. Assim que saem do processador, essas informações são salvas no contexto de hardware.
O processador, ao trocar um processo pelo outro, está efetuando uma troca de contexto. Isso se faz salvando as informações do processo que está saindo do processador e carregando as relativas ao processo que está entrando.
O contexto de software consiste em informações relativas às características e limites de recursos que podem ser alocados pelo processo. Entre as informações disponíveis estão: nome; identificador de processo ou PID (Process Identifier); identificador de grupo ou UID (User Identifier); prioridade de execução; data e hora de criação; tempo de processador; quotas; e privilégios.
Os identificadores (PID ou UID) permitem ao sistema operacional ou outros processos fazerem referência ao processo em questão. As quotas impõem um limite de uso, como: a quantidade de arquivos que se pode abrir; número máximo de operações de entrada ou saída; tamanho de buffers; número máximo de subprocessos que podem ser criados.
O espaço de endereçamento é a área de memória associada ao processo. Nesse espaço são alocados os endereços de memória utilizados. Esse item será abordado na Aula 4 – Gerência de Memória.
Escalonamento
No item anterior, foram apresentados os estados de um processo (criação, execução, espera ou bloqueado, pronto e terminado).
O processo é dito “em execução” quando está sendo processado na CPU. Em computadores com uma única CPU, somente um processo estará em execução. 
Quando está no estado “pronto”, um processo está apenas aguardando a liberação do acesso ao processador. De maneira geral, muitos processos podem estar no estado pronto. Esses processos ficam então em uma fila de espera denominada lista encadeada. Nessa lista, os processos prioritários terão privilégio no acesso ao processador.
Durante seu ciclo de vida um processo passa por várias mudanças de estado. São elas:
· Pronto -> execução – Após ser criado o processo fica na lista de processos prontos, aguardando sua vez de ter acesso ao processador.
· Execução -> espera – Um processo em execução passa para o estado de espera por vários motivos, entre eles, o aguardo de uma operação de entrada ou saída.
· Espera -> pronto – O processo retorna ao estado pronto após a operação solicitada ser concluída (por exemplo: entrada ou saída).
· Execução -> pronto – Quando terminado o tempo a que tem direito de utilizar o processador. Havendo ainda processamento a ser feito, é colocado na fila de prontos.
Como já se disse, nos sistemas operacionais atuais temos muitos programas em execução ao mesmo tempo. Vimos ainda que, se o computador possui somente uma CPU, somente um processo estará em execução ao mesmo tempo. Desse modo faz-se necessária essa alternância entre os processos, em que cada qual tem uma fatia de tempo antes de passar a vez para outro processo.
Ocorre que, muitas vezes, ainda durante o tempo de processamento, um processo necessita parar por algum tempo. Isso pode ser dar em razão de estar aguardando o retorno de um dispositivo de entrada ou saída, ou de alguma solicitação feita a outro processo. Logo, é necessário liberar o processador, um precioso recurso, enquanto não estiver sendo utilizado. Para isso temos o escalonador de processos.
O objetivo do escalonamento é otimizar a utilização do processador, de modo que o processador esteja em uso o máximo do tempo possível. A finalidade dele é escolher entre os processos na fila, que ganhará o acesso ao processador.
Processos Cooperativos
Os processos nos sistemas operacionais atuais podem ser independentes ou cooperativos. Independente é quando sua execução não depende de interação com nenhum outro processo. Cooperativo é quando sua execução depende dessas interações.
Existem vários motivos para um processo ser cooperativo:
· Compartilhar informações – Uma dada informação é compartilhada por vários processos e essa informação pode estar sendo modificada com o tempo.
· Agilizar a execução de tarefas – Para completar uma tarefa mais rapidamente, um determinado processo pode criar vários subprocessos, sendo que cada qual executará uma parte da tarefa, que será então consolidada pelo processo original.
· Modularizar solução – Um programa pode fazer uso de modularização para o cumprimento das tarefas que lhe são delegadas. Dessa forma podem existir módulos que podem, em dado momento, ser criados para cumprir determinada tarefa.
Processos Independentes, Subprocessos
O que são processos independentes, subprocessos? Qual a finalidade de utilizá-los?
Como se viu, podemos ter diversos processos em execução simultaneamente no computador. Esses processos podem ser totalmente independentes ou cooperativos. Lembre-se ainda de que cada processo possui três componentes: contexto de hardware; contexto de software; e espaço de endereçamento.
Considere que você utiliza um programa que efetua várias atividades ao mesmo tempo. Esse programa pode ser para gerenciar seus e-mails. Por exemplo, oOutlook ou Evolution. Neles, você pode ao mesmo tempo enviar, receber ou escrever mensagens.
Cada uma dessas atividades pode ser implementada como um processo independente em separado (modo mais fácil) ou como processos cooperativos, que utilizam melhor os recursos computacionais.
Um processo pode criar outros subprocessos para executar tarefas que lhe são delegadas. Cada novo subprocesso criado demanda a criação de um novo bloco de controle de processo (contexto de hardware, contexto de software e espaço de endereçamento). Essa operação de criação de processos é dispendiosa, do ponto de vista computacional.
A Figura 3.2 mostra o esquema da criação de alguns subprocessos:
Figura 3.2 – Estrutura de um Processo e seus Subprocessos.
Existe ainda uma terceira opção, denominada threads, que será vista no tópico seguinte.
Threads
Conceito de Threads
Como vimos no tópico anterior, o processo de criação de processos é uma atividade onerosa do ponto de vista computacional. Pode então surgir a seguinte questão: existe algum modo mais fácil e rápido de criação de subprocessos?
A resposta é sim. Temos um novo elemento, denominado thread, que implementa uma solução menos onerosa.
O que é thread? Como utilizá-la?
Tomemos o servidor web Apache como exemplo. Como todo servidor web, ele tem de ser capaz de atender a vários usuários diferentes que podem estar acessando-o ao mesmo tempo. Temos aqui uma solução muito interessante de como isso é feito.
Nesse caso, o servidor web cria um processo para cada requisição web que chega, ou seja, para cada usuário que acessa o servidor é criado um processo para atendê-lo. Agora, veja que as páginas em geral possuem um texto acompanhado de imagens. Para acelerar o atendimento, é criada uma thread para transferir cada imagem. Temos, desse modo, para cada usuário, um processo e várias threads executadas simultaneamente.
Em resumo, em um ambiente com múltiplas threads, o conceito de um programa associado a cada processo não é verdadeiro. O que temos é que cada processo tem pelo menos uma thread, criando quantas mais forem necessárias para cumprir as atividades.
Uma thread é, então, uma sub-rotina que, em um programa, é chamada para cumprir uma determinada tarefa.
Qual a diferença entre processos e threads?
Um processo possui seu próprio contexto de hardware, de software e espaço de endereçamento (bloco de controle de processo), onde os espaços de endereçamento são individuais e protegidos.
Threads compartilham esses espaços dentrode um mesmo processo. Isso permite que a criação de threads dentro de um processo seja mais rápida e eficiente.
Múltiplas Threads
Uma grande quantidade de programas que utilizamos faz uso do recurso de multithreads. Como já se disse, a criação de threads para execução de determinadas tarefas é mais rápida do que a criação de processos adicionais, uma vez que não precisamos criar novos blocos de controle de processo.
As threads dentro de um mesmo processo compartilham o contexto de software e o espaço de endereçamento, tendo somente seu espaço de hardware individual.
Figura 3.3 – Processo com uma Thread e com Múltiplas Threads.
Assim, como os processos disputam o acesso ao processador, o mesmo acontece com threads dentro de um mesmo processo. Desse modo, enquanto umathread aguarda um retorno de dispositivo de entrada ou saída, outra assume o processador.
Dentro de um mesmo processo, as threads podem acessar o espaço de endereçamento umas das outras sem restrições, facilitando o trabalho cooperativo.
A título de comparação, se tivéssemos vários processos fazendo a mesma atividade (ao invés de um único processo com várias threads), os processos não acessariam os contextos e espaços um do outro. A troca de informações e dados entre eles se dá por comunicação entre processos, ou seja, um processo tem que parar o que está fazendo para passar informações a outro processo.
Logo, os benefícios de utilização de multithreads são: aumento da responsividade – uma vez que o programa continua em execução mesmo que uma parte esteja em estado de espera; compartilhamento de recursos – as threads compartilham o contexto de software e espaço de memória de um processo; economia – a criação de threads é menos onerosa do que a criação de outros processos; utilização de arquiteturas multiprocessadas – nesse caso, as threadspodem estar em execução em diferentes processadores.
Threads no Windows e Linux
Os sistemas operacionais Windows (desde o Windows 95) e Linux implementam threads.
No Windows, cada programa é executado em um processo, sendo que cada processo pode conter uma ou mais threads. Cada thread possui: um identificador de thread, que identifica cada uma unicamente; um conjunto de registradores; uma pilha de usuários, quando a thread está sendo executada no modo usuário, ou uma pilha do kernel, quando a thread está sendo executada no modo kernel; área de armazenamento privada, usada por bibliotecas diversas em tempo de execução e bibliotecas de vínculo dinâmico ou DLL (Dynamic Link Libraries).
No Linux não há uma distinção entre processos e threads. Isso se dá em razão de como o Linux implementa um processo (ou tarefa). O compartilhamento do espaço de endereços é permitido em virtude de como o processo é representado no Kernel do Linux.
Cada processo no Linux possui uma estrutura de dados exclusiva para ele. Todavia, a estrutura de dados, ao invés de armazenar os dados, possui ponteiros para outras estruturas de dados, onde eles realmente estão. Essas estruturas representam a lista de arquivos abertos, de memória virtual etc.
Existem sinalizadores (flags) que indicam quanto do processo (pai) pode ser compartilhado com os subprocessos (processos filho). Se os sinalizadores estiverem desligados, naquele processo pai não haverá compartilhamento; se estiverem ligados, haverá o compartilhamento; se parte deles estiver ligada e parte desligada, haverá o compartilhamento parcial dos recursos.
Comunicação Interprocessos
Segundo Plano
Um processo pode estar em execução de dois modos diferentes: primeiro plano (ou foreground); segundo plano (ou background).
O que define se um processo é de primeiro plano ou de segundo é a interação com seus canais de entrada e saída, que podem ser: teclado, mouse, monitor, impressoras, arquivos ou outros processos.
O processo é dito de primeiro plano, quando permite a comunicação com o usuário enquanto executa. Geralmente a entrada é por meio de um teclado ou mouse, enquanto que a saída pode ser o monitor ou impressora. É o caso de um usuário que está utilizando um editor de texto.
Um processo em segundo plano não possui comunicação com o usuário durante o processamento. Como exemplo, podemos considerar o agendador de tarefas, no Windows, ou o Cron, no Linux.
Seção Crítica
Um conceito importante é o de seção crítica. Ele diz respeito a um trecho de código em execução pela thread, durante o qual não pode haver acessos por parte de outras threads como, por exemplo, quando está escrevendo em um arquivo.
Assim, quando uma thread está executando uma seção crítica, nenhuma outra thread pode executar sua própria seção crítica, o que é conhecido como exclusão mútua. O grande problema é criar um algoritmo que permita que as threads possam executar cooperativamente e sem conflitos, em razão dessas seções críticas.
Existem três considerações que devem ser feitas: somente uma thread pode estar em sua seção crítica; escalonamento de qual thread poderá entrar em sua seção crítica, quando mais de uma deseja fazê-lo; controle de quantas vezes uma determinada thread fez uso de sua seção crítica, evitando-se assim que esse acesso privilegie umas seções em detrimento de outras, causando o que é conhecido por starvation.
Semáforos
A sincronização de processos é um assunto extremamente importante no estudo de sistemas operacionais. O acesso aos recursos, controlado pelo sistema operacional, pode cair em algumas armadilhas se a sincronização não for efetuada corretamente.
O conceito de semáforo foi proposto por Dijkstra, em 1965, com o objetivo de criar um mecanismo de exclusão mútua e sincronização entre os processos. O recurso é utilizado na maior parte dos sistemas operacionais atuais e em linguagens de programação.
Os semáforos podem ser: do tipo binário, quando podem assumir somente os valores 0 (zero) ou 1 (um); do tipo contador, no qual podem assumir qualquer valor positivo e 0 (zero). Aqui nos restringiremos ao funcionamento do semáforo binário.
Semáforo binário
O semáforo tem valor 0(zero) ou 1 (um). O valor 0 (zero) indica que algum processo está acessando sua região crítica, enquanto o valor 1 (um) indica que nenhum processo está em sua região crítica.
O semáforo é manipulado pelas instruções DOWN e UP. Caso um processo deseje entrar em sua região crítica, este aciona a instrução DOWN.
A instrução DOWN decrementa a variável, enquanto a instrução UP incrementa uma unidade à variável.
Assim, se o semáforo estiver com valor 1 (um) e um processo necessita entrar em sua região crítica, este chama a instrução DOWN. O valor do semáforo é decrementado e o processo executa sua região crítica.
Se, por outro lado, o valor do semáforo for 0 (zero), o processo fica impedido de entrar na região crítica e fica em espera.
Quando o processo sai de sua região crítica, executa a instrução UP, tornando o valor do semáforo 1 (um) e liberando o acesso a outros processos.
Problemas Típicos de Sincronismo
No item anterior, você pôde ver como o semáforo é utilizado para lidar com questões de sincronismo. Todavia, existe um problema clássico de sincronização que você deve compreender: é o problema dos filósofos.
Problema dos filósofos
O problema dos filósofos, também conhecido como “o jantar dos filósofos”, consiste na seguinte situação:
Numa mesa de jantar, onde estão sentados cinco filósofos, estão disponíveis cinco pratos e cinco garfos. No centro da mesa há uma tigela com arroz. Cada vez que um filósofo pára de pensar e vai comer, necessitará de dois garfos. Se cada filósofo pegar um garfo ninguém conseguirá comer, uma vez que são necessários dois garfos. Esse problema é conhecido como deadlock (descrito brevemente na Aula 1).
Existem três possibilidades para permitir um funcionamento adequado do jantar, são elas:
· limitar a quatro o número de filósofos na mesa. Todavia, isso resolve apenas parcialmente o problema;
· o filósofo somente pode pegar um garfo se o outro estiver disponível;
· permitir que o filósofo ímpar pegue primeiro o garfo situado à esquerda e depois o situado à direita, enquanto o filósofo par efetuao inverso.
Veja que, qualquer que seja a solução, não há um controle de escalonamento; logo, não há nada que impeça um dos filósofos de morrer de fome (starvation).
Monitores
Monitores utilizam uma forma mais sofisticada de controle de sincronização do que o semáforo. É considerado um mecanismo estruturado. A utilização de monitores no desenvolvimento de programas é mais fácil do que semáforos, dando menos chances de que o programador cometa um erro.
O monitor consiste em módulos; cada módulo é constituído de procedimentos e variáveis; cada região crítica é definida como procedimento no monitor.
Nessa solução, somente um processo pode chamar um dos procedimentos do monitor. Caso já exista algum acesso, os demais processos aguardam em uma fila.
Transações Atômicas
Transação atômica consiste em garantir que uma determinada operação seja executada no seu todo ou que nenhuma parte seja executada.
Em muitos sistemas, a simples exclusão mútua de regiões críticas garante a coerência dos resultados, não importando a ordem em que sejam executadas.
Todavia, a garantia de execução de ambas é essencial.
Um exemplo clássico disso é a transferência de recursos entre duas contas bancárias. Essa operação consiste em duas operações básicas: efetuar o saque de uma das contas e efetuar o depósito na outra.
Para que não haja problemas para o banco, as duas operações devem ser efetuadas. Efetuar somente o saque de uma das contas ou simplesmente o depósito na outra, não é uma opção.
Devem existir então técnicas para que caso ocorram problemas com uma das ações, a outra seja automaticamente desfeita.
Deadlocks
Conceito de Deadlock
Deadlock pode ser definida como uma situação em que um processo aguarda por um evento que não acontecerá. Isso se dá, sobretudo, em razão de problemas de compartilhamento de recursos, em especial quando se usa exclusão mútua.
Na Aula 1, abordamos o conceito de deadlock, situação na qual dois processos ficam bloqueados, um esperando pela liberação de um recurso alocado pelo outro. A seguir é apresentada uma figura que ilustra um exemplo de deadlock.
Figura 3.4 – Deadlock – Espera Circular.
Para que uma deadlock aconteça são necessárias quatro condições. São elas:
· Problema com exclusão mútua – Nesse caso, um recurso já está alocado para um processo.
· Espera por um recurso – Um processo que alocou um recurso aguarda outro recurso sem liberar o primeiro recurso já em uso.
· Recurso não preemptivo – incapacidade do sistema operacional de alternar o uso do recurso entre os processos que o necessitam, ou seja, um recurso já alocado por um processo não pode ser alocado para outros que necessitam.
· Espera circular – um processo com um recurso já alocado espera pela liberação do recurso alocado por outro processo, enquanto o outro processo aguarda a liberação do recurso ocupado pelo primeiro processo.
Quanto mais são utilizados os recursos de processamento paralelo, maiores são as chances de esse tipo de problema ocorrer. Nos itens a seguir, serão abordadas a prevenção, detecção e recuperação de deadlocks.
Prevenção de Deadlock
A prevenção da ocorrência de deadlock passa por ações que impeçam uma das quatro condições necessárias para uma deadlock ocorrer.
A eliminação da primeira condição citada – problema com exclusão mútua – impede que uma deadlock ocorra. Isso se deve ao fato de que um processo não terá de aguardar por um recurso alocado por outro processo.
Em relação à segunda condição – espera por recurso – o melhor modo de preveni-la é garantir que um processo somente possa alocar todos os processos que necessitará ao mesmo tempo. Porém, essa abordagem pode levar o processo ao problema de starvation, ou seja, essa condição pode nunca ocorrer e o processo pode ficar parado “eternamente”.
A terceira condição – recursos não preemptivos – pode ser eliminada se um processo puder alocar um recurso já alocado por outro. Embora impeça o problema de não preempção, pode levar alguns processos ao problema de starvation, pois um processo pode liberar um recurso sem ter terminado seu uso e demorar a consegui-lo de volta.
A quarta condição – espera circular – pode ser evitada se for permitido que um processo somente solicite um novo recurso se liberar o recurso já em uso.
Apesar de a proposta de impedir uma das quatro condições de ocorrer resolver teoricamente o problema do deadlock, na prática, esse problema ainda pode ocorrer em razão de situações adversas não previstas.
Detecção de Deadlock
O recurso de detecção de deadlock é utilizado em sistemas operacionais que não tenham mecanismos de prevenção de deadlocks, permitindo que sejam identificados os processos e recursos envolvidos no problema.
Funciona baseado em estruturas de dados capazes de identificar os recursos do sistema, os processos que os alocaram e os processos que estão aguardando a liberação de algum desses recursos já em uso.
O funcionamento desses recursos geralmente se baseia em detectar a ocorrência de espera circular. Todavia, como o tempo de detecção varia conforme a implementação desse algoritmo, deve-se ter cuidado ao utilizá-lo em sistemas operacionais baseados em tempo real. Exemplo: sistemas utilizados em controle industriais, inclusive indústrias químicas e nucleares, além de tráfego aéreo e outros.
Recuperação de Deadlock
A recuperação de um deadlock pode utilizar duas técnicas: eliminar um dos processos na espera circular; suspender um dos processos na espera circular, liberando o recurso do mesmo.
A primeira técnica – de eliminação de um dos processos – é sem dúvida a mais simples e rápida. Todavia, pode causar problemas para a aplicação que o utiliza. Já a segunda técnica – suspender o processo – embora mais trabalhosa, permite resolver o problema sem provocar erros nos processos envolvidos. Nela, um dos processos é suspenso, seu recurso liberado e, depois de utilizado pelo outro processo, é devolvido ao primeiro processo, então reativado. Essa segunda técnica é denominada de rollback.
Nesta aula, você pôde estudar o gerenciamento de processos, cujo objetivo é compreender e visualizar como é a manipulação dos mesmos pelo sistema operacional.
Inicialmente foram abordados os conceitos de processos e de escalonamento dos mesmos e de seu funcionamento cooperativo. Na seqüência foi apresentado o conceito de thread. Você pôde então perceber que uma thread é criada e iniciada mais facilmente pelo sistema operacional. Nesse caso, um processo pode ter uma ou mais threads que compartilham recursos no cumprimento de suas atividades.
Nos itens seguintes – associados à comunicação interprocessos e deadlocks – foram apresentados conceitos e algumas situações-problema. Foram em seguida apresentadas as soluções típicas para resolvê-los.
Com isso, espera-se que tenha sido cumprido o objetivo desta aula, que foi ensinar sobre como melhorar a utilização do processador, permitindo que muitos processos (e threads) possam compartilhá-lo, inclusive em ambientes multiprocessados.
Aplicando o Conhecimento
1. O que é um processo?
2. Por quais estados passa um processo? Explique cada um.
3. Quais as partes que compõem um processo?
4. O que são threads?
5. Em quais situações é vantajoso utilizar threads?
6. O que é um processamento em primeiro plano e em segundo plano?
7. Em que consiste uma seção crítica? Como a utilização de semáforos pode ajudar?
8. O que é um deadlock? Quais as formas de prevenção?
Para Refletir
a. Como implementar concorrência em um ambiente monothread?
b. Qual a vantagem de compartilhamento do espaço de endereços entre as threads de um mesmo processo?
c. O sistema operacional que você utiliza em seu computador utiliza processos e threads? Quantos processos e threads estão em execução neste momento?
Aula 04 - Gerência de Memória
O gerenciamento de memória é um assunto sempre presente no estudo dos sistemas operacionais. Sempre foi considerado um recurso escasso e caro e, mesmo com a redução de preços que temos atualmente, ainda é um recurso disponível em quantidade limitada na máquina.
Então, em razão dessas limitações, temos queter um gerenciamento adequado de seu uso. Esse fato se torna ainda mais importante à medida que os sistemas operacionais atuais lidam com uma quantidade cada vez maior de programas em execução, simultaneamente.
Na aula anterior, vimos que os processos precisam alocar áreas na memória para que possam funcionar. Veremos agora como é feita essa alocação, além de outras ações, tais como: swapping (troca), paginação, segmentação e memória virtual.
O objetivo é que, ao final desta aula, você compreenda a finalidade do gerenciamento de memória, incluindo o princípio de funcionamento das ações citadas.
Conceitos Iniciais de Gerência de Memória
Em um sistema computacional existem dois tipos de memória: a principal – a ser tratada nesta aula; a secundária – que cuida do armazenamento de dados em dispositivos auxiliares como discos rígidos, memórias flash ou fitas.
Existem algumas características importantes que você deve saber neste momento. A primeira é que o processador somente executa instruções que estejam armazenadas na memória principal. A segunda é que o tempo de acesso à memória secundária é muito mais alto do que o de acesso à memória principal.
Assim, é interessante que a memória principal seja suficiente para todos os processos em execução. Caso contrário, o sistema terá que descarregar para a memória secundária os dados referentes a um processo que não esteja mais em execução, de modo a permitir que os dados de outro processo sejam carregados na memória principal. Essa ação é denominada swapping (troca) e será abordada a seguir.
Desse modo, no gerenciamento da memória, o sistema operacional deve fazer o melhor uso possível da memória principal, inclusive minimizando o número de operações de entrada e saída de dados na memória secundária.
Troca de Processos (Swapping)
A técnica de troca de processos, ou swapping, disponível nos sistemas operacionais atuais, permite que um sistema operacional utilize mais memória do que a disponível na memória principal.
Conforme mencionado anteriormente, todos os processos em execução devem ter seus espaços de endereçamento presentes na memória principal. Hoje em dia, com a utilização da multiprogramação, temos em um dado sistema operacional dezenas ou centenas de processos em execução. Em muitos casos a memória principal torna-se insuficiente para lidar com todos eles.
Para lidar com esse problema surgiu a técnica de swapping. Por meio dessa técnica o sistema decide qual processo será removido da memória principal e transferido para a memória secundária que pode ser, por exemplo, um disco rígido. A essa operação é dado o nome de swap out.
Figura 4.1 – Utilização de Área de Troca (Swap).
Em outro momento, o processo removido para a memória secundária pode ser transferido de volta para a memória principal; a isso se dá o nome de swap in.
Para que funcione adequadamente o swapping, deve utilizar-se um algoritmo que priorize a transferência de processos menos sujeitos de serem executados em um instante próximo. Com isso, evita-se que um processo recém-removido venha a ter que ser recolocado imediatamente.
Sistemas operacionais que implementam essa troca de processos devem ter o recurso de relocação dinâmica de programas. Isso é necessário porque, quando há o retorno à memória principal, a posição já não é mais a mesma que ocupava anteriormente, sendo então necessário que essa nova posição seja informada ao carregador (loader) que efetua essa relocação.
Considere que, apesar de permitir a execução de mais processos do que a máquina suportaria, introduz-se uma perda de desempenho considerável, que é tanto maior quanto maior for a quantidade de memória secundária necessária ao processo de swap. Quando a quantidade de memória principal é muito menor do que a necessária, pode-se observar que a máquina fica sobrecarregada, efetuando operações de troca o tempo todo. Isso ocasiona, como se disse, perda considerável de desempenho, o que pode muitas vezes ser evidenciado pela quantidade excessiva de acessos (de leitura e escrita) no disco rígido.
Alocação de Memória Contígua
Alocação de Memória
Para que você possa compreender como funciona a alocação de memória, é interessante entender antes alguns conceitos: alocação contígua simples; overlay; proteção de memória.
Na alocação contígua simples, presente nos primeiros sistemas operacionais, que eram monoprogramáveis, a memória é dividida em duas partes. A primeira, dedicada ao sistema operacional e a segunda, ao programa. Em geral, eram acompanhadas de um registrador que limita o acesso do usuário à área para programa.
Figura 4.2 – Utilização de Memória Principal.
Em relação ao overlay, anteriormente, um programa estava limitado ao tamanho da memória disponível, o que limitava muito o programador. O overlaypermitiu a utilização de um recurso importante, que é o uso de um processo que necessite de uma área de memória maior do que a disponível para ele.
Desse modo, o overlay permite que um processo carregue na memória apenas parte das instruções e dos dados, justamente os que serão necessários naquele momento. À medida que as primeiras instruções forem sendo utilizadas, elas vão sendo descarregadas e substituídas pelas próximas. Logo, um processo que necessite de 200 KB pode ser utilizado quando o limite disponível para cada processo seja de 150 KB.
Figura 4.3 – Utilização de Memória Principal – Técnica de Overlay.
A proteção de memória é outro conceito importante. Sua finalidade é a proteção do sistema operacional contra o acesso indevido a processos do usuário, assim como prevenir a interferência de um processo na memória de outro. Esse controle é feito pela utilização de um registrador, que contém o menor endereço físico e o intervalo de endereços lógicos. Desse modo, o endereço a ser utilizado está no intervalo entre esses dois valores.
O controle do acesso aos endereços nesse intervalo é feito por um dispositivo denominado Unidade de Gerenciamento de Memória (Memory ManagementUnity - MMU). O MMU efetua um mapeamento entre o endereço lógico e o endereço físico realmente utilizado para armazenar os dados na memória principal. A figura a seguir ilustra esse funcionamento.
Figura 4.4 – Relocação Dinâmica.
O processo do usuário não visualiza os endereços físicos utilizados, ele simplesmente tem um ponteiro direcionado para um local cuja associação com a localização real (física) é feita pelo MMU. O processo do usuário entende que está acessando endereços, por exemplo, entre 0 (zero) até M (máximo), enquanto o MMU converte esses endereços para algo do tipo: R+0 até R+M.
Fragmentação de Memória
Um aspecto importante em memória é o conceito de fragmentação. Mas o que é fragmentação?
Lembre-se de que o sistema operacional mantém uma tabela com a alocação da memória, ou seja, onde está o quê. Nesse conceito, o sistema tem as informações sobre quais trechos da memória estão ocupados e quais estão livres.
Considere que um processo entra em execução; ele precisará de um espaço de memória que possa utilizar. O sistema procura um espaço livre onde possa colocá-lo e continua a fazer assim para cada processo que precisar de memória.
Em um dado momento, algum processo não mais necessitará da memória alocada e o sistema a liberará. Perceba então que, aos poucos, começarão a surgir espaços (buracos) na memória.
Outros processos que venham a surgir serão colocados pelo sistema operacional nesses espaços. Nesse momento, o sistema procura por um espaço grande o suficiente para alocar. Caso não haja um espaço grande o suficiente, o sistema alocará parte da memória em um espaço e parte em outro espaço. Ocorre então o que chamamos de “fragmentação de memória”.
Existe um meio de eliminar essa fragmentação?
Não, se a alocação de memória for estática. Porém, se a alocação de memória for dinâmica, essa desfragmentação pode ser feita.
Utilizando a alocação dinâmica podemos fazer uso de um algoritmo que efetua a movimentação dos processos para os espaços disponíveis em uma extremidade da memória e a movimentação dos espaços (buracos) para a outra extremidade.A cada movimentação de processo, o registrador é atualizado para refletir a nova posição.
Alternativas podem ser utilizadas com paginação ou segmentação. Esses dois conceitos são abordados nos itens seguintes.
Memória Virtual
Como vimos, os programadores e os sistemas há muito lidam com programas maiores do que a memória. Você viu as técnicas de swapping, que utiliza a memória secundária como apoio, e a de overlay, que carrega partes do processo que necessitem de mais espaço do que o estabelecido como tamanho de bloco.
A memória virtual se tornou uma técnica em que partes de um programa podem estar em memória e o resto no disco. Você verá a seguir algumas técnicas adicionais que visam otimizar o uso da memória fazendo uso desse recurso.
Paginação
A paginação consiste em permitir que o espaço de endereçamento seja não contíguo. Ela resolve alguns problemas. Um deles é que a fragmentação ocorrida na memória se dá também na memória secundária (por exemplo: disco). Logo, quando algum fragmento de código ou dados da memória principal precisar ser retirado, esse espaço precisará ser localizado também no armazenamento secundário. Ocorre que o acesso nesse tipo de armazenamento é mais lento.
Como funciona a paginação?
A paginação divide a memória física em blocos de tamanho fixo, também denominados quadros. Um processo que entre em execução tem suas páginas carregadas em quadros disponíveis na memória.
Observe que o armazenamento secundário (disco) também é dividido em blocos que possuem tamanho igual aos dos quadros de memória.
O funcionamento pode ser representado pela figura a seguir:
Figura 4.5 – Paginação.
Cada endereço gerado é dividido em duas partes: um número de página (p) e um deslocamento de página (d). O primeiro é utilizado como um índice para a tabela de páginas; o segundo é utilizado como deslocamento.
A tabela de páginas contém o endereço denominado “endereço de base” de cada página. O endereço de base é combinado ao deslocamento para definir o endereço na memória, em um sistema semelhante ao descrito anteriormente, no item “Alocação de Memória” (R+0 e R+M).
Os tamanhos de página, sempre uma potência de 2, variam entre 512 bytes e 16 MB, conforme a arquitetura do computador utilizado.
Em geral, o suporte à paginação é feito por hardware; entretanto, em alguns sistemas operacionais, em especial os mais novos de 64 bits, possuem parte da paginação implementada em software.
Considere o seguinte exemplo teórico (Figura 4.6):
· Tamanho de página – 4 bytes.
· Memória física – 32 bytes (equivalente a 8 páginas).
Figura 4.6 – Paginação para uma Memória de 32 bytes e Páginas de 4 bytes.
Veja as seguintes situações:
Antes, atente para que:
· Os quadros (na memória lógica) estão numerados de 0 (zero) a 3 (três).
· Os quadros (na memória física) estão numerados de 0 (zero) a 7 (sete).
· A tabela de página efetua a associação entre a posição na memória lógica e memória física.
Situação 1 - A página 0 (zero) está no quadro 5
· Logo, o endereço lógico 0 (zero) está mapeado para o endereço físico 20 (quadro 5). Ou então (5x4)+0 = 20.
· Já o endereço lógico 3 (três) está mapeado para o endereço físico 23 (quadro 5). Ou então (5x4)+3 = 23.
Situação 2 - A página 1 está no quadro 6
· O endereço lógico 4 está mapeado para o endereço físico 24 (quadro 6). Ou então (6x4)+0 = 24.
Situação 3 - A página 2 está no quadro 1
· O endereço lógico 8 está mapeado para o endereço físico 4 (quadro 1). Ou então (1x4)+0 = 4
· O endereço lógico 9 está mapeado para o endereço físico 5 (quadro 1). Ou então (1x4)+1 = 5
Dedique um tempo a compreender o que está colocado nas situações anteriores. Assim que você perceber que cada quadro da memória lógica foi colocado em um quadro da memória física e que o mapa disso está na tabela de página, é sinal de que você está compreendendo o significado de paginação.
Algumas considerações sobre paginação e fragmentação
No exemplo anterior, foram apresentados exemplos de paginação. Veja que as páginas foram preenchidas completamente. Na prática podemos ver o que é chamado de fragmentação interna.
Fragmentação interna significa um processo que dificilmente ocupa completamente todas as páginas alocadas. Por exemplo: um processo que necessita de 102950 bytes; considerando uma página de 4096 bytes, seriam necessárias 25 páginas completas e mais 550 bytes, o que significam 26 páginas, sendo que a última teria ocupados somente 550 dos 4096 bytes disponíveis; logo, na última página sobram 3546 bytes.
Desse modo, um processo pode alocar “n páginas + 1 byte”, o que significa que o fragmento teria praticamente o tamanho da página.
Esse raciocínio leva a crer que, quanto menor a página, menores os fragmentos. Porém, a tabela de páginas aumentaria, uma vez que a quantidade de páginas a gerenciar aumentaria. Valores razoáveis para o tamanho de página atual variam de 4KB a 8KB.
Substituição de Página
A substituição de página consiste em uma técnica de substituição quando não houver mais nenhuma página livre na memória principal.
O sistema operacional deve decidir quais páginas devem ser retiradas. Caso as páginas a serem removidas não tenham sofrido alterações e estejam de acordo com a cópia na memória secundária, elas são então removidas. Se houve modificações, estas têm que ser salvas no disco antes de removidas da memória.
A identificação de quais páginas foram alteradas é feita através de um bit que identifica se a página sofreu alteração.
Duas possibilidades podem ser utilizadas para decidir quais páginas serão removidas: substituição local e substituição global. Na primeira, as páginas escolhidas estão entre as utilizadas pelo processo que necessita de páginas adicionais. Na segunda, as páginas escolhidas podem estar entre todas utilizadas pelo sistema operacional.
Segmentação
A segmentação é uma técnica de gerenciamento de memória em que os blocos de memória possuem tamanhos diferentes.
Em geral, essa alocação é feita pelo compilador, o qual, a partir do código fonte, decide o que cada bloco irá conter: procedimento, função, vetor ou pilha. Essa alocação pode ser feita dinamicamente durante a execução. Isso permite que uma sub-rotina seja modificada, sem a necessidade de se recompilar o programa todo.
O mapeamento do endereço é similar à paginação e utiliza um mapa que identifica os blocos (ou segmentos) da memória virtual com os blocos da memória principal. O sistema operacional mantém ainda uma tabela indicando as áreas livres e ocupadas.
Havendo um novo bloco a ser carregado, o sistema operacional aloca um espaço suficiente para caber os dados em questão.
Enquanto na paginação ocorre o problema de fragmentação interna – dentro de cada página, uma vez que a paginação divide os dados em blocos de tamanho fixo – na segmentação se dá a fragmentação externa, já que não sobra espaço no bloco, uma vez que os blocos são de tamanho variável.
Porém, podem sobrar espaços na memória principal e estes podem não ser suficientes para alocar um novo processo. É necessário, então, realocar os segmentos na memória, com a finalidade de reunir os vários pequenos espaços, o que pode vir a servir para algum outro bloco a ser carregado.
A segmentação permite ainda o compartilhamento de dados da memória, pois permite que mais de um processo aponte para um mesmo segmento na memória.
Nesta aula, você estudou como o sistema operacional efetua o gerenciamento da memória. Foram abordados os conceitos mais importantes relativos ao tema, entre eles: swapping, fragmentação, memória virtual, paginação e segmentação.
Cada um desses recursos permite ao sistema operacional um melhor uso dos recursos da máquina, ou seja, tanto da memória principal, quanto da memória secundária. Assim, procura-se fazer o melhor uso de técnicas que permitam que se utilize mais memória do que a fisicamente existente em sua memória principal, permitindo aos sistemas operacionais atuais lidarem com uma grande quantidade de processos em execução simultaneamente na máquina. 
Até aqui, você já estudou, além dos conceitos básicos, a gerência de processos e

Outros materiais