domingo, 28 de novembro de 2010

Sistemas de arquivos

SISTEMAS DE ARQUIVOS


Um sistema de arquivos é uma coleção de arquivos e diretórios mais as operações sobre eles. Sua funcionalidade apresenta-se da seguinte forma: os arquivos podem ser lidos e escritos; os diretórios podem ser criados e destruídos; os arquivos podem ser movidos de um diretório para outro.
Os sistemas de arquivos mais famosos usados no Windows são FAT e NTFS. As diferenças entre eles e suas variações são:

FAT - é uma tabela de alocação de arquivos que organiza os arquivos através de tabelas. Os endereços vão para a tabela do FAT, endereçado por um número inteiro.
Um dos problemas que geralmente acontece é que possui um limite de tamanho de arquivo que é menor que o tamanho do disco e tem também o tamanho máximo por arquivo. Se for maior ele não grava e é perdido estas informações. Ele não dá suporte as permissões de vários usuários.

NTFS - oferece maior segurança para o usuário no próprio sistema de arquivos. Permite definir permissões de arquivos para ler , escrever, alterar suporte no próprio sistema de arquivos para cada usuário. Possui a técnica Jourmalling que recupera o arquivo que por algum motivo não foi salvo, exemplo: falta de luz, ele restaura o arquivo. Compressão, compacta o arquivo e continua trabalhando. Define uma limitação de uso de disco para cada usuário, isto é uma cota para cada usuário.




Ext 2, Ext3, Ext4, Reiserfs e Swap

Os sistemas de arquivos mais famosos usados no Linux são ext (2, 3,4), reiserfs e swap.

O Sistema de Arquivos é criado durante a "formatação" da partição de disco (quando se usa o comando mkfs.ext3). Após a formatação toda a estrutura para leitura/gravação/permissões de arquivos e diretórios pelo sistema operacional estará pronta para ser usada. Normalmente este passo é feito durante a instalação de sua distribuição GNU/Linux.

Cada sistema de arquivos tem uma característica em particular mas seu propósito é o mesmo: Oferecer ao sistema operacional a estrutura necessária para ler/gravar os arquivos/diretórios.


  • Ext2 - Usado em partições Linux Nativas para o armazenamento de arquivos. É identificado pelo código 83. Seu tamanho deve ser o suficiente para acomodar todo os arquivos e programas que deseja instalar no GNU/Linux (você encontra isto no manual de sua distribuição). Você deverá usar preferencialmente o ext3 para a instalação de seu sistema operacional.
  • Ext3 - Este sistema de arquivos possui melhorias em relação ao ext2, como destaque o recurso de jornaling e suporte a arquivos de até 16Gb. Ele também é identificado pelo tipo 83 e totalmente compatível com o ext2 em estrutura. O journal mantém um log de todas as operações no sistema de arquivos, caso aconteça uma queda de energia elétrica (ou qualquer outra anormalidade que interrompa o funcionamento do sistema), o fsck verifica o sistema de arquivos no ponto em que estava quando houve a interrupção, evitando a demora para checar todo um sistema de arquivos (que pode levar minutos em sistemas de arquivos muito grandes).
  • O Ext4 - é um sistema de arquivos do Linux desenvolvido para ser o sucessor do Ext3 a partir de 2006. Ext4 usa uma técnica de execução do sistema de arquivos chamado atribuir-on-flush , também conhecida como a atribuição de atraso. Isso melhora o desempenho e reduz a fragmentação , melhorando a alocação de blocos decisões com base no tamanho do arquivo.O sistema de arquivos ext4 é compatível com o ext3 e ext2. Isto irá melhorar o desempenho já ligeiramente, porque alguns novos recursos do ext4 também pode ser usado com ext3 e ext2, tal como o novo algoritmo de alocação de blocos.
O sistema de arquivos ext4 permite pré-alocação de espaço em disco para um arquivo. Um novo fallocate () chamada de sistema foi adicionado ao kernel do Linux para uso de sistemas de arquivos, incluindo ext4 e XFS , que têm essa capacidade.


