Estudo de Caso 1: UNIX e LINUX
10.1 História do Unix
10.2 Visão geral do Unix 10.3 Processos no Unix
10.4 Gerenciamento de memória no Unix 10.5 Entrada/Saída no Unix
10.6 O sistema de arquivos do Unix 10.7 Segurança no Unix
Sistemas Operacionais II
Material adaptado de: TANENBAUM, Andrew S. Sistemas Operacionais Modernos. 2ª edição. Disponível em: http://www.prenhall.com/tanenbaum_br
História do UNIX e do Linux
• UNICS
– MULTICS (pesquisadores Mit e Bell Labs)
– Bell Labs abandona o projeto
– Ken Thompson escreve UNICS (assembly), posteriormente grafado UNIX
História do UNIX e do Linux
• UNIX PDP-11
– Sucesso leva Unix para PDP-11
– Resolve-se utilizar linguagem de alto nível
– Thompson propõe e escreve B
– Falta de recursos de B leva Ritchie a produzir e implementar sua sucessora: C
– C possuía compilador excelente
– Linguagem certa no momento certo
– Tomou conta de universidades, onde sofreu grandes melhorias
História do UNIX e do Linux
• UNIX Portátil
– Portabilidade mais fácil devido ser escrito em C
– Interdata 8/32 foi o primeiro depois dos PDP´s
– Nasce a rede Unix
– Com a dissolução da AT&T (detentora dos
direitos do Unix), ela ativa uma subsidiária que lança a primeira versão comercial do Unix, o System III
– Um ano depois é lançado o System V devido a pouca aceitação do System III
História do UNIX e do Linux
• UNIX de Berkeley
– Universidade da Califórnia em Berkeley, de posse da Versão 6 do Unix e com vários
incentivos propõe inúmeras melhorias como uso de memória virtual e paginação, melhorias no tratamento de sinais, nomes de arquivos
superiores a 14 caracteres, etc.
– Conhecido com BSD
– Introduziu vários programas utilitários como vi, compiladores Pascal e Lisp
História do UNIX e do Linux
• UNIX Padrão
– System V e BSD totalmente incompatíveis
– Dificuldades no desenvolvimento de programas para Unix
– Várias tentativas de padronização frustradas
– IEEE com o projeto POSIX propõe 1003.1 (intersecção do System V e do BSD)
História do UNIX e do Linux
• MINIX
– Lançado em 1987, foi desenvolvido por Andrew S. Tanenbaum, visava ser um código simples, compreensível e de fins educacionais
– Baseado no projeto de micronúcleo
– Em 2004, a versão 3 priorizou ainda mais a
modularização, buscando se tornar um sistema extremamente confiável. Deixa de ser voltado para a área educacional e passa a ser um sistema altamente confiável.
História do UNIX e do Linux
• Linux
– Lançado em 1991 por Linus Torvalds, a versão 0.01 era um sistema de produção completo que abrangia áreas que o MINIX não atendia.
– Duas GUIs diferentes (KDE e Gnome)
– Se tornou um clone poderoso do Unix
– Teve como maior impulso uma disputa judicial entre a AT&T e a Universidade da Califórnia que retirou o FreeBSD (sistema maduro e estável,
com grande multidão de seguidores desde 1977) do mercado por algum tempo
Objetivos do Linux
• Princípio da surpresa mínima
– ls A*
– rm A*
• Fazer somente uma coisa, mas fazê-la bem
feita (desempenho e flexibilidade)
• Evitar redundância inúteis
Linux
Interfaces para o Linux
• A maioria das distribuições do linux para PC substitui a interface orientada para teclado, pela
interface orientada para mouse, sem modificar o SO. • As interfaces gráficas, são semelhantes as já
existentes, e englobam conceitos como arrastar e soltar, clique para executar programas, etc.
Interfaces para o Linux
• Estas interfaces gráficas são executadas pelo
Sistema X Window, comumente chamado X11 ou simplesmente X
• Além dos recursos oferecidos pela interface gráfica, usuários podem optar pela emulação de um terminal
Programas Utilitários do Linux
Núcleo do Linux
Processos no Linux
• As entidades ativas no Linux são os processos • Cada processo executa inicialmente um único
programa e uma única thread
• Threads podem ser criadas posteriormente • O Linux é um sistema multiprogramado
Processos no Linux
• Fork cria novos processos no linux, retornando 0 para filho e PID do filho para o processo pai.
• Processos comunicam através de canais
chamados pipes ou através de sinais
• Processos só podem emitir sinais para seu grupo de processos, ou seja, seus parentescos.
Chamadas ao Sistema para
Gerenciamento de Processos
• O processo progenitor (pai) cria processos
progénitos (filhos), os quais, por sua vez, criam outros processos, formando uma árvore de
processos.
• O filho criado pela chamada ao sistema fork() duplica o espaço de memória do pai.
• Pai e filho(s) executam concorrentemente a partir da instrução a seguir o fork()
• A função fork() devolve valores diferentes para o processo pai e processo filho permitindo
assim o programa pode tomar varias linhas de ação através de uma instrução de controle (if)
Chamadas ao Sistema para
Gerenciamento de Processos
Chamadas ao Sistema para
Gerenciamento de Processos
Processos no UNIX
Sinais POSIX
Chamadas ao Sistema para
Gerenciamento de Processos
s é um código de retorno pid é um ID de processo
Shell do POSIX
Implementação de processos no Linux
Informações da tabela de processos
• Parâmetros de escalonamento
– Prioridade, qtde de tempo de CPU
• Imagem da memória
– Ponteiros para suas tabelas de páginas
• Sinais
– Sinais que estão sendo ignorados, capturados, etc.
Implementação de processos no Linux
Informações da tabela de processos
• Registradores de máquina
– Local que salva as informações quando ocorre um desvio de execução para o núcleo
• Estado da chamada de sistema
– Informações sobre a chamada de sistema (parâmetros e resultados)
• Tabela de descritor de arquivo
– Informações que indicam onde estão os descritores de arquivos (i-node)
Implementação de processos no Linux
Informações da tabela de processos
• Contabilidade
– Tempo gasto de CPU em modo usuário e durante chamadas de sistemas
• Pilha do Núcleo
– Pilha fixa a ser usada pela parte do núcleo do processo
• Miscelânia
– Estado do processo atual (está esperando evento?, PID, PID do pai, etc)
Implementação de processos no Linux
Copy on write (copiar-se-escrita)
• Técnica utilizada nos sistemas Linux para reduzir custos com cópias de memória do processo pai para processo filho
• Consiste em inicialmente apontar as tabelas de página do filho para as tabelas do pai, e só alocar novos espaços de memória se alguma escrita for solicitada
O Comando ls
Flags para o clone do Linux
Bits do mapa de bits sharing_flags
Escalonamento no Linux
O Linux distingue 3 classes de threads para questões de escalonamento:
• FIFO em tempo real
– Não preemptivel exceto por outra thread de FIFO de tempo real
• Chaveamento circular em tempo real
– Semelhantes aos anteriores, porém preemptíveis e associados ao
quantum de tempo • Tempo compartilhado
– Classe de prioridade mais baixa
A palavra tempo real vêm do padrão P1003.4 (extensões de „tempo real‟ para UNIX)
Escalonamento no Linux
Possui uma fila de execução (runqueue) que mantém dois vetores:
• Ativo
• Threads na fila de execução
• Expirado
• Threads que já foram executadas e tiveram seu quantum de tempo expirado antes de concluírem suas tarefas
Escalonamento no Linux
Quando o vetor de ativos está vazio, é feito uma varredura no vetor de expirados para que as threads passem a fazer parte do vetor de ativos e vice-versa
• Objetivo de evitar a inanição em threads de baixa prioridade
• Exceto quando threads FIFO de tempo real tomem todo o tempo da CPU
Inicializando o Linux
Passos para inicialização
1. BIOS executa POST (Power-On-Self-Test) e detecta e inicializa dispositivos
2. Lê e executa MBR
3. Executa o programa boot
4. Lê o diretório raiz do dispositivo de boot
5. Lê o núcleo no SO e transfere o controle para ele.
6. Cálculo de RAM, desabilitação de interrupção e habilitação de MMU, etc.
Inicializando o Linux
Passos para inicialização
7. Chama a rotina main em C para iniciar a parte principal do SO
8. Inicializações lógicas
9. Processo de detecção e auto configuração de drivers e dispositivos
10.Alocar processo 0, ajustá-lo e executá-lo
(programação do relógio, montagem do
sistema de arquivos raiz, criação do init e do
Inicializando o Linux
Passos para inicialização
11.Verifica se o sistema é mono ou multi-usuário 12.Login
13.Senha
14.Se ok, carrega shell do usuário, senão senha novamente
Inicializando o Linux
A seqüência de processos usada para iniciar alguns sistemas Unix
Gerenciamento de Memória
O espaço de endereçamento de um processo consiste de 3 segmentos:
• Código
– Código executável do programa
– Imutável
• Dado
– Variáveis do programa
– 2 partes: dados inicializados e não incializados (BSS)
– Página zero estática
• Pilha
– Variáveis de ambiente
Gerenciamento de Memória
a) Espaço de endereçamento virtual do processo A b) Memória física
Gerenciamento de Memória
Se mesmo programa executando duas vezes:
– Segmentos de códigos compartilhados
– Dados e pilhas nunca são compartilhados, exceto quando um fork é executado
Arquivos mapeados na memória
– Mapeamento de arquivos em parte do espaço de endereçamento do processo
– Leitura de vetor de bytes na memória ao invés de chamadas E/S
– Dois ou mais processos podem mapear o mesmo arquivo
Arquivos Mapeados em Memória
Chamadas ao Sistema para
Gerenciamento de Memória
• s é um código de retorno (-1 se erro) • a e addr são endereços de memória • len é um comprimento
• prot controla proteção
• flags arquivo privado/compartilhado, addr obrigatório/sugestão
• fd é um descritor de arquivo
Gerenciamento de Memória Física
no Linux
3 tipos de zonas de memória: • ZONE_DMA
– Zonas para operações de DMA
• ZONE_NORMAL
– Páginas de mapeamento normal
• ZONE_HIGHMEN
– Endereços de memória alto
– Não são permanentemente mapeados
Gerenciamento de Memória Física
no Linux
Na versão Alpha o Linux utilizava tabelas de páginas de três níveis
Gerenciamento de Memória Física
no Linux
A partir da versão 2.6.11 o Linux passou a utilizar o esquema de 4 níveis para se tornar
Linux suporta diversos mecanismos de alocação: • Algoritmo do companheiro
– Vetor contém as cabeças de listas de blocos com tamanhos de 0, 2, 4... Unidades (múltiplos de 2)
– Fácil localização de um bloco
– Muita fragmentação
• Alocador de fatias
– Obtém blocos com algoritmo do companheiro
– Divide-os em fatias (unidades menores)
– Gerencia as fatias separadamente
– Fatias podem estar cheias, parcialmente cheias ou vazias.
Mecanismos de Alocação de
Memória
Operação do algoritmo companheiro (buddy)
Mecanismos de Alocação de
Memória
• Unix confiava em um processo trocador que movimentava processos inteiros entre memória e disco
• O Linux passou a trabalhar com páginas
• Daemon de paginação (processo 2) verifica e faz alocação e liberação de memória física de acordo com a demanda
• Segmentos de textos e arquivos mapeados são paginados para seus arquivos no disco
• O restante vai para uma área de troca (arquivos de paginação de tamanho fixo)
• Páginas são alocadas no dispositivo ou partição de paginação somente quando são necessárias
• O Linux tenta manter algumas páginas livres de forma que elas possam estar disponíveis quando necessárias
• Esse grupo é constantemente renovado
• Algoritmo de Recuperação de Molduras de Páginas (PFRA) é responsável por esta tarefa
Algoritmo de Recuperação de
Molduras de Páginas
Linux distingue 4 tipos de páginas: • Não recuperáveis
– Não podem ser excluídas da memória
• Trocável
– Devem ser escritas de volta, antes de serem solicitadas
• Sincronizável
– Devem ser escritas no disco se estiverem sujas
• Descartável
– Podem ser imediatamente solicitadas
Algoritmo de Recuperação de
Molduras de Páginas
• Cada vez que o PFRA é executado ele tenta recuperar as páginas mais fáceis, para em seguida recuperar as mais difíceis.
• Se uma página for inválida, estiver bloqueada, sendo usada para DMA, etc. ela é ignorada
Algoritmo de Recuperação de
Molduras de Páginas
• O linux integra dispositivos de E/S no sistema de arquivos, chamando os de arquivos especiais
• Estes arquivos podem ser acessados da mesma forma que arquivos comuns
• Arquivos especiais são divididos em duas categorias: bloco e caracteres
• Arquivos especiais de bloco consistem em uma sequência de blocos enumerados, onde cada bloco pode ser acessado individualmente.
• Arquivos especiais de caractere são empregados em dispositivos em que a E/S ocorre em forma de fluxo de caracteres.
• Associado a cada arquivo especial existe um driver que por sua vez possui um número de dispositivo principal (talvez um secundário também, se dispositivo >= 2) que identifica o dispositivo
• O conceito de transmissão em rede do linux foi copiado quase que literalmente do Unix
• Trabalha com o conceito de soquete
• Cada soquete dá suporte a um tipo específico de transmissão em rede:
– Fluxo confiável de bytes orientado a conexão (protocolo TCP – padrão)
– Fluxo confiável de pacotes orientado a conexão
– Transmissão não confiável de pacotes (protocolo UDP – padrão)
Transmissão em Rede
Chamadas de Sistema para E/S no Linux
As principais chamadas do POSIX para o gerenciamento de terminal:
• As 4 primeiras ajustam a velocidade do terminal. Ex: ADSL
• As 2 últimas são usadas para configuração, interrupção de processos, tratar o fluxo de controle, etc.
Implementação de E/S no Linux
Algumas operações de arquivos para dispositivos de caracteres típicos
Implementação de E/S no Linux
O Sistema de E/S é dividido em 2 partes:
• Manipulador de arquivos especiais de bloco
– Minimizar o nº de transferências: cache
– Reduzir a latência de movimentos repetidos da cabeça do disco: escalonador de E/S
• Escalonador do elevador de Linus (causa inanição)
• Versão revisada do escalonador inclui duas listas adicionais que mantém as operações de r/w ordernadas pelo prazo
• Manipulador de arquivos especiais de caracteres
Módulos no Linux
• Durante décadas, os drivers de dispositivos UNIX eram estaticamente ligados ao núcleo
– Cada centro computacional construía um núcleo
– Se um novo dispositivo fosse adquirido ele religava o núcleo
– Funcionou bem nas estações de trabalho
• Com a chegada do Linux para PC a quantidade de dispositivos de E/S é muito grande e tudo mudou
– Usuários embora tenham acesso ao código fonte, sente
dificuldades para incluir e atualizar drivers e religar o núcleo
– Surgem os módulos carregáveis (blocos de códigos que podem
Módulos no Linux
• Tarefas realizadas durante o carregamento de um módulo:
1. Realocação dinâmica durante o carregamento
2. Verificar se recursos estão disponíveis
3. Vetores de interrupção necessários devem ser ajustados
4. Tabela de drivers deve ser ajustada para tratar deste novo tipo de dispositivo
5. Driver executado para inicializar as características específicas do dispositivo que forem necessárias
• Quando as 5 etapas forem concluídas o driver estará totalmente instalado.
O Sistema de Arquivos do Linux
• Origem com o MINIX
– Busca por melhorias
• Ext
– 255 caracteres e 2 GB
• Ext2
– Melhorias na capacidade e nos nomes dos arquivos
– Principal sistema de arquivos por vários anos
• Suporte a vários sistemas utilizando VFS (Virtual File System
O Sistema de Arquivos do Linux
Características
• 255 caracteres
• Não faz distinção entre arquivos ASCII e binários
• O proprietário conhece o arquivo, o sistema não se preocupa com isso
• Qualquer caractere é aceito, exceto NUL
O Sistema de Arquivos do Linux
Características
• Diretórios podem ser usados por conveniência • Utiliza “/” (barra) para separar diretórios
• Permite caminhos relativos e absolutos • Permite a criação de links
• Permite arquivos especiais para mapear dispositivos de bloco e caractere
O Sistema de Arquivos do Linux
Diretórios
Alguns diretórios importantes encontrados na maioria dos sistemas Linux
(a) Antes da ligação (b) Depois da ligação
O Sistema de Arquivos do Linux
Links
(a) Sistemas de arquivos separados. Ex: Windows 98 (b) Após a montagem. Ex: Linux
O Sistema de Arquivos do Unix
Mapeamento de Arquivos Especiais
Arquivos com Impedimento
(a) Arquivo com um impedimento
(b) Adição de um segundo impedimento
(c) Um terceiro impedimento
• Permite travamento de arquivos refinado • Dois tipos de travamento
• Compartilhado
Chamadas ao Sistema para
Gerenciamento de Arquivos
• s é um código de retorno
• fd é um descritor de arquivo
A Chamada ao Sistema stat
Chamadas ao Sistema para
Gerenciamento de Diretório
• s é um código de retorno • dir identifica um diretório
Sistema de Arquivos do Linux
VFS (Virtual File System)
• Superbloco
– Sistema de arquivos específicos
– read_inode, sync_fs
• Dentry
– Representa uma entrada de diretório
– create, link
• I-node
– Descreve um arquivo
– d_compare, d_delete
• Arquivo
– Representação na memória de um arquivo aberto
Sistema de Arquivos do Linux
ext2 (2º sistema de arquivos estendido)• Bloco 0
– Não usado
– Contém código para inicialização do sistema
• Depois dele, a partição é dividida em grupos de blocos, onde cada um contém:
– Superbloco
• Informações sobre a organização do sistema de arquivos
– Descritor de grupo
• Informações sobre a localização do mapa de bits, o nº de blocos livres
Esquema do sistema de arquivos Ext2 do Linux
Sistema de Arquivos do Linux
ext2 (2º sistema de arquivos estendido)Estrutura do i-node no Linux
Sistema de Arquivos do Linux
ext2 (2º sistema de arquivos estendido)A relação entre a tabela de descritores de arquivos, a tabela de descrição de arquivos abertos e a tabela de i-nodes
Sistema de Arquivos do Linux
ext2 (2º sistema de arquivos estendido)• Altamente compatível com o ext2
• Trabalha com uma espécie de diário onde todas as operações realizadas são descritas em sequência, até que tenham sido concluídas
• Utiliza um dispositivo de blocos para diário (JBD) para controlar as operações de r/w no diário. Este por sua vez suporta 3 operações:
– Registro de diário
– Gerenciador de operações atômicas
– Transação
Sistema de Arquivos do Linux
ext3 (sistema de arquivos com diário)• Consiste basicamente em criar diretórios dentro de /proc para cada processo em execução
• O nome do diretório é o número PID do processo em decimal
• Dentro deste diretório ficam os arquivos quem contém informações acerca deste processo
Sistema de Arquivos do Linux
/proc (processo)
1. Quais as vantagens de se utilizar módulos no linux?
2. Cite pelo menos 4 características do sistema de arquivos do linux.
3. Quais são os tipos de travamento permitidos pelo Linux. Comente sobre eles.
4. Comente sobre o funcionamento do sistema de arquivos ext3.
NFS - Sistema de Arquivos
em Rede
a) Exemplos de sistemas de arquivos montados remotamente
NFS - Sistema de Arquivos
em Rede
• Utiliza 2 protocoloas cliente-servidor
• O primeiro trata da montagem de diretórios
– Retorna um controle de arquivo se caminho for válido
– Esse controle identifica de modo único o sistema de arquivo, o disco, o i-node e
as informações de segurança
– Permite montagem estática ou a automontagem
• O segundo é para acesso a arquivos e diretórios
– Suporta as chamadas do sistema Linux, exceto as chamadas open e close
– Utiliza lookup para substituir a chamada open
– Tem a vantagem de não copiar qualquer informação para as tabelas do sistema.
– A chamada read tem os parâmetros: controlador do arquivo, deslocamento no
arquivo e nº de bytes a ser lido
– Um servidor com essas caracterísiticas é conhecido como sem estado (stateless)
– Servidores sem estado, não podem utilizar os travamentos, por isso utilizam a
A estrutura em camadas do NFS
NFS - Sistema de Arquivos
em Rede
Segurança no Linux
Alguns exemplos de modos de proteção de arquivos
OBS:
x em arquivo = execução x em diretório = busca
Chamadas ao Sistema para
Segurança no Unix
• s é um código de retorno
• uid e gid são o identificador de usuário UID e o identificador de grupo -GID, respectivamente