Prévia do material em texto
RESUMO – SISTEMAS OPERACIONAIS
TEMA 2. CONCEITOS BÁSICOS DE SO
❖ INTRODUÇÃO AOS SISTEMAS OPERACIONAIS
1. Composição de um Sistema Computacional
• Inclui usuários, hardware e software.
• Os softwares são divididos em:
o Aplicativos: Desenvolvidos e utilizados pelos usuários.
o Sistemas Operacionais (SO): Interface entre hardware e aplicativos.
2. Função do Sistema Operacional
• Simplifica o uso do hardware para usuários e desenvolvedores.
• Torna o uso do hardware mais eficiente e eficaz.
3. Evolução dos Sistemas Operacionais
• Relacionada ao avanço dos sistemas computacionais.
• Conhecer a história dos SO ajuda a entender seu papel atual.
Módulo 1. Descrever a evolução histórica dos sistemas operacionais
❖ Conceitos de Sistemas Operacionais
1. Importância dos Sistemas Operacionais (SO)
• Essencial para profissionais de computação, como:
o Administradores de sistemas.
o Programadores de aplicações concorrentes.
o Gerentes de segurança.
o Administradores de redes.
• Facilita o uso eficiente e seguro de sistemas computacionais.
2. Componentes Básicos de um Sistema Computacional (S.C.)
• Hardware: Fornece recursos básicos, como CPU, memória e dispositivos de entrada/saída (E/S).
• Aplicativos: Soluções para problemas computacionais dos usuários (e.x., compiladores, bancos de dados,
jogos, programas comerciais, etc).
• Usuários: Pessoas, máquinas ou outros computadores que utilizam o sistema.
• Sistema Operacional (SO): Intermediário que controla e coordena o uso do hardware entre programas e
usuários.
3. Definição e Função do SO
• Definição: Conjunto de rotinas de computação que atua como intermediário entre o hardware e o usuário.
• Objetivos principais:
o Simplificar: Torna o uso do hardware mais acessível.
o Abstrair: Oculta a complexidade do hardware.
o Gerenciar recursos: Coordena e aloca hardware e software de forma otimizada.
4. Modos de Execução em um Sistema Computacional: Em um computador, os programas podem ser executados
em modo usuário ou kernel.
• Modo usuário:
o Software com acesso limitado ao hardware.
o Inclui programas e aplicativos utilizados diretamente pelos usuários.
• Modo núcleo (kernel):
o SO é o único programa executado com acesso completo ao hardware.
o Permite a execução de instruções críticas e gerência do sistema.
5. Interface com o Usuário
• Os usuários que interagem com sistemas como Windows, Linux, Mac OS ou Android; na verdade estão
utilizando uma interface de acesso, que pode ser baseada em texto (shell) ou em gráficos (GUI).
• Essa interface de acesso não é o sistema operacional em si, mas usa o SO para funcionar.
• Shell: Baseado em texto, interpreta comandos (ex: prompt de comando).
• GUI: Interface gráfica baseada em ícones.
6. Diferença entre Interface e Sistema Operacional
• Interface do Usuário:
o Baseada em texto (shell) ou gráfica (GUI).
o Não faz parte do SO, mas utiliza o SO para funcionar.
• Sistema Operacional:
o É o único programa executado em modo núcleo (kernel), com acesso completo ao hardware.
o Gerencia programas do usuário e dispositivos de E/S.
5. Histórico e Importância
• Nos primeiros computadores, a programação era feita manualmente em painéis físicos.
• O surgimento do SO possibilitou:
o Utilização mais eficiente do hardware.
o Modularização e abstração das operações para os usuários.
o Redução da complexidade no acesso ao hardware.
6. Abstração e Máquina de Níveis
• O SO abstrai o hardware e rotinas de software, criando um modelo de máquina de níveis (ou máquina de
camadas).
• Qualquer camada acima do hardware pode ser chamada de máquina virtual, representando serviços e
funções acessíveis ao usuário.
❖ Histórico dos Sistemas Operacionais
1. Relação entre Sistema Operacional e Hardware
• O SO é intimamente ligado ao hardware, estendendo as instruções do computador e gerenciando recursos.
• O sistema operacional exige conhecimento profundo do hardware para otimizar o desempenho e a
interação, ao menos a partir do ponto de vista do programador.
2. Evolução dos Sistemas Operacionais por Geração
• Os sistemas operacionais evoluíram gradualmente, e pode ser dividido em fases.
• A história dos sistemas operacionais é bastante relacionada à arquitetura de computadores. Sendo assim,
veremos brevemente as várias gerações de computadores com o objetivo de entender as primeiras versões
de sistemas operacionais.
• Primeira Geração (1945–1955):
o Programação feita em painéis de controle.
o Usavam válvulas nos circuitos lógicos.
• Segunda Geração (1955–1965):
o Substituição das válvulas por transistores.
o Surgimento dos sistemas de computação em lote (batch).
• Terceira Geração (1965–1980):
o Estabelecimento pleno dos sistemas operacionais.
o Introdução de conceitos como:
▪ Multiprocessamento, multiprogramação e time-sharing.
▪ Spooling e memória virtual.
o Avanço do hardware com circuitos integrados (CIs).
o Surgimento do sistema operacional UNIX.
• Quarta Geração (1980 – Atualidade): Consolidação e avanços significativos:
o Surgimento dos computadores pessoais
o Integração em larga escala (LSI e VLSI) – Miniaturização e barateamento dos componentes
eletrônicos
o Intel produz seu primeiro microprocessador – Intel 4004
o Intel 8080 – Primeiro microcomputador
o 1976: Apple II (8 bits)
o Surgimento da Microsoft
o Redes distribuídas
o Protocolos de redes
o Redes locais
o SO intimamente relacionados com o software de rede
o Surgimento da linguagem Pascal e C
o Surgimento do IBM PC – Intel 8088 de 16 bits com DOS (Disk Operating System)
o Sistemas multiusuários foram impulsionados
o Protocolos da internet TCP/IP
o Surgimento das estações de trabalho
o 1982: Surgimento da Sun Microsystems e das primeiras estações RISC
o Surgimento das interfaces gráficas
o Avanços de hardware, software e telecomunicações
o Processadores e dispositivos de E/S mais rápidos e menores
o Integração em ultra larga escala (ULSI)
o Internet: Problemas de gerência, segurança e desempenho
o Arquitetura Cliente – Servidor
o Software aberto (Open Source)
o Demanda cada vez maior de processamento
o Arquiteturas paralelas
o Processamento distribuído
o SO em celulares, tablets e outros
3. Inovações e Eventos na Quarta Geração
• Hardware e Dispositivos:
o Processadores mais rápidos e menores.
o Integração de larga e ultra larga escala.
o Apple II (8 bits), IBM PC (Intel 8088 de 16 bits com DOS).
• Sistemas Operacionais:
o Sistemas multiusuários e distribuídos.
o SO com integração em redes e telecomunicações.
o Surgimento de interfaces gráficas e arquitetura cliente-servidor.
o Expansão do Open Source e SO para dispositivos móveis (celulares, tablets).
• Telecomunicações e Internet:
o Desenvolvimento de protocolos, redes locais e distribuídas.
o Problemas de gerência, segurança e desempenho em redes.
• Avanços na Computação:
o Processamento paralelo e distribuído.
o Demanda crescente por maior capacidade de processamento.
4. Impacto Tecnológico
• Avanços contínuos em hardware, software e redes.
• Integração de sistemas operacionais em diversas plataformas, como dispositivos móveis.
• Expansão de arquiteturas paralelas e processamento distribuído.
❖ MS Windows e Unix:
1. MS Windows
• MS-DOS (1981):
o Sistema operacional de 16 bits monoprogramável e monousuário com interface de linha de
comando.
o Lançado pela Microsoft para o IBM-PC.
• MS Windows 1.0 (1985):
o Introdução da interface gráfica para o MS-DOS.
o As versões seguintes mantiveram o MS-DOS como núcleo (Windows 3.0, 95, 98, Me).
• Windows NT (1993):
o Sistema de 32 bits com multitarefa preemptiva, multithread e suporte a múltiplos processadores.
o Núcleo novo, mas compatibilidade com MS-DOS.
o Interface gráfica semelhante às versões anteriores.
• Windows 2000:
o Evolução do Windows NTinanição: Prioridades são reduzidas ao longo do tempo para evitar que
processos prioritários monopolizem a CPU.
➢ Quantum proporcional: Pode-se ajustar o quantum de forma inversamente proporcional à
fração de quantum utilizada.
• Vantagens e desvantagens:
o Vantagem: Oferece melhor tempo de resposta para os processos.
o Desvantagem: Aumenta a complexidade e o overhead do sistema.
7. Escalonamento por Múltiplas Filas
• Motivação:
o Processos possuem diferentes características de processamento, tornando difícil a aplicação de um único
algoritmo de escalonamento.
• Solução:
o Classificar os processos em função do tipo de processamento realizado.
o Aplicar a cada grupo, mecanismos de escalonamentos distintos.
• Estrutura e Funcionamento:
o O escalonamento utiliza múltiplas filas de processos no estado pronto.
o Cada processo é atribuído exclusivamente a uma fila específica, com base em suas características.
o Cada fila possui um mecanismo próprio de escalonamento, adaptado ao tipo de processo.
• Classificação dos Processos:
o Os processos precisam ser previamente classificados pelo tipo de processamento antes de serem
associados a uma fila.
• Prioridade entre filas:
o As filas têm prioridades definidas. Processos de filas com maior prioridade são escalonados antes dos de
filas com prioridade inferior.
o Uma fila só é atendida se todas as filas de maior prioridade estiverem vazias.
• Exemplo prático: Para exemplificar esse escalonamento, considere que os processos, em função de suas
características, sejam divididos em três grupos: sistema, interativo e batch.
o Fila de sistema:
▪ Prioridade superior.
▪ Utiliza escalonamento baseado em prioridades.
o Fila de processos interativos:
▪ Prioridade intermediária
▪ Utiliza escalonamento circular.
o Fila de processos batch:
▪ Prioridade mais baixa
▪ Também pode usar escalonamento circular.
• Vantagem:
o Oferece flexibilidade para atender diferentes tipos de processos de forma eficiente e ordenada.
8. Escalonamento em Sistemas de Tempo Real
• Características:
o Um sistema de tempo real é aquele em que o tempo tem um papel essencial.
o Processos precisam atender a prazos fixos.
• Exemplos de sistemas de tempo real:
o equipamentos que estão monitorando pacientes em uma UTI.
o piloto automático de um avião
o controle de robôs em uma fábrica automatizada.
o Em todos esses casos, ter a resposta certa tarde demais é, muitas vezes, tão ruim quanto não tê-la.
• Sistemas em tempo real geralmente são categorizados em:
o Tempo Real Crítico: prazos absolutos, que devem ser cumpridos.
o Tempo Real Não Crítico: prazos podem ser tolerados ocasionalmente.
• Tipos de Eventos a que um sistema de tempo real pode responder são:
o Periódicos: ocorrem em intervalos regulares.
o Aperiódicos: ocorrem de forma imprevisível.
• Um sistema de tempo real pode ser implementado se ele atender ao seguinte critério:
o Se há m eventos periódicos e o evento i ocorre com o período Pi e exige Ci segundos de tempo da
CPU para lidar com cada evento, a carga pode ser tratada se:
∑
𝐶𝑖
𝑃𝑖
≤ 1
𝑖
𝑖=1
o Um processo que não atende a esse critério não pode ser escalonado, pois o montante total de
tempo de CPU que os processos querem coletivamente é maior do que a CPU pode proporcionar.
• Algoritmos de escalonamento de tempo real podem ser:
o Estáticos: Algoritmos estáticos tomam suas decisões de escalonamento antes de o sistema começar
a ser executado.
▪ Funciona apenas quando há uma informação perfeita disponível antecipadamente sobre o
trabalho a ser feito e sobre os prazos que precisam ser cumpridos.
o Dinâmicos: Algoritmos dinâmicos tomam suas decisões no tempo de execução, após ela ter
começado.
▪ Algoritmos de escalonamento dinâmico não têm essas restrições.
• Vantagens:
o Garantia de cumprimento de prazos (se for escalonável).
• Desvantagens:
o Algoritmos estáticos requerem conhecimento prévio completo.
o Algoritmos dinâmicos são mais complexos.
9. Escalonamento de Threads
• Contexto:
o Em sistemas com múltiplos processos e threads, há dois níveis de paralelismo: processos e threads.
o O escalonamento varia dependendo se os threads são de usuário ou de núcleo.
• Threads de Usuário:
o O núcleo desconhece os threads.
o O núcleo escala o processo e o thread é gerenciado internamente pelo escalonador do processo.
o Funcionamento:
▪ O núcleo seleciona um processo, que controla internamente qual thread executar.
▪ Threads podem consumir todo o quantum do processo ou cooperar para ceder tempo de
CPU.
o Características:
▪ Simples e eficiente: A troca de thread exige poucas instruções.
▪ Limitação: Se um thread é bloqueado (e.x., por E/S), todo o processo é suspenso.
▪ Escalabilidade: Permite o uso de escalonadores específicos para cada aplicação.
• Threads de Núcleo:
o O núcleo é responsável por gerenciar os threads diretamente.
o Funcionamento:
▪ Cada thread recebe um quantum e pode ser preemptivamente interrompido.
▪ Exemplo de sequência com threads de núcleo: A1, B1, A2, B2, A3, B3 (intercalando threads
de diferentes processos).
o Características:
▪ Menor eficiência: chaveamento de threads exige troca de contexto completa (mapa de
memória e cache).
▪ Vantagem: Um bloqueio de thread não suspende todo o processo.
• Comparação entre Threads de Usuário e de Núcleo:
o Desempenho:
▪ Threads de usuário: Troca mais rápida, mas suspende o processo em bloqueios.
▪ Threads de núcleo: Troca mais lenta, mas permite maior flexibilidade em bloqueios.
o Flexibilidade:
▪ Threads de usuário: Podem usar escalonadores específicos para aplicações.
▪ Threads de núcleo: O núcleo pode priorizar chaveamentos mais eficientes (e.x., entre
threads do mesmo processo).
❖ Escalonamento no Linux
• Multitarefa Preemptiva:
o O Linux utiliza escalonamento preemptivo para decidir qual processo executar e quando,
equilibrando justiça e desempenho para diversas cargas de trabalho.
• Classes de Tarefas: O Linux é baseado em tarefas do núcleo. São definidas três classes de tarefas:
1. FIFO em Tempo Real:
▪ Escalonamento baseado exclusivamente na prioridade.
▪ Não ocorre preempção, a menos que uma tarefa de maior prioridade entre no estado
pronto.
2. Escalonamento Circular em Tempo Real:
▪ Utiliza o algoritmo Round Robin com quantum associado.
▪ Após exceder o quantum, ocorre preempção, e a tarefa vai para o final da fila.
3. Tempo Compartilhado:
▪ Escalonadas somente se não houver tarefas de tempo real prontas.
▪ Menor prioridade entre as classes.
• Prioridades:
o Tempo Real:
▪ Níveis de prioridade de 0 (mais alto) a 99 (mais baixo).
o Tempo Compartilhado:
▪ Níveis de prioridade de 100 (mais alto) a 139 (mais baixo).
o Total de 140 níveis de prioridade no Linux.
• Escalonamento por Múltiplas Filas:
o Classes de tarefas organizadas em filas com diferentes prioridades.
o FIFO em tempo real tem maior prioridade, enquanto tempo compartilhado tem a menor.
• Utilitário de linha de comando, nice:
o Permite alterar a prioridade de tarefas.
o Aceita valores de -20 a +19:
▪ Valores negativos só podem ser definidos pelo root (administrator do Linux).
▪ Usuários comuns só podem reduzir a prioridade de suas tarefas, nunca aumentá-la.
• Observação sobre Tempo Real:
o Apesar do nome, as classes "tempo real" no Linux não garantem limites de tempo rígidos necessários
para sistemas de tempo real.
TEMA 4. MEMÓRIA
❖ Introdução
Execução de programas :
• Segundo von Neumann, instruções e dados de um programa precisam ser alocados na memória principal
para serem referenciados e executados.
• Processos ativos devem estar na memória para serem executados.
Importância do gerenciamento de memória :
• Necessário para alocar espaços na memória e localizar instruções e dados dos processos.
• Essencial em sistemas monotarefa e ainda mais relevanteem sistemas multitarefas.
Desafios de gerenciamento :
• O alto custo e as limitações de memória em relação às necessidades dos programas tornam o gerenciamento
eficiente.
Módulo 1. Descrever como os processos enxergam a memória e como ela é gerenciada
❖ Gerência de Memória
• A memória do computador é um recurso importante e que exige um gerenciamento adequado.
Estrutura da Memória: Ela é composta por vários elementos, tais como:
• Componentes da memória:
o Memória principal (RAM): Armazenamento primário.
o Armazenamento interno: Registradores e cache.
o Armazenamento secundário: Discos (SSD, magnéticos, óticos) e fitas magnéticas.
• Características dos níveis de armazenamento:
o Custo: Memórias mais rápidas são mais caras.
o Quantidade: Memórias mais rápidas e caras, estão em menor quantidade no computador.
Tipos de Memória: Três grandes tipos de armazenamento:
1. Armazenamento Primário:
o Representado pela memória RAM.
o Armazena código e dados dos programas em execução.
o Volátil e acessada diretamente pelo processador.
2. Armazenamento Interno:
o Localizado no processador (registradores e cache).
o Memória volátil e de alta velocidade.
o Utilizada como memória de trabalho direta do processador.
3. Armazenamento Secundário:
o Memória não volátil usada para armazenar dados a longo prazo.
o Dados devem ser transferidos para a memória primária para serem processados.
Funções do Sistema Operacional: O sistema operacional é o responsável por realizar a gerência da memória. Entre
suas funções estão:
• Alocar e desalocar processos na memória.
• Controlar os espaços livres e ocupados.
• Garantir segurança, impedindo que processos acessem a memória de outros.
• Gerenciar a transferência de dados entre armazenamento primário e secundário.
❖ Como os Processos Enxergam a Memória
Perspectivas sobre a Memória:
• Memória Física:
o Armazenamento real dos dados em circuitos eletrônicos.
o Acessada por endereços físicos, geralmente representados em hexadecimal.
• Memória Lógica:
o Vista pelos processos como um conjunto de endereços lógicos.
o Corresponde ao espaço de endereçamento do processo.
o Muitas vezes maior que a memória física devido ao uso de memória virtual.
Modelo de Memória de um Processo:
• Áreas principais da memória:
o Text: Área que armazena o código do programa.
o Data: Área que contém as variáveis do programa.
o Heap: Área que é reservada para alocação de variáveis
temporárias e dinâmicas.
o Pilha: Área que armazena registros de ativação e variáveis locais.
o Área Livre: Área que permite o crescimento do Heap e da Pilha em direções opostas.
Tradução de Endereços:
• Processo e Endereçamento:
o O processo enxerga apenas endereços lógicos.
o O circuito eletrônico enxerga apenas endereços físicos.
o Necessidade de Tradução: Dessa forma, a tradução de endereços lógicos para físicos é necessária.
o Propósito da Tradução: Permite que um programa que usa endereços lógicos aponte para endereços
físicos correspondentes.
• Tradução de endereço lógico para físico:
o Necessária para que o programa acesse corretamente a memória física.
o Realizada pela MMU (Memory Management Unit), com base nas regras:
1. Endereço lógico está dentro dos limites (maior que o limite
inferior e menor que limite superior): é válido e corresponde
ao físico.
2. Endereço lógico é menor que o limite superior: é ajustado
com o endereço base. O endereço lógico é diferente do
endereço físico.
3. Endereço lógico está fora dos limites (maior que o limite
superior ou menor que limite inferior): é inválido e gera uma
exceção.
Compartilhamento e Concorrência: A memória é sempre dividida entre outros processo:
• Monotarefa: Mesmo em sistemas monotarefa, a memória terá uma área dedicada para o sistema
operacional (a).
• Multiprograma:
o Enquanto nos sistemas multiprogramados, diversos processos
compartilham a memória simultaneamente (b).
o É essencial evitar que processos invadam as áreas uns dos outros, o que
poderia causar erros graves.
o Por questão de Segurança: Há a necessidade de impedir que um processo leia ou sobrescreva dados
de outro processo na memória.
❖ Proteção da Memória
Importância da Proteção
• Separação de Espaço de Memória:
o Cada processo deve ter um espaço de memória separado.
o Fundamental para execução concorrente e proteção mútua dos processos.
o Intervalo de Endereços Legais: A ideia básica da separação é que seja determinado um intervalo de
endereços que só possam ser acessados pelo processo.
▪ Objetivo: Assegurar que esse acesso seja realizado exclusivamente por ele.
Mecanismo de Proteção: É possível fornecer essa proteção usando dois registradores, geralmente um registrador
base e um registrador limite.
• Intervalo de endereços legais:
o Cada processo tem um intervalo definido que delimita os endereços que
pode acessar.
o Implementado por meio de registradores base e limite:
▪ Registrador base: Define o limite inferior do espaço de memória do processo (endereço
inicial. Ex. limite inferior = 300040).
▪ O limite superior é determinado pela soma do limite com o endereço base (ex.:
limite superior = 420940)
▪ Registrador limite: Define o tamanho da área alocada ao processo.
• Verificação pela MMU: A proteção do espaço da memória é assegurada pela MMU.
o A MMU confirma se o endereço solicitado está dentro do intervalo permitido.
o Endereços fora do intervalo geram um erro fatal, prevenindo acessos indevidos.
o Esse esquema impede que um programa rodando em modo usuário, de forma deliberada ou
acidental, modifique o código ou as estruturas de dados do sistema operacional ou de outros
processos de usuários.
o O carregamento dos registradores base e limite exige a execução de uma instrução privilegiada pelo
Sistema Operacional (SO)
o Essa instrução privilegiada só é concedida pelo SO estar em modo Kernel.
o Sendo assim, não é possível modificá-lo sem este acesso privilegiado.
Modos de Operação:
• Modo Usuário:
o Programas podem acessar apenas endereços dentro de seu intervalo.
o Proteção evita alterações no código ou dados de outros processos e do sistema operacional.
• Modo Kernel:
o O sistema operacional pode acessar qualquer endereço de memória.
o Realiza operações privilegiadas, como:
▪ Carregar e descarregar programas do usuário.
▪ Alterar argumentos de chamadas de sistema.
▪ Gerenciar entrada e saída de dados.
▪ Trocar contexto entre processos em sistemas multiprocessados.
Realocação de Processos
• Alocação Inicial de um Processo
o Quando um processo é alocado na memória, ele recebe um endereço inicial para sua área de
memória.
o Esse endereço inicial é carregado no registrador base, que define o ponto de início do processo na
memória.
• Realocação de um Processo
o Após ser alocado inicialmente, o processo pode ser desalocado e depois realocado em outro ponto
da memória.
o Essa realocação é possível graças à relocação, que permite que um processo mude de lugar na
memória ao longo de sua execução.
• Motivação para a Realocação: Embora possa parecer incomum, a realocação é viável e necessária em
sistemas que utilizam políticas de alocação dinâmicas, que gerenciam o uso da memória de forma flexível.
• Importância da Realocação: A realocação de processos é um mecanismo importante para otimizar o uso da
memória e possibilita o reuso eficiente de espaço.
❖ Relocação de Memória
Conceitos Iniciais
• Endereçamento Absoluto: Processo com endereçamento absoluto refere-se a posições físicas fixas na
memória.
o Quando os endereços físicos são fixos e associados ao módulo durante o link-edição, o processo tem
sua alocação em um local fixo da memória, conhecido como Imagem de Memória ou que ele está
com Endereçamento Absoluto.
• Endereçamento Relativo: Para que um processo seja alocado em qualquer lugar da memória, osendereços
lógicos (referenciados pelo processo) devem ser mapeados para endereços físicos (na memória principal).
Tipos de Espaço de Endereçamento: Chamamos de Espaço de Endereçamento o conjunto de endereços, sejam eles
de dados ou de instruções, referenciados por um processo, pondo ser:
• Espaço Lógico de Endereçamento: Conjunto de objetos ou endereços lógicos referenciados pelo processo
(seja eles dados ou instruções).
• Espaço Físico de Endereçamento: Conjunto de endereços físicos correspondentes aos endereços lógicos.
Processo de Relocação
• Definição de Relocação de Memória: É a função que mapeia endereços lógicos para físicos.
• Responsáveis pela realocação de memória:
o A relocação de memória pode ser realizada pelo link-editor, durante a criação do módulo de carga
(arquivo preparado para execução).
▪ Como funciona a relocação nesse caso? Os endereços do programa são ajustados para uma
base inicial específica na memória.
▪ Limitação dessa abordagem: O programa só pode ser carregado e executado na mesma
posição da memória onde foi configurado, ou seja, ele sempre rodará no mesmo lugar.
o Em alguns sistemas a relocação de memória pode ser realizada pelo carregador (loader) ou ligador-
carregador (link-loader).
▪ Quando acontece a relocação nesse caso? No momento em que o processo é carregado na
memória para ser executado.
• Diferença entre as abordagens:
o Link-editor: O programa é configurado para rodar sempre no mesmo lugar da memória.
o Carregador (loader): O programa pode ser realocado para qualquer posição da memória.
• Tipos de realocação:
o Relocação Estática: O mapeamento de endereços ocorre antes do carregamento do módulo na
memória, com a alocação sendo fixa.
o Relocação Dinâmica: O mapeamento de endereços é feito dinamicamente, com referências lógicas
sendo mapeadas pelo hardware, permitindo que o processo seja carregado em qualquer local da
memória.
Registrador de Relocação:
• Recebe o endereço inicial da área de memória do processo, garantindo a relocação correta.
• Garante a proteção da memória baseada no registrador de relocação e registrador limite.
Proteção de Memória
• A proteção deve garantir que o endereço lógico não ultrapasse o limite superior do espaço de memória
alocado ao processo.
• O registrador de relocação impede endereços fora do intervalo do processo, ajudando na proteção da
memória.
• Técnicas de Gerência de Memória: Permitem que um processo seja movido para outro endereço de
memória durante sua execução, facilitando a gestão e a alocação eficiente de memória.
Módulo 2. Distinguir as diversas políticas de alocação de memória
❖ Políticas de Alocação de Memória
Tipos Básicos de Políticas de Alocação:
1. Manutenção contínua na memória principal: Os processos permanecem na memória principal durante toda
a execução.
2. Movimentação entre memórias: Os processos são alternados entre a memória principal e a memória
secundária (disco), utilizando técnicas como swapping ou paginação.
❖ Gerenciamento de Memória sem Permuta:
Alocação Contígua:
• Monoprogramação: Os primeiros sistemas computacionais eram monoprogramados.
o Limitação Inicial: Um único processo de usuário ocupava a memória.
o Esquema de Melhoria: Foi desenvolvido um esquema simples para melhorar a utilização da memória.
o Compartilhamento da Memória: Memória principal era compartilhada entre o sistema operacional e o
processo de usuário.
Técnica de Overlay
• Definição de Overlay:
o Permite sobrepor diferentes módulos do processo na mesma região da memória, otimizando o uso
do espaço disponível.
• Funcionamento do Overlay:
1. O programador dividia o programa em:
▪ Um módulo principal (sempre residente na memória).
▪ Módulos secundários independentes entre si (apenas dependentes do
módulo principal).
2. Execução inicial: O módulo principal é carregado na memória, enquanto os
secundários permanecem no disco.
3. Carga sob demanda:
▪ Quando o módulo principal solicita um módulo 1 (secundário), este é carregado na memória
(área de overlay).
▪ Após a execução, o controle retorna ao módulo principal, que pode requisitar outro módulo
secundário.
▪ Ao necessitar de um recurso do módulo 2, ele solicita sua carga na área de overlay e é
colocado em execução.
• Estrutura Hierárquica do Overlay:
o Os módulos secundários são organizados em uma árvore hierárquica:
▪ Módulo principal na raiz, possui residência fixa.
▪ Módulos secundários em níveis organizados e mutuamente exclusivos na execução.
• Características Principais do Overlay:
o O mesmo espaço de memória pode ser reutilizado por diferentes módulos secundários.
o A execução dos módulos secundários ocorre de forma sequencial, controlada por chamadas
específicas (call).
• Desafios e Responsabilidades do Overlay:
o Cabe ao programador:
▪ Dividir corretamente o programa em módulos.
▪ Configurar os endereços de carregamento dos módulos na área de overlay.
• Importância do Overlay: Foi a primeira técnica de permuta utilizada para superar limitações de memória.
Alocação Particionada Fixa
• Definição de Alocação Particionada Fixa:
o Na Alocação particionada fixa a memória é dividida em partições fixas, de tamanhos predefinidos,
para suportar múltiplos processos simultaneamente em sistemas multitarefa.
o Cada partição pode conter apenas um processo de usuário.
• Funcionamento da Alocação Particionada Fixa:
o As partições são configuradas de forma fixa no sistema.
o Um processo ocupa a partição até o fim de sua execução, momento em que a partição é liberada
para outro processo.
• Estratégias da Alocação Particionada Fixa:
a) Uma fila por partição:
▪ Processos são organizados em filas separadas com base no tamanho.
▪ Cada fila aloca processos para uma partição específica.
b) Uma única fila de entrada:
▪ Todos os processos aguardam juntos.
▪ São alocados na menor partição livre que os comporte.
• Problema da Alocação Particionada Fixa:
o Desperdício de memória: Se o processo não ocupa toda a partição, o espaço restante fica inutilizável
para outros processos.
• Evolução da Alocação Particionada Fixa: Para reduzir o desperdício, foi desenvolvida a alocação com
partições variáveis, que ajusta dinamicamente o espaço de memória com base nas necessidades dos
processos.
Alocação com Partições Variáveis
• Definição de Alocação com Partições Variáveis:
o Técnica onde a memória de usuário não é dividida em blocos fixos.
o Cada processo é alocado conforme seu tamanho, utilizando apenas o espaço necessário.
• Funcionamento da Alocação com Partições Variáveis:
o A memória começa como um único bloco livre.
o Processos são carregados sequencialmente, criando partições do tamanho exato de cada processo.
o Processos são desalocados ao terminar, liberando espaço na memória.
o Problema: Fragmentação da memória ocorre após várias alocações e desalocações, dificultando a
alocação de novos processos.
o Exemplo de Fragmentação: Se um processo não encontra espaço contínuo suficiente, deve esperar
pela liberação de memória para ser carregado.
• Políticas de Alocação: Para realizar a escolha da partição para a próxima tarefa em fila, podem ser utilizados
diversos tipos de políticas:
1. Best-Fit:
▪ Aloca o processo na menor partição onde ele caiba.
▪ Minimiza o desperdício, gerando fragmentos menores.
▪ Desvantagem: Exige verificar todas as partições para encontrar a menor adequada.
▪ Exemplo de Best-Fit: Aloca na partição de 80k, deixando um fragmento de 10k.
2. First-Fit:
▪ Aloca o processo na primeira partição onde ele couber.
▪ Vantagem: Mais rápido, pois não analisa todas as partições.
▪ Probabilisticamente separa processos pequenos dos grandes.
▪ Exemplo de First-Fit: Aloca na primeira partição adequada, deixando um fragmento de 80k.
3. Worst-Fit:
▪ Aloca o processo na maior partição disponívelonde ele couber.
▪ Deixa fragmentos grandes para futuros processos pequenos.
▪ Desvantagem: Também exige verificar todas as partições.
▪ Exemplo de Worst-Fit: Aloca na maior partição, deixando um fragmento de 130k.
❖ Fragmentação Externa e Interna
• Diferença entre partições fixas e variáveis: Em partições variáveis, o número, o tamanho e posição das
partições mudam ao longo do tempo.
• Devido a esta característica, ao longo do tempo, esse processo pode acarretar fragmentação externa.
• Tipos de Fragmentação:
1. Fragmentação Externa: Pequenos espaços livres entre partições, que somados seriam suficientes
para um processo, mas não permitem alocação por não serem contíguos.
2. Fragmentação Interna: Espaço não utilizado dentro de uma partição alocada.
Exemplo de fragmentação externa e interna: Considere uma área livre de 16.484 bytes e que o próximo
processo solicite 16.480 bytes. Se for alocado exatamente o bloco solicitado, ficaremos com uma
fragmentação externa de 4 bytes. O esforço para fazer o controle de uma lacuna tão pequena não
compensa. Dessa forma, a solução geral para esse tipo de problema é alocar todo o bloco para o processo,
que resultará numa área não utilizada de 4 bytes dentro dele, correspondendo a uma fragmentação interna.
• Soluções para Fragmentação Externa:
1. Realizar a Compactação de Memória:
▪ Na compactação da memória, os blocos ocupados são movidos para uma extremidade do
espaço de endereçamento físico, criando um único bloco livre.
▪ Limitação: Elevado custo de processamento. Portanto não é muito utilizada.
2. Evitar que o Espaço de Endereçamento Não seja Contíguo:
▪ Permite que processos recebam blocos de memória em qualquer parte do espaço de
endereçamento.
▪ Essa ideia com Swap é a base do funcionamento da Paginação e Segmentação.
❖ Gerenciamento de Memória com Permuta (Swapping)
• Definição de Swapping:
o É uma técnica que permite mover processos da memória principal para a memória secundária (swap
out) enquanto estão bloqueados ou em espera.
o O processo é carregado de volta (swap in) quando for sua vez de ser executado.
• Vantagens do Swapping:
o Aumenta o grau de multiprogramação.
o Maior compartilhamento de memória: Permite que a soma das memórias dos processos exceda a
memória física disponível.
o Redução de fragmentação: Evita desperdício de espaço em memória.
o Melhor aproveitamento: Adequado para ambientes com processos pequenos e poucos usuários.
• Funcionamento do Swapping:
o Exemplo: Processo E aguardando espaço livre.
▪ Processo A é removido (swap out) para liberar espaço.
▪ Processo E é alocado no espaço liberado.
▪ Posteriormente, o processo A é carregado de volta (swap in) em outra partição.
o Nota: Utiliza relocação dinâmica, impedindo endereçamento absoluto.
• Desvantagens do Swapping:
o Tempo elevado de operação:
Exemplo: Suponha que um processo que tem que ser retirado da memória possua 200MB (swap out) e
que um processo a ser carregado tenha 150MB (swap in). Se considerarmos que o HD possui uma
velocidade de escrita de 50MB/s e de leitura de 100MB/s o swap out demoraria 4 segundos e o swap in
1,5 segundos. Portanto, a operação total, sem considerar outros tempos envolvidos, demoraria 5,5
segundos, uma eternidade em termos computacionais., considerado muito lento para sistemas
modernos.
• Evolução:
o Devido a essa perda de tempo, essa técnica não é utilizada em sistemas modernos.
o Sistemas modernos utilizam técnicas otimizadas, como paginação, para reduzir o tempo de escrita e
leitura e superar limitações do swapping clássico.
❖ Gerenciamento de Espaço Livre
• Objetivo do Gerenciamento de Espaço Livre: Controlar os espaços livres na memória e gerenciar a alocação
de processos utilizando técnicas específicas.
• Para que as diversas políticas de alocação possam funcionar é necessário que o SO controle os espaços livres
na memória e onde cada processo está alocado, utilizando algumas técnicas como:
Técnica 1: Gerenciamento de memória com mapas de bits
• Funcionamento: Divide a memória em unidades de alocação, com cada unidade representada por um bit no
mapa:
o 0: Unidade livre.
o 1: Unidade ocupada.
• Considerações:
o O tamanho da unidade de alocação é crucial para definir a eficiência do mapa de bits.
▪ Unidades menores: Possui maior tamanho do mapa e é mais detalhado..
▪ Unidades maiores: : Possui menor tamanho do mapa e podem causar fragmentação interna no
último bloco alocado.
o Para alocar um processo, o gerenciador deve encontrar uma sequência de bits 0 consecutivos, o que
pode ser lento.
o Exemplo: Mostra como os processos e lacunas são representados na memória, com equivalentes em
mapa de bits e lista encadeada.
Técnica 2: Gerenciamento de memória com listas encadeadas
• Funcionamento:
o A memória é representada como uma lista encadeada de segmentos, cada nó contendo:
▪ Status: Segmento de memória Alocada (P) ou Segmento de memória Livre (L).
▪ Endereço inicial do segmento.
▪ Tamanho em unidades de alocação.
o Lista é ordenada pelo endereço, facilitando atualizações ao final de processos.
Exemplo Visual
• Figura 25: Mostra como os processos e lacunas são representados na memória, com equivalentes em mapa
de bits e lista encadeada.
Figura 25: Memória e mapeamento de espaço livre.
Memória e mapeamento de espaço livre:
Letra (a): Representação da memória com processos e lacunas
• A memória está representada graficamente como uma sequência de unidades de alocação (tracinhos).
• Contém cinco processos (A, B, C, D e E) intercalados por três lacunas livres (espaços desocupados).
• As lacunas estão localizadas entre as unidades dos processos:
o Lacuna 1: entre A e B.
o Lacuna 2: entre C e D.
o Lacuna 3: ao final de E.
Letra (b): Representação com mapa de bits
• Cada unidade de alocação possui um bit associado:
o 1 indica unidade ocupada.
o 0 indica unidade livre.
• A sequência dos bits reflete a ocupação da memória:
o Exemplo: Após os cinco bits iniciais para o processo A (todos 1), há três bits 0 que correspondem à
primeira lacuna.
Letra (c): Representação com lista encadeada
• Representa os segmentos de memória com nós organizados em lista encadeada.
• Cada nó inclui:
o O status do segmento (P = Processo, L = Lacuna).
o O endereço inicial do segmento.
o O comprimento do segmento (em unidades de alocação).
• Exemplo:
o Nó "P 0 5" indica que o processo ocupa 5 unidades, começando no endereço 0.
o Nó "L 18 2" representa uma lacuna que começa no endereço 18 e tem comprimento de 2 unidades.
• Figura 26: Demonstra as combinações possíveis ao término de um processo e suas respectivas atualizações
na lista.
Figura 26: Gerência da lista encadeada. Fonte: TANENBAUM, 2008.
Gerência de lista encadeada ao término de um processo:
Situação (a):
• O processo X termina.
• Nenhuma lacuna adjacente a X.
• A entrada correspondente ao processo X é alterada de P para L.
Situação (b):
• O processo X termina.
• Há uma lacuna adjacente ao início de X.
• A lacuna adjacente e a entrada de X são combinadas em um único segmento livre.
Situação (c):
• O processo X termina.
• Há uma lacuna adjacente ao final de X.
• A lacuna adjacente e a entrada de X são combinadas em um único segmento livre.
Situação (d):
• O processo X termina.
• Há lacunas adjacentes tanto no início quanto no final de X.
• As três entradas (lacuna inicial, processo X e lacuna final) são combinadas em uma única entrada livre.
Pontos Críticos:
• Mapas de bits: Operação de busca pode ser lenta.
• Listas encadeadas: Requer manutenção frequente para lidar com combinações de lacunas e processos.
Questão 1. O gerenciamento do espaço livre é uma tarefa importante realizada pelo sistema operacional. Duas
técnicas básicas podem ser utilizadas para essa atividade: o mapa de bits e a lista encadeada. Considere a seguinte
lista encadeada:Qual seria o mapa de bits correspondente?
A. 11110011
B. 11000111
C. 11100011
D. 10001111
E. 10110011
Módulo 3. Classificar o funcionamento da memória virtual
❖ Memória Virtual
1. Mapeamento de Endereço:
o Os endereços lógicos do programa precisam ser mapeados em endereços físicos de memória.
o Isso é feito pelo SO, sem responsabilidade do programa sobre o tamanho da memória física.
o Assim, o conjunto de endereços que um programa pode endereçar pode ser muito maior que a
memória física disponível para o processo.
2. Definição de Espaço de Endereçamento Virtual e Real:
o Espaço de Endereçamento Virtual: É o conjunto de endereços que o programa pode endereçar, que
pode ser maior que a memória física disponível.
o Espaço de Endereçamento Real: É o conjunto de endereços reais da memória física.
3. Funcionamento da Memória Virtual:
o Apenas partes do programa que estão sendo utilizadas precisam estar na memória física no
momento da execução.
o As partes não necessárias são armazenadas no disco e carregadas sob demanda.
o O processo de gerenciamento é transparente ao usuário e aos compiladores e link-editores, sendo
responsabilidade exclusiva do sistema operacional (SO).
4. Vantagens da Memória Virtual:
1 1 1 0 0 0 1 1
• O primeiro elemento corresponde a um processo que ocupa três unidades,
portanto, em bits seria 111.
• O segundo elemento corresponde a 3 lacunas, portanto, 000.
• Finalmente, o terceiro elemento é novamente um processo de duas unidades,
portanto, 11.
• Dessa forma, para termos o mapa basta concatenarmos os três na ordem correta, o
que daria 11100011, correspondendo à opção C.
o Programas podem ser maiores que a memória física.
o Programas não precisam estar em regiões contíguas da
memória.
o A memória física é utilizada de forma mais eficiente.
5. Divisão e Mapeamento da Memória Virtual:
o Tanto a memória virtual, quanto a real são divididas
em blocos (exemplo: páginas).
o O SO mantém tabelas de mapeamento para relacionar
os blocos de memória virtual com os da memória real.
6. Paginação
o Técnica que implementa a ideia de swap (troca de partes entre memória e disco).
o As páginas de memória são carregadas ou gravadas no disco conforme necessário.
o Permite maior flexibilidade e utilização eficiente da memória.
7. Recursos Envolvidos
o O mapeamento é gerenciado pelo SO com suporte de hardware.
o Deve haver um equilíbrio no nível de fracionamento das páginas para não comprometer o
desempenho.
8. Resumo Visual
o O espaço de endereçamento virtual é muito maior que a memória física.
o As páginas do programa são movidas entre disco e memória, conforme necessário.
❖ Paginação
1. Definição e Estrutura da Paginação:
o O espaço de endereços e a memória principal são divididos em blocos de tamanho fixo:
▪ Páginas: Blocos no espaço de endereçamento virtual.
▪ Molduras (frames): Blocos na memória física, com o mesmo tamanho das páginas.
2. Funcionamento da Paginação:
o Cada processo possui algumas páginas residentes na memória principal (páginas ativas) e outras
armazenadas na memória secundária (páginas inativas).
o A troca entre memória principal e secundária é gerenciada dinamicamente.
3. Atribuições da Paginação: O mecanismo da paginação possui duas atribuições:
o Mapeamento: Determinar em qual bloco de memória está localizada uma página referenciada.
o Transferência:
▪ Trazer páginas da memória secundária para a principal (quando requisitadas).
▪ Mover páginas da principal para a secundária (quando não estão em uso).
4. Esquema de Paginação
o Tabela de páginas: Relaciona as páginas virtuais do
processo com as molduras físicas na memória.
o Exemplo: Um processo com 4 páginas (0 a 3) possui a
tabela que associa cada página a um frame
correspondente na memória física.
5. Tamanho das Páginas
o Determinado pelo hardware, geralmente uma potência
de 2 (entre 512 bytes e 2 KB).
o O uso de potências de 2 facilita o mapeamento de endereços virtuais para endereços físicos.
6. Vantagens
o Uso eficiente da memória, permitindo a execução de processos maiores que a memória física
disponível.
o Simplificação do gerenciamento de memória com blocos de tamanho fixo.
❖ Controle de Espaço Livre
1. Alocação de Quadros
o O tamanho de um processo é analisado em páginas, e cada página requer um quadro livre na
memória física.
o Exemplo: Um processo com 4 páginas precisa de, no mínimo, 4 quadros disponíveis.
2. Lista de Quadros Livres
o O SO mantém uma lista de quadros livres para gerenciar os espaços disponíveis.
o Características da lista:
▪ Tamanho fixo e uniforme dos quadros: Simplifica o gerenciamento.
▪ Não ordenada: Como os quadros podem ser alocados de forma não contígua, a ordenação
não é necessária, facilitando a manutenção.
3. Vantagem de Controlar o Espaço Livre: O gerenciamento baseado em lista não ordenada simplifica a
alocação e reduz a sobrecarga administrativa do sistema.
Exemplo: Paginação e controle de quadros livres.
Parte (a): Estado inicial
1. Memória Física:
o Representada verticalmente, os quadros
disponíveis estão em cinza, e os quadros
ocupados em azul.
o A memória possui quadros livres nos índices
14, 13, 18, 20 e 15.
2. Novo Processo:
o O processo precisa ser alocado e contém 4
páginas (página 0 a página 3).
o Cada página requer um quadro livre na memória física.
3. Lista de Quadros Livres:
o A lista indica os quadros disponíveis para alocação: 14, 13, 18, 20 e 15.
o Os quadros serão utilizados em sequência para alocar as páginas do processo.
Parte (b): Após a alocação
1. Alocação das Páginas:
o A tabela de páginas do processo registra o mapeamento entre as páginas e os quadros ocupados:
▪ Página 0 → Quadro 14.
▪ Página 1 → Quadro 13.
▪ Página 2 → Quadro 18.
▪ Página 3 → Quadro 20.
2. Estado Atual da Memória:
o Os quadros 14, 13, 18 e 20, antes livres, agora estão ocupados pelo novo processo.
o O quadro 15 permanece livre, conforme a lista atualizada de quadros livres.
3. Tabela de Páginas do Processo:
o Organiza o mapeamento de cada página para seu respectivo quadro, facilitando o controle pelo SO
durante a execução.
Conclusões
• O sistema utiliza uma lista de quadros livres para gerenciar a alocação, simplificando o controle.
• A alocação é realizada de forma sequencial, sem necessidade de quadros contíguos.
• A tabela de páginas é essencial para rastrear a correspondência entre páginas (memória virtual) e quadros
(memória física).
❖ Proteção de Memória
• Objetivo da Proteção de Memória:
o Garantir que as páginas de memória sejam acessadas de forma segura e controlada, prevenindo
acessos indevidos.
• Método de Proteção em Ambiente Paginado:
o Bits de Proteção: Cada quadro de memória na tabela de páginas possui bits adicionais que definem
as permissões de acesso.
▪ Um bit de leitura/gravação determina se a página pode ser lida ou modificada.
▪ Um bit válido/inválido indica se a página está no espaço de endereçamento lógico do
programa (acesso legal) ou fora dele (acesso ilegal).
• Exemplo Prático: Ela nos mostra um sistema com espaço de endereçamento de 14 bits (0 a 16383) e um
processo que usa apenas os endereços de 0 a 10468. Considerando um tamanho de página de 2KB, o
processo possui 6 páginas, apesar de ter uma tabela de páginas com mais entradas possíveis.
o Espaço de Endereçamento: 14 bits (0 a 16383) de endereços disponíveis.
o Processo: Utiliza endereços de 0 a 10468, o que corresponde a 6 páginas de tamanho 2KB.
o Tabela de Páginas:
▪ A tabela tem mais entradas possíveis do que as realmente necessárias para o processo (6
páginas).
▪ As páginas 6 e 7 têm o número de
quadro 0, mas não estão realmente
alocadas no espaço de endereçamento
do processo.
▪ Consequência: Qualquer tentativa de
acesso à página 7 resultará em uma
exceção para o SO, devido à violação da
proteção.• Conclusão:
o A proteção de memória é crucial para evitar acessos ilegais e garantir que os processos operem
dentro dos limites de sua memória alocada.
o A implementação de bits de proteção e de um bit válido/inválido nas tabelas de páginas é essencial
para o controle de acesso.
❖ Paginação sob Demanda
• Conceito Básico:
o A paginação sob demanda carrega apenas as páginas que são referenciadas durante a execução de
um processo.
o Inicialmente, somente a primeira página do processo é carregada, e as outras são carregadas
conforme são referenciadas pelas instruções.
• Funcionamento da Demanda:
o O número de blocos de memória alocados a um processo é menor do que o número de páginas que
ele usa.
o Quando uma página ausente é referenciada, ocorre um page fault (falha de página).
• Processo após a Falha de Página (Page Fault):
1. Interrupção: A falha de página gera uma interrupção.
2. Transferência de Página: A página ausente é transferida da memória secundária (disco) para a memória
principal.
3. Atualização da Tabela: A tabela de páginas é atualizada para refletir a nova localização da página na
memória.
4. Bloqueio do Processo: O processo é bloqueado até que a transferência da página seja concluída.
• Gestão de Memória Secundária:
o A posição da página na memória secundária é registrada, seja em uma tabela separada ou na
própria tabela de páginas.
o Se não houver espaço na memória principal, o algoritmo de troca decide qual página será removida
da memória para dar espaço à nova página solicitada.
• Conclusão:
o A paginação sob demanda é uma técnica eficiente de gerenciamento de memória, garantindo que
apenas as páginas necessárias sejam carregadas na memória, economizando recursos e tempo de
execução.
❖ Políticas de Paginação
• Conceito de Working Set:
o Para minimizar a ocorrência de page faults surgiu o working set.
o Definição: O working set é o conjunto das páginas mais acessadas por um processo durante sua
execução.
o Logo, o working set refere-se ao conjunto de páginas que um programa deve manter carregado na
memória para minimizar page faults.
o Inicialmente, quando o programa começa, há uma grande chance de page faults, mas à medida que
mais páginas são carregadas, a ocorrência diminui devido à localidade das referências de memória.
o O sistema operacional (SO) define o working set para equilibrar capacidade e velocidade de acesso
à memória.
• Compromisso entre Capacidade e Desempenho:
o Quanto Mais páginas no working set:
▪ Menor chance de page faults e melhor é o desempenho.
▪ No entanto, páginas no working set significa que menos processos podem ser carregados ao
mesmo tempo, afetando a capacidade de execução simultânea.
o Quanto Menos páginas no working set:
▪ Maior risco de page faults.
▪ E mas mais processos podem ser carregados ao mesmo tempo.
• Decisão de Retirada de Página (Page Fault):
o Quando ocorre um page fault e não há quadros livres, o SO precisa decidir qual página será retirada
da memória.
o A escolha é baseada em diferentes políticas de substituição.
o Verificação de alterações: Antes de descartar uma página, o SO verifica se houve alterações nela
utilizando o bit de modificação na tabela de páginas.
o Se a página foi modificada: Ela é salva em disco antes de ser descartada para evitar perda de dados.
• Políticas de Liberação de Páginas:
1. Página Aleatória:
o Escolha aleatória de uma página para ser removida.
o Desvantagem: Pode remover páginas frequentemente acessadas.
2. FIFO (First-in, First-out):
o Remove a página carregada há mais tempo.
o Desvantagem: Pode remover páginas periodicamente acessadas.
3. LRU (Least Recently Used):
o Remove a página que não foi acessada há mais tempo.
o Desvantagem: Exige overhead para atualizar a hora do último acesso.
4. NRU (Not Recently Used):
o Remove páginas não acessadas nos últimos k acessos.
o Desvantagem: Também exige overhead para manter um contador de acessos.
5. LFU (Least Frequently Used):
o Remove a página com o menor número de acessos.
o Desvantagem: Páginas recém-carregadas podem ser removidas prematuramente, mesmo que sejam
úteis.
• Política Utilizada em Sistemas Reais:
o Sistemas como Linux utilizam variações do LRU, buscando minimizar overhead e melhorar a
eficiência.
o Um exemplo comum é o algoritmo de segunda chance, que é uma adaptação do LRU.
❖ Algoritmo de Segunda Chance
• Objetivo do Algoritmo de Segunda Chance:
o Aproximar-se do LRU (Least Recently Used), mas utilizando uma abordagem mais simples e com
menor custo computacional.
• Funcionamento do Algoritmo de Segunda Chance:
o Tabela de páginas: Acrescenta-se um bit de referência para cada página.
o Inicialmente, todos os bits são desligados (0).
o Quando uma página é acessada, o bit de referência associado é ligado (1) pelo hardware.
• Substituição de Página (Política FIFO com Modificação):
o A substituição segue a política FIFO, mas com uma modificação: antes de substituir, verifica-se o bit
de referência:
▪ Se o bit for 0, a página é substituída.
▪ Se o bit for 1, a página recebe uma segunda chance: o bit é zerado e o ponteiro avança para
a próxima página.
▪ Objetivo: Garantir que páginas frequentemente acessadas não sejam substituídas.
• Implementação do Algoritmo de Segunda Chance:
o O algoritmo é implementado como uma fila circular.
o Um ponteiro do relógio (daí o nome "algoritmo do relógio") percorre a fila, procurando páginas com
o bit de referência 0.
o Quando uma página vítima é encontrada, ela é substituída e a nova página é inserida na fila circular.
Página vítima é a candidata a sair da memória. Ele faz a busca na fila circular: ao encontrar uma
página vítima, ele substitui.
• Pior Caso:
o Se todas as páginas têm o bit de referência 1, o ponteiro percorre a fila inteira e dá uma segunda
chance a cada página, o que degenera a política para FIFO.
• Aperfeiçoamento (com bit de modificação):
o Leva-se em consideração o bit de modificação para determinar a categoria da página:
✓ (0, 0): Página não utilizada nem modificada.
Melhor para substituição.
✓ (0, 1): Página não utilizada, mas modificada.
Necessita ser salva no disco antes da
substituição.
✓ (1, 0): Página utilizada recentemente, mas
não modificada. Provavelmente será usada
novamente em breve.
✓ (1, 1): Página utilizada e modificada.
Provavelmente será usada novamente e
necessita ser salva no disco.
• Alteração no Algoritmo:
o Substitui-se a página com a categoria mais baixa (de acordo com o bit de modificação).
o Dá preferência para substituir páginas não modificadas, a fim de reduzir operações de gravação em
disco.
• Benefício Principal:
o Reduz o número de gravações em disco, já que páginas não modificadas não precisam ser gravadas
antes de serem substituídas.
❖ Segmentação
• Objetivo da Segmentação: A segmentação surgiu como uma alternativa à paginação para gerenciar a
memória, evitando o grande número de page faults associados à divisão física do programa em blocos de
tamanho fixo (páginas).
• Conceito de Segmentação:
o Segmentos são unidades de memória de comprimentos variáveis, e a divisão do programa é feita de
acordo com características lógicas (em vez de uma divisão física fixa).
o Ao agrupar partes do programa que se referem mutuamente, a segmentação reduz a ocorrência de
segment faults.
• Espaço de Endereçamento:
o O espaço de endereços se torna bidimensional, sendo representado por (nome do segmento,
endereço dentro do segmento).
o Para facilitar, o sistema operacional converte o nome do segmento em um número quando o
segmento é referenciado pela primeira vez.
• Tabela de Segmentos:
o Cada processo tem uma tabela de segmentos, que contém descritores de segmento:
▪ Cada entrada da tabela inclui:
✓ Tamanho (i) do segmento.
✓ Endereço inicial (a) na
memória.
oO mapeamento de endereços é feito através da
tabela de segmentos:
1. Extrair o endereço do programa (s, d).
2. Indexar a tabela de segmentos com o
número do segmento s.
3. Retirar o endereço inicial do segmento (a).
4. Verificar se o endereço dentro do segmento (d) está dentro do intervalo válido.
5. Calcular o endereço final como a + d.
• Gerência de Memória:
o Para trazer um segmento à memória, é necessário encontrar espaço contíguo apenas para aquele
segmento, não para o processo inteiro, diferenciando-se da abordagem de partições fixas.
o A segmentação exige menos gerenciamento de partições variáveis em comparação com a paginação,
pois o espaço contíguo é necessário somente para o segmento em questão.
• Diferenças em relação à Paginação:
o Segmentação:
▪ Divide o espaço de endereçamento de forma lógica (baseada no significado do programa).
▪ Cada segmento pode ter tamanho variável.
o Paginação:
▪ Divide o espaço de endereçamento de forma física em blocos de tamanho fixo.
▪ O tamanho das páginas é determinado pelo tamanho da palavra.
• Conclusão: Ambos, segmentação e paginação, implementam políticas de memória virtual de nível único,
mas a segmentação foca em uma divisão lógica, enquanto a paginação foca em uma divisão física.
1. A unidade de gerenciamento de memória de processadores modernos traduz endereços virtuais utilizados por
processos em endereços físicos. Uma forma de fazer o mapeamento de endereços virtuais para endereços físicos é
usando uma tabela de páginas.
Considere um processador hipotético em que processos possuem endereços virtuais com um identificador de
página de 4 bits e 10 bits de deslocamento, como mostrado na tabela a seguir:
Endereço
Pagina Deslocamento
4 bits 10 bits
Considere ainda que o processador hipotético endereça bytes e que 1KB = 210 B.
Assinale a alternativa que corresponde à quantidade de memória que pode ser endereçada por um processo.
A. 8KB.
B. 16KB.
C. 24KB.
D. 32KB.
E. 64KB.
RESPOSTA: Para calcular a quantidade de memória que pode ser endereçada por um processo nesse sistema,
precisamos considerar o número total de bits utilizados para endereçamento.
Passo 1: Calcular o total de bits do endereço virtual
O endereço virtual é formado pela soma dos bits do identificador de página e do deslocamento:
Total de bits do endereço virtual = bits da página + bits do deslocamento
Total de bits do endereço virtual = 4 + 10 = 14 bits.
Passo 2: Determinar a quantidade de memória endereçável
Com 14 bits no total, podemos calcular a quantidade de memória endereçável usando a fórmula:
Memoria endereçável = 2número total de bits
Substituindo:
214 = 16.384 Bytes
Convertendo B em KB:
16.384 Bytes em KB = 16.384 x 0,001 = 16,384 ou aproximadamente 16KB
Resposta correta: A quantidade de memória que pode ser endereçada por um processo é: 16KB.
2. Seja uma memória virtual com 3 blocos e que use o algoritmo LRU (least-recently-used) como seu algoritmo de
substituição de páginas. Admitindo-se que ocorra a seguinte sequência de referência às páginas de memórias: 1, 2,
3, 4, 2, 3, 4, 2. Assumindo que, inicialmente, todos os blocos estão vazios, quantas interrupções de páginas
ausentes (page faults) ocorrerão?
A. 5.
B. 4.
C. 6.
D. 7.
E. 3.
RESPOSTA:
Como temos 3 quadros disponíveis no início, eles estão vazios.
Quadro 1 Quadro 2 Quadro 3
Ao ser referenciada a página 1, como ela não está na memória, será gerado um page fault e a página será carregada
no quadro 1.
Quadro 1 Quadro 2 Quadro 3
Página 1
A seguir, é referenciada a página 2, que, como não está na memória, gera o segundo page fault, então ela é
carregada no quadro 2.
Quadro 1 Quadro 2 Quadro 3
Página 1 Página 2
Posteriormente, é referenciada a página 3, que, como não está na memória, gera o terceiro page fault, sendo
carregada no quadro 3.
Quadro 1 Quadro 2 Quadro 3
Página 1 Página 2 Página 3
Depois disso, é referenciada a página 4, que, como não está na memória, gera o quarto page fault. Como não existem
mais quadros livres para que a página 4 possa ser carregada, uma das que estão na memória deve ser retirada. Uma
vez que a política utilizada é a LRU, será retirada a página que foi referenciada há mais tempo, ou seja, a página 1,
sendo a página 4 carregada em seu lugar.
Quadro 1 Quadro 2 Quadro 3
Página 4 Página 2 Página 3
Por fim, são referenciadas as páginas 2, 3, 4 e 2. Como todas já estão na memória, não é gerado page fault, portanto,
no total temos 4 interrupções por falha de página.
Módulo 4. Descrever como o Linux realiza a sua gerência de memória
Gerenciamento de memória no Linux
A gerência da memória no Linux envolve dois aspectos distintos, cada um efetuado por um componente específico:
• A alocação e liberação da memória física – páginas, grupos de páginas e pequenos blocos de RAM.
• A manipulação da memória virtual – mapeamento da memória física para o espaço de endereçamento de
processos em execução.
Gerenciamento da memória física no Linux
• Divisão da memória física em zonas: O Linux organiza a memória física em quatro zonas, que variam
conforme a arquitetura do sistema.
Em sistemas Intel x86 (32 bits):
1. ZONE_DMA: Destinada a dispositivos ISA que só acessam os primeiros 16 MB da memória para operações
de DMA.
2. ZONE_DMA32: Para dispositivos que acessam até 4 GB da memória em operações de DMA.
3. ZONE_NORMAL: Abrange os 16 MB a 896 MB da memória, sendo mapeada diretamente para o kernel.
4. ZONE_HIGHMEM: Representa a memória acima de 896 MB, não mapeada para o kernel, disponível para uso
pelo sistema.
Em sistemas modernos de 64 bits (Intel x86_64):
• ZONE_DMA: Mantida para compatibilidade com sistemas legados (16 MB).
• Todo o restante da memória é atribuído à ZONE_NORMAL.
• ZONE_HIGHMEM e ZONE_DMA32 não são utilizadas.
A tabela abaixo mostra o mapeamento entre as zonas e os endereços físicos na arquitetura do Intel x86 de 32 bits:
• Gerenciamento de memória pelo kernel:
o O kernel mantém uma lista de páginas livres para cada zona.
o Solicitações de memória são atendidas por meio da zona mais adequada.
o Cada zona tem um alocador de páginas responsável por gerenciar a alocação e liberação das páginas
físicas.
❖ Memória virtual no Linux
Definição do mecanismo de memória virtual:
• Responsável por gerenciar o espaço de endereçamento disponível para cada processo.
• Mantém duas visões diferentes para cada processo:
1. Visão lógica:
▪ Representa o layout do espaço de endereçamento como um conjunto de regiões não
sobrepostas, formadas por páginas alinhadas e contínuas.
▪ As regiões são organizadas em uma árvore binária balanceada para busca rápida de
endereços virtuais.
2. Visão física:
▪ Refere-se às entradas na tabela de páginas de hardware, identificando a localização exata de
cada página (em disco ou na memória física).
Regiões de memória virtual no Linux:
• O Linux utiliza vários tipos de regiões de memória virtual, que geralmente estão associadas a arquivos.
• As regiões funcionam como uma porta de entrada para uma seção do arquivo de paginação:
o Quando um processo referencia uma página da região, a tabela de páginas é preenchida com o
endereço de uma página do cache do kernel, com o deslocamento apropriado no arquivo.
Tipos de mapeamento de regiões de memória:
1. Mapeamento privado:
o Alterações feitas pelo processo em uma região privada não afetam outros processos.
o O paginador cria uma cópia local para preservar as alterações específicas ao processo.
2. Mapeamento compartilhado:
o Alterações feitas pelo processo em uma região compartilhada são imediatamente atualizadas no
objeto mapeado.
o Essas alterações se tornam visíveis para outros processos que compartilham o mesmo objeto.
Zona Memória física
ZONE_DMA896 MB
❖ Permuta e Paginação no Linux
Permuta e Paginação
• Processo de pagein (carrega a página na memória principal) e pageout (remove a pagina da memória
principal e se necessário guarda em disco):
• O Linux trabalha em dois passos:
1. Decidir qual página substituir na memória e se precisa ser gravada no disco.
2. Carregar a nova página no espaço liberado.
• Política de substituição de páginas:
o Baseada no algoritmo do relógio modificado para múltiplos ciclos.
o Cada página tem uma “idade”:
▪ Indicador de tempo de alocação e nível de atividade recente.
▪ Páginas frequentemente acessadas têm maior idade; raramente acessadas têm idade
próxima de zero.
▪ Essa quantificação da idade baseia-se na política de menos frequentemente utilizada (LFU).
• Memória virtual do kernel:
o O Linux reserva uma região constante do espaço de endereçamento virtual de cada processo.
o Tabelas de páginas do kernel são protegidas contra acesso/modificação na modalidade de usuário.
❖ Execução e Carga de Programas de Usuário no Linux
Execução de Programas
• Iniciada pela chamada de sistema exec().
• Substitui o contexto de execução atual por um novo contexto, correspondente ao programa a ser executado.
Carga do Programa
• Realizada pelo carregador binário, que:
o Não carrega o arquivo completo na memória física inicialmente.
o Mapeia as páginas do arquivo para regiões da memória virtual.
o Utiliza Paginação sob Demanda, carregando páginas na memória física somente quando necessárias.
Formato ELF
• Arquivo binário no formato ELF (Executable and Linkable Format):
o Consiste em um cabeçalho seguido por seções alinhadas em páginas.
o O carregador ELF lê o cabeçalho e mapeia cada seção para uma região distinta na memória virtual.
Layout da Memória Virtual
• Kernel: Reside em uma região privilegiada, inacessível a programas de usuário.
• Memória virtual de usuário: Disponível para aplicações, com regiões mapeadas para arquivos ou para dados
de aplicações.
Regiões Inicializadas
1. Pilha:
o Criada no topo da memória virtual de usuário.
o Cresce para baixo, armazenando argumentos e variáveis
de ambiente.
2. Texto:
o Contém instruções do programa.
o Marcado somente como leitura e protegido contra
gravação.
3. Dados:
o Inclui dados inicializados e não inicializados.
o Permite gravação.
4. Heap:
o Área de tamanho variável para dados em tempo de execução.
o Gerenciada pelo registrador brk, que possibilita expansão ou retração.
Conclusão
• O carregador configura o mapeamento inicial da memória e define o registrador de contagem de
programas com o ponto inicial registrado no cabeçalho ELF.
• Após isso, o processo é adicionado ao escalonador para execução.
❖ Vinculação Estática e Dinâmica no Linux
Vinculação Estática:
• O código das bibliotecas do sistema é embutido diretamente no executável do programa.
• Realizada pelo ligador durante a geração do executável.
• Vantagem: Permite que o programa inicie imediatamente após o carregamento.
• Desvantagem: Ineficiente em memória e espaço em disco, pois cada programa contém cópias idênticas das
mesmas funções das bibliotecas.
Vinculação Dinâmica:
• Bibliotecas do sistema são carregadas apenas uma vez na memória e compartilhadas entre os programas.
• Cada programa possui uma função estática pequena que:
o Mapeia a biblioteca de vinculação na memória.
o Executa o código necessário para habilitar a vinculação dinâmica.
Processo de Vinculação Dinâmica:
1. Identificação das bibliotecas requeridas: A biblioteca de vinculação lê as informações contidas nas seções do
binário ELF.
2. Mapeamento na memória virtual: As bibliotecas dinâmicas são carregadas em locais adequados na
memória.
3. Resolução de símbolos: Variáveis e funções necessárias são localizadas e conectadas ao programa.
4. Código independente de posição: As bibliotecas dinâmicas são compiladas para executar em qualquer
endereço da memória virtual, garantindo flexibilidade.
Benefícios da Vinculação Dinâmica
• Eficiência: Reduz o uso de memória e espaço em disco.
• Reutilização: Permite que várias aplicações compartilhem o mesmo código de biblioteca na memória.
❖ Utilitários e Comandos para Gerenciar Memória no Linux
Comandos Principais
1. free
o Exibe informações detalhadas sobre o uso de memória.
o Informações incluem: memória total, usada, livre e swap.
o Argumento -m: apresenta os dados em megabytes (MB).
2. top
o Lista todos os processos em execução.
o Inclui dados sobre o uso da memória por cada processo.
3. vmstat
o Exibe o status da memória virtual do sistema.
4. getconf PAGESIZE
o Mostra o tamanho da página no sistema de memória virtual.
o Exemplo: 4096 bytes (4 KB).
5. swapon
o Fornece informações sobre o arquivo ou partição de swap.
Recursos Adicionais
Comandos podem ser usados em conjunto para monitorar e otimizar o uso de memória.
Aplicação: Esses comandos são úteis para identificar o uso de recursos de memória, ajustar configurações e
monitorar o desempenho do sistema.
❖ Utilitários para Monitorar Memória no Linux
Principais Utilitários
1. Htop
o Descrição: Evolução do comando top, com interface interativa.
o Chamada: Linha de comando.
o Informações Exibidas:
▪ Parte superior: Resumo do sistema com uso de CPU, memória e swap.
▪ Parte inferior: Lista de processos com informações de CPU e memória.
o Significado das Cores:
▪ CPU:
▪ Verde: Threads com prioridade normal.
▪ Azul: Threads com baixa prioridade.
▪ Vermelho: Threads do kernel.
▪ Memória:
▪ Verde: Uso por aplicações.
▪ Azul: Buffers.
▪ Amarelo/Laranja: Cache.
▪ Swap:
▪ Vermelho: Memória swap utilizada.
2. Ksysguard
o Descrição: Ferramenta gráfica para monitorar o sistema (não instalada por padrão no Ubuntu).
o Chamada: Linha de comando.
o Recursos:
▪ Tabela de Processos: Lista de processos com uso de CPU e memória.
▪ Carga do Sistema: Exibição gráfica da utilização de recursos.
3. Monitor do Sistema
o Descrição: Aplicativo gráfico instalado por padrão.
o Acesso: Aba Ferramentas.
o Interface:
▪ 3 abas principais: Apresenta informações sobre processos, uso de memória e CPU.
Destaques
• Utilitários interativos e gráficos facilitam a análise do uso de recursos.
• Htop e Ksysguard precisam ser instalados no Ubuntu.
• Monitor do Sistema é uma solução pronta e prática para usuários do Ubuntu.
TEMA 5. SISTEMAS DE ARQUIVO
Introdução
• Importância dos Sistemas Operacionais:
o São softwares essenciais para dispositivos computacionais.
o Facilitam o uso por meio de interfaces amigáveis.
o Simplificam tarefas de desenvolvimento.
• Persistência de Informações:
o Sistemas operacionais garantem a persistência dos dados.
o Armazenam informações em dispositivos intermediários, como discos rígidos magnéticos.
o Essa funcionalidade é implementada pelos sistemas de arquivos.
Módulo 1. Identificar como são implementados os sistemas de arquivos
❖ Conceitos
Importância do armazenamento e recuperação de informações:
• É essencial para garantir a continuidade do trabalho em sistemas computacionais.
• Permite armazenamento de grandes quantidades de dados.
• Garante persistência das informações mesmo após o término do processo.
• Suporta acesso concorrente por múltiplos processos.
Sistemas de Arquivos:
• O sistema operacional estrutura e organiza informações armazenadas em discos ou outras mídias.
• A parte responsável por gerir a estrutura e organização dos arquivos é denominada sistema de arquivos.
• Devem permitir manipulação uniforme de arquivos, independente do dispositivo de armazenamento.
• São responsáveis por gerenciar o armazenamento e a recuperação de dados.
Requisitos básicos para o armazenamento:
• Capacidade: Armazenar grande quantidade de informações.
• Persistência: Informação deve sobreviver ao término do processo.
• Acesso Concorrente: Múltiplosprocessos devem acessar informações simultaneamente
Manipulação Uniforme:
• A manipulação de arquivos deve ocorrer de maneira uniforme, independente do tipo de dispositivo de
armazenamento.
• Dispositivos de armazenamento são vistos como sequências lineares de blocos de tamanho fixo, que dão
suporte a duas operações:
o leitura e escrita de blocos. Exemplo: Ler o bloco k; Escrever no bloco k.
• Operações fundamentais: leitura e escrita de blocos.
Desafios do gerenciamento de arquivos:
• Localizar blocos que contêm informações necessárias.
• Impedir acessos não autorizados entre usuários.
• Identificar blocos disponíveis para uso.
Componentes de um sistema de arquivos:
• Conjunto de arquivos: Armazena os dados.
• Estrutura de diretórios: Organiza e fornece informações sobre os arquivos.
Definições de Arquivos e Discos:
• Arquivos: São unidades lógicas criadas por processos.
• Discos: Podem conter milhares ou milhões de arquivos, cada um independente.
❖ Arquivos
Uniformidade no acesso aos dados:
• Sistemas operacionais devem oferecer uma visão lógica e uniforme dos dispositivos de armazenamento,
independentemente do tipo.
Definição de arquivos:
• Um arquivo é constituído de informações e pode representar programas ou dados:
o Programas: São arquivos executáveis, que contém instruções compreendidas pela CPU.
o Arquivo de dados: Podem ser estruturados livremente, como numéricos, alfabéticos, alfanuméricos
ou binários.
Identificação dos arquivos:
• Arquivos são identificados por um nome, cujas regras variam de sistema para sistema.
• As principais diferenças entre as regras para os nomes de arquivo são:
o Quantidade máxima de caracteres.
o Sensibilidade a maiúsculas/minúsculas.
o Uso de caracteres especiais.
o Relevância das extensões nos nomes.
Extensões de arquivos:
• Em alguns sistemas, extensões são apenas convenções e não são impostas pelo sistema operacional.
• Exemplos:
o "file.txt" pode indicar um arquivo de texto, mas serve mais como referência ao usuário.
o Algumas aplicações, como compiladores de C, podem exigir extensões específicas (e.x., “.c”), porém
isso não é relevante para o sistema operacional.
Persistência e independência dos arquivos:
• Ao criar um arquivo, o processo atribui um nome para garantir que ele continue acessível após a execução.
• Ao receber um nome, o arquivo torna-se independente do processo, do usuário e, em alguns casos, até do
sistema que os criou.
❖ Estrutura de Arquivos
Organização de arquivos ao serem criados:
• No momento da criação de um arquivo, é possível definir qual organização será adotada.
• Esta organização pode ser uma estrutura suportada pelo:
o Sistema operacional ou definida pela própria aplicação.
Tipos de organização:
1. Sequência desestruturada de bytes:
o É a forma mais simples de organização.
o Sem estrutura lógica imposta pelo sistema operacional; a aplicação define a organização.
o Vantagem: Alta flexibilidade para criar diferentes estruturas de dados.
o Desvantagem: A aplicação é totalmente responsável pelo controle de acesso e significado dos dados.
o Exemplos: Usado em sistemas como Linux e MS Windows.
2. Sequência de registros de tamanho fixo:
o É uma forma estruturada para o armazenamento de arquivos.
o O arquivo é composto por registros com estrutura interna definida e tamanho fixo.
o Operações de leitura/gravação lidam com registros inteiros.
o Histórico: Utilizado em sistemas antigos com cartões perfurados (80 colunas) ou registros de 132
caracteres para impressoras de linha.
o Atualmente, não é o modelo primário de sistemas operacionais modernos.
3. Árvore de registros:
o Os arquivos são compostos por registros de tamanhos variados, cada um contendo uma chave em
posição fixa.
o Os registros são organizados como uma árvore, ordenados pela chave para buscas rápidas.
o Utilizado em computadores de grande porte para processamento de dados comerciais.
o Difere significativamente de sequências de bytes desestruturadas.
❖ Métodos de Acesso
1. Acesso Sequencial:
• Foi o primeiro método de acesso desenvolvido.
• Os registros são acessados na ordem em que foram gravados.
• É possível retroceder registros, mas não pular ou acessá-los fora de ordem.
• Novos registros podem ser adicionados apenas no final do arquivo.
2. Acesso Aleatório: Posteriormente, surgiu um método de acesso mais eficiente, o acesso aleatório (também
conhecido como acesso direto).
• Permite acessar diretamente um registro com base em sua posição relativa ao início do arquivo.
• Requer registros de tamanho fixo.
• Não há restrição à ordem de leitura ou gravação dos registros.
• Em sistemas operacionais antigos, o tipo de acesso ao arquivo é determinado quando o arquivo é criado.
• Em sistemas operacionais modernos, a maioria dos arquivos utiliza acesso aleatório, exceto em dispositivos
que não o suportam.
3. Acesso Indexado:
• Método menos comum.
• Baseia-se na construção de um índice contendo ponteiros para os blocos do arquivo.
• O acesso ocorre em duas etapas:
1. Pesquisa no índice.
2. Uso do ponteiro para alcançar a posição desejada.
Evolução:
• Sistemas antigos determinavam o tipo de acesso ao arquivo no momento de sua criação.
• Sistemas modernos oferecem maior flexibilidade, com suporte primário ao acesso aleatório.
❖ Tipos de Arquivos
• Arquivos Suportados pelos Sistemas Operacionais: Os sistemas operacionais costumam suportar vários
tipos de arquivos, sendo os mais comuns:
1. Arquivos Regulares: Contêm informações gerais, por exemplo, dados de usuários.
2. Diretórios: Arquivos de sistema usados para organizar e manter a estrutura do sistema de arquivos.
3. Arquivos Especiais de Caractere: Associados a operações de E/S, modelando dispositivos seriais.
4. Arquivos Especiais de Bloco: Utilizados para modelar dispositivos de bloco, especialmente discos.
• Classificação de Arquivos Regulares:
1. Arquivo Texto:
▪ Constituído por linhas de texto de tamanhos variados, terminadas por caracteres especiais
de fim de linha.
▪ Compreensíveis para humanos quando exibidos ou impressos.
▪ Editáveis em editores de texto comuns.
2. Arquivo Binário:
▪ Não são compostos por texto legível.
▪ Geram caracteres incompreensíveis quando listados.
▪ Podem ser:
▪ Arquivos de Usuário: Com ou sem estrutura interna.
▪ Arquivos Executáveis: Contêm uma estrutura conhecida pelo sistema operacional e
os códigos são executados pela CPU.
❖ Diretórios:
• Definição e Função:
o Definição de Estrutura de Diretórios: É o modo como o sistema organiza logicamente os arquivos em
um disco.
o Diretório (ou pasta): É um arquivo que contém uma estrutura de dados com entradas associadas aos
arquivos onde são armazenadas informações como:
▪ Localização física.
▪ Nome.
▪ Organização.
▪ Demais atributos.
• Abertura de Arquivos:
o Durante a abertura de um arquivo:
▪ Pesquisa no Diretório: O sistema operacional busca no diretório a entrada correspondente.
▪ Tabela de Arquivos: Os atributos e endereços são copiados para a tabela de arquivos na memória.
▪ Liberação: Quando fechado, a entrada é liberada da tabela.
• Estruturas de Diretórios:
1. Nível Único (Um Nível):
▪ Todos os arquivos estão em um único diretório.
▪ Limitações:
o Não permite arquivos com nomes iguais.
o Conflitos no acesso.
▪ Nota: Este modelo não é mais utilizado.
2. Diretório de Dois Níveis:
▪ Contém:
o Um diretório para arquivos do sistema.
o Um diretório separado para cada usuário.
▪ Com esta implementação, cada usuário pode criar arquivos sem a preocupação de conhecer os
demais arquivos do disco.
▪ Para localizar os arquivos nesta estutura:
o Utiliza-se o master file directory que aponta para os diretórios de usuários.
o Requer especificação do caminho (path) para referenciar arquivos.
3. Estrutura em Árvore (Hierárquica):
▪ A organizaçãodos arquivos em um único diretório não permite uma organização adequada.
▪ A extensão para um modelo de múltiplos níveis permite que os arquivos sejam mais bem
organizados.
▪ Este modelo é chamado estrutura de diretórios em árvore ou sistema de diretórios hierárquico.
▪ É o modelo mais comum nos sistemas operacionais modernos.
▪ É possível criar quantos diretórios for desejado.
▪ Os diretórios podem conter:
o Arquivos.
o Subdiretórios.
▪ Cada arquivo possui um caminho único (path) desde a raiz, até o diretório que contém o arquivo
bem, como o próprio arquivo.
▪ Quando o sistema de arquivos é organizado como uma árvore de diretórios, os nomes de caminhos
podem ser absolutos ou relativos.
o Caminhos de Arquivo:
✓ Caminho Absoluto: Parte do diretório raiz até o arquivo.
✓ Caminho Relativo:
➢ Baseia-se no diretório de trabalho atual.
➢ O caminho é buscado a partir do diretório de trabalho (diretório atual).
o Características Adicionais:
✓ Cada processo possui seu próprio diretório de trabalho.
✓ Alterações no diretório de trabalho de um processo não afetam outros.
✓ Diretórios em árvore incluem duas entradas especiais:
➢ ".": Diretório atual.
➢ "..": Diretório pai (para subir na árvore).
❖ Implementação do Sistema de Arquivos:
• Os discos são o meio de armazenamento secundário mais comum no qual os arquivos são armazenados.
• Transferências: As transferências de dados entre a memória e o disco são realizadas em unidades chamadas
blocos.
Estrutura de Armazenamento no Disco
• Blocos:
o São unidades de transferência entre memória e disco, compostas por setores.
o Setores variam de 32 a 4096 bytes (porem o mais comum é de 512 bytes).
• Partições:
o Os discos podem ser divididos em uma ou mais partições,
o Cada partição pode ter um sistema de arquivos independente.
o MBR - Master Boot Record (registro mestre de inicialização):
▪ Está localizado no setor 0.
▪ É usado para inicializar o computador.
▪ No final do MBR está localizada a tabela de partição, que armazena os endereços de início e
fim de cada partição.
▪ Uma das partições da tabela é marcada como ativa.
▪ Identifica a partição ativa para carregar o sistema operacional.
o Cada partição possui um bloco de inicialização, usado para carregar o sistema operacional ou outras
funções.
Inicialização do Sistema:
• Processo de Inicialização: Quando o computador é inicializado:
o A BIOS lê e executa o MBR.
o MBR localiza e executa o bloco de inicialização da partição ativa.
o O programa no bloco de inicialização carrega o sistema operacional contido naquela partição.
o Cada partição começa com um bloco de inicialização, mesmo que ela não contenha um sistema
operacional que possa ser inicializado.
o O esquema de uma partição de disco varia bastante entre sistemas de arquivos.
Estrutura de Partições:
o Superbloco:
o O super bloco é o primeiro elemento de uma partição.
o O super bloco é o local que contém parâmetros a respeito do sistema de arquivos.
o O superbloco armazena parâmetros e informações que protegem a integridade do sistema de arquivo,
podendo conter informações chave, tais como:
▪ Identificador de sistema de arquivo;
▪ Quantidade de blocos do sistema de arquivo;
▪ Localização dos blocos livres;
▪ Localização do diretório-raiz;
▪ Data e o horário em que o sistema foi modificado pela última vez;
▪ Informações indicando se o sistema de arquivo precisa ser verificado.
o O super bloco é lido para a memória durante a inicialização ou ao acessar o sistema pela primeira
vez.
o Mapeamento de Blocos Disponíveis: As informações sobre blocos disponíveis podem vir em forma
de mapa de bits ou lista encadeada.
o Pode ser seguido pelos i-nodes.
Definição de i-nodes: Estruturas de dados que descrevem cada arquivo.
o Depois pode vir o diretório-raiz, que contém o topo da árvore do sistema de arquivos.
Diretório-raiz: Representa o topo da hierarquia do sistema de arquivos.
o Por fim, o restante do disco contém os demais diretórios e arquivos.
Gerenciamento de Blocos Livres
• A criação de arquivos em disco exige que o sistema operacional tenha o controle de quais blocos no disco
estão livres.
• Este controle é realizado através de uma estrutura de dados que armazena informações que possibilitam ao
sistema de arquivos gerenciar o disco.
o Métodos de Controle:
1. Mapa de Bits:
✓ É a forma mais simples de implementar uma estrutura de espaços livres.
✓ Representa cada bloco por um bit:
✓ 0: Bloco livre.
✓ 1: Bloco alocado.
2. Lista Encadeada:
✓ Blocos livres contêm endereços do próximo bloco livre.
✓ Restrições:
➢ Uso de espaço no bloco para controle.
➢ Busca sequencial é lenta.
3. Blocos Contíguos :
✓ Blocos Contíguos agrupa blocos livres consecutivos no disco, sem espaços entre eles,
onde os dados de um arquivo são dispostos de forma sequencial.
✓ Cada entrada armazena:
➢ Endereço do primeiro bloco do segmento.
➢ Quantidade de blocos livres contíguos.
Considerações
• Sistemas de arquivos modernos adotam esquemas eficientes para inicialização e controle de blocos.
• A escolha da estrutura de controle depende das características e necessidades do sistema.
❖ Alocação Contígua de Arquivos
• Definição de Alocação Contígua de Arquivos: Consiste em armazenar arquivos em blocos contíguos no disco,
ou seja, armazena arquivos um ao lado um do outro, sem espaços intermediários.
• Localização: A localização do arquivo é baseada no endereço do primeiro bloco e na quantidade de blocos.
• Vantagens da Alocação Contígua de Arquivos:
1. Implementação Simples: Qualquer bloco pode ser acessado por uma simples adição ao endereço inicial.
2. Desempenho Elevado na Leitura: Arquivos podem ser lidos em uma única operação.
• Acesso:
o O acesso a arquivos dispostos contiguamente no disco é bastante simples tanto para acesso
sequencial quanto para acesso aleatório.
• Desafios da Alocação Contígua de Arquivos:
o Alocação de Espaço Livre:
▪ Requer segmentos contíguos de blocos livres para novos arquivos.
▪ Seleção do segmento depende de uma estratégia de alocação.
o Fragmentação de Disco:
▪ Espaços livres dispersos ao longo do disco após repetidas operações.
▪ Impacta negativamente a alocação de novos arquivos.
o Desfragmentação:
▪ A desfragmentação é um processo necessário para reorganizar os arquivos e liberar espaço
contíguo.
▪ É demorado e deve ser realizado periodicamente.
• Uso Atual: A alocação contígua é amplamente utilizada em CD-ROMs, onde os tamanhos dos arquivos são
fixos e não mudam durante o uso do sistema.
❖ Alocação por Lista Encadeada
• Organização da Alocação por Lista Encadeada:
o Na alocação por lista encadeada, um arquivo é organizado como um conjunto de blocos ligados
logicamente, independente da sua localização física.
o Arquivo é armazenado como um conjunto de blocos logicamente ligados por ponteiros.
o Cada bloco contém um ponteiro para o próximo bloco.
• Funcionamento do Armazenamento em Diretórios:
o A entrada do diretório armazena apenas o endereço do primeiro bloco do arquivo.
• Fragmentação e Desfragmentação:
o Fragmentação de Disco: Não ocorre, pois blocos não precisam ser contíguos.
o Fragmentação de Arquivos: Ocorre apenas a fragmentação de arquivos.
▪ Fragmentação de Arquivos: É a quebra do arquivo em diversos blocos espalhados pelo disco.
▪ Aumenta tempo de acesso aos deslocamentos da cabeça de leitura/gravação.
o Desfragmentação: É importante desfragmentar periodicamente para otimizar operações de
entrada/saída.
• Desvantagens da Alocação por Lista
Encadeada:
1. Acesso Sequencial: Somente
permite acesso sequencial aos
blocos, dificultando acessos
aleatórios.
2. Desempenho: Fragmentação
lógica dos arquivos aumenta o tempo
de leitura/gravação devido aos
deslocamentos frequentes da cabeça do disco.
3. Perda de Espaço: Parte dos blocos é ocupada4.
o Novos recursos como plug and play e Active Directory.
• Windows XP (2001):
o Integração das famílias DOS-Windows e Windows NT/2000.
• Outras versões:
o Versões para desktop: Windows Vista, 7, 8, 10.
o Versões para servidores: Windows Server 2003, 2008, 2012, 2016, 2019.
2. Unix: O Unix veio de outra vertente dos sistemas operacionais. Uma das características da geração de
computadores existentes na década de 1960 eram os sistemas batch.
• MULTICS (1965):
o Desenvolvido pelo MIT, Bell Labs e General Electric para criar um sistema de tempo compartilhado.
• Unix (1969):
o Criado por Ken Thompson após a retirada da Bell Labs do projeto MULTICS.
o Originalmente desenvolvido em Assembly para o PDP-7, depois reescrito na linguagem B, evoluindo
para a linguagem C com a ajuda de Dennis Ritchie.
• Reescrita em C (1973):
o Unix reescrito em C e portado para o PDP-11.
o Licenciamento para várias universidades, incluindo a Universidade de Berkeley, que desenvolveu o
BSD (Berkeley Software Distribution).
• BSD (Berkeley Software Distribution):
o Introduziu melhorias como memória virtual, C shell, Fast File System, sockets e o protocolo TCP/IP.
• Linux (1991):
o Linus Torvalds inicia o desenvolvimento do Linux baseado no Minix, uma variante educacional do
Unix.
o Evolução com a ajuda de programadores voluntários.
• Unificação:
o O comitê POSIX (Portable Operating System Unix) tentou unificar as versões do Unix, criando uma
biblioteca padrão de chamadas e um conjunto de utilitários.
Módulo 2. Identificar os tipos de sistemas operacionais
Tipo de sistemas operacionais
Sistemas monoprogramáveis
• Definição de Sistemas monoprogramáveis: Também chamados de sistemas monotarefa.
• Alocação de Recursos: O processador, a memória e os periféricos são dedicados exclusivamente à execução
de um único programa.
• Execução de Aplicações: Outras aplicações devem aguardar até que o programa em execução seja concluído
para serem processadas.
• Limitação: Não permite a execução simultânea de múltiplos programas.
Sistemas multiprogramáveis ou multitarefa
• Definição de Sistemas multiprogramáveis:
o Recursos computacionais são compartilhados entre usuários e aplicações.
o Permite a execução simultânea de múltiplos programas.
• Funcionamento:
o Enquanto um programa aguarda operações de E/S, outros utilizam o processador.
o O sistema operacional gerencia vários programas de forma concorrente.
• Classificação:
o Sistemas multiprogramáveis podem ser:
▪ Batch: Processamento em lotes.
▪ Tempo compartilhado: Compartilhamento de CPU entre usuários.
▪ Tempo real: Resposta imediata a eventos.
• Vantagem sobre sistemas monoprogramáveis: Evita o desperdício do processador, que ficava ocioso em
operações de E/S.
• Grau de multiprogramação:
o Refere-se ao número de processos na memória simultaneamente.
o Maior grau de multiprogramação reduz o tempo ocioso da CPU.
• Fórmula de utilização da CPU:
o 𝑼𝒄𝒑𝒖 = 𝟏 − 𝒑𝒏
▪ p: Tempo de espera por E/S.
▪ n: Número de processos na memória.
o Exemplo: Se p=65% e n=3 → 𝑼𝒄𝒑𝒖 = 𝟏 − 𝟎, 𝟔𝟓𝟑→ 𝑼𝒄𝒑𝒖 = 𝟎, 𝟕𝟐 𝒐𝒖 𝟕𝟐%
• Gráfico de análise (Figura 11):
o Mostra a relação entre o grau de multiprogramação e a utilização da CPU.
o Para 80% de espera de E/S, 10 processos são necessários para que a CPU desperdice menos de 10% de
tempo.
Sistemas com múltiplos processadores
Definição de Sistemas com múltiplos processadores: Sistemas com dois ou mais processadores que atuam em
conjunto.
Vantagens:
• Escalabilidade: Aumenta a capacidade de processamento.
• Disponibilidade: Falhas em um processador podem ser compensadas por outro.
• Balanceamento de carga: Distribui a carga de trabalho entre os processadores.
Modos de Comunicação:
• Sistemas fortemente acoplados:
o Compartilham memória principal e periféricos.
o Gerenciados por um único sistema operacional.
o Tipos:
▪ SMP (Symmetric Multiprocessors): Acesso uniforme à memória.
▪ NUMA (Non-Uniform Memory Access): Tempos de acesso à memória variam devido à
organização em conjuntos conectados por redes de interconexão.
• Sistemas fracamente acoplados:
o Sistemas computacionais independentes conectados por linhas de comunicação.
o Cada sistema possui seu próprio sistema operacional e gerencia seus próprios recursos (processador,
memória, periféricos).
Outras denominações e configurações:
• Também chamados de "Sistemas Avançados de Processamento".
• Podem incluir computadores com múltiplos processadores, processadores com múltiplos núcleos e sistemas
distribuídos.
Requisitos para o Sistema Operacional: O S.O. precisa estar adaptado para gerenciar e operar eficientemente
sistemas com múltiplos processadores.
Outras classificações dos sistemas operacionais
Evolução e variedade: Sistemas operacionais surgiram ao longo de mais de 50 anos com grande diversidade, alguns
pouco conhecidos.
Serviços suportados em grandes sistemas:
• Processamento simultâneo de muitas tarefas.
• Suporte ao manejo de grandes quantidades de operações de entrada/saída (E/S).
• Serviços específicos como processamento em lote, processamento de transações e tempo compartilhado.
Tipos de sistemas operacionais e suas características:
1. Sistemas em lote (batch):
o Executam tarefas rotineiras sem interação do usuário.
o Exemplo: Processamento de apólices de seguros, relatórios de vendas.
2. Sistemas de processamento de transações:
o Administram grande volume de pequenas requisições por segundo.
o Exemplo: Processamento bancário, reservas de passagens aéreas.
3. Sistemas de tempo compartilhado:
o Permitem múltiplos usuários remotos executando tarefas simultaneamente.
o Exemplo: Consultas a bancos de dados.
Sistemas de tempo real:
• Tempo é um fator crítico.
• Classificações:
o Tempo real crítico:
▪ Ações devem ocorrer em momentos específicos, sem falhas.
▪ Exemplo: Processos industriais, aviônica, aplicações militares.
o Tempo real não crítico:
▪ Descumprimento de prazos não gera danos permanentes.
▪ Exemplo: Sistemas de áudio digital, multimídia, telefones digitais.
Evolução dos sistemas operacionais:
• Novos tipos de SOs e funcionalidades surgem com o avanço tecnológico, enquanto outros deixam de existir.
• Tecnologias e ideias obsoletas podem retornar devido a mudanças tecnológicas.
• Exemplo: Memórias cache:
o Desaparecem se memórias se tornam mais rápidas que CPUs.
o Reaparecem se CPUs superam novamente as memórias em velocidade.
Tipos de licenças de sistemas operacionais:
1. Software proprietário:
o Licenciado sob copyright com direitos exclusivos.
o Código-fonte geralmente não acessível para modificação.
o Apenas a fabricante tem controle total.
2. Software livre (Free software):
o Enfatiza a liberdade dos usuários para:
▪ Executar o programa para qualquer propósito.
▪ Estudar e adaptar o programa (requer acesso ao código-fonte).
▪ Redistribuir cópias.
▪ Aperfeiçoar o programa e compartilhar melhorias com a comunidade.
o Exemplo: Licença GNU da Free Software Foundation (FSF).
3. Software de código aberto (Open source):
o Código-fonte disponibilizado para modificação e melhoria.
o Não segue necessariamente as 4 liberdades do software livre.
o Termo promovido pela Open Source Initiative (OSI).
o Diferença principal:
▪ Todo software livre é código aberto, mas nem todo código aberto é livre.
o Exemplos de licenças:
▪ Apache License.
▪ MIT License.
▪ Mozilla Public License.
▪ Common Development and Distribution License.
▪ Eclipse Public License.
Módulo 3. Compreender a estrutura do SO: Kernel, system calls, modos de acesso
Estrutura do SO: Kernel, System Calls, Modos de Acesso
Composição e localização:
• O sistema operacional é formado por rotinas que oferecem serviços aos usuários,
aplicações e ao próprio sistema.
• Essas rotinas compõem o kernel, localizado no núcleo do sistemapelos ponteiros.
4. Confiabilidade: Corrupção de um ponteiro pode resultar na perda do encadeamento e,
consequentemente, do arquivo.
❖ Alocação por Lista Encadeada Utilizando Índice
• Definição:
o Similar à alocação por lista encadeada, mas o encadeamento é feito por meio de uma tabela (não
diretamente nos blocos).
o A tabela é chamada de FAT (File Allocation Table).
• Funcionamento:
o A tabela FAT (File Allocation Table), mantém o encadeamento dos blocos de um arquivo.
o Quando mantida na memória, a tabela torna o acesso mais rápido.
o A entrada do diretório ainda armazena apenas o número do bloco inicial, permitindo localizar todos
os blocos do arquivo.
• Vantagens:
o Acesso mais rápido: Utilização da tabela na memória principal acelera o processo.
o Blocos disponíveis: Todo o bloco no disco é utilizado para dados, sem a necessidade de ponteiros
dentro dos blocos.
• Desvantagens:
1. Tabela grande: Para discos grandes,
a tabela FAT pode crescer
significativamente.
2. Agrupamento em clusters: Para
reduzir o tamanho da tabela, blocos
são agrupados em clusters, o que pode
causar desperdício de espaço (parte
não utilizada do último cluster).
Clusters: Agrupamentos de blocos de um disco.
❖ I-nodes (Alocação Indexada)
• Definição de i-nodes (Alocação indexada): Cada arquivo possui um i-node (nó-índice ou nó-i), que é uma
tabela que lista os atributos e os endereços dos blocos do arquivo no disco.
• Vantagens:
1. Eficiência de memória: O i-node só precisa estar na memória quando o arquivo está aberto, e o espaço
ocupado pelos i-nodes para arquivos abertos é muito menor do que a tabela de arquivos usada na alocação
por lista encadeada.
2. Armazenamento eficiente: Arquivos pequenos têm toda a informação contida no próprio i-node,
facilitando o acesso rápido.
• Estrutura do i-node:
o Endereços diretos: Contidos diretamente no i-node para
arquivos pequenos.
o Bloco indireto simples: Contém endereços de blocos
adicionais para arquivos maiores.
o Bloco indireto duplo: Contém o endereço de um bloco que
lista blocos indiretos simples.
o Bloco indireto triplo: Contém o endereço de um bloco que
lista blocos indiretos duplos.
• Desempenho:
o Uso de memória: O método é eficiente em termos de uso de memória, com o armazenamento de i-
nodes sendo proporcional ao número de arquivos abertos.
❖ Implementação de Cache
• O acesso a disco é lento quando comparado com o acesso à memória principal.
• Objetivo da Implementação em Cache: Melhorar o desempenho do sistema, pois é capaz de minimizar o
impacto da lentidão no acesso ao disco em relação à memória principal.
• Funcionamento:
o O sistema operacional aloca uma área na memória principal como cache para armazenar dados
utilizados em operações de acesso ao disco.
o Durante uma operação de E/S, o sistema verifica se o dado requisitado está na cache. Se estiver, o
acesso ao disco é evitado. Caso contrário, o disco é acessado e a cache é atualizada.
• Política de Substituição: Como o tamanho da cache é limitado, o sistema adota uma política de substituição
para decidir quais blocos manter ou substituir.
• Segurança e Confiabilidade: O problema de perda de dados pode ocorrer se blocos modificados
permanecerem na cache por muito tempo sem serem gravados no disco, especialmente em caso de falhas
de energia.
• Maneiras de Mitigar Perda de Dados:
1. Rotina de atualização periódica: O sistema atualiza periodicamente todos os blocos modificados na
cache para o disco.
2. Write-through: Atualização imediata no disco sempre que um bloco da cache for modificado, garantindo
segurança, mas aumentando as operações de E/S.
3. Write-back: A atualização no disco ocorre apenas quando necessário, reduzindo operações de E/S, mas
aumentando o risco de perda de dados.
Módulo 2. Aplicar os conceitos de sistemas de arquivos
❖ Sistema de Arquivos do Linux
Conceito de Arquivo
• Um arquivo no Linux pode ser qualquer objeto capaz de manipular de dados, não apenas um objeto em
disco.
• Virtual File System (VFS): É a camada de abstração que oculta detalhes específicos dos sistemas de arquivos.
Principais Objetos Definidos pelo VFS:
1. I-node: Representa um arquivo individual.
2. Arquivo: Representa um arquivo aberto.
3. Superbloco: Representa um sistema de arquivos inteiro.
4. Dentry: Representa uma entrada de diretório individual.
Funções e Chamadas de Sistema:
• Tabelas de Funções: Cada objeto tem um ponteiro para uma tabela que lista funções que implementam
chamadas de sistema.
• Operações: O VFS executa operações chamando funções apropriadas na tabela sem conhecer o tipo de
objeto.
• Os objetos arquivo pertencem a um único processo, mas os objetos i-node não.
• Há um objeto arquivo para cada instância de um arquivo aberto, mas um único objeto i-node.
Organização de Arquivos:
• I-nodes em Cache: I-nodes podem ser armazenados em cache pelo VFS mesmo quando não estão sendo
usados por processos.
• Superbloco: Mantém acesso a i-nodes e representa dispositivos de disco montados e sistemas de arquivos
de rede.
o Principal função do objeto superbloco: É dar acesso a i-nodes.
• Dentry: Representa entradas de diretório no caminho de um arquivo.
Exemplo: O arquivo “/home/maria/teste.txt” possui as entradas de diretório “/”, “home”, “maria” e
“teste.txt”, sendo cada uma destas entradas representada por um objeto dentry diferente.
Evolução dos Sistemas de Arquivos
• MINIX: A primeira versão do Linux usava sistema de arquivos do MINIX.
o O MINIX limitava os nomes de arquivos a 14 caracteres e tinha um limite de 64 MB para o tamanho
máximo dos arquivos).
• Desenvolvimentos posteriores melhoraram desempenho e capacidade de nomes longos e maiores tamanhos
de arquivos, como o sistema de arquivos ext e o ext2.
o Ext: Permitia suporte a arquivos de até 2 GB e nomes de 255 caracteres.
o Ext2: Melhorias de desempenho do ext, tornando-se o principal sistema de arquivos do Linux.
Vantagens do VFS
• Possui suporte a múltiplos sistemas de arquivos simultaneamente.
• Os módulos para novos sistemas de arquivos podem ser carregados dinamicamente.
• Extensões em arquivos são opcionais (caracteres após um caractere “.”).
• Está a cargo dos programas interpretar ou não o tipo do arquivo por sua extensão, visto que para o Linux a
extensão de um arquivo não possui nenhum significado.
Diretório Raiz (conhecido como “/”)
• O diretório raiz é uma estrutura hierárquica;
• Além de ser usado para separar nomes de diretórios, é um caractere que contém subdiretórios.
• Sob o diretório raiz, existe um grupo de diretórios comuns à maioria das distribuições Linux, tais como:
o /bin: Executáveis básicos.
o /boot: Configurações de boot e kernel.
o /dev: Dispositivos do sistema.
o /etc: Configurações do sistema.
o /home: Diretórios pessoais dos usuários.
o /lib, /lib64: Bibliotecas do sistema.
o /media, /mnt: Montagem de dispositivos externos.
o /opt: Aplicativos opcionais.
o /proc: Informações sobre processos e variáveis do kernel.
o /root: Diretório do administrador.
o /sbin: Ferramentas de administração.
o /srv: Arquivos de serviços do sistema.
o /sys: Arquivos especiais do kernel.
o /tmp: Arquivos temporários.
o /usr: Aplicativos disponíveis para todos os usuários.
o /var: Arquivos de logs e bancos de dados.
❖ Sistema de Arquivos ext2
Características Gerais
• Um dos sistemas de arquivos mais populares no Linux.
• Estrutura organizada em grupos de blocos, com layout uniforme após o bloco de inicialização (reservado
para boot).
Layout de uma partição ext2
Estrutura do ext2
1. Bloco de Inicialização: Reservado para inicialização do computador.
2. Superbloco:
o Contém informações sobre o layout do sistema de arquivos.
o Entre os dados armazenados incluem a quantidade de i-nodes e blocos de disco.
3. Descritor de Grupo:
o Armazena localizaçãodos mapas de bits, quantidade de blocos e de i-nodes livres, e número de
diretórios no grupo.
4. Mapas de Bits:
o Dois mapas de bits são usados para controlar os blocos livres e i-nodes livres.
o Cada mapa contém um bloco de comprimento.
5. I-nodes:
o São numerados de 1 até um limite máximo.
o Cada i-node tem 128 bytes de comprimento e descreve exatamente um arquivo.
o I-nodes contém informações para localizar todos os blocos de disco associados ao arquivo.
6. Blocos de Dados: É onde os arquivos e diretórios estão armazenados.
Alocação de Dados
• Os diretórios ficam dispersos pelos grupos de blocos do disco.
• Os arquivos são preferencialmente armazenados no mesmo grupo de blocos que seu i-node.
• Os mapas de bits são usados para tomar decisões rápidas sobre onde alocar novos dados do sistema de
arquivos.
• Para minimizar a fragmentação, o ext2 pré-aloca 8 blocos adicionais em operações de escrita.
• Essa pré-alocação equilibra a carga do sistema de arquivos.
Estrutura dos Diretórios
• Diretórios armazenam nomes de arquivos.
• Dentro de um diretório, as entradas para arquivos e diretórios estão fora de ordem.
• Entradas podem não ocupar um bloco de disco inteiro, resultando em bytes não utilizados no final de cada
bloco de disco.
• Cada entrada de diretório possui 5 campos, onde 4 campos são de comprimento fixo e 1 campo de
comprimento variável:
1°) Número do i-node: Identifica o i-node correspondente (16 para projeto, 22 para documento.txt e 91 para
dados).
2°) Tamanho da entrada: Contém o tamanho da entrada, incluindo os espaços não utilizados no final.
3°) Tipo: Identifica o tipo (arquivo, diretório, link etc).
4°) Tamanho do nome: Possui o tamanho do nome do arquivo.
5°) Nome do arquivo: Possui tamanho variável e armazena o nome do arquivo.
Formato dos I-nodes
• Permissões: Controle de acesso ao arquivo.
• Contador de links: Número de hardlinks que o arquivo possui.
Hardlinks são diferentes entradas de diretórios que apontam para o mesmo i-node (o mesmo arquivo),
permitindo múltiplos caminhos para um único arquivo.
• UID: Identificador do dono do arquivo.
• GID: Grupo do dono do arquivo.
❖ Journaling
Definição e Propósito do Journaling;
• Journaling é um recurso desenvolvido para minimizar perda de dados em casos de falhas, como falta de
energia.
• Ele substitui a gravação direta de dados no disco por um método mais eficiente, armazenando as alterações
em um diário.
Funcionamento
1. Journaling:
o Alterações são gravadas sequencialmente no diário, evitando movimentação constante das cabeças
de leitura/gravação.
o Operações que executam uma tarefa específica são denominadas de transações.
2. Confirmação de Transações:
o Quando uma transação é gravada no diário é considerada confirmada e o sistema pode continuar.
o Quando uma transação é concluída (totalmente salva no disco), elas são removidas do diário.
3. Localização do Diário:
o Quando removida, ela pode estar em uma seção separada do sistema de arquivos ou em um eixo
distinto no disco.
o Como fica em uma seção confinada do disco, é mais eficiente por diminuir os tempos de disputa e
busca do cabeçote.
Recuperação do Sistema: Caso ocorra uma falha, transações pendentes no diário são concluídas após a
recuperação do sistema.
Implementação: O journaling foi implementado no Linux na terceira versão do ext, conhecida como ext3.
❖ Disco Rígido e Partições
Disco Rígido
• O Disco rígido é composto por discos sobrepostos girando a uma velocidade constante, com trilhas
concêntricas divididas em setores.
• Trilhas na mesma posição vertical em diferentes discos formam um cilindro.
• Cada superfície possui uma cabeça de leitura/gravação presa a um braço que se move radialmente entre os
cilindros.
Fatores que afetam o tempo de leitura/gravação:
1. Tempo de busca (seek): Tempo para mover o braço até o cilindro correto.
2. Tempo de latência: Tempo de espera para o setor desejado alinhar-se
com a cabeça.
3. Tempo de transferência: Tempo necessário para leitura/gravação do
bloco.
Partições
• As partições de um disco dividem o espaço de um disco em seções independentes, permitindo múltiplos
sistemas de arquivos.
• Cada partição precisa ser formatada com um sistema de arquivos para uso.
• Informações sobre partições são armazenadas em uma tabela de partição no disco.
Identificação de Dispositivos no Linux
• Os dispositivos são identificados por arquivos especiais que ficam armazenados no diretório /dev.
• A identificação de discos e partições é realizada de acordo com o seguinte padrão:
• Algumas identificações de discos e partições em sistemas Linux:
o /dev/fd0 → Primeira unidade de disquetes;
o /dev/fd1 → Segunda unidade de disquetes;
o /dev/sda → Primeiro disco rígido na primeira controladora SATA ou SCSI;
o /dev/sda1 → Primeira partição do primeiro disco rígido SATA ou SCSI;
o /dev/sda2 → Segunda partição do primeiro disco rígido SATA ou SCSI;
o /dev/sdb → Segundo disco rígido na primeira controladora SATA ou SCSI;
o /dev/sdb3 → Terceira partição do segundo disco rígido SATA ou SCSI;
o /dev/sr0 → Primeiro CD-ROM SATA ou SCSI;
o /dev/hda → Primeiro disco rígido na primeira controladora IDE;
o /dev/hda1 → Primeira partição do primeiro disco rígido IDE.
❖ Formatação de Partições
o O processo de criação de partições em um disco reserva espaço para o sistema de arquivos, mas
ainda não faz com que o dispositivo possa ser utilizado.
o A formatação cria a estrutura do sistema de arquivos em uma partição, tornando-a utilizável.
o Formatar uma partição Linux significa criar os grupos de blocos, cada um deles contendo seu
superbloco, descritor do grupo, mapas de bits, i-nodes e reservar espaço para os blocos de dados.
• Finalidade da Formatação: Preparar uma partição para receber um sistema de arquivos e dados.
❖ Montagem do Sistema de Arquivos e Comandos Relacionados
Montagem do Sistema de Arquivos
• Muitos sistemas possuem dois ou mais discos ou partições.
• Além disso, muitos sistemas atuais permitem o uso de diversos dispositivos de armazenamento
simultaneamente, como discos ópticos e unidades USB,
• Dessa forma, houve a necessidade de criar diferentes formas de acessar os diferentes sistemas de arquivos.
• Uma solução está em manter cada sistema separado e encontrar uma forma de referenciá-los.
✓ Solução no Windows:
o Os dispositivos e partições são identificados por letras seguidas de “:” (ex.: C:, D:, G:).
o Cada unidade possui seu próprio diretório raiz, arquivos e subdiretórios.
o O usuário deve especificar o dispositivo e o
arquivo para acessá-lo.
✓ Solução no Linux:
o Os sistemas de arquivos são montados sobre a
árvore de diretórios.
o Exemplos de montagem:
▪ Unidade ótica: /mnt.
▪ Dispositivo USB: /media/usb1.
Comandos para Gerenciamento de Partições
O Linux possui outros utilitários que podem ser úteis para a administração do sistema
1. fsck (File System Check):
o Usado para verificar e corrigir sistemas de arquivos.
o Se não for informado o tipo do sistema de arquivos, o fsck procurará por essa informação no
arquivo /etc/fstab.
/etc/fstab: Arquivo que contém informações sobre os sistemas de arquivos a serem utilizados no sistema, como a partição
em que se encontra, o tipo do sistema de arquivos, o ponto de montagem etc.
o Opções opcionais:
▪ -t: Especifica o tipo do sistema de arquivos.
▪ -C: Exibe uma barra de progresso (não disponível para todos os sistemas de arquivos).
▪ -V: Saída detalhada das operações.
o Exemplo:
2. df (Disk Free):
o Usado para mostrar espaço livre/ocupado de sistemas de arquivos montados.
o Informa a partição, tamanho, espaço usado, disponível, percentual de uso, ponto de montagem do
sistema de arquivos.
o Opções opcionais:
▪ -h: Mostra tamanhos em MB, GB, etc.
▪ -k: Lista em Kbytes.
▪ -l: Exibe apenas sistemas de arquivoslocais.
▪ -m: Lista em Mbytes.
o Exemplo:
3. lsblk (List Block Devices):
o Usado para listar informações sobre os dispositivos de bloco do sistema (exceto discos de RAM).
o Informa:
▪ Tamanho total da partição/bloco, ponto de montagem (se montado).
▪ Não exibe espaço usado/livre.
o Opções opcionais:
▪ -a: Lista todos os dispositivos, incluindo discos de RAM.
▪ -b: Exibe tamanhos em bytes.
▪ -f: Mostra informações sobre os sistemas de arquivos.
javascript:void(0)
o Exemplo:
Módulo 3. Empregar as ferramentas de gerenciamentos de arquivos do Linux
Conceitos Básicos do Linux
• Definição:
o O Linux é um sistema operacional, ou melhor, o núcleo do sistema, responsável pelo gerenciamento
de dispositivos e recursos.
o Oferece chamadas de sistema que simplificam a interação com o hardware.
• Distribuições:
o Um sistema Linux completo combina o núcleo com um conjunto de softwares empacotados,
formando uma distribuição.
o Cada distribuição é livre para escolher os pacotes de software que serão instalados, e isso se torna
mais evidente com relação ao ambiente gráfico.
o Existem várias interfaces gráficas que podem ser utilizadas, cada uma configurada com diferentes
softwares.
o Ambientes gráficos populares incluem GNOME, KDE, Cinnamon, MATE e XFCE.
Modo Texto vs Interface Gráfica
• O Linux oferece comandos em modo texto como ferramentas padrão, permitindo realizar praticamente
qualquer tarefa no sistema.
• Diferente das interfaces gráficas, esses comandos são comuns em quase todas as distribuições.
Sistema de Arquivos no Linux
• Sistema de arquivos raiz:
o Durante a inicialização, o Linux monta um sistema de arquivos conhecido como sistema de arquivos
raiz.
o Representado pelo diretório “/” (root ou raiz).
o Não confundir diretório root com o usuário root (administrador do sistema).
• Pontos de montagem:
o Outros sistemas de arquivos necessários são montados na hierarquia de diretórios.
Arquivos Ocultos
• No Linux, um arquivo é considerado oculto quando seu nome começa com o caractere ponto (.).
• Esses arquivos não aparecem em listagens normais, a menos que seja explicitamente solicitado.
• Comparação:
o No Windows, "ser oculto" é uma propriedade ativada no arquivo.
o No Linux, "ser oculto" é definido pelo nome do arquivo.
❖ Comandos para Manipulação de Diretórios no Linux
1. Comando ls (lista conteúdo de diretórios)
• Sintaxe: ls [opções] [caminho]
o Se nenhum caminho for informado, lista o diretório atual.
• Principais opções:
o -a: Inclui arquivos ocultos.
o -h: Exibe tamanhos em KB, MB ou GB.
o -i: Mostra o número do i-node.
o -l: Exibe detalhes como permissões, data, donos e grupos.
o -R: Lista diretórios e subdiretórios recursivamente.
o -r: Inverte a ordem de classificação.
o --help: Exibe a ajuda do comando.
• Exemplo:
2. Comando pwd (mostra o caminho do diretório atual)
• Uso: Exibe o caminho absoluto do diretório de trabalho atual.
• Exemplo:
3. Comando cd (altera o diretório atual de trabalho)
• Sintaxe: cd [diretório]
o Se o diretório de destino não for especificado, retorna ao diretório home do usuário.
• Principais usos:
o cd /: Vai para o diretório raiz.
o cd ..: Sobe um nível na hierarquia de diretórios.
o cd -: Retorna ao diretório anterior.
• Exemplo:
No exemplo acima, o diretório de trabalho era /var/spool. Ao executar o comando “cd” o diretório de
trabalho mudou para /home/fabio. Ao executar o comando “cd /etc” o diretório de trabalho mudou
para /etc.
4. Comando mkdir (cria diretórios)
• Sintaxe: mkdir [caminho/diretório]
o Cria um ou mais diretórios no local especificado.
• Opção útil:
o -p: Cria diretórios intermediários caso não existam.
• Exemplo:
No exemplo, o primeiro comando (mkdir a/b/c) falhou porque tentou criar, o diretório “c” dentro do caminho
“a/b”, mas o caminho “a/b” não existe. O segundo comando (mkdir -p a/b/c) funcionou por causa do
parâmetro -p, que forçou a criação dos diretórios “a” e “a/b” caso não existissem. O terceiro comando criou o
diretório “d” dentro do caminho “a/b/c”.
5. Comando rmdir (remove diretórios vazios)
• Sintaxe: rmdir [caminho/diretório]
o Remove apenas diretórios vazios.
• Exemplo:
Neste caso, o primeiro comando funcionou e removeu o diretório “d” que estava no caminho “a/b/c”. O segundo
comando não funcionou porque tentou remover o diretório “a”, que não está vazio.
Observação: Para remover diretórios não vazios, utilize o comando rm com as opções apropriadas.
❖ Comandos para Manipulação de Arquivos no Linux
1. Comando rm (remove arquivos e diretórios)
• Sintaxe: rm [opções] arquivo/diretório
• Principais opções:
o -i: Confirmação antes de remover.
o -v: Exibe os itens removidos.
o -r: Remove recursivamente diretórios e subdiretórios.
o -f: Força a remoção sem confirmação.
• Exemplo:
Neste caso, o arquivo a é removido, pois sendo a um diretório, ele será apagado, assim como todos os seus arquivos
e subdiretórios, sem que seja solicitada a confirmação.
2. Comando cp (copia arquivos e diretórios)
• Sintaxe: cp [opções] origem destino
o É necessário especificar tanto a origem quanto o destino do arquivo/diretório a ser copiado.
• Principais opções:
o -i: Confirmação antes de substituir.
o -f: Força a substituição.
o -r/-R: Copia recursivamente diretórios e arquivos.
o -v: Exibe os itens copiados.
o -p: Preserva atributos do arquivo.
o -u: Copia apenas se o arquivo de origem for mais recente ou não existir no destino.
• Exemplo:
No exemplo, ocorre a copia do arquivo fstab que está no diretório /etc para o diretório de trabalho (“.”).
O segundo exemplo copia o arquivo teste.txt para outro.txt no mesmo diretório.
3. Comando mv (move ou renomeia arquivos/diretórios)
• Sintaxe: mv [opções] origem destino
• Principais opções:
o -f: Força a substituição.
o -i: Confirmação antes de substituir.
o -v: Exibe os itens movidos.
o -u: Move somente se o arquivo de origem for mais novo ou inexistente no destino.
• Exemplo:
No exemplo, o primeiro comando renomeia o arquivo teste.txt para outro.txt. O segundo comando move o
arquivo outro.txt para o diretório b que está dentro do diretório a.
4. Comando cat (exibe o conteúdo dos arquivos)
• Sintaxe: cat [opções] arquivo
• Principais opções:
o -n: Numera as linhas.
o -s: Remove linhas em branco consecutivas.
• Exemplo:
5. Comando find (procura arquivos/diretórios no disco)
• Sintaxe: find [diretório] [opções/expressão]
• Principais opções/expressões:
o -name [expressão]: Busca pelo nome.
o -amin [num]: Acessados há [num] minutos.
o -atime [num]: Acessados há [num] dias.
o -mmin [num]: Modificados há [num] minutos.
o -mtime [num]: Modificados há [num] dias.
o -user [nome]: Pertencentes ao usuário especificado.
o -group [nome]: Pertencentes ao grupo especificado.
o -size [num]: De tamanho específico ([num] pode ser precedido por “+” ou “-”).
o -perm [modo]: Com permissões específicas.
• Exemplo:
Neste caso, o comando procura por um arquivo ou diretório de nome outro.txt, fazendo a busca a partir do
diretório /home. O retorno do comando informa que o arquivo se encontra no diretório /home/fabio/a/b.
❖ Links Simbólicos e Hardlinks no Linux
1. Links Simbólicos
• Definição de Links Simbólicos:
o São atalhos para arquivos ou diretórios, apontando para outras entradas de diretório.
o São úteis para evitar duplicação de arquivos e inconsistências.
o São transparentes ao usuário, pois funcionam como atalho para um arquivo ou diretório.
• Vantagens dos Links Simbólicos:
o Facilitam compatibilidade entre sistemas que procuram arquivos em diferentes locais.
o Economizam espaço em disco, pois são criados links simbólicos nos diferentes locais onde os
arquivos podem ser procurados.
o Evitam inconsistências que poderiam ser provocadas por arquivos que deveriam seriguais mais
possuem conteúdo diferente.
• Quando Utilizar Links Simbólicos:
o Acesso Rápido: Quando você precisa de um acesso rápido a arquivos ou diretórios frequentemente
usados, que estão localizados em diretórios diferentes.
o Compatibilização: Para criar referências a arquivos em locais diferentes, sem precisar copiar os
arquivos, economizando espaço e evitando inconsistências.
2. Hardlinks (link duro)
• Definição de Hardlinks:
o Hardlinks são entradas de diretório que apontam diretamente para o mesmo i-node (estrutura do
sistema de arquivos que representa o arquivo).
o Em outras palavras, um hardlink cria um nome alternativo para o mesmo arquivo, permitindo acesso
ao mesmo conteúdo
o Diferentes hardlinks podem acessar o mesmo conteúdo.
• Características dos Hardlinks:
o Alterações no conteúdo de qualquer hardlink são refletidas em todos os links.
o A contagem de links no i-node é atualizada, indicando o número de referências ao mesmo arquivo.
• Função dos Hardlinks:
o Redundância e Acesso: Permite múltiplos caminhos de acesso ao mesmo arquivo físico. Se um nome
(entrada de diretório) for deletado, o arquivo ainda pode ser acessado pelos outros hardlinks
restantes.
o Eficiência de Espaço: Não duplica o conteúdo do arquivo. Vários hardlinks podem apontar para o
mesmo arquivo sem ocupar espaço adicional no disco.
• Quando Utilizar Hardlinks:
o Backup e Recuperação: Quando se deseja manter versões de um arquivo em diferentes locais sem
duplicá-lo, facilitando a recuperação se uma das versões for perdida ou corrompida.
o Organização: Para facilitar o acesso a um mesmo arquivo a partir de diferentes diretórios, sem
necessidade de cópia.
o Evitar Duplicação: Quando múltiplos processos ou usuários precisam acessar o mesmo arquivo,
evitando a criação de várias cópias do mesmo conteúdo.
3. Diferenças entre Links Simbólicos e Hardlinks
Aspecto Link Simbólico Hardlink
Tipo de referência Aponta para o nome de um arquivo. Aponta diretamente para o i-node.
Dependência O link simbólico se torna inválido se o arquivo
original for apagado.
Continua funcional se o arquivo original for apagado.
Diretórios Pode apontar para diretórios. Diretórios requerem permissões específicas.
• Sintaxe para Criação de links simbólicos e hardlinks:
o Sintaxe: ln [opções] [alvo] [nome_do_link/diretório]
▪ alvo é o arquivo/diretório que será referenciado pelo link;
▪ nome_do_link/diretório é o nome do link que será criado ou o diretório onde será criado o
link com o mesmo nome do alvo.
o Opções Importantes:
▪ -s: Cria um link simbólico.
▪ -v: Exibe os links criados.
▪ -d: Cria hardlinks para diretórios.
o Exemplo de Criação de Links Simbólicos:
Suponha que em um diretório exista o arquivo “documento.txt”.
O comando abaixo cria no mesmo diretório um link simbólico chamado “simbolico.txt” que aponta
para “documento.txt”.
Observe pela saída do comando “ls -lh” que “simbolico.txt” é um link simbólico para “documento.txt”, ou seja, cria
um link simbólico chamado simbolico.txt que aponta para documento.txt.
o Exemplo de Criação de Hardlinks:
▪ Para criar um hardlink, é utilizado também o comando ln, mas sem a opção -s.
• A opção -i, informa o número do i-node do arquivo. Observe no exemplo acima que ambos “documento.txt”
e “hard.txt” possuem o mesmo número de i-node (404662), ou seja, ambos apontam para o mesmo arquivo.
• Alterações feitas em qualquer nome (documento.txt, simbolico.txt ou hard.txt) são refletidas em todos.
• O número de links é exibido na contagem de links do i-node.
✓ Contagem de Links no i-node: O sistema de arquivos mantém o número de entradas de diretório
apontando para o mesmo i-node.
• Eliminação:
o Remover apenas um hardlink não afeta os demais.
o Porém, se todos os hardlinks forem removidos, o arquivo é efetivamente deletado.
Módulo 4. Descrever o funcionamento dos principais editores de arquivos do Linux
❖ Editor de Arquivos vs. Processador de Textos
1. Arquivos de Texto Puro
• Definição de Arquivos de Texto Puro: Contêm apenas caracteres ASCII, sendo facilmente interpretáveis sem
necessidade de conversões ou softwares especializados.
• Características:
o Compreendem arquivos como HTML, que podem incluir marcações de controle, mas ainda são
compostos exclusivamente por caracteres ASCII.
o Usados frequentemente para configurações de sistemas em ambientes Linux.
• Relevância no Linux: Administradores de sistemas precisam dominar a edição desses arquivos.
2. Documentos Criados por Processadores de Texto
• Definição de Criados por Processadores de Texto: Contêm um formato específico com caracteres de controle
e informações binárias.
• Características dos Documentos Criados por Processadores de Texto: Suportam:
▪ Seleção de fontes com tamanhos e estilos variados (negrito, itálico etc.).
▪ Incorporação de elementos como tabelas, imagens e links.
• Exemplos de Software:
o Microsoft Word e LibreOffice Writer:
▪ Writer é um processador popular no Linux, parte do pacote LibreOffice.
▪ LibreOffice oferece ferramentas para texto, planilhas, apresentações, desenhos, banco de
dados e edição de equações matemáticas.
3. Diferenças entre Arquivos de Texto Puro e Documentos de Processadores de Texto
Aspecto Texto Puro Processador de Texto
Conteúdo Apenas caracteres ASCII. Formato específico com binários.
Formato Simples, sem estilos ou imagens. Estilos, formatações, e multimídia.
Uso no Linux Configuração de sistemas. Criação de documentos variados.
4. Importância no Linux
• Arquivos de texto puro são essenciais para configurações e ajustes do sistema.
• A familiaridade com editores de texto puro é fundamental para administradores.
❖ O editor Vim
O que é o Vim?
• Significado: "Vim" é a abreviação de Vi Improved (Vi Melhorado).
• Origem: Baseado no editor vi, criado em 1976 para o BSD.
BSD é um sistema operacional Unix desenvolvido na Universidade de Berkeley.
• Características do vi:
o Editor pequeno e leve, ideal para mídias com pouco espaço de armazenamento e sistemas com
poucos recursos.
o Disponível em todas as distribuições Linux.
o Utilizado para operações de manutenção de emergência e alterações diárias em arquivos de
configuração do sistema.
• Características do Vim:
o O vim é um editor modal, ou seja, possui diferentes modo de operação (comando e edição)
o Com teclas que possuem diferentes funções em cada modo.
o É executado a partir de um terminal com os comandos
▪ “vim nome_do_arquivo” ou “vi nome_do_arquivo”.
(nome_do_arquivo é o nome do arquivo que será executado).
o A opção por utilizar vi ou vim depende da distribuição.
Exemplo: No Ubuntu 20.04 LTS, utiliza-se vi.
Modalidade do Vim
• Editor modal:
o Possui dois principais modos de operação:
o Inicialização: Sempre que o editor é aberto, ele inicia no modo de comando.
▪ Modo de comando: Quando se digita algo no teclado, são enviados comandos para que o
editor execute determinadas ações sobre o texto que está sendo editado.
o Alterar para modo de edição: Para realizar alterações no texto, é necessário alternar para o
modo de edição.
▪ Modo de edição: Todo o texto digitado será inserido na posição onde se encontra o cursor.
o A tecla é utilizada para sair do modo de edição e retornar ao modo de comando.
❖ Principais comandos do Vim
Alguns comandos básicos para utilização deste poderoso editor de textos:
1. Entrar em Modo de edição
• Inserir texto:
o i → Insere na posição atual.
o I → Insere no começo da linha.
o a → Acrescenta na posição atual.
o A → Acrescenta ao final da linha.
o o → Insere abaixo, criando nova linha.
o O → Insere acima, criando nova linha.
• Alterar texto:
o cc → Deleta linha e entra no modo de inserção.
o C → Deleta linha à frente do cursor e entra no modo de inserção.
o s → Deleta caractere e entra no modo de inserção.
o S →Deleta linha e entra no modo de inserção.
• Sair do modo de edição:
o Pressionar .
2. Salvar e sair
• Salvar:
o :w → Salva as alterações.
o :w arquivo → Salva como outro arquivo (não altera o arquivo em edição).
o :sav arquivo → Salva como outro arquivo (passa a editar o novo arquivo).
• Sair:
o :q → Sai.
o :q! → Sai sem salvar.
o :wq → Salva e sai.
3. Movimentação
• Básico:
o j → Baixo.
o k → Cima.
o l → Direita.
o h → Esquerda.
o 0 → Início da linha.
o ^ → Início do texto (ignora espaços).
o $ → Fim da linha.
• Palavras:
o w → Próxima palavra.
o e → Fim da palavra atual.
o b → Início da palavra anterior.
• Caracteres específicos:
o f[caractere] → Próxima ocorrência desse caractere.
o t[caractere] → Posiciona um caractere antes do caractere pressionado.
• Linhas:
o gg → Primeira linha.
o G → Última linha.
o :[número] → Vai até a linha especificada.
4. Apagar
• Caracteres e palavras:
o x → Apaga caractere sob o cursor.
o X → Apaga caractere antes do cursor.
o dw → Apaga até o final da palavra.
o d[comando de posicionamento] → Apaga até o ponto indicado pelo comando.
• Linhas:
o dd → Apaga linha.
o dj → Apaga 2 linhas abaixo.
o dk → Apaga 2 linhas acima.
o D → Apaga do cursor até o final da linha.
5. Copiar e colar
• Copiar:
o yy ou Y → Copia linha.
o yw → Copia até o final da palavra.
o y2j → Copia duas linhas abaixo.
o "+y → Copia para a área de transferência.
• Colar:
o p → Cola após o cursor.
o P → Cola antes do cursor.
o "+gp → Cola da área de transferência.
6. Desfazer e refazer
• u: Desfaz.
• ^r: Refaz.
7. Repetição de comandos:
• Para repetir um comando, digite um número representando a quantidade de vezes que deseja repeti-lo.
Exemplo:
o 3w → Avança três palavras
o 10k → Sobe dez linhas
o 2t" → Coloca o cursor antes da segunda aspas
o 3i[escreva e pressione a tecla ] → O que for digitado será inserido 3 vezes
8. Busca
• Buscar termos:
o /txt → Busca pelo termo txt.
o /\ctxt → Busca o texto txt, ignorando a diferença entre maiúsculas/minúsculas.
o /\Ctxt → Busca o texto txt, diferenciando maiúsculas/minúsculas.
• Navegação:
o n → Busca próxima ocorrência.
o N → Busca ocorrência anterior.
o * → Localiza a palavra sob o cursor.
• Configurações:
o :set hlsearch → Destaca todos os termos encontrados.
o :set nohlsearch → Desativa destaque.
o :set ignorecase → Configura todas as buscas para não diferenciar maiúsculas e minúsculas.
9. Expressões regulares: É possível utilizar expressões regulares como padrão de busca!
❖ Editor de texto Nano
Características principais do Editor de texto Nano:
• Nano é um editor de texto em linha de comando,
disponível na maioria das distribuições Linux.
• Diferente do Vim, não possui diferentes modos de
operação, sendo mais intuitivo.
• Executado a partir do terminal usando o comando:
o “nano nome_do_arquivo”
nome_do_arquivo é o nome do arquivo que será
executado
• Inicia diretamente com o arquivo aberto para edição.
Comandos básicos do Nano
• Ajuda:
o +G → Exibe ajuda com todos os comandos disponíveis.
• Manipulação de arquivos:
o +O → Salvar arquivo.
o +X → Sair do editor.
o +R → Abrir outro arquivo.
• Busca e substituição:
o +W → Procurar texto.
o +\ → Pesquisar e substituir.
• Edição:
o +K → Recorta (copia para a memória e apaga a linha).
o +U → Cola o conteúdo da memória.
o +J → Quebra linhas longas para caber na janela.
• Navegação:
o +C → Mostra a posição atual no texto.
o +L → Ir para uma linha específica.
❖ Editor Gedit
Propósito e contexto
• Essencial para administradores de sistemas Linux que precisam editar arquivos de texto em modo gráfico.
• Ideal para situações onde a interface gráfica está disponível, proporcionando maior conforto em comparação
aos editores de linha de comando.
Dependência da interface gráfica
• Cada interface gráfica no Linux possui seu próprio editor.
• Ubuntu 20.04 LTS, que utiliza GNOME, adota o Gedit como editor de texto padrão.
Formas de abrir o Gedit
1. Gerenciador de arquivos GNOME: Navegue pelos arquivos e clique duas vezes no arquivo desejado.
2. Tela de aplicativos do GNOME: Procure pelo “Editor de texto”.
3. Linha de comando:
o Bash: Abra um terminal, entre no diretório onde se encontra o arquivo que deseja editar e entre com
o comando “gedit ” para que o arquivo seja aberto no Gedit.
o Ou simplesmente digite gedit para iniciar o gedit.
Recursos da interface do Gedit
• (1) Botão "Abrir": Abre documentos no editor.
• (2) Triângulo invertido: Lista os últimos arquivos abertos.
• (3) Botão "Criar arquivo": Inicia um novo arquivo.
• (4) Nome e localização do arquivo: Mostra informações do arquivo em edição.
• (5) Botão "Salvar": Salva o arquivo a qualquer momento.
• (6) Menu do editor: Acessa ferramentas como localizar e imprimir.
• (7) Tipo do arquivo: Selecionado automaticamente para auxiliar na edição.
• (8) Configuração de tabulação: Permite ajustar a largura da tabulação.
• (9) Posição do cursor: Exibe linha e coluna atuais.
• (10) Modo de entrada: Indica se está em modo inserção ou sobreposição.
Dica:
• O Gedit reconhece automaticamente o tipo de arquivo (e.x., C, HTML) e adapta ferramentas de auxílio,
como:
o Tabulações automáticas.
o Coloração de palavras reservadas para facilitar a edição.
TEMA 6. AUTOMATIZANDO TAREFAS
Módulo 1. Definir agendamentos, por meio da ferramenta CRON, para a execução automática de tarefas
Conceito de CRON:
• Origem: Desenvolvido nos anos 1970, nas primeiras versões do sistema UNIX.
• Objetivo: CRON é uma ferramenta criada para automatizar a execução de processos.
• Configuração:
o Simples e acessível aos usuários.
o Permite especificar dias e horários para executar comandos automaticamente.
• Funcionamento: Elimina a necessidade de intervenção manual para a execução de tarefas programadas.
CRON como ferramenta multiusuário:
• Definição: CRON é uma ferramenta multiusuário, permitindo que cada usuário do sistema operacional tenha
sua própria configuração de tarefas.
• Execução por usuário:
o Os comandos configurados no CRON são sempre executados pelo usuário a quem pertence a
configuração.
• Exemplos práticos:
o Usuário root: Executa o comando /usr/limpeza todos os dias às 23h.
o Usuário bob: Executa o comando /home/bob/relatorio_semanal, todos os domingos às 9h.
• Automação: O CRON automatiza as tarefas ajustadas sem necessidade de intervenção manual.
• Atenção às leis:
o É crucial garantir que o usuário executor tenha as permissões para que o comando seja concluído
com sucesso.
• Consideração: Sempre identificar claramente qual usuário executará as tarefas para evitar problemas de
execução ou acesso.
Como configurar o CRON do usuário:
• Definição de CRONTAB: É um arquivo de configuração do CRON exclusivo para cada usuário.
• Comando para editar: Utilize $ crontab -e para abrir o editor do CRONTAB.
• Primeiro uso:
o Ao executar o comando pela primeira vez, será solicitada a escolha de um editor de texto.
o Sugestão: Prefira um editor simples, como o “nano”, caso não conheça outros.
• Escolha do editor: Exemplos de opções disponíveis:
1. /bin/nano - mais simples.
2. /usr/bin/vim.basic - mais avançado.
3. Outros, como: /usr/bin/vim.tinyou /bin/ed.
• Salvar alterações:
o Quando terminar de editar o CRONTAB, você deverá salvá-lo.
o Se for o editor ‘nano’, use a combinação de teclas Crtl-X.
• Formato do CRONTAB: Ao abrir o editor, o CRONTAB poderá estar preenchido com diversas informações e
instruções que as distribuições Linux incluem para auxiliar os usuários.
• Dica: Escolha o editor em que você se sente mais confortável e leia as instruções no CRONTAB para
orientações adicionais.
Regras e formatos do CRONTAB• Todas as linhas sem conteúdo são ignoradas pelo CRON.
• Todas as linhas começadas com ‘#’ são tratadas como comentários e, portanto, ignoradas pelo CRON. Em
geral, os editores mostrarão essas linhas com cores destacadas para facilitar a visualização.
• Cada tarefa será configurada em uma (e somente uma) linha, que deverá conter os campos requeridos pelo
CRON.
• Cada linha possui 6 ou mais campos de configuração, separados por espaços.
• Os cinco primeiros campos de cada linha representarão as configurações de tempo, ou seja, quando cada
tarefa deverá ser executada.
• O sexto campo e os demais representam o comando que será executado pelo CRON, no dia e horário
estabelecido.
Campos de configuração de tempo:
1. Minuto: representam o minuto em que a tarefa será executada
o Valores de 0 a 59.
2. Hora: representam a hora em que a tarefa será executada
o Valores de 0 a 23.
3. Dia: representam o dia do mês em que a tarefa será executada
o Valores de 1 a 31.
4. Mês: representam o mês em que a tarefa será executada
o Valores de 1 a 12 ou abreviações ( jan, feb, etc.).
5. Dia da semana:
o Valores de 0 a 7 (onde 0 e 7 são domingo).
o Atenção: No CRON, os dias da semana são numerados ( 1 = segunda-feira).
Máscara especial:
• O caractere “*” indica "qualquer valor" para o campo correspondente.
Exemplos práticos de agendamento:
o 30 17 * * * /bin/comando
➢ Executa todos os dias às 17h30.
o 30 17 10 * * /bin/comando
➢ Executado dia 10 de todos os meses às 17h30.
o 30 17 * 12 * /bin/comando
➢ Executa todos os dias de dezembro às 17h30.
o 30 17 * * 5 /bin/comando
➢ Executa todas as sextas-feiras às 17h30.
o 30 17 * 3 1 /bin/comando
➢ Executado todas as segundas-feiras de março às 17h30.
Configurações avançadas:
• Vários valores no mesmo campo:
o Separados por vírgula “ ,”: executado quando qualquer valor for atendido.
▪ Exemplo: 0,15,30,45 * * * * /bin/comando → Executa nos minutos 0, 15, 30 e 45 de todas as
horas.
▪ Exemplo: 0,15,30,45 0,12 * * * /bin/comando → Ao incluir as horas 0 e 12, o comando será
executado todos os dias em 8 horários: 0h, 0h15, 0h30, 0h45, 12h, 12h15, 12h30 e 12h45.
o Intervalo “ -”: Indica intervalo, e o comando será executado em um intervalo definido.
▪ Exemplo: 0-5 * * * * /bin/comando → Executado nos minutos de 0 a 5.
▪ Exemplo: 0,15,30,45 0,12 * * 1-5 /bin/comando → O comando será executado nos horários:
0h, 0h15, 0h30, 0h45, 12h, 12h15, 12h30 e 12h45. Porém somente de segunda a sexta-feira
(1-5).
o Intervalos com “/”: Representa a frequência.
▪ Exemplo: */2 * * * * /bin/comando → O comando será executado no minuto 0 a cada duas
horas (/2): 0h, 2h, 4h, 6h ... 22h.
▪ Exemplo: 0/10 * * * * /bin/comando → O comando será executado a cada 10 minutos: 0h,
0h10, 0h20....
▪ Exemplo: 0,30 8-17 * * 1-5 /bin/comando → O comando será executado nos minutos 0 e 30,
das horas 8 a 17 e somente de segunda a sexta-feira. Ex: 8h, 8h30, 9h, 9h30 ....16h, 16h30,
17h e 17h30.
Exemplo de uma tarefa automática de BACKUP no CRON:
Configuração de agendamento:
• Os cinco primeiros campos da linha definem o horário e a frequência de execução.
• A partir do 6º campo, é especificado o comando a ser executado, exatamente como seria usado no terminal.
Exemplo de comando de backup:
• Comando: tar -cfz /tmp/backup.tar.gz /home/bob
o Cria um arquivo TAR compactado com o conteúdo do diretório /home/bob.
o O arquivo gerado será nomeado backup.tar.gze salvo no diretório /tmp.
• Exemplo: Se quisermos automatizar essa tarefa para que seja executada todos os dias às 20h, devemos
incluir a linha abaixo no CRONTAB:
Permissões necessárias:
• O usuário que for executar o comando ‘tar’ deve:
o Ter permissão para ler o conteúdo do diretório de origem ( /home/bob).
o Ter permissão para escrever no diretório de destino ( /tmp).
Atenção sobre o uso de sudo:
• Não use o comando “sudo” dentro do CRONTAB, pois ele é interativo e requer a digitação de senha, algo
inviável no CRON.
• Em vez de usar o ‘sudo’, configure o comando diretamente no CRONTAB do usuário ‘root’.
A configuração de CRON para o sistema
Configuração global:
• Além das configurações individuais de usuários, o CRON possui uma configuração global para o sistema .
• A configuração global é usada para rotinas relacionadas a serviços e processos do sistema.
• Exemplos de uso:
o Rotação periódica de arquivos de logs, apagando arquivos antigos.
o Restart automático de processos que necessitem desse tipo de operação.
o Verificação de atualizações disponíveis e notificação.
o Verificação de dispositivos de hardware e notificação dos problemas encontrados.
Arquivo principal:
• O arquivo global do sistema é: /etc/crontab.
• Formato diferenciado: Possui um campo extra em cada linha, que é a indicação do usuário que executará
cada comando.
Exemplo:
Nesse exemplo, o comando será executado como o usuário root.
Organização em diretórios:
• As principais distribuições Linux organizam rotinas em diretórios, facilitando a inclusão e exclusão de tarefas
conforme a instalação ou desinstalação de serviços.
• Para que o arquivo /etc/crontab não precise ser alterado, é costume criar diretórios para as rotinas diárias,
semanais e mensais.
• Em cada diretório serão criados programas (scripts) para cada uma das tarefas definidas.
• E no arquivo principal, /etc/crontab, é configurada a execução de todos os SCRIPTS em cada um dos
diretórios, nos horários agendados.
• Esses diretórios costumam ter os nomes como abaixo:
o /etc/cron.hourly → Para rotinas de hora em hora.
o /etc/cron.daily → Para rotinas diárias.
o /etc/cron.weekly → Para rotinas semanais.
o /etc/cron.monthly → Para rotinas mensais.
Questão 1. Hoje é segunda-feira, dia 1º de março, e o relógio marca 14h30. No CRONTAB do usuário ‘root’ há uma
entrada, exibida abaixo.
É possível afirmar que a próxima execução do comando ‘/opt/relatorio’ será:
A. No mesmo dia, às 20h10
B. No dia seguinte, terça-feira, às 20h10
C. No próximo domingo, dia 7, às 10h20
D. Na segunda-feira da próxima semana, às 10h20
A configuração da tarefa no CRONTAB define que ela deverá ser executada às 10h20, todos os domingos. A primeira
coluna indica o minuto: 20. A segunda coluna indica a hora: 10. As terceira e quarta colunas indicam o dia do mês e o
mês: o caractere ‘*’ significa ‘todos os valores possíveis’. A quinta coluna indica o dia da semana: O valor ‘0’ se refere
ao domingo.
Questão 2. O usuário ‘luiz’ configurou seu CRONTAB para executar um SCRIPT, porém verificou que ele não está
sendo executado como esperado. A linha configurada no CRONTAB é:
Pela análise da linha acima, é possível identificar que:
A. Não há erro na configuração do CRONTAB, sendo necessário avaliar o funcionamento do SCRIPT.
B. O comando ‘sudo’ não deve ser usado no CRONTAB. No lugar dele, a tarefa deve ser configurada no
CRONTAB do usuário ‘root’.
C. A configuração define que o comando deve ser executado no dia 15 de cada mês, mas somente se for um
domingo.
D. A configuração possui um erro, pois indica o mês de número 15, quando o valor deve estar entre 1 e 12,
obrigatoriamente.
Por se tratar de um comando interativo, o ‘sudo’ não deve ser usado no CRON. Quando o ‘sudo’ é executado pela
primeira vez, ele solicita que o usuário digite a sua senha, o que não vai acontecer quando estiver sendo executado a
partir do CRON. Portanto, o SCRIPT ficará aguardando indefinidamente por uma informação que não poderá ser
fornecida.
Módulo 2. Definir SCRIPTS para a automatização de tarefas no terminal Linux, sem a necessidade de interação do
usuário
❖ Conceitos de Script:
Definição e características gerais de Script
• Scripts são arquivos de texto com sequências de comandos executados pelo terminal (SHELL) em sistemas
Unix/Linux.
• São interpretados diretamente pela SHELL, dispensando a necessidadede construção.
• Podem ser executados imediatamente após serem escritos.
Funcionalidades do SHELL
• Permite a criação de variáveis de ambiente .
• Suporta comandos para comparação, operações de valores e estruturas de repetição .
• Facilita a automação de tarefas complexas .
Tipos de scripts
• Simples : São aqueles que executam diversos comandos em sequência, economizando tempo.
• Complexos : São aqueles que podem analisar resultados, tomar decisões e executar tarefas com segurança
integridade e eficiência.
Intérpretador de SHELL
• Existem diversos interpretadores disponíveis para o Linux, e as sintaxes para SCRIPTS variam entre eles.
• O BASH é o padrão na maioria das distribuições e será uma referência adotada.
Identificação de um script
• Todo script deve começar com a sequência #!, seguida do caminho do interpretador.
o Neste exemplo é declarado que o arquivo é um SCRIPT e deverá ser interpretado pelo BASH
o O /bin/bash o caminho completo para esse programa interpretador.
❖ Um script muito simples
Passos para criar um script
1. Criação do arquivo de script :
o Use um editor de texto como ‘nano’ ou o ‘vi’ para criar um arquivo chamado ‘script1’.
2. Conteúdo do script :
o Adicione as seguintes linhas ao arquivo:
o A primeira linha ( #!/bin/bash) identifica o interpretador do script.
o A segunda linha (date) exibe os dados e a hora atual.
3. Salvar o arquivo:
o Salve o arquivo (Ctrl O) e saia do editor (Ctrl X).
o E confirme que deseja salvar o arquivo e escolha o nome (‘script1’).
4. Verificando o arquivo:
o Usando o comando ‘ls’ para ver o conteúdo do diretório, encontraremos o nosso ‘script1’ entre os
arquivos.
o Porém, se tentarmos digitar ‘script1’ no PROMPT, receberemos um erro do tipo “comando não
encontrado”.
Problemas e soluções para executar o script:
1° Problema: Permissão de execução
o Por padrão, o arquivo criado não tem permissão para ser executado.
o Solução: Use o comando ‘chmod’ para conceder permissão de execução:
o Nesse exemplo, foi concedida a permissão de execução para o proprietário do arquivo.
o Para permitir a execução por qualquer usuário, utilize ‘a+x’:
o $ chmod a+x script1
o Ao usar o comando ‘ls -l’, veremos que a permissão foi concedida:
o Porém, se tentarmos executar o comando agora, ainda receberemos um erro, devido a outro
mecanismo de proteção do Linux:
▪ Apenas programas em alguns diretórios do sistema podem ser executados sem a
necessidade de indicar o seu caminho.
2° Problema: Indicar o caminho para o arquivo
o Scripts criados no diretório HOME não podem ser executados diretamente sem especificar o
caminho.
o Para executar o script no diretório atual, use o caminho relativo:
o O prefixo ‘./’ indica o diretório atual.
o Ao executar o SCRIPT teremos no terminal a saída do comando ‘date’, como esperávamos:
Linhas em branco e comentários
• As linhas em branco e as iniciadas com ‘#’ são ignoradas pelo interpretador.
• As linhas iniciadas com ‘#’ podem ser usadas para comentários, observações e instruções sobre o SCRIPT.
• Atenção: A palavra mágica ( #!/bin/bash) na primeira linha é essencial e não deve ser confundida com
comentários, apesar de começar com ‘#’.
❖ Incluindo textos na resposta do SCRIPT
• Nosso primeiro objetivo foi atingido:
o Criar um SCRIPT simples e executá-lo.
o O próximo passo é evoluir esse SCRIPT e mudar seu comportamento.
o Para tanto o script será alterado para exibir apenas a hora e com um texto mais amigável. O desejado
é que a saída seja a seguinte:
Passos para alterar o script:
1. Adicionar texto personalizado:
o Formato de hora: O comando date pode ser configurado para exibir hora e minutos no formato
desejado, usando:
%H: Hora com dois dígitos.
%M: Minutos com dois dígitos.
o Texto personalizado: Use o comando ‘echo’ para exibir o texto personalizado: "Hora certa".
Ao executar temos a seguinte saída:
2. Unir texto e comando em uma única linha:
o Combine texto e o resultado do comando ‘date’ no mesmo ‘echo’, usando a sintaxe ‘$(...)’ para
executar comandos dentro do texto:
Evolução para incluir data e hora:
• Modifique o script para exibir também a data:
• Formatos adicionais: ‘%d/%m/%Y’: Exibe o dia, mês e ano no formato DD/MM/AAAA.
Saída:
Repare nesse último exemplo que o comando ‘date’ foi executado duas vezes dentro do ‘echo’.
❖ Inserindo caracteres especiais no comando ‘echo’
Uso de caracteres especiais no comando ‘echo’:
• O parâmetro ‘-e’ no comando ‘echo’ permitiu o uso de caracteres especiais.
• Exemplo: A combinação ‘\n’ adiciona uma quebra de linha.
Adaptação do script para incluir quebra de linha:
• Modifique o script anterior para usar ‘echo -e’ e incluir a quebra de linha:
Saída esperada ao executar o script:
❖ Criando pausas na execução de um SCRIPT
Inserindo pausas com o comando sleep:
• O comando ‘sleep’ permite incluir pausas configuráveis na execução do script.
• O número passado como parâmetro representa o tempo de pausa em segundos.
• Exemplo de criação de ‘script2’ com diferentes tempos de pausa:
• Lembrando: Para executar o ‘script2’, é necessário conceder permissão de execução, usando
($ chmod u+x script2):
• Saída esperada:
Repare: Na indicação dos segundos, os intervalos do comando ‘sleep’, como
programado.
Aguardando interação do usuário com o comando read: Em muitos casos, pode ser interessante aguardar uma
interação do usuário.
• O comando ‘read’ suspende a execução do script até que o usuário pressione ENTER.
• Exemplo de script substituindo ‘sleep’ por ‘read’:
• Saída esperada: O script exibe a hora após cada interação do usuário.
• As linhas em branco foram inseridas pela resposta do comando ‘read’ ao
ENTER do usuário.
• Remoção dos espaços vazios: Deve incluir o parâmetro ‘-s’ nos comandos
‘read’ para que as linhas em branco não apareçam.
Apagando todo o conteúdo do terminal com o comando clear:
• O comando ‘clear’ limpa todo o conteúdo do terminal.
• Útil para facilitar a visualização das respostas ao iniciar ou durante a execução de um script.
Exemplo de uso no script:
• Inclua o comando clear no início do script para limpar o terminal antes de executar os demais
comandos:
Resultado esperado:
• O terminal será limpo antes de exibir a saída, garantindo que o resultado apareça na primeira linha.
Terminando um SCRIPT com valor de retorno
• Valor de retorno de um processo no Linux:
o Todo processo no Linux termina com um valor numérico de retorno chamado ‘return value’.
o O “return value” serve para indicar o sucesso da execução ou a ocorrência de erros
o O return value pode variar de 0 a 255:
▪ 0: Indica sucesso na execução.
▪ 1 a 255: Podem indicar erros ou tipos específicos de falha.
• Encerrando um script com o comando ‘exit’:
o O comando ‘exit’ encerra o script e retorna um valor numérico definido pelo usuário.
Exemplo:
▪ O script será encerrado imediatamente com o valor de retorno igual a 1.
▪ Comportamento padrão do ‘exit’ sem parâmetros: Se ‘exit’ for usado sem parâmetro, ele:
➢ Retornará o resultado do último comando executado no script.
➢ Isso também acontece para scripts que terminam sem um comando ‘exit’ explícito.
Questão 1. Considere o SCRIPT abaixo:
A. Ao executar o SCRIPT acima, podemos afirmar que:
B. Será exibida no terminal a mensagem: “Codigo 1”.
C. Será exibida no terminal a mensagem: “Codigo 2”.
D. O SCRIPT não pode ser executado, pois a declaração inicial (!/bin/bash) está precedida pelo caractere ‘#’.
E. Ao término da execução do SCRIPT, nenhuma informação terá sido enviada para o terminal.
A primeira linha é a declaração do interpretador SHELL de comandos que executará o SCRIPT. Apesar de importante,
essa linha não gera saída de conteúdo para o terminal. As linhas seguintes são iniciadascom o caractere ‘#’ e,
portanto, são ignoradas pelo interpretador durante a execução do SCRIPT. A quarta linha encerra a execução do
SCRIPT definindo um valor de retorno ‘zero’. Portanto, nenhuma das linhas efetivamente gera respostas ao terminal.
Questão 2. Considere um SCRIPT cujas primeiras linhas são mostradas a seguir:
Os pontos ‘...’ no fim do trecho acima simbolizam a continuação do SCRIPT.
Analisando as linhas acima, é possível afirmar que, ao executar o SCRIPT:
A. A execução é suspensa até que o usuário digite a tecla ENTER.
B. Todos os arquivos no diretório atual são apagados.
C. É obtida a lista de arquivos existentes no diretório /tmp.
D. O arquivo /tmp é lido e seu conteúdo carregado para memória.
O comando ‘read’, executado como no SCRIPT acima, interrompe a execução até que o usuário digite a tecla ENTER.
O comando ‘clear’ apaga as informações que eram exibidas no terminal, deixando a tela “limpa”. O comando ‘cd
/tmp’ muda o diretório atual.
Módulo 3. Empregar variáveis de ambiente e estruturas de decisão em SCRIPTS
❖ Conceitos:
• Definição e Utilidade de Variáveis:
o O terminal Bash permite a criação de variáveis, como em linguagens de programação.
o Variáveis são espaços para armazenar informações.
o Variáveis permitem compartilhar dados entre comandos e desviar o fluxo de execução de scripts.
• Componentes de uma Variável:
o Nome: Identificador utilizado para referenciar a variável.
o Valor: Informação armazenada na variável.
• Atribuição de Valores:
o Utiliza-se a sintaxe: ‘VAR=1’ para declarar e atribuir valor.
o Se a variável já existir, seu valor anterior será substituído.
o Não pode haver espaços antes ou depois do sinal de igualdade.
o Para textos com espaços, usam-se aspas: VAR="Texto com espaços".
• Sensibilidade a Maiúsculas e Minúsculas:
o O nome das variáveis é case-sensitive, ou seja, ‘VAR’ e ‘var’ são variáveis diferentes.
• Referenciando Variáveis:
o Utilize ‘$’ antes do nome para acessar o conteúdo da variável (ex.: ‘$VAR’).
o Exemplo:
o Saída: Terminal do Linux.
o Atenção: O prefixo ‘$’ não é usado ao atribuir valores; é obrigatório ao referenciar.
o Atenção: No terminal BASH, as variáveis não possuem tipo. Portanto, a interpretação do conteúdo
como número ou texto vai depender do contexto da operação que está sendo realizada.
• Atribuição da Saída de um Comando a uma Variável:
o Suponha que você está desenvolvendo um SCRIPT no qual a informação retornada por um comando
que será utilizado posteriormente.
o Uma das formas de você armazenar essa informação temporariamente é por meio de variáveis.
o Para que o usuário saiba quanto tempo a execução demorou, esse SCRIPT apresentará no final os
horários em que começou e o atual.
o No início da execução, o horário será salvo em uma variável de nome “INICIO”.
o Exemplo:
Saída ao executar:
o O comando ‘date’ é executado, retornando a hora naquele momento, que será armazenada na
variável INICIO.
o O comando ‘sleep 5’ simula uma tarefa demorada, aqui com 5 segundos de duração.
o Na saída, é exibido o horário de início e término da tarefa.
o Atenção: Variáveis são adequadas para armazenar pequenas quantidades de dados. Para volumes
grandes, prefira arquivos temporários.
• Passando Parâmetros para um Script:
o No terminal Linux, Scripts podem receber parâmetros ao serem executados.
o Assim, é possível passar valores para o SCRIPT a cada execução, sem precisar modificar o seu
conteúdo.
o Exemplo: Suponha um SCRIPT onde foram passados 4 parâmetros (lembre-se: Os parâmetros são
separados pelo espaço).
o Onde:
▪ A variável $0 : Nome do script.
▪ As variáveis $1, $2, ..., $n: São os parâmetros passados na execução.
o Exemplo prático: Considere o ‘script4’:
Saída ao executar:
• Atenção: Para parâmetros acima de $9, use a sintaxe ${10}, ${11}, ${12}, etc.
O operador lógico if no Bash:
• Definição:
o O comando ‘if’ permite realizar comparações no Bash, similar a outras linguagens de programação.
o Avalia uma expressão e executa diferentes blocos de código com base no resultado.
• Sintaxe Básica:
• Comportamento: O comando ‘if’ avalia a condição apresentada.
o VERDADEIRO: Se a condição for verdadeira, o código entre ‘then’ e ‘fi’ é executado.
o FALSO: Se a condição for falsa, o fluxo pula para depois do ‘fi’.
• Uso de ‘else’:
o O ‘else’ permite executar um bloco alternativo caso a condição seja falsa.
o Sintaxe:
Comparadores numéricos:
• Comparadores numéricos são usados para comparar valores dentro de scripts Bash.
• São utilizados com o comando if para tomar decisões baseadas nos resultados das condições.
• Tabela de comparadores numéricos:
Comparador Descrição Exemplo Condição Verdadeira
-eq Igualdade (is equal) if [[ "$A" -eq "$B" ]] O valor de $A é igual ao de $B.
-ne Diferente (is not equal) if [[ "$A" -ne "$B" ]] O valor de $A é diferente do de $B.
-gt Maior que (is greater than) if [[ "$A" -gt "$B" ]] O valor de $A é maior que o de $B.
-ge Maior ou igual (is greater than or equal) if [[ "$A" -ge "$B" ]] O valor de $A é maior ou igual ao de $B.
-lt Menor que (is less than) if [[ "$A" -lt "$B" ]] O valor de $A é menor que o de $B.
-le Menor ou igual (is less than or equal) if [[ "$A" -le "$B" ]] O valor de $A é menor ou igual ao de $B.
Exemplo prático: Script que realiza comparações:
• Saída do script: A saída dependerá dos valores passados:
Comparadores de cadeias de caracteres (strings)
• Comparadores de strings são usados para comparar textos dentro de scripts Bash.
• São utilizados com o comando ‘if’ para avaliar condições baseadas no conteúdo das variáveis.
• Tabela de comparadores de strings:
Comparador Descrição Exemplo Condição Verdadeira
= Igualdade (textos iguais) if [[ "$A" = "$B" ]] O valor de $A é igual ao de $B.
!= Diferente (textos diferentes) if [[ "$A" != "$B" ]] O valor de $A é diferente do de $B.
-z Cadeia nula ou vazia (zero caracteres) if [[ -z "$A" ]] O valor de $A é uma cadeia vazia.
-n Cadeia não nula (tamanho maior que
zero)
if [[ -n "$A" ]] O valor de $A possui pelo menos um
caractere.
• O SCRIPT que desenvolvemos no exemplo de comparador de cadeia numéricas possui uma falha:
o Se for executado sem parâmetros vai retornar erro, pois tentará comparar valores ($1 e $2) que não
existem.
o Esse problema pode ser facilmente resolvido incluindo-se um teste de validade dos parâmetros no
início da execução: O comparador ' -n ' verifica se a variável ' PALAVRA ' contém algum texto.
• Exemplo prático com validação de parâmetros: Script5 para validar e comparar parâmetros:
• Se tentarmos executar o SCRIPT sem preencher ambos os
parâmetros, o erro do usuário será detectado e indicado.
[[-n “$VARIÁVEL”]]: O comparador ' -n ' verifica se a variável
'VARIAVEL' contém algum texto.
Executando o SCRIPT sem parâmetros:
• No último exemplo criamos um SCRIPT para comparar dois valores passados por meio de parâmetros na
linha de comando.
• Em algumas situações, porém, pode ser mais prático e intuitivo pedir que o usuário digite os valores durante
a execução.
➢ Definição de SCRIPT interativo:
• Um SCRIPT interativo exige a interação do usuário para fornecer valores durante a execução.
• É mais prático em algumas situações do que passar parâmetros pela linha de comando.
➢ Comando ‘read’:
• O ‘read’ pode ser usado para aguardar a entrada do usuário e atribuir o valor digitado a uma variável.
• Exemplo:
o Aguarda a digitação e armazena o valor na variável A.
➢ Modificação do SCRIPT para interação:
• Uso do comando ‘echo -n’: Exibe uma mensagem sem quebra de linha, pedindo ao usuário para inserir
valores.
• Valores atribuídos pelo usuário, para as variáveis, são lidos com ‘read’:
Realizando operações aritméticas em SCRIPT
1. Utilidade das operações aritméticas:
•Realizar cálculos comuns.
• Auxiliar no controle de estruturas de repetição.
Exemplo: O ‘script6’ q solicita dois valores e calcula a soma
deles:
Saída ao executar:
Incrementando variáveis
• Em estruturas de repetição, precisamos de variáveis auxiliares, que são constantemente incrementadas.
• O incremento de uma variável X pode ser feito com: ‘ ((X++)) ’
• No exemplo ao lado, o primeiro comando declara a variável X e atribui o valor ‘1’ a ela.
• Confirmamos que o valor foi atribuído no segundo comando (‘echo’), mostrando o valor de X.
• No terceiro comando, incrementamos o valor de X em uma unidade, o que nos é comprovado
pelo último comando (‘echo’).
Operações com ponto flutuante
➢ Desvantagem do SHELL:
• Não realiza operações com ponto flutuante.
• Resultados de divisões são números inteiros, perdendo-se casas decimais.
➢ Comando ‘bc’: Auxilia na realização de operações com ponto flutuante.
➢ Exemplo de Uso: O comando ‘bc’ pode ser invocado recebendo expressões de um ‘echo’ para calcular.
• Exemplo:
• A expressão tem três partes:
o (scale=5): Define o número de casas decimais.
o 29/3: A segunda parte é o cálculo (29 dividido por 3).
o -1: Usa a biblioteca matemática do bc.
• Exemplo: Considere o ‘script7’ abaixo, que pede ao usuário três números (A, B e C) e calcula sua média.
• Saída ao executar:
• Repare que o comando ‘bc’ realizou o cálculo utilizando
ponto flutuante, sem perder as casas decimais no resultado.
Módulo 4. Esquematizar tarefas complexas em SCRIPTS com o uso de estruturas de repetição
Conceitos
1. Definição de Estruturas de Repetição (LOOPS):
• Estruturas de repetição permitem a execução repetitiva de códigos até atingir um objetivo.
• É essencial definir uma condição de saída para evitar LOOPS infinitos indesejados.
2. Tipos de Estruturas de Repetição Abordados:
• while
• for
3. Funcionamento do LOOP ‘while’:
• Sintaxe:
• Etapas:
1. Avaliação inicial da condição.
2. Execução dos comandos dentro do bloco do se a condição for verdadeira.
3. Reavaliação da condição após cada iteração.
4. Interrupção do LOOP quando a condição não for mais atendida.
• Cada ciclo do LOOP é chamado de iteração.
4. Exemplo de SCRIPT com ‘while’: Objetivo: Contar de 1 até o número informado pelo usuário.
• Saída ao executar:
Interferindo na execução de um LOOP
1. Comandos para interferência em LOOPS:
• break: O comando ‘break’ força a interrupção imediata do LOOP, mesmo que a condição tenha sido
satisfeita.
• continue: Já o comando ‘continue’ força uma nova iteração do LOOP, ou seja, retorna a execução para o
começo do LOOP.
2. Exemplo do SCRIPT com break: Objetivo: Interromper o LOOP quando o ponteiro dos segundos do relógio estiver
em "00".
Saída após execução:
5. Substituindo ‘break’ por ‘continue’:
• O comando ‘continue’ reinicia o LOOP sem executar
os comandos após o teste condicional.
• No exemplo, ao atingir os segundos "00", o SCRIPT
inicia uma nova iteração imediatamente, sem
aguardar o comando sleep.
A estrutura de repetição FOR
1. Função do ‘for’:
• O ‘for’ realiza um LOOP baseado em uma lista de variáveis.
• Cada iteração utiliza um valor da lista especificada.
2. Exemplo básico de ‘for’: Listar números especificada diretamente no código.
• Saída após execução: Para cada número na
lista o ‘for’ realizou uma iteração.
3. Uso do ‘for’ com máscara de arquivos:
• A máscara ‘*’ é usada como lista, representando todos os arquivos e diretórios no diretório atual.
• Ela adiciona um contador para numerar os itens da lista.
• Saída ao executar:
4. Dicas e considerações:
• O ‘for’ pode ser adaptado para diferentes tipos de listas (números, strings, resultados de comandos, etc.).
• Máscaras como ‘*’ ou ‘*.extensão’ permitem criar LOOPS dinâmicos baseados em arquivos/diretórios.
• Ideal para automatizar tarefas que iteram sobre itens de listas ou arquivos em um diretório.
Obtendo uma variável a partir de um arquivo texto
O SCRIPT de Levantamento de espaço ocupado, visto anteriormente, tem uma característica que pode ser
considerada como inconveniente.
1. Problemas ao incluir listas diretamente no SCRIPT:
• Alterar a relação de diretórios diretamente no código apresenta os seguintes inconvenientes:
o Risco de danos no SCRIPT: Um usuário inexperiente pode modificar ou corromper o arquivo.
o Permissões: É necessário que o usuário tenha permissão de escrita para editar o SCRIPT.
o Tamanho do código: Se a relação de diretórios for grande, o SCRIPT inevitavelmente ficará grande.
2. Solução: Separar a lista de diretórios do SCRIPT:
• Estratégia: A ideia é colocar a lista de diretórios em um arquivo separado, mantendo o código do SCRIPT
mais limpo.
• Vantagens:
o Evita a necessidade de modificar o SCRIPT.
o Facilita a manutenção e a atualização da lista.
3. Como criar uma lista de diretórios em um arquivo separado:
• Primeiro devemos criar um arquivo para a lista de diretórios.
• Cada diretório deve estar em uma linha do arquivo.
• Por exemplo, foi o criado o arquivo ‘lista_diretorios’ com o conteúdo ao lado:
• Alteração no SCRIPT: Substituir a declaração direta da variável DIRETORIOS pela leitura do
arquivo: ‘DIRETORIOS=$( ou >>) na execução, diretamente no CRONTAB.
o Exemplo de redirecionamento no CRONTAB:
▪ Esse comando salva a saída do script1 no final do arquivo ‘script1.log’
o O CRON pode enviar mensagens para a caixa postal local do usuário, mas arquivos de LOG são mais
seguros para dados importantes.
2. Expressões regulares em SCRIPTS Bash:
• Expressões Regulares ou regular expressions, ou simplesmente, regex)
o Uso das Expressões Regulares: Podem ser usadas para realizar comparações complexas e
transformações de dados ou como ferramenta para validação rigorosa.
o Comparação é feita com o operador ‘=~’.
• Exemplo prático ao lado:
• Análise da expressão regular:
o ^: Indica o início da cadeia de caracteres.
o [0-9]: Qualquer caractere entre 0 e 9.
o {3}: Exatamente 3 repetições do padrão anterior.
o $: Indica o fim da cadeia de caracteres.
o Resultado: A cadeia deve ter exatamente 3 dígitos numéricos para ser válida.
3. Aplicações:
• Automatização confiável com o CRON: Garante que os SCRIPTS sejam independentes do terminal e com
LOGs claros.
• Validação rigorosa de entrada: Expressões regulares garantem precisão no tratamento de dados.(conforme figura 14).
Características de execução das rotinas:
• Tarefas não sequenciais: Rotinas executadas concorrentemente.
• Sem ordem predefinida.
• Eventos assíncronos:
o Relacionados ao hardware.
o Internos ao SO.
Funções do kernel:
1. Tratamento de interrupções e exceções.
2. Criação e eliminação de processos e threads.
3. Sincronização e comunicação entre processos e threads.
4. Escalonamento e controle de processos e threads.
5. Gerência de memória.
6. Gerência do sistema de arquivos.
7. Gerência de dispositivos de E/S.
8. Suporte a redes locais e distribuídas.
9. Contabilização do uso do sistema.
10. Auditoria e segurança.
11. Outras funções específicas do SO.
Controle de execução de rotinas:
• Feito por system calls (chamadas ao sistema).
• System calls são mecanismos de proteção por
software.
• Garantem que apenas rotinas autorizadas sejam
executadas (conforme figura 15).
System Calls
Definição de Sistem Calls:
• System calls são "portas de entrada" para o acesso ao núcleo do SO e seus serviços.
• Elas permitem que as aplicações solicitem rotinas do sistema operacional.
• O sistema operacional verifica os privilégios da aplicação antes de executar a rotina.
Funcionamento das System Calls:
1. Chamada pela aplicação: A aplicação faz uma system call, que envolve a execução de uma rotina específica.
2. Verificação de privilégios: O SO verifica se a aplicação tem permissão para executar a rotina.
3. Execução da rotina: O sistema operacional processa a solicitação e retorna a resposta para a aplicação.
Exemplo da system call "read":
• Parâmetros: A system call "read" possui três parâmetros.
• Processo de execução: Envolve armazenamento de parâmetros, chamada à rotina de biblioteca, transição de
modo usuário para modo núcleo, execução no núcleo, e retorno ao espaço do usuário.
Passos detalhados da execução:
• A aplicação armazena parâmetros.
• A rotina de biblioteca faz a chamada real, passando o número da chamada ao sistema.
• O modo usuário transita para o modo núcleo com a instrução TRAP.
• O código do núcleo executa a rotina solicitada.
• O controle é retornado para a aplicação.
Tipos de System Calls:
• POSIX: Padrão internacional para unificação das system calls, permitindo que aplicações possam ser
executadas em qualquer SO compatível.
• Win32: Suporta chamadas de sistema desde o Windows 95, mas com diferenças em relação ao POSIX,
especialmente no desacoplamento das chamadas de biblioteca e de sistema.
Exemplos de system calls no Win32:
• Criação de processos, abertura/fechamento de arquivos, leitura/gravação em arquivos, manipulação de
diretórios, entre outros.
Classificação das chamadas ao sistema:
A tabela 2 exibe algumas chamadas da API Win32 que correspondem, aproximadamente, às chamadas do UNIX.
Tabela de comparação:
• A tabela apresenta as correspondências entre as chamadas POSIX e Win32, como fork()/CreateProcess,
read()/ReadFile, e outras funções para manipulação de arquivos e processos.
UNIX Win32 Descrição
fork CreateProcess Cria um novo processo
waitpid WaitForSingleObject Pode esperar que um processo saia
execve (nenhuma) CreateProcess = fork + execve
exit ExitProcess Conclui a execução
open CreateFile Cria um arquivo ou abre um arquivo existente
close CloseHandle Fecha um arquivo
read ReadFile Lê dados a partir de um arquivo
write WriteFile Escreve dados em um arquivo
iseek SetFilePointer Move o ponteiro do arquivo
stat GetFileAttributesEx Obtém vários atributos do arquivo
mkdir CreateDirectory Cria um novo diretório
rmdir RemoveDirectory Remove um diretório vazio
link (nenhuma) Win32 não dá suporte a links
unlink DeleteFile Destrói um arquivo existente
mount (nenhuma) Win32 não dá suporte a links
umount (nenhuma) Win32 não dá suporte a links
chdir SetCurrentDirectory Altera o diretório de trabalho atual
chmod (nenhuma) Win32 não dá suporte à segurança (embora o NT suporte)
kill (nenhuma) Win32 não dá suporte a sinais
time GetLocalTime Obtém o tempo atual
Podemos classificar os tipos de chamadas ao sistema em: Chamadas para o gerenciamento
de processos, arquivos e diretórios.
A Tabela 3 mostra alguns exemplos desses tipos de chamadas.
Gerenciamento de processos
Chamada Descrição
pid=fork() Cria um processo filho idêntico ao pai
pid=waitpid(pid, &statloc, options) Espera que um processo filho seja concluído
Gerenciamento de arquivos
Chamada Descrição
fd=open(file, how, ...0) Abre um arquivo para leitura, escrita ou ambos
s=close(fd) Fecha um arquivo aberto
n=read(fd, buffer, nbytes) Lê dados a partir de um arquivo em um buffer
Gerenciamento do sistema de diretório e arquivo
Chamada Descrição
s=mkdir(name, mode) Cria um novo diretório
s=rmdir(name) Remove um diretório vazio
s=mount(special, name, flag) Monta um sistema de arquivos
Diversas
Chamada Descrição
s=chmod(name, mode) Altera os bits de proteção de um arquivo
seconds=time(&seconds) Obtém o tempo decorrido desde 1 de janeiro de 1970
Modos de Acesso
Instruções Executadas pelas Aplicações:
• Instruções Privilegiadas: Podem comprometer o sistema se executadas de maneira inadequada.
• Instruções Não Privilegiadas: Não oferecem riscos ao sistema.
Modos de Acesso ao Sistema:
1. Modo Kernel ou Supervisor:
o A aplicação possui instruções privilegiadas.
o A aplicação pode executar todas as instruções, incluindo aquelas que afetam o sistema.
o Protege a área do sistema operacional na memória.
2. Modo de Acesso Usuário: A aplicação executa instruções não privilegiadas, que não comprometem o
sistema.
System Call e Verificação de Privilégios:
• Quando uma aplicação chama uma rotina do sistema, o sistema operacional verifica se ela tem os privilégios
necessários.
• Se não tiver privilégios, o SO impede a execução da rotina, utilizando o mecanismo de proteção por software.
Execução de Aplicações:
• As aplicações sempre devem ser executadas com o processador em modo usuário.
Proteção de Hardware:
• Se uma aplicação tentar executar uma instrução privilegiada diretamente (sem passar por uma system call), o
hardware do processador sinaliza um erro, garantindo a segurança do sistema.
Arquiteturas de Kernel
Arquitetura Monolítica (Mono-Kernel):
• Sistema operacional composto por vários módulos compilados separadamente e
depois ligados em um único programa executável.
• Todos os módulos podem interagir livremente, sem ocultação de informações.
Arquitetura de Camadas:
• O sistema é dividido em várias camadas, cada uma oferecendo funções para a
camada superior.
• Vantagens:
o Facilita a manutenção e depuração.
o Cria uma hierarquia de níveis de acesso, protegendo as camadas internas.
• Desvantagens:
o Pode comprometer o desempenho devido à comunicação entre as camadas.
• A maioria dos SO comerciais usa duas camadas.
Máquina Virtual (VM):
• Cria um nível intermediário entre o hardware e o sistema operacional (gerenciador de máquinas virtuais).
• Possibilita a criação de máquinas virtuais independentes, cada uma com uma cópia virtual do hardware.
• Vantagens:
o Execução de vários sistemas operacionais em uma mesma máquina física,
com isolamento entre eles.
o Redução de custos ao permitir execução simultânea de múltiplos sistemas
operacionais.
• Necessário que a CPU seja virtualizável.
• Uso de hypervisors de tipo 1 e tipo 2 para gerenciar as máquinas virtuais.
Arquitetura Microkernel:
• O núcleo do sistema operacional é minimizado, oferecendo apenas serviços essenciais, como gerenciamento
de arquivos, processos e memória.
• A maior parte das funções do sistema é executada fora do núcleo.
• Objetivo: Alta confiabilidade, ao dividir o sistema em módulos bem
definidos.
• Vantagens:
o Menor impacto de falhas (por exemplo, erros em drivers
de dispositivos não afetam o sistema).
• Difícil de implementar, geralmentecombinada com a arquitetura
de camadas.
Exonúcleo:
• Em vez de clonar a máquina real, divide-se os recursos entre as máquinas virtuais.
• O exonúcleo aloca recursos às máquinas virtuais e verifica o uso para garantir que uma máquina não acesse
recursos de outra.
• Vantagens:
o Poupa uma camada de mapeamento ao eliminar a necessidade de remapeamento de endereços de
disco para cada máquina virtual.
Módulo 4. Analisar a arquitetura, instalação do Linux e comandos básicos
Conceitos
Origem e Desenvolvimento do Linux:
• Linux foi criado em 1991 por Linus Torvalds como um kernel pequeno e autocontido.
• Objetivos: ser baseado nos padrões UNIX e manter compatibilidade com o mesmo.
• História de colaboração global, com contribuições de usuários via Internet.
Características:
• Sistema operacional Unix-like, com comportamento similar ao Unix (multitarefa e multiusuário).
Distribuições Linux:
• Uma distribuição é composta pelo kernel e um conjunto de aplicativos.
• Distribuições podem ser instaladas em disco ou usadas como live distributions, que funcionam diretamente
da memória RAM sem instalação.
Exemplo de Distribuição: Ubuntu:
• Ubuntu é uma distribuição popular baseada no Debian.
• A versão "Ubuntu desktop" será usada para demonstrações no módulo, mas outras distribuições também
podem ser escolhidas.
• O Ubuntu possui uma numeração de versão e codinome. Exemplo:
o 20.04 LTS: Ano (2020), Mês (04 - abril), LTS (Suporte de longo prazo de 5 anos), Codinome "Focal
Fossa".
Estrutura de diretório no Linux
Estrutura única de pastas:
• O Linux possui uma estrutura de diretórios partindo de uma única raiz.
• Todos os dispositivos (internos ou externos) são montados em algum ponto abaixo da raiz.
Regras para nomes de arquivos e pastas:
• O Linux é case-sensitive (distingue maiúsculas de minúsculas). Exemplo: "texto", "Texto" e "TEXTO" são
arquivos diferentes.
• O separador de diretórios é o "/" (barra). Exemplo de caminho: /tmp/Texto.txt.
Principais diretórios e seus significados:
/ Pasta Raiz /usr Programas de Usuário
/bin Executáveis Binários /home Pasta Pessoal
/sbin Sistema Binário /boot Arquivos de Inicialização
/etc Arquivos de Configuração /lib Bibliotecas do Sistema
/dev Arquivos de Dispositivos /opt Aplicações Opcionais
/proc Informação de Processo /mnt Pasta de Montagem
/var Arquivos Variáveis /media Dispositivos Removíveis
/tmp Arquivos Temporários /srv Serviço de Dados
Super Usuário (root):
• No Linux, o super usuário é denominado root, com poderes especiais de administração.
• Comparado ao administrador no Windows.
Comandos do Linux
Abertura do Terminal:
• No Ubuntu Desktop, clique em "mostrar aplicativos" e digite "term" na caixa de pesquisa para abrir o
terminal.
Significado da linha de comandos: teste@teste-VirtualBox:~$
• teste: Nome do usuário.
• teste-VirtualBox: Nome da máquina.
• ~$: Indica que o usuário está na pasta pessoal (diretório /home/usuário).
Comandos básicos:
• Uma lista de comandos básicos pode ser acessada no terminal para uso comum.
Instalação de aplicativos via código-fonte:
• Passos para compilar e instalar o código-fonte:
1. Baixar o arquivo-fonte (exemplo: .tar.gz).
2. Descompactar o arquivo.
3. Acessar o diretório com os arquivos do código-fonte.
4. Executar os seguintes comandos:
▪ ./configure
▪ make
▪ make install
TEMA 3. PROCESSOS E GERENCIA DE PROCESSADOR
Módulo 1. Descrever os conceitos de processos
❖ Modelo de Processo
• Evolução dos sistemas :
o Os sistemas iniciais executavam apenas um programa por vez, com controle total do sistema e acesso
a todos os recursos.
o Sistemas modernos atuais permitem a execução simultânea de vários programas, o que proporciona
maior controle das tarefas por meio do conceito de processo.
• Definição de Sistema Multiprogramável : Sistema que permite a execução de mais de um programa ao
mesmo tempo.
• Definição de Processo :
o Um processo é um programa em execução, incluindo:
▪ Valores atuais dos registradores.
▪ Variáveis.
▪ Espaço de endereçamento.
o Diferenciação:
▪ Programa : Entidade passiva.
▪ Processo : Entidade ativa com contador de instruções e registradores associados.
• Multiprogramação e pseudoparalelismo :
o Em sistemas multiprogramáveis, a CPU alterna entre processos, dedicando um tempo limitado a
cada um.
o Isso cria uma ilusão de paralelismo (pseudoparalelismo).
• Organização e execução :
o Todo software é organizado em processos sequenciais.
o O modelo de processos facilita o tratamento do paralelismo.
• Processos e execução simultânea :
o Dois processos podem estar associados ao mesmo programa, mas são sequências de execução
distintas.
o Conceitualmente, cada processo tem sua própria CPU.
o A velocidade de execução de um processo não é uniforme devido à alternância entre processos.
• Alternância entre processos :
o Exemplo prático:
▪ Os processos A, B, C e D alternam a execução nos tempos t1, t2, t3 e t4.
▪ O usuário percebe como se os processos estivessem sendo executados simultaneamente
devido à rápida alternância de execuções.
❖ Criação e Encerramento de Processos
Criação de processos
• Principais eventos que são capazes de criar processos :
1. Inicialização do sistema.
2. Execução de chamada de sistema por outro processo.
3. Solicitação de usuário (comandos ou cliques).
4. Execução de tarefas em lote.
• Tipos de processos : Quando um sistema operacional é inicializado, uma série de processos são criados.
Alguns são processo de:
o Primeiro plano : Interagem diretamente com usuários.
o Segundo plano (background) : São processos que ficam em segundo plano para lidar com algumas
atividades, como e-mail, páginas da web, notícias, impressão, são chamados de daemons. Ou seja,
são processo que não estão associados a usuários em particular.
• Chamada de sistema por um processo em execução : Além dos processos criados durante a inicialização do
sistema, outros também podem ser criados.
o Processos em execução podem criar outros para auxiliar no trabalho.
o Criar processos novos é útil em tarefas distribuídas, como em multiprocessadores.
• Solicitação do usuário : Em sistemas interativos, os usuários podem começar um programa digitando um
comando ou clicando duas vezes sobre um ícone. Cada uma dessas ações inicia um novo processo e executa
o programa selecionado.
• Tarefas em lote :
o São comuns em sistemas grandes, onde as tarefas são executadas sequencialmente conforme os
recursos estão disponíveis.
o Exemplo: As tarefas são submetidas ao sistema e, quando o sistema operacional tem os recursos
necessários para executar outra tarefa, cria um processo e executa a próxima tarefa a partir da fila de
entrada.
Observação importante: Um processo é sempre criado executando uma chamada de sistema específica, que gera
um novo processo vinculado ao criador.
• Chamada de sistema no Linux : A chamada de sistema mais comum para a criação de processos é a fork().
o Chamada de sistema fork() :
▪ fork() cria um processo idêntico ao pai.
▪ Ambos compartilham a mesma imagem de memória, variáveis de ambiente e arquivos
abertos.
▪ Após a criação:
➢ Pai : recebe o PID do filho, como resultado.
➢ Filho : recebe resultado = 0.
*** PID (identificação do processo): É um valor que identifica um processo de forma única no sistema
operacional.
• Chamada de sistema execve() :
o Quando o fork() é utilizado para a criação de um processo que executará o código de outro
programa, a chamada de sistema execve() deve ser utilizado para que o processo filho mude sua
imagem de memória e execute o novo programa.
o execve() é usado para o filho executar outro programa, atualizando sua imagem de memória.
o Exemplo: criar processos que executem uma calculadora, editor de texto e gráficos importantes.
Exemplo: O código a seguir ilustra a utilização de execve().Nele, o processo pai cria três processos filhos em
sequência. O primeiro coloca em execução uma calculadora, o segundo, o editor de textos gedit, e o terceiro, o
utilitário xeyes.
#include
#include
#include
int main(int argc, char **argv, char* envp[]) {
int pid, i;
// Cria 3 processos para executar os programas
for (i=1; ientrada é chamada de Bloco de Controle de Processo – BCP (Process
Control Block – PCB) e contém todas as informações do processo. Algumas entradas do BCP são:
• Função do Bloco de controle de Processo: Contém informações sobre cada processo.
• Algumas entradas do BCP :
o Estado do processo
o Prioridade do processo
o Número do processo
o Registradores da CPU
o Informações relativas ao gerenciamento de memória
o Informações de contabilidade
o Informações sobre operações de E/S
Escalonador (agendador)
1. Funções :
o Realiza o gerenciamento de interrupções, ou seja, faz a Gestão Intermediária e Alternativa de
Processos nas Filas de Execução.
o Seleciona qual processo será executado a seguir.
2. Frequência de chamada : É executado frequentemente (ex.: a cada 100ms) para maximizar a utilização da
CPU.
3. Características : Deve ser rápido para evitar desperdício de recursos com gerenciamento.
Mudança de Contexto: Para transferir o controle da CPU de um processo a outro, é necessário guardar o estado do
processo em execução e carregar o estado do processo a entrar em execução. Esta tarefa é conhecida
como mudança de contexto (ou troca de contexto).
1. Definição de Mundança de Contexto: Tarefa de salvar o estado do processo atual e carregar o estado do
próximo processo.
2. Elementos básicos do contexto de um processo:
o Contexto de hardware : Constitui-se do conteúdo dos registradores e informações salvas quando o
processo é pausado.
➢ O contexto de hardware é como um "bloco de notas" onde o sistema operacional anota o
que um processo estava fazendo na CPU (como o conteúdo dos registradores, que guardam
dados e instruções). Quando um processo para usar a CPU, o sistema salva essas
informações para que, quando o processo volte a ser executado, ele continue exatamente de
onde parou. Isso é essencial em sistemas multiprogramáveis, pois permite que vários
processos alternem o uso da CPU sem perder seu progresso.
o Contexto de software : Especifica características do processo que influenciarão na execução de um
programa. Ele define basicamente três grupos de informações sobre um processo: identificação,
quotas e privilégios.
➢ Identificação: Define o processo para o sistema de forma única, através de seu PID
(identificação do processo), UID (identificação do usuário), GID (identificação do grupo).
➢ Quotas: são os limites de cada recurso que o sistema operacional pode alocar, como número
de arquivos abertos, quantidade de memória, quantidade de subprocessos que podem ser
criados etc.
➢ Privilégio: é o que o processo pode ou não fazer em relação ao sistema e outros processos.
o Espaço de endereçamento : É a área de memória do processo em que o programa será executado e
a área de memória onde os dados do processo serão armazenados.
➢ Cada processo possui seu próprio espaço de endereçamento, que deve ser protegido dos
demais.
3. Tempo gasto na mudança de contexto:
o Varia dependendo de fatores como velocidade da memória, quantidade de registradores e existência
de instruções especiais.
o O tempo gasto na mudança de contexto pode variar de 1 a 1000 μs.
❖ Processos no Linux
• Comportamento Geral:
o Processos no Linux seguem o modelo de processos sequenciais tradicionais.
o Possui suporte a múltiplos usuários e multitarefa, permitindo a execução simultânea de diversos
processos, incluindo os pertencentes a diferentes usuários.
o Daemons (processos em segundo plano) são comuns, como o daemon de impressão, que gerencia o
uso compartilhado da impressora.
• Criação de Processos no Linux:
o Utiliza a chamada de sistema fork() para criar processos filhos.
o O processo filho herda uma cópia exata do espaço de endereçamento do processo pai, mas
alterações em memória não afetam o outro.
o Arquivos abertos antes do fork() permanecem acessíveis para pai e filho, com alterações sendo
compartilhadas entre ambos.
• Identificação de Processos: Cada processo é identificado por um número inteiro único, o PID (Process ID).
• Principais Chamadas de Sistema:
o fork(): Cria um processo filho idêntico ao pai; retorna 0 para o filho e o PID do filho para o pai.
o waitpid(): Faz o processo pai aguardar a finalização do processo filho especificado.
o execve(): Substitui o código em execução no processo pelo código de um novo programa.
o exit(): Finaliza a execução do processo e retorna um status especificado.
Módulo 2. Compreender como ocorre a construção de programas concorrentes
❖ Subprocesso
• Definição de Subprocesso:
o Um subprocesso é um processo filho criado por outro processo (pai).
o Um subprocesso pode criar seus próprios subprocessos, formando uma hierarquia de processos.
• Vantagens de Subprocesso:
o Permite dividir aplicações em partes que trabalham de forma concorrente, otimizando desempenho
e recursos do sistema.
o Aproveita a capacidade de multiprocessamento, distribuindo subprocessos entre diferentes
processadores.
o Processa múltiplas requisições simultaneamente, reduzindo atrasos em tarefas simples.
• Exemplo: Servidor Web: O trecho de código abaixo em Linguagem C exemplifica a parte de um servidor web
simples que cria subprocessos para atendimento das requisições:
o Problema sem subprocessos: Processamento sequencial de requisições, usando apenas um
processador e causando atraso em requisições simples se houver outras complexas na fila.
o Solução com subprocessos: Cria um subprocesso para cada requisição, permitindo execução
concorrente e uso eficiente dos processadores.
while (1) { // Loop infinito
req = pega_proxima_requisicao();
pid = fork();
if (pid == 0) { // Proceso filho
processa_requisicao(req);
exit(0);
}
}
o Funcionamento do Código (Linguagem C):
▪ while (1): Loop infinito que monitora e processa novas requisições.
▪ pega_proxima_requisicao(): Verifica se há requisições na fila; bloqueia o processo pai se não
houver.
▪ fork(): Cria um subprocesso para atender cada requisição.
▪ processa_requisicao(req): Subprocesso filho processa a requisição.
▪ exit(0): Encerra o subprocesso após concluir o processamento.
• Custos e Recursos:
o A criação de subprocessos consome recursos do sistema, como tempo de CPU e memória.
o Cada subprocesso requer alocação de contexto de hardware, contexto de software e espaço de
endereçamento.
o Cada processo possui um BCP (Bloco de Controle de Processo) individual.
❖ Threads
• Definição e Propósito:
o Introduzidas para reduzir o tempo e os recursos gastos na criação/eliminação de processos.
o Threads são linhas de execução concorrentes dentro de um processo.
o Threads são "processos leves", permitindo execução concorrente sem necessidade de múltiplos
processos.
• Características das Threads:
o Compartilham o mesmo espaço de endereçamento, arquivos abertos, alarmes e sinais.
o Cada thread possui sua própria pilha e conjunto de registradores (contexto de hardware).
o Desenvolvidas para trabalhar cooperativamente, podendo alterar os dados umas das outras.
• Diferença entre Threads e Subprocessos:
o Subprocessos: Possuem espaços de endereçamento independentes e protegidos.
o Threads: Compartilham o mesmo espaço de endereçamento, sem proteção, permitindo que um
thread possa alterar dados de outro thread.
▪ Threads são desenvolvidos para trabalharem de forma cooperativa, voltados para
desempenhar uma tarefa em conjunto, e são conhecidos como processos leves.
• Vantagens das Threads:
o Mudança de contexto entre threads é mais rápida do que entre processos, pois não requer
gerenciamento de memória.
o Ideais para sistemas com múltiplas CPUs, permitindo execução concorrente real (paralelismo).
o Threads no nível do usuário têm comutação mais rápida, mas podem bloquear todo o processo se
um thread for bloqueado.
• Gerenciamento de Threads em um Processo:
o Quando múltiplos threadsestão presentes no mesmo processo, alguns campos da tabela de
processos não ocorrem por processo, mas por thread.
▪ Isso acontece porque: Em um processo com múltiplos threads, certos campos da tabela de
processos são gerenciados individualmente para cada thread (como o estado ou
registradores), enquanto outros são compartilhados por todos os threads do processo (como
o espaço de memória ou arquivos abertos).
• Gerenciamento de threads no espaço do usuário: Em certos sistemas, os threads podem ser gerenciados
diretamente pelo programa (no espaço do usuário), sem envolver o sistema operacional. Isso acontece, por
exemplo, com o pacote P-threads (POSIX).
o Vantagem no gerenciamento de threads pelo espaço do usuário:
▪ Comutação de threads (troca de contexto entre threads): Alterar entre threads no espaço do
usuário é mais rápido porque não exige uma chamada ao núcleo do sistema operacional (kernel),
economizando recursos.
o Desvantagens do Gerenciamento no Espaço do Usuário:
▪ Bloqueio de todo o processo: Se um thread bloqueia (ex.: espera por uma operação de E/S), o
sistema operacional bloqueia todo o processo, já que não sabe distinguir os threads.
▪ Distribuição desigual de tempo: Threads em diferentes processos não recebem tempos iguais,
pois o sistema operacional gerencia o tempo de CPU com base em processos, não em threads
individuais.
• Termos Associados:
o Multithread: Múltiplos threads em um mesmo processo.
o Monothread: Processo com apenas um thread.
• Criação de Threads no Linux:
o A criação do thread é realizada com a chamada de sistema clone(), que permite configurar o
comportamento do thread com diferentes flags. Sua sintaxe é:
int clone(int (*fn)(void *), void *stack, int flags, void *arg)
o Flags mais comuns:
FLAG
COMPORTAMENTO
Quando utilizado Quando não utilizado
CLONE_VM Cria um thread. Cria um processo.
CLONE_FS Compartilha as informações sobre o sistema
de arquivos.
Não compartilha informações sobre o sistema
de arquivos.
CLONE_FILES Compartilha os descritores de arquivos. Copia os descritores de arquivos.
CLONE_SIGHAND Compartilha a tabela do tratador de sinais. Copia a tabela do tratador de sinais.
CLONE_PARENT O novo thread tem o mesmo pai que o
chamador.
O chamador é o pai do novo thread.
SIGCHLD O thread envia o sinal SIGCHLD ao pai
quando termina.
O thread não envia o sinal SIGCHLD ao pai
quando termina.
• Pontos Importantes:
o Threads têm sua própria pilha, contendo variáveis locais e endereços de retorno.
o Algumas CPUs possuem suporte de hardware para multithreading, permitindo chaveamentos
rápidos (em nanossegundos).
• Tipos de Processos: Os tipos de processos estão relacionados ao tipo de processamento que executam:
o CPU-bound:
▪ Os processos do tipo CPU-bound passam a maior parte do tempo no estado executando.
▪ Realizam poucas operações de entrada/saída (E/S).
▪ Comuns em aplicações científicas.
o I/O-bound:
▪ Os processos do tipo I/O-bound passam a maior parte do tempo no estado bloqueado.
▪ Realizam grande número de operações de entrada/saída (E/S).
▪ Comuns em aplicações comerciais e processos interativos.
❖ Processos e Threads no Linux
• Criação de Processos e Threads:
o O Linux usa a chamada de sistema fork() para duplicar processos e clone() para criar threads.
o No Linux, não há distinção entre processos e threads; ambos são tratados como tarefas (tasks).
o Um processo com um único thread será considerado como uma tarefa e um processo com n threads
será representado por n estruturas de tarefas.
• Semelhança entre fork() e clone():
o A chamada clone(), quando usada sem flags, funciona de forma idêntica à fork().
• Gerenciamento do Contexto de Tarefas:
o O contexto de uma tarefa é armazenado em diversas estruturas independentes.
o Assim, o compartilhamento de informações entre tarefas é facilitado por ponteiros que apontam
para as mesmas estruturas em memória.
• Identificação de Tarefas:
o O Linux atribui um PID único para cada tarefa, mesmo para threads de um mesmo processo, a fim
de manter a compatibilidade com demais sistemas UNIX
• Otimização de Memória com "Copy on Write" no Linux:
o Inicialmente, subprocessos compartilham os mesmos segmentos de memória do processo pai.
o A cópia do segmento ocorre apenas quando um processo tenta escrever (mecanismo conhecido
como cópia na escrita – copy on write).
o Esse método melhora o desempenho do sistema e reduz o uso de memória física.
Módulo 3. Identificar o mecanismo de comunicação entre processos
❖ Processos de Aplicações Concorrentes
• Definição e Contexto:
o Aplicações concorrentes são programas onde diferentes partes do código podem ser executadas
simultaneamente, habilitadas pelos sistemas multiprogramáveis.
o Processos concorrentes geralmente compartilham recursos do sistema, mas isso pode levar a
situações indesejáveis que comprometem o funcionamento do sistema.
• Problemas do Compartilhamento de Recursos:
o Exemplo: Em um buffer compartilhado:
▪ Um processo só pode gravar dados se o buffer não estiver cheio.
▪ Um processo só pode ler dados se o buffer não estiver vazio.
▪ Processos podem precisar aguardar que o buffer esteja disponível para realizar operações de
E/S.
• Comunicação entre Processos:
o Pode ser feita por:
▪ Memória compartilhada (variáveis compartilhadas).
▪ Troca de mensagens.
o Em ambos os casos, os processos precisam estar sincronizados.
• Mecanismos de Sincronização:
o Garantem:
▪ Comunicação segura entre processos concorrentes.
▪ Acesso controlado a recursos compartilhados.
o São aplicáveis tanto a processos quanto a threads.
• Questões Principais em Aplicações Concorrentes:
1. Troca de Informações: Como um processo comunica informações a outro?
RESPOSTA: Um processo pode passar informações a outro utilizando memória compartilhada (variáveis
compartilhadas) ou troca de mensagens (comunicação explícita entre processos). Esses mecanismos exigem
sincronização para evitar inconsistências.
2. Evitar Interferência: Como garantir que processos não interfiram entre si?
RESPOSTA: Utiliza-se mecanismos de sincronização como semáforos, mutexes ou monitores para gerenciar o acesso
aos recursos compartilhados, garantindo exclusão mútua e evitando interferências.
3. Sequenciamento: Como coordenar processos que dependem uns dos outros?
RESPOSTA: Por meio de mecanismos de sincronização, como barreiras ou sinais (eventos), que coordenam a ordem
de execução, permitindo que um processo aguarde pelo outro quando necessário.
❖ Condição de Corrida:
• Memória Compartilhada: Processos que trabalham em conjunto podem compartilhar memória para ler ou
escrever dados, o que pode gerar condições de corrida quando o acesso simultâneo não é controlado.
• Condição de Corrida:
o Definição de Condição de Corrida: Ocorre quando dois ou mais processos acessam dados
compartilhados simultaneamente, e o resultado depende da ordem de execução.
o Exemplo de Condição de Corrida: Dois processos (Carlos e Orlando) tentam atualizar o saldo de uma
conta simultaneamente, causando uma inconsistência. Carlos lê o saldo (500), faz um depósito de 100 e
grava 600, mas Orlando também lê 500, faz um saque de 200 e grava 300. O resultado correto seria 400.
• Região Crítica:
• Conceito de Região Crítica: É a parte do programa que acessa dados compartilhados.
o Quando um processo é executado dentro de sua região crítica, nenhum outro processo pode entrar lá, o
que evita acessos simultâneos.
• Exclusão Mútua (mutex): Garante que apenas um processo entre na região crítica por vez, enquanto os
demais processos devem esperar até que o recurso seja liberado.
o Exclusão Mútua evita condições de corrida, pois impede que dois ou mais processos acessem
simultaneamente um recurso compartilhado, garantindo que apenas um processo acesse um recurso
compartilhadopor vez.
o Condições para Solução de Exclusão Mútua:
1. Apenas um processo por vez na região crítica.
2. Nenhuma suposição sobre velocidade ou número de CPU.
3. Processos fora da região crítica não devem bloquear outros.
4. Evitar espera infinita (starvation), onde um processo nunca consegue acessar a região crítica.
• Semáforos:
o Definição: É uma variável inteira usada para sincronizar o acesso a recursos compartilhados.
o Operações: Existem duas operações especiais: up e down.
▪ down: Decrementa o semáforo se ele for maior que 0 ou bloqueia o processo se o valor for 0.
▪ up: Incrementa o semáforo e libera o recurso, desbloqueando processos na fila de espera.
o Funcionamento:
▪ Quando um processo deseja entrar na região crítica, executa down.
▪ Se o semáforo for maior que 0, ele é decrementado de 1, e o processo que solicitou a operação, é
executado na região crítica.
▪ Se o semáforo for 0, o processo que solicitou a operação ficará no estado bloqueado em uma fila
associada ao semáforo.
▪ Ao sair da região crítica, executa up, liberando o recurso para outros processos.
▪ Se um ou mais processos estiverem esperando, o sistema escolhe um processo na fila de espera e
muda seu estado para pronto.
▪ As operações up e down são realizadas de forma atômica pelo sistema operacional, ou seja, sem
interrupções.
▪ No caso da exclusão mútua, as instruções down e up funcionam como protocolos para que um
processo possa entrar e sair de sua região crítica.
o Exemplo Prático: Com semáforos, operações concorrentes (como saque e depósito) são sincronizadas,
evitando inconsistências no saldo bancário, veja o caso de Carlos e Orlando:
1. Carlos e Orlando tentam atualizar a mesma conta com saldo de 500.
2. Antes de Carlos ler o saldo, a operação down(mutex) é executada, permitindo que ele acesse a
região crítica.
3. Orlando também tenta acessar, mas é bloqueado pelo semáforo, pois Carlos ainda está na
região crítica.
4. Carlos faz o depósito de 100, atualizando o saldo para 600, e sai da região crítica com a
operação up(mutex).
5. Orlando, agora desbloqueado, lê o saldo atualizado (600), faz o saque de 200, e atualiza o saldo
para 400.
6. No final, Orlando executa up(mutex), liberando a região crítica, e a inconsistência anterior é
evitada.
7. Conclusão com uso de Semáforos: A implementação correta com semáforos garante que os
processos acessem os dados compartilhados de forma segura, mantendo a consistência dos
saldos das contas.
❖ Monitores
• O uso de semáforos exige do programador cuidado, pois qualquer engano pode levar a problemas de
sincronização, daí a importância do uso de monitores.
Definição de Monitores:
• Monitores são mecanismo de sincronização de alto nível para facilitar o
desenvolvimento e a correção de programas concorrentes.
• Monitores agrupam variáveis, procedimentos e estruturas de dados em um pacote
protegido.
Características Principais de Monitores:
• Exclusão Mútua Automática:
o Apenas um processo pode estar ativo dentro de um monitor por vez.
o Se um processo já estiver executando um procedimento do monitor, os demais aguardam sua vez.
• Proteção de Dados:
o Variáveis globais do monitor são acessíveis apenas por ele e seus procedimentos.
o Inicialização das variáveis ocorre no bloco de comandos do monitor, executado uma única vez na
ativação do programa.
Vantagens dos Monitores:
• Simplifica o desenvolvimento de programas concorrentes ao encapsular regiões críticas.
• Reduz riscos de erros comuns em sincronização, como os associados ao uso de semáforos.
• A implementação da exclusão mútua é realizada pelo compilador (realizada de forma automática).
Exemplo Prático do uso de Monitores:
• A cláusula synchronized em Java é uma implementação de monitores.
• O programador transforma regiões críticas em procedimentos de monitor, organizando melhor o código e
garantindo a segurança.
• Monitores são estruturas definidas por linguagens de programação. Portanto, cabe aos compiladores das
linguagens implementar tais mecanismos, e não ao sistema operacional.
Conclusão: Monitores são uma solução mais intuitiva e segura que semáforos para sincronização em programas
concorrentes, tornando o código mais confiável e de fácil manutenção.
❖ Sincronização no Linux
Semáforos:
• O Linux oferece suporte à utilização de semáforos para sincronização de tarefas por meio da chamada de
sistema:
o sem_wait(): Decrementa o semáforo; bloqueia a tarefa se o valor for 0.
o sem_post(): Incrementa o semáforo, liberando processos bloqueados.
o sem_trywait(): Similar a sem_wait(), mas retorna erro se não puder prosseguir, sem bloquear.
• Uso: Sincronização de tarefas e controle de acesso a recursos compartilhados.
Comunicação entre Processos: Além da utilização de semáforos para sincronização de processos, o Linux permite a
comunicação entre processos por meio de troca de mensagens e de sinais.
1. Troca de Mensagens com Pipe “|”:
o Definição de Pipe: São mecanismo que conecta a saída de um processo à entrada de outro,
permitindo execução concorrente. O pipe é representado pela barra vertical “|”.
o Exemplo de Comando:
cat *.txt | sort | uniq
▪ cat *.txt: Exibe o conteúdo de todos os arquivos .txt.
▪ sort: Ordena as linhas.
▪ uniq: Remove duplicatas.
o Funcionamento: A saída de um comando é enviada como entrada ao próximo, conectados pelo pipe
(|).
2. Comunicação entre processo por meio de Sinais:
o Definição de Sinais: São notificações enviadas a processos para informar eventos (ex.: fim de um
temporizador, a chegada de uma informação pela rede, término de um processo filho).
o Exemplos de Sinais:
Sinal Ação padrão Comentário
SIGHUP Terminar Gerado pelo fim do terminal controlador.
SIGTERM Terminar Informa que deve parar a execução.
SIGINT Terminar Recebeu uma interrupção + pelo terminal controlador.
SIGKILL Terminal Força a finalização do processo.
SIGTSTP Suspender Processo deve ser suspenso (+).
SIGSTOP Suspender Processo deve ser suspenso. Semelhante ao SIGTSTP, mas não pode ser sobrescrito.
SIGCONT
Retornar à execução se estiver suspenso.
SIGCHLD Ignorar Informa ao processo pai que um processo filho terminou ou foi suspenso.
SIGALRM Terminar Fim de temporizador.
SIGURG Ignorar Condição urgente no socket. Normalmente, aviso de chegada de pacote de rede.
SIGUSR1 Terminar Sinal definido pelo usuário.
SIGUSR2 Terminar Sinal definido pelo usuário.
o Quando um sinal chega ao processo, ele pode:
▪ Receber o tratamento padrão definido pelo kernel.
▪ Ser capturado, sendo, então, tratado por uma função definida pelo usuário.
▪ Ser ignorado.
▪ Exceções: Para os sinais SIGKILL e SIGSTOP, sempre é executado o tratamento padrão. Eles
não podem ser capturados nem ignorados.
o Sinais podem ser gerados por:
▪ Exceções de hardware.
▪ Condições de software.
▪ Pelo shell com o comando kill.
▪ Por outro processo, utilizando a chamada de sistema kill().
▪ Por uma combinação de teclas, como, por exemplo, + .
▪ Controle de processos.
Principais Chamadas de Sistema para Sinais
Chamada de sistema Descrição
signal() Instala rotina para tratamento do sinal.
sigaction() Define a ação a ser tomada nos sinais.
sigreturn() Retorna de um sinal.
sigpending() Obtém o conjunto de sinais bloqueados.
kill () Envia um sinal para um processo.
alarm() Ajusta o alarme do relógio para envio de um sinal.
pause() Suspende o chamador até o próximo sinal.
Resumo: O Linux oferece múltiplas ferramentas para sincronização e comunicação entre processos, como semáforos,
mensagens (pipes) e sinais. Essas abordagens permitem o controle eficiente de tarefas concorrentes, com
flexibilidade e segurança, embora exijam cuidado na implementação para evitar erros.
Módulo 4. Comparar as diferentes formas de escalonamento
❖ Escalonamento
Multiprogramação:
• Objetivo: Amultiprogramação tem como objetivo permitir que haja algum processo para maximizar a
utilização da CPU.
• Sistemas multiprogramáveis permitiu que a CPU pudesse ser compartilhada entre diversos processos.
• Portanto, deve existir um critério para determinar a ordem da escolha dos processos para execução dentre os
vários que concorrem pela CPU.
Definição de escalonamento:
• O escalonamento (scheduling) é o processo de selecionar qual processo terá acesso à CPU (Unidade Central
de Processamento), maximizando sua utilização em sistemas multiprogramáveis.
• Escalonador (Scheduler ou também chamado de agendador): É responsável por realizar o escalonamento.
Ele é parte do sistema operacional.
Objetivo do escalonamento:
• Maximizar a utilização da CPU.
• Garantir que a CPU seja compartilhada entre diversos processos de forma eficiente.
• Decidir qual processo pronto será alocado à CPU de forma eficiente.
Algoritmos de Escalonamento:
• Função de um algoritmo de escalonamento: É decidir qual dos processos prontos deve ser alocado à CPU.
• O algoritmo de escalonamento não é o único responsável pelo tempo de execução de um processo.
• O algoritmo de escalonamento afeta somente o tempo de espera na fila de processos prontos.
Classificação dos Algoritmos de Escalonamento:
1. Preemptivo: Permite interromper um processo em execução para dar lugar a outro mais prioritário.
• Requisitos: Realizar o escalonamento preemptivo exige que uma interrupção de relógio ocorra ao fim do
intervalo para devolver o controle da CPU ao escalonador.
• Vantagens:
o Possui melhor tempo de resposta em sistemas de tempo compartilhado.
o Garante atenção imediata a processos prioritários.
o Permite o compartilhamento uniforme do processador.
• Desvantagens:
o Gera overhead devido à troca de contexto (mudança de processos na CPU).
o Está sujeito a problemas de condição de corrida.
2. Não Preemptivo: Um processo em execução só libera a CPU ao concluir sua tarefa.
• Vantagens: Elimina problemas de condição de corrida.
• Desvantagem: Pode levar a tempos de resposta mais longos para processos prioritários.
Importância do Escalonamento:
• Afeta diretamente o tempo de espera dos processos na fila de prontos.
• Contribui para otimizar o uso da CPU e garante a eficiência do sistema multiprogramável.
Considerações sobre Preempção:
• Introduz custos adicionais (overhead) com troca de contexto.
• Necessita de critérios bem definidos para evitar sobrecarga no sistema.
Resumo: O escalonamento é essencial para gerenciar a concorrência entre processos em sistemas
multiprogramáveis. A escolha entre algoritmos preemptivos ou não preemptivos envolve trade-offs entre eficiência,
simplicidade e complexidade de sincronização.
Tipos de Escalonamento:
1. Escalonamento FIFO (First In First Out - Primeiro a chegar, primeiro a ser servido)
• Características:
o O processo que chegar primeiro é o primeiro a ser selecionado para execução.
o Processos executam na ordem de chegada (de acordo com uma fila simples).
o Não preemptivo. Quando um processo entra na CPU, ele a utiliza sem ser interrompido.
o Foi inicialmente implementado em sistemas batch (Tipo de processamento de dados em lote que
não depende da interação com o usuário).
• Vantagens:
o Fácil de aprender e de programar.
• Desvantagens:
o Difícil prever o início da execução de um processo.
o Processos CPU-bound de menor importância podem prejudicar I/O-bound mais prioritários.
2. Escalonamento SJF (Shortest Job First - Tarefa mais curta primeiro)
• Características:
o Algoritmo não preemptivo.
o Prioriza o processo com menor tempo de execução no estado pronto.
o Reduz o tempo médio de espera em comparação ao FIFO.
• Funcionamento:
o Cada processo é associado ao seu tempo de execução estimado.
o A CPU é alocada ao processo com menor tempo estimado.
• Vantagens:
o Beneficia processos de curta duração.
o Melhora a eficiência ao diminuir o tempo médio de retorno.
• Desvantagens
o Dificuldade de estimativa: Complicado determinar quanto tempo de CPU cada processo necessita
para terminar seu processamento, especialmente em ambientes de desenvolvimento.
o Menos adequado para sistemas interativos e dinâmicos.
• Exemplo: Quatro tarefas com tempos de execução: A (14 min), B (8 min), C (6 min), D (4 min).
o Ordem FIFO: Tempo médio de retorno: 24 minutos. (ordem de chegada)
o Ordem SJF: Tempo médio de retorno: 16 minutos. (ordem do menor para o maior)
• Contexto de Uso: Utilizado em sistemas batch iniciais.
3. Escalonamento SRTN (Shortest Remaining Time Next - Tempo restante mais curto em seguida)
• Características:
o Algoritmo de escalonamento preemptivo.
o Prioriza o processo com menor tempo de execução restante.
o Requer conhecimento prévio do tempo de execução dos processos.
• Vantagens: Bom desempenho para tarefas curtas.
• Desvantagens: Complexidade maior devido à necessidade de preempções frequentes.
4. Escalonamento Cooperativo
• Características:
o Algoritmo de escalonamento não preemptivo.
o O processo que já está em execução por determinado tempo, é voluntariamente liberado pela CPU,
retornando para a fila de processos prontos.
o A liberação da CPU é uma tarefa realizada exclusivamente pelo processo em execução, que a libera
para um outro processo
o Não existe nenhuma intervenção do sistema operacional na execução do processo.
• Vantagens: Simples de implementar.
• Desvantagens: Problemas com processos mal escritos ou em loop, que podem monopolizar a CPU.
5. Escalonamento Circular (Round Robin)
• Características:
o Algoritmo de escalonamento preemptivo.
o Similar ao FIFO, mas utiliza um tempo limite (quantum ou time-slice) para cada processo em
execução.
o Quando o quantum expira, o processo volta ao estado pronto, e outro é escalonado no intervalo de
tempo determinado pelo quantum.
o A fila de processos prontos é tratada como circular.
o Em geral, o quantum varia de 10 a 100ms.
• Configuração do quantum:
o Muito pequeno: Gera excesso de overhead administrativo.
o Muito grande: Prejudica a interatividade, aumentando o tempo de espera dos processos.
• Benefícios:
o Garante que nenhum processo monopolize a CPU.
• Problema principal:
o Não diferencia entre processos I/O-bound e CPU-bound.
o Processos CPU-bound tendem a monopolizar a CPU, enquanto I/O-bound enfrentam longos
períodos de espera.
6. Escalonamento por Prioridade
• Limitações do Escalonamento Circular
o Melhora a distribuição do tempo de CPU em comparação aos algoritmos não preemptivos.
o Porém não implementa um compartilhamento equitativo entre diferentes tipos de processos.
• Solução: Escalonamento por Prioridade
o Processos I/O-bound recebem vantagens no escalonamento para compensar o tempo excessivo no
estado bloqueado.
o Há a necessidade de diferenciar o tratamento de processos de acordo com a prioridade para maior
eficiência.
o Prioridades são atribuídas aos processos:
▪ Processos de maior prioridade têm preferência no uso da CPU.
• Funcionamento:
o Cada processo recebe uma prioridade para diferenciar o tratamento.
o Processos de maior prioridade são escalonados preferencialmente.
o Preempção ocorre periodicamente por interrupções de relógio, reavaliando prioridades,
caracterizando-o como algoritmo de escalonamento preemptivo.
• Esquemas de prioridade: Todos os sistemas de tempo compartilhado utilizam esquemas de prioridade
associados ao contexto de software do processo, podendo ser classificadas como:
o Estática: Prioridade fixa durante a existência do processo; simples, mas pode aumentar o tempo de
resposta.
o Dinâmica: Prioridade ajustada com base no tipo de processamento ou carga do sistema.
▪ Características da Prioridade dinâmicas:
➢ Processos que saem do estado bloqueado recebem um aumento na prioridade, favorecendo
os processos I/O-bound.
➢ Prevenção de