Reiserfs: Sistema de arquivos com suporte a Journaling que usa árvores B* além de usar um único bloco para metadados e dados quando possível.
Swap: Sistema de arquivos focado em fornecer suporte ao mecanismo de swapping para extensão da memória principal usando o disco.

    Particionamento de Disco Rígido
Uma partição simula um ou mais Hds para o SO, ou seja pode-se ter apenas um Hd de 80 GB e particioná-lo em em dois de 40 GB fazendo com que o SO “pense” que tem dois Hds de 40 GB.
Exstem dois tipos de partições: primaria e estendida.
Partição Primária:
Permite-nos instalar o SO. Esta partição não pode ser subdividida. Em um Hd pode-se ter no máximo quatro partições primárias.
    Partição Estendida: A partição estendida usa o espaço livre do Hd e pode ser subdivididas , mas não é possível instalar SO.
    No Windows o software mais famoso para controle de particionamento é o fdisk.


Get a Voki now!

Desfragmentador -  Windows
Scandisk - Windows






Get a Voki now!



Simulação do MS-DOS no ambiente Linux e Windows
 


 GERENCIAMENTO DE DISPOSITIVOS

Gerenciadores de dispositivos são softwares responsáveis pela transformação de sinais diversos de dispositivos em sinais compreensíveis pelo sistema operacional, bem como detecção de falhas nos mesmos.
Exemplos práticos incluem os gerenciadores de dispositivos USB presentes no Linux e no Windows, que cuidam da parte da comunicação entre o dispositivo e seu respectivo driver, e gerenciadores de captura de imagem, que cuidam da transformação de sinais diversos de dispositivos em um stream para ser processado em sequência.


Um controlador de dispositivo é um código que utiliza um sistema operativo para controlar dispositivos de disco, placas gráficas, mouse ou trackball, modens, faxes, impressoras e outro hardware de entrada.
Sua função é converter o fluxo serial de bits em um bloco de bytes e executar toda a correção de erro necessária. O bloco de bytes é normalmente montado, bit a bit, em um buffer dentro do controlador. Após sua soma de verificação (checksum) ter sido checada e o bloco declarado estar livre de erros, ele pode então ser copiado para a memória principal.


DMA
O recurso DMA permite que outros componentes também acessem a memória RAM diretamente, como discos rígidos, o que aumenta o desempenho na transferência de grande quantidade de dados.
Existem 8 canais de DMA, numerados de 0 a 7. Os canais de 0 a 3 são herança do PC original e trabalham a 8 bits, assim como o barramento externo no processador 8080. Os canais de 4 a 7 foram introduzidos com o 286 e, acompanhando o barramento de dados do processador, são canais de 16 bits. Os canais de DMA são relacionados ao barramento ISA e, justamente por isso, nunca foram introduzidos canais de 32 bits. Ao invés disso, o barramento PCI (seguido pelos demais barramentos modernos), trouxe o Bus Mastering, um sistema muito mais eficiente e rápido.


DRIVERS
Um driver de dispositivo simplifica a tarefa da aplicação atuando como um tradutor entre o dispositivo e as aplicações ou o SO.
O código de alto nível das aplicações pode ser escrito independentemente do dispositivo que será utilizado. Qualquer versão de um dispositivo, como uma impressora, requer os seus próprios comandos. Entretanto, a maioria das aplicações acedem aos dispositivos usando comandos genéricos de alto-nível, como println, que imprime um texto. O driver converte esses comandos genéricos e converte para um código de baixo-nível interpretado pelo dispositivo. Em uma melhor tradução: um driver (do verbo to drive) opera ou controla um hardware, ou seja, é o meio de comunicação do hardware.




USB
USB é a sigla para Universal Serial Bus. Tecnologia que tornou mais simples, fácil e rápida a conexão de diversos tipos de aparelhos (câmeras digitais, HDs externos, pendrives, mouses, teclados, MP3-players, ) ao computador, evitando assim o uso de um tipo específico de conector para cada dispositivo.
O funcionamento dos cabos USB contam com quatro fios internos: VBus (VCC), D+, D- e GND. O primeiro é o responsável pela alimentação elétrica. O segundo e o terceiro são utilizados na transmissão de dados (a letra "D" provém de data, dado em inglês). O quarto, por sua vez, é para controle elétrico, servindo como "fio-terra".
A comunicação entre os dispositivos conectados via USB é feita através de um protocolo. Nele, o host, isto é, o computador ou o equipamento que recebe as conexões, emite um sinal para encontrar os dispositivos conectados e estabelece um endereço para cada um deles. Uma vez estabelecida a comunicação, o host recebe a informação de que tipo de conexão o dispositivo conectado utiliza.
Há quatro possibilidades:
  • Bulk: esse tipo é utilizado por dispositivos que lidam com grandes volumes de dados, como impressoras e scanners, por exemplo. O Bulk conta com recursos de detecção de erro para garantir a integridade das informações transmitidas;
  • Control: tipo utilizado para transmissão de parâmetros de controle e configuração do dispositivo;
  • Interrupt: tipo utilizado para dispositivos que transferem poucos dados, como mouses, teclados e joysticks;
  • Isochronous: esse tipo é aplicado em transmissões contínuas, onde os dados são transferidos a todo o momento, razão pela qual não há recursos de detecção de erros, já que isso atrasaria a comunicação. Dispositivos como caixas de som utilizam esse modo.
O SO gerencia os dispositivos USBs através de drivers de dispositivos.


Gerenciamento de dispositivos do SO Windows:
  • Controladores de som, vídeo e jogo;
  • Controladores USB ( barramento serial universal);
  • Dispositivos de imagens.
Gerenciamento de dispositivos do SO Linux
  • Hotplug
  • Coldplug
  • Devfs
CODEC
  
Codificador/Decodificador (ou Compressor/Decompressor). Os filmes salvos em formatos como avi, mpeg e wmv são comprimidos e o Windows Media Player tem que reconhecer o algoritmo usado na compressão para poder reproduzir o vídeo. Entre os algoritmos possíveis de serem usados estão o VP3, Indeo 3.2, Indeo 4.4, Indeo 5, DivX, Cinepak, Microsoft Video 1, ClearVideo e TrueMotion, só para citarmos alguns.
Quando executado algum vídeo e não houver sucesso, significa que o player não possui o codec ( algorítimo usado para a compressão do vídeo) por isso ele não consegue executar.

 INSTALAÇÃO DO SO E DISPOSITIVOS

Quando é realizada a instalação do SO ela tem relação direta com o gerenciador de dispositivos, este normalmente está associado a um Sistema Operacional específico, portanto a instalação de um novo SO também causa a instalação de um novo gerenciador de dispositivos.
    O processo de instalação de algum dispositivo como impressora, mouse, máquina fotográfica apresenta-se da seguinte forma:
    No Windows, um dispositivo pode ser detectado automaticamente, por exemplo, um mouse USB provavelmente não necessitará de maior atenção do usuário, caso o sistema não reconheça o dispositivo, deve-se baixar um driver compatível e seguir as instruções de instalação, o que tipicamente copia DLLs para pastas apropriadas e cria entradas nas tabelas de referência.
    No Linux o procedimento é similar, porém ao invés de DLLs são criados arquivos SO (Shared
     Object) e o usuário geralmente deve estar logado como root.    
    GERENCIAMENTO DE MEMÓRIA
      Os tipos de gerenciamento de memória utilizado no Windows e no Linux são os mesmos que a paginação por demanda.
    O gerenciador está dividido em quatro tipos de memória: swapping, segmentação, paginação e virtual.
    Swapping:
    • Acontece quando a memória principal está cheia ou é realizada a troca de contexto;
    • Quando a memória está cheia o SO armazena as informações em disco;
    • Swap é a troca de informações entre a memória principal (MP) e o disco;
    • Quando ocorre o swap o SO deve sincronizar as informações armazenadas na MP e o disco;
    • O swapping é alocado, ou seja, é partilhado entre a memória e o disco;
    • Na sua instalação ele é obrigatoriamente instalado no Linux, porque o Linux tem diferentes sistemas de arquivos para o swapping.
    Segmentação:
    • Permite que o usuário veja a memória como uma coleção de segmentos com um nome e um tamanho;
    • O usuário deve implicitamente ou explicitamente especificar o nome do segmento e o deslocamento;
    • Memória alocada: a palavra (words) e organizada em segmentos;
    • Endereços lógicos bidimencionais: (segmento, deslocamento) traduzidos pela MMU em endereços físicos;
    • Espaço de endereçamento dos processos é implementado através de tabelas de segmentos e estes espaços armazenam a base e o tamanho.
    • Dentro da UCP de um computador, o que não vai para a memória principal, segue para os registradores do hardware. Ex: Texto escrever na tela usadas nos registradores assembler.
    • Os registradores locais são utilizados para armazenar dados importantes e resultados temporários. Seu uso é conveniente pois o tempo de acesso à memória principal é muito maior do que o tempo de executar instruções. Também em algumas arquiteturas pelo menos um registrador sempre deve ser operando de uma operação.
    Paginação:
    • Memória física é dividida em frames;
    • Todos os frames tem o mesmo tamanho;
    • A memória lógica ou virtual (programa) é dividida em páginas;
    • Uma página tem o tamanho de um frame;
    • A diferença entre endereço lógico e endereço físico para um programa de computador, é fundamental para entender a alocação de memória baseada em frames e páginas virtuais.
      Não há diferença, todas as transformações necessárias são feitas até o nível do SO.
    • A paginação por demanda deve manter em uma lista quais as páginas que estão na memória e quais estão no disco, ou seja, é necessário saber para poder trocar as páginas da memória para o disco ou vice-versa, conforme a necessidade.
      Algoritmos de substituição de páginas:
      * FIFO (Firts-In First- Out) –
      Caraterística – substitui-se a página há mais tempo na memória.
      Implementação – a tabela de páginas é uma fila FIFO.
      Exemplo:
    Nem sempre se diminui a taxa de falta de página aumentando a memória:

*Algoritmo Ótimo:
Características:
  • A página que não está sendo usada é substiuida por mais tempo;
  • Não implementável (conhecimento do futuro).
    Exemplo:

    * LRU (Least Recently Used)
    Características:
  • A página que há mais tempo não está sendo referenciada é substituta;
  • Usa o passado próximo para estimar o futuro.
    Implementação:
    - É o registrador de tempo para cada página;
    - Bit de referência setado pela MMU, isto é, para cada acesso desloca-se o bit de referência para uma palavra referência. Substitui-se a página com a menor palavra de referência.
    - As páginas se apresentam em lista encadeada.
Exemplo:

Aproximações de LRU
    LFU (Least Frequently Used):
    - Contador de referências é incrementado a cada acesso;
    - A página do grupo de mais baixa ordem é substituída.
     
Memória Virtual:

  • Permite que um processo seja executado sem estar completamente na memória principal;
  • Permite que processos maiores que o tamanho da memória principal sejam executados;
  • Aumenta a utilização da CPU;
  • Diminui o overhead das operações de swapping

     
    Uma tabela de alocação de páginas no Windows é construída da seguinte forma:
    No Windows 2000, todo o processo de usuário tem seu próprio espaço de endereçamento virtual. Os endereços virtuais são de 32 bits de largura; portanto, cada processo tem 4 GB de espaço de endereçamento virtual. Os 2 GB inferiores menos cerca de 256 MB estão disponíveis para o código e para os dados dos processos; os 2 GB superiores mapeam a memória do núcleo de uma maneira protegida. O espaço de endereçamento virtual é paginado sob demanda, com um tamanho fixo de página (4 KB no Pentium).
    O esquema do espaço de endereçamento virtual para três usuários é demostrado abaixo. A parte de baixo e a de cima dos 64 KB do espaço de endereçamento virtual de cada processo normalmente não estão mapeadas. Essa escolha foi intencional, visando auxiliar a identificação de erros de programas. Ponteiros inválidos são, muitas vezes, 0 ou -1, portanto a tentativa de usá-los no Windows 2000 causa um desvio em vez de geral uma leitura de lixo ou, pior ainda, uma escrita em local incorreto da memória.
    Partindo dos 64 KB vêm o código e os dados privados ao usuário. Isso se estende por quase 2 GB. A última região dessa parte de baixo dos 2 GB contém alguns contadores de sistema e temporizadores que são compartilhados, somente para leitura, entre todos os usuários. Torná-los visíveis permitiria aos processos ter acesso a eles, sem a sobrecarga de uma chamada ao sistema.
    Os 2 GB superiores contém o sistema operacional, inclusive código, dados e reservatórios paginados e não paginados (usados para objetos etc.). Os 2 GB superiores são compartilhados entre todos os processos dos usuários, exceto pelas tabelas de páginas, que são as tabelas de páginas de cada processo. Os 2 GB superiores da memória não podem ser escritos e a maior parte não pode nem se quer ser lida pelos processos no modo usuário. O motivo de colocá-la ali é que, ao fazer uma chamada ao sistema, o thread desvia o controle para o modo núcleo e continua executando no mesmo thread. Tornado todo o sistema operacional e todas as suas estruturas de dados (bem como todo processo de usuário) visíveis no espaço de endereçamento do thread, não há necessidade de alterar o mapa de memória ou descarregar a cache quando da entrada no modo núcleo. Tudo o que precisa ser feito é alternar para a pilha do núcleo do thread. O compromisso aqui é entre menos espaço privado de endereçamento por processo e o retorno mais rápido de chamadas ao sistema. Servidores de grandes bancos de dados já se sentem tolhidos, e esse é o motivo pelo qual existe a opção de 3 GB de espaço do usuário no Advanced Server e no Datacenter Server.


    O Linux usa tabela de páginas de três níveis:
    Tabela de Alocação de páginas no Windows
    O esquema do espaço de endereçamento virtual para três processos de usuário. As áreas cinzas são privadas aos processos.
    As várias listas de páginas e as transições entre elas
     

    Alocação de Memória disponíveis no Windows

    A alocação de memória está dividida em duas partes:
  • Alocação Estática: Decisão tomada quando o programa é compilado.
Quando o programa é executado o Sistema operacional lê o mesmo e cria um processo, sendo o programa uma noção estática e o processo o programa em execução, ele é criado em armazenamento primário e após isso recebe um espaço na memória. O espaço de memória é dividido em varias partes, uma das partes se chama segmentos de memória, que armazena dados estáticos, e outro se chama segmento de código que guarda instruções do programa. Quando o programa é executado o registrador PC apontará para determinado endereço do segmento de código do processo, que se chama TEXT. Para que se realize a alocação estática o compilador deve saber o total de memória que está livre, mandar esta informação para o SO para que este crie um segmento de dados.
  • Alocação Dinâmica: Decisão é adiada até a execução. (Permite Swapping)
Os objetos alocados dinamicamente podem ser criados e liberados a qualquer momento, em qualquer ordem, o que difere dos objetos locais das funções, que são criados e destruídos em uma ordem específica. Dado isto, é preciso organizar a memória para objetos dinâmicos de uma forma que possibilite o gerenciamento do tempo de vida dos objetos por parte do programador. A memória reservada para objetos dinâmica costuma ser chamada de heap, existem várias formas de organizar um heap. Em linguagens sem gerenciamento automático(linguagem C), da memória dinâmica, uma organização usual do heap é uma lista encadeada de blocos livres, porém este tipo de organização pode ter problemas devido à fragmentação dos blocos. Já em linguagens com gerenciamento automático de memória dinâmica (Java), a organização do heap depende da parte do sistema de tempo de execução encarregada deste gerenciamento. Este componente é normalmente chamado de coletor de lixo.

Comandos (shell) que podemos utilizar para acompanhar o gerenciamento de memória do Windows
O shell de comando é um software independente que oferece comunicação direta entre o usuário e o sistema operacional. A interface de usuário não gráfica do shell de comando é o ambiente propício para a execução de aplicativos e utilitários baseados em caracteres. O shell de comando executa programas e exibe os dados de saída em uma tela usando caracteres individuais de forma idêntica ao interpretador de comandos do MS-DOS, o Command.com. O shell de comando do Windows XP utiliza o interpretador de comandos Cmd.exe, que carrega aplicativos e direciona o fluxo de informações entre aplicativos, para transformar entradas de usuário em um formato que possa ser compreendido pelo sistema operacional.
Você pode usar o shell de comando para criar e editar arquivos em lotes (também denominados de scripts) e, assim, automatizar tarefas rotineiras. Por exemplo, você pode usar scripts para automatizar o gerenciamento de contas de usuários ou backups noturnos. Você também pode usar o Windows Script Host, CScript.exe, para executar scripts mais sofisticados no shell de comando. O uso de arquivos em lotes possibilita a realização de operações mais eficientes do que através da interface do usuário. Os arquivos em lotes aceitam todos os comandos disponíveis na linha de comando.
Você pode personalizar a janela do prompt de comando para obter uma melhor visualização e aumentar o controle sobre como são executados os programas.

Alocação de Memória disponíveis no Linux

O Linux tem uma forma bastante interessante de gerenciar a memória. O sistema de fato não necessita de muita memória para sua operação e conforme os programas vão sendo abertos, mais memória vai sendo alocada de forma mais eficiente. O sistema lida bem em casos de sobras de memória, utilizando os MBytes livres dos módulos como cache de disco. Cache de disco são porções da memória RAM usadas por arquivos e bibliotecas lidos do HD que têm uma maior probabilidade de serem acessados, uma espécie de Prefetch, o que melhora o desempenho do sistema. É fácil comprovar a eficiência o cache de disco: abra um programa como o Firefox ou o OpenOffice; o primeiro carregamento é demorado, certo? Agora feche o programa e abra-o novamente: levou muito menos tempo, né? Esse recurso está presente também no Windows e no Vista ele foi melhorado. Por isso não se assuste se no Ksysguard do KDE você verificar que sua memória RAM estiver quase que totalmente ocupada, mesmo com poucos programas abertos: é o cache de disco que está em ação usando parte da memória livre que você dispõe.

Além do Ksysguard, temos o Monitor do sistema no Gnome como programas gráficos de monitoramento dos recursos do sistema. Via terminal temos o top e o free. O top detalha os processos em execução além de outras informações como o estado dos processos, memória consumida por cada um, uptime do sistema e recursos de memória. O free (o parâmetro -m exibe as informações em MBytes) exibe informações precisas sobre o uso dos recursos de memória do sistema. Vamos ver ele na prática, no meu caso tenho 2,25GB de RAM física, 2 GB de espaço em disco para a partição SWAP e poucos programas abertos. A distribuição usada é o Debian Etch Kernel 2.6.18-4.


    *  O porquê da alocação de memória.

Quando executamos uma aplicação, o kernel cria uma imagem desta aplicação na memória, geralmente na memória RAM e executa esta aplicação à partir de lá. Se precisarmos executar mais de um processo simultaneamente, teremos que nos perguntar duas coisas:

1.  Possuo espaço suficiente para que uma imagem desta aplicação seja escrita na memória?
2.  É possível referenciar de maneira unívoca cada processo?

      Se não possuirmos espaço suficiente em algum lugar para executar tal aplicação, nada poderá ser feito e se não conseguirmos alocar os processos de maneira unívoca, não se conseguirá referenciá-los sem ambiguidade. Estes são dois problemas básicos da alocação de memória cuja solução tentarei explicitar aqui.


Comandos (shell) que podemos utilizar para acompanhar o gerenciamento de memória no Linux
ps – Listar processos

Lista os processos em execução, apresentando o PID e outras informações sobre o processo, como o comando executado (CMD) e estado atual do processo (STAT).
top – Lista processos em tempo real

Sintaxe: $ top [opções]

Mostra ao usuário os processos ativos no sistema da mesma forma que o ps, mas em tempo real e em uma certa ordem. Por padrão, o top mostra nas primeiras linhas os processos que mais gastam processamento (em porcentagem).