segunda-feira, 6 de dezembro de 2010

Memórias x SO



Linux

Windows

Segmentação

Sim. O 2/6 versão do Linux utiliza segmentação apenas quando exigido pelo 80 x 86 arquitetura.
Todos os processos em execução no Linux usam o mesmo segmentos para abordar instruções e dados;

Sim.

Associa-se a cada área de memória um valor de base e um valor de limite base=endereço inicial, limite=endereço máximo ou tamanho.

Paginação

Sim. As primeiras versões do Unix funcionavam apenas com o swapping. Posteriormente (a partir do release 2.0, aparentemente) foi implementado o paging ao Unix System V. Os sistemas operacionais atuais não utilizam o processo de swap, apenas o Paging, mas é comum que se utilize apenas o termo Swapping (ou Swap) para a definição deste processo, sem a separação entre Paging e Swapping, tratando-os pelo mesmo nome, exceto quando se está estudando estes processos de maneira específica.

Sim. Paginação “Quebra” a memória do processo permitindo espaços de endereçamento não contíguos.

Swapping

Sim. Os sistemas operacionais atuais não utilizam o processo de swap, apenas o Paging, mas é comum que se utilize apenas o termo Swapping (ou Swap) para a definição deste processo, sem a separação entre Paging e Swapping, tratando-os pelo mesmo nome, exceto quando se está estudando estes processos de maneira específica.


Memória Virtual

Sim. Tanto no Linux quanto no Windows o conceito de memória virtual está presente.



Semelhança UCP e Segmentação




A arquitetura x86 em modo real e virtual 8086, usa um processo conhecido como segmentação de endereços de memória, não o modelo de memória plana, usado em muitos outros ambientes. Segmentação envolve a composição de um endereço de memória de duas partes, um segmento e um deslocamento; pontos do segmento até o início de um grupo de 64 KB de endereços, e o deslocamento determina o quão longe desse endereço iniciar o endereço desejado.

A unidade de gerenciamento de memória (MMU) verifica, a cada referência, se o deslocamento é menor que o tamanho do segmento. Se o limite for ultrapassado, é gerada uma exceção e o processo é terminado. Relocação e proteção são obtidas através de um só mecanismo:
if (deslocamento > limite) então { gera exceção } ;
endereço_efetivo = endereço_base + deslocamento ;

Fontes:
http://www.inf.ufpr.br/roberto/ci064/ci064a15.pdf
http://www.lac.inpe.br/~becceneri/arquivos/gerenciamento_de_memoria.ppt

domingo, 5 de dezembro de 2010

Gerenciamento de Memória: Comandos

Windows:

Na linha de comando do sistema operacional MS-DOS, o comando MEM é usado para mostrar informações sobre o uso da memória RAM.

Sintaxe

MEM

Opções
  • /p : Mostra o status dos programas que estão usando a memória.
  • /d : Mostra vários dados sobre o uso da memória pelos programas.
  • /c : Mostra o tamanho dos programas e os classifica de acordo com o uso da memória.
Exemplo:



Linux:

Comando Free

O comando free permite que você saiba o quanto de memória, cache e swap está sendo usado no momento pelo seu sistema.
Usando o comando "free -m" podemos ver os valores em Mbytes.

Neste caso temos um total de 2895MB de memoria, 2782 usados. Destes 47MB para buffer, 1388MB para cache de programas e o restante, 1347MB para cache de disco.O cache de disco nada mais é que trazer do HD para a memoria os arquivos/bibliotecas mais prováveis de serem acessadas. Funciona como um PREFETCH sobre o HD, que melhora o desempenho do sistema.


# free -m

Comando Grep

Com o grep pode-se verificar o quanto de memória total do sistema.

# grep MemTotal /proc/meminfo

Comando dmidecode

Com o dmidecode descubre-se algumas informações, como o máximo de memória que o sistema suporta.

# dmidecode -t 16
dmidecode 2.9 SMBIOS 2.31 present.
Handle 0×0009, DMI type 16, 15 bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 4 GBError Information Handle: Not Provided
Number Of Devices: 2

Comando Top

O comando "top" nos mostra informações gerais do sistema e um detalhamento da quantidade de memoria que cada processo está utilizando, alem de informações sobre a quantidade de memoria de todo sistema e da swap.


Fontes: http://pt.wikibooks.org/wiki/MS-DOS/Lista_de_comandos#MEM
http://diegofucitalo.blogspot.com/2008/11/alguns-comandos-para-verificar-memria.html

Tipos de Gerenciamento de Memória do Linux e Windows

Windows:
  • Paginação
  • Memória Virtual

O Linux usa exclusivamente a paginação
  • Em geral é implementada usando-se um único tamanho de página.
  • Em sistemas de 32 bits, o núcleo pode endereçar 4 GB de dados.
  • Em sistemas de 64 bits, o núcleo suporta no máximo 2 petabytes de dados.
  • Três níveis de tabelas de páginas.
  • Diretório global de páginas.
  • Diretório intermediário de páginas
Tabela de páginas
Em sistemas que suportam apenas dois níveis de tabelas de páginas, o diretório intermediário de páginas contém exatamente uma entrada.
O espaço de endereço virtual é organizado dentro de áreas de memória virtual para reunir informações com as mesmas permissões (semelhante aos segmentos).

Memória Virtual: Paginação por demanda e Algorítimos de Substituição de páginas

Paginação Sob Demanda:

É baseada na paginação simples:
– a memória lógica é dividida em páginas que podem ser
colocadas em qualquer quadro da memória física;
– a TP é usada para conversão de endereços lógicos em físicos

Na paginação por demanda apenas as páginas que o processo acessa são carregadas para a memória física. O bit de válido/inválido indica se a página já está presente na memória ou se ainda está no disco.

Na conversão de endereço lógico a MMU testa o bit de válido/inválido e se o bit for válido o endereço é
convertido e o acesso é executado normalmente
• caso contrário a MMU gera uma interrupção de proteção e aciona o SO
– o SO verifica se o acesso é a uma inválida (o processo deve ser abortado) ou a uma página que está no disco
– se o acesso é a uma página que está no disco (falta de página ou page fault), o SO:
• coloca o processo numa fila de processos esperando por página
• localiza um quadro livre
• localiza a página no disco
• agenda uma operação de leitura da página no disco

Enquanto um processo espera por uma página, a UCP é passada para outro processo
• quando a leitura da página for concluída, o SO:
– atualiza a tabela de páginas do processo
– recoloca o processo na fila de prontos
• quando o processo reassumir a UCP ele deverá reiniciar a execução que gerou a falta de página
• na paginação por demanda pura, uma página só é carregada para a memória quando é referenciada
• a parte do SO que carrega as páginas do disco para a memória é chamada de pager


Os algoritmos de substituição de páginas são políticas definidas para escolher qual(is) página(s) da memória dará lugar a página que foi solicitada e que precisa ser carregada. Isso é necessário quando não há espaço disponível para armazenar a nova página. Devemos ressaltar que se a página a ser removida sofreu alterações enquanto esteve na memória, a cópia virtual existente em disco deverá ser atualizada. Por outro lado, se a página não foi modificada significa que sua cópia está atualizada e, portanto, não é necessário reescrevê-la. Políticas de substituição de páginas devem ser utilizadas em sistemas que fazem uso de memória virtual paginada com o objetivo de melhorar o desempenho do sistema computacional.
Os algoritmos de substituição de páginas podem ser classificados, basicamente, em: algoritmos com espaço fixo e algoritmos com espaço variável. A diferença entre estes dois tipos de algoritmos é que o de espaço fixo trabalha sobre uma área de memória sempre constante, enquanto que os de espaço variável podem modificar o tamanho da memória alocada dinamicamente [CAS03].

Algoritmo de substituição de páginas FIFO O FIFO (First-in, First-out) é um algoritmo de substituição de páginas de baixo custo e de fácil implementação que consiste em substituir a página que foi carregada há mais tempo na memória (a primeira página a entrar é a primeira a sair). Esta escolha não leva em consideração se a página está sendo muito utilizada ou não, o que não é muito adequado pois pode prejudicar o desempenho do sistema. Por este motivo, o FIFO apresenta uma deficiência denominada anomalia de Belady: a quantidade de falta de páginas pode aumentar quando o tamanho da memória também aumenta.
Por estas razões, o algoritmo FIFO puro é muito pouco utilizado. Contudo, sua principal vantagem é a facilidade de implementação: uma lista de páginas ordenada pela “idade”. Dessa forma, na ocorrência de uma falta de página a primeira página da lista será substituída e a nova será acrescentada ao final da lista.

Algoritmo de substituição de páginas LRU
O LRU (Least Recently Used) é um algoritmo de substituição de página que apresenta um bom desempenho substituindo a página menos recentemente usada. Esta política foi definida baseada na seguinte observação: se a página está sendo intensamente referenciada pelas instruções é muito provável que ela seja novamente referenciada pelas instruções seguintes e, de modo oposto, aquelas que não foram acessadas nas últimas instruções também é provável que não sejam acessadas nas próximas. Apesar de o LRU apresentar um bom desempenho ele também possui algumas deficiências [CAS03] quando o padrão de acesso é sequencial (em estruturas de dados do tipo vetor, lista, árvore), dentro de loops, etc. Diante dessas deficiências foram propostas algumas variações do LRU, dentre eles destacamos o LRU-K. Este algoritmo não substitui aquela que foi referenciada há mais tempo e sim quando ocorreu seu k-último acesso. Por exemplo, LRU-2 substituirá a página que teve seu penúltimo acesso feito há mais tempo e LRU-3 observará o antepenúltimo e assim por diante.
A implementação do LRU também pode ser feita através de uma lista, mantendo as páginas mais referenciadas no início (cabeça) e a menos referenciadas no final da lista. Portanto, ao substituir retira-se a página que está no final da lista. O maior problema com esta organização é que a lista deve ser atualizada a cada nova referência efetuada sobre as páginas, o que torna alto o custo dessa manutenção.

Algoritmo de substituição de páginas Ótimo
O algoritmo ótimo, proposto por Belady em 1966, é o que apresenta o melhor desempenho computacional e o que minimiza o número de faltas de páginas. No entanto, sua implementação é praticamente impossível. A idéia do algoritmo é retirar da memória a página que vai demorar mais tempo para ser referenciada novamente. Para isso, o algoritmo precisaria saber, antecipadamente, todos os acessos à memória realizados pela aplicação, o que é impossível em um caso real. Por estes motivos, o algoritmo ótimo só é utilizado em simulações para se estabelecer o valor ótimo e analisar a eficiência de outras propostas elaboradas.

Algoritmo de substituição de páginas MRU
O algoritmo MRU (Most Recently Used) faz a substituição da última página acessada. Este algoritmo também apresenta algumas variações, semelhante ao LRU. Por exemplo, o MRU-n escolhe a n-última página acessada para ser substituída. Dessa forma, é possível explorar com mais eficiência o princípio de localidade temporal apresentada pelos acessos.

Algoritmo de substituição de páginas CLOCK
Este algoritmo mantém todas as páginas em uma lista circular (em forma de relógio). A ordem mantida segue a seqüência em que elas foram carregadas em memória. Além disso, é adicionado um bit de uso que indica se a página foi referenciada novamente depois de ter sido carregada. Ao precisar substituir uma página o algoritmo verifica se a página mais antiga está com o bit zerado (o que significa que a página não foi mais referenciada) para ser substituída. Se ela não estiver o bit é zerado e a próxima página da fila mais antiga será verificada. Esse processo continua até que uma página antiga com o bit zerado seja encontrada para ser substituída.

Algoritmo de substituição de páginas NRU
O algoritmo NRU (Not Recently Used) procura por páginas que não foram referenciadas nos últimos acessos para serem substituídas. Tal informação é mantida através de um bit. Este algoritmo também verifica, através de um bit de modificação, se a página teve seu conteúdo alterado durante sua permanência em memória. Esta informação também vai ajudar a direcionar a escolha da página. As substituições das páginas seguem a seguinte prioridade: páginas não referenciadas e não modificadas, páginas não referenciadas, páginas não modificadas e páginas referenciadas e modificadas.

Algoritmo de substituição de páginas LFU
O LFU (Least Frequently Used) escolhe a página que foi menos acessada dentre todas as que estão carregas em memória. Para isso, é mantido um contador de acessos associado a cada página (hit) para que se possa realizar esta verificação. Esta informação é zerada cada vez que a página deixa a memória. Portanto, o problema desse algoritmo é que ele prejudica as páginas recém-carregadas, uma vez que por estarem com o contador de acessos zerado a probabilidade de serem substituídas é maior. Qual uma possível solução para este problema? (Estabelecer um tempo de carência) Só páginas fora desse tempo é que podem ser substituídas. Tal estratégia deu origem ao algoritmo FBR (Frequency-Based Replacement).

Algoritmo de substituição de páginas MFU
O MFU (Most Frequently Used) substitui a página que tem sido mais referenciada, portanto, o oposto do LFU. O controle também é feito através de contadores de acesso. O maior problema deste algoritmo é que ele ignora o princípio de localidade temporal.

Algoritmo de substituição de páginas WS
O algoritmo WS (Working Set) possui a mesma política do LRU. No entanto, este algoritmo não realiza apenas a substituição de páginas ele também estabelece um tempo máximo que cada página pode permanecer ativa na memória. Assim, toda página que tem seu tempo de permanência esgotado ela é retirada da memória. Portanto, o número de páginas ativas é variável. O WS assegura que as páginas pertencentes ao working set processo permanecerão ativas em memória.
Os algoritmos apresentados são alguns dos disponíveis na literatura. Outras implementações ou variações dos destacados aqui podem ser encontradas também [CAS03].

Fontes:

[CAS03] CASSETTARI, H. H. Análise da Localidade de Programas e Desenvolvimento de
Algoritmos Adaptativos para Substituição de Páginas. Qualificação de Mestrado. Escola
Politécnica da Universidade de São Paulo. Departamento de Engenharia de Computação e
Sistemas Digitais. 2003.

Memória com Paginação: Diferença entre endereço lógico e endereço físico

A memória física é dividida em blocos de tamanho fixos denominados molduras de páginas (page
frames). Já a memória lógica é dividida em blocos de tamanho fixos denominados páginas
(pages). As páginas e as molduras de páginas são sempre do mesmo tamanho.

Quando um programa tenta usar uma página virtual que não está mapeada é gerada uma interrupção da CPU para o sistema operacional a fim de buscar esta página na memória. Esta interrupção (trap) é denominada falta de página (page fault). As ações desencadeadas são: o sistema operacional escolhe uma moldura de página (page frame) pouco usada e a salva em disco. Em seguida, carrega a página virtual referenciada pela instrução na moldura de página que foi liberada. Feito isso o sistema operacional pode reinicializar a instrução causadora da interrupção.

Swap: Criação na instalação de um S.O.

Sobre a memória Swap no momento da instalação de um Sistema Operacional:

No Windows, o usuário nem tem como modificar a memória swap.

No Linux, a instalação é obrigatória, caso você não faça, o Linux por default faz e define os valores para tal e isso é importante pois no Linux conforme mais e mais memória física vai sendo ocupada, o sistema vai abrindo mão do cache de disco para liberar memória para os aplicativos. Com o passar o tempo, alguns dados relacionados a programas que estão ociosos a muito tempo começam a lentamente serem movidos para a memória cache, fazendo com que o sistema recupere parte do espaço e volte a fazer cache de disco.

Gerenciador de Memória: Swapping

A função do gerenciador de memória envolve controlar quais partes da memória estão em uso e quais não estão; alocar memória a processos; liberar a memória dos processos; e, tratar o problema de swapping.

Onde este tipo de memória é alocado?
Em Linux é possível alocar tanto em partição quanto em arquivo, em Windows somente em arquivo.

Particionamento com partição Swap

sábado, 4 de dezembro de 2010

Swapping x Paginação x Segmentação x Memória Virtual

Swapping
Existem situações onde não é possível manter todos os processos na memória.
Ex: um processo já alocado na memória faz uma chamada de sistema pedindo mais memória e não existe memória livre contígua a área onde o mesmo está alocado um usuário dispara um programa, não existe memória disponível mas é política dos sistema disparar imediatamente todos os programas solicitados de terminal.

Usando o swapping o sistema escolhe um programa residente que é levado da memória para o disco (swap-out ) retornando posteriormente para a memória (swap-in).

Paginação
A paginação permite que o programa possa ser espalhado por áreas não contíguas de memória. Características:
  • o espaço de endereçamento lógico de um processo é dividido em páginas lógicas de tamanho fixo
  • a memória física é dividida em páginas com tamanho fixo, com tamanho igual ao da página lógica
  • o programa é carregado página a página, cada página lógica ocupa uma página física
  • as páginas físicas não são necessariamente contíguas
  • o endereço lógico é inicialmente dividido em duas partes : um número de página lógica e um deslocamento dentro da página
  • o número da página lógica é usado como índice no acesso a tabela de páginas, de forma a obter o número da página física correspondente
  • não existe fragmentação externa
  • existe fragmentação interna (Ex: um programa que ocupe 201kb, o tamanho de página é de 4 kb, serão alocadas 51 páginas resultando uma fragmentação interna de 3kb)
  • além da localização a tabela de páginas armazena também o bit de validade, (1) se a página está na memória (0) se a página não está na memória
  • a transferência das páginas de processo podem ser transferidas para a memória por demanda, levando apenas o que é necessário para a execução do programa ou por paginação antecipada, onde o sistema tenta prever as páginas que serão necessárias à execução do programa.
Paginas constantemente referenciadas em um processo devem permanecer na memória:


Segmentação

  • Técnica de gerência de memória onde programas são divididos em segmentos de tamanhos variados cada um com seu próprio espaço de endereçamento.
  • A principal diferença entre a paginação e a segmentação é a alocação da memória de maneira não fixa, a alocação depende da lógica do programa.
  • O mapeamento é feito através das tabelas de mapeamento de segmentos.
  • Os endereços são compostos pelo número do segmento e um deslocamento dentro do segmento.
  • Cada entrada na tabela mantém o endereço físico do segmento, o tamanho do segmento, se ele está ou não na memória e sua proteção.
  • O sistema operacional mantém uma tabela com as áreas livres e ocupadas da memória.
  • Somente segmentos referenciados são transferidos para a memória principal.
  • Ocorre fragmentação externa.
  • Sistemas que implementam a segmentação com paginação. Cada segmento é dividido fisicamente em páginas.
  • O endereço é formado pelo número do segmento, número da página dentro desse segmento e o deslocamento dentro dessa página.

Memória Virtual

  • Técnica de gerenciamento que combina a memória principal e a secundária dando ao usuário a idéia de existir uma memória maior que a memória principal.
  • Desvincula o endereçamento feito pelo programa dos endereços físicos da memória principal.
  • Um programa no ambiente de memória virtual não faz referência a endereços físicos mas endereços virtuais.
  • O endereço virtual é traduzido para o endereço físico através do mapeamento.
  • Os programas podem ser muito maiores do que sua memória física, apenas parte deles está residente na memória em um determinado instante.
  • O restante do programa fica na memória secundária até ser referenciado.



sexta-feira, 3 de dezembro de 2010

Instalação de Dispositivos no Linux e Windows

O sistema operacional tanto no windows quanto no linux, instala o driver assim que o dispositivo é reconhecido.
Nas proximas vezes se o driver ainda estiver instalado, ja é executado diretamente.

Instalando Impressora HP C4480 no Ubuntu:

Instalando Impressora HP no Windows XP:


Formatação - Instalação SO - Gerenciamento de Dispositivos

A formatação de uma máquina, a instalação de um sistema operacional tem relação direta com o Gerenciamento de Dispositivos, porque cada sistema operacional trata diferentemente os dispositivos. Quando formatamos o PC, ele identifica e instala cada dispositivo encontrado. Alguns destes devem ser baixados do site do fabricante e instalados.

Codecs: Conceito e Problemas

Os codecs são dispositivos capazes de codificar e/ou decodificar dados e sinais digitais. A sigla nada mais é do que a junção das palavras em inglês coder e decoder (codificador e decodificador). Estes dispositivos são usados em programas que gravam e reproduzem vídeos, sons e imagens.
Imagine uma carta escrita em português. Para alguém entender esta carta em qualquer outro lugar do mundo, é necessário que a pessoa entenda português. Quem não sabe ler neste idioma, precisará encontrar uma pessoa que traduza o que está escrito. É assim que os codecs funcionam, eles são os responsáveis pela tradução do conteúdo.

A codificação é necessária porque permite diminuir o tamanho de um arquivo. Conseqüentemente isso facilita a transmissão pela internet e diminui o espaço de armazenamento no disco rígido.

Softwares de Gerenciamento de Dispositivos

Windows:
  1. DevManView
  2. Device Remover
  3. DriverView
Linux:
  1. DeviceWall
  2. Devfs
  3. UDEV
  4. Gnome-Device-Manager

USB: Como funciona?

Universal Serial Bus (USB) ou em português, Barramento Serial Universal é um tipo de dispositivo de conexão que foi projetado para preencher algumas lacunas deixadas pelos outros barramentos seriais. Foi desenvolvido por companhias do ramo de telecomunicações e de computadores pessoais. Estas companhias são: Compaq, Hewlett-Packard, Intel, Lucent, Microsoft, NEC, Philips. O USB , basicamente, tem como objetivo conectar periféricos externos ao computador sem que se tenha a necessidade de abrir o gabinete para instalar placas em slots e ainda permite alternar entre periféricos sem ter que desligar o PC. O USB traz ao usuário diversas vantagens como a versatilidade, a facilidade no uso e a alta velocidade.

Abaixo, podemos ver como interagem as camadas de software e hardware que constituem o funcionamento da conexão do USB com um computador:
O acesso à periféricos comuns funciona da mesma forma que o acesso à um periférico USB. Ambos chamam funções da API.

O próximo passo será a comunicação da API com o driver do periférico conectado na porta USB. Esse driver, ao receber as informações da API, as traduz para USB. Tal driver, fica armazenado no próprio sistema operacional ou vem juntamente com o CD de instalação do dispositivo USB.

Depois disso, temos a camada do Driver USB, que torna o sistema operacional compatível com o USB.

O quarto passo, inclui a camada de software chamada Driver do Controlador Host. Este driver, funciona à nível de Kernel do sistema operacional e é ele que realiza os acessos de I/O mediante à recepção das chamadas vindas do Driver USB. Essas chamadas são organizadas por este driver, para serem acessadas pelo Controlador Host.

Na primeira camada da parte de hardware, temos o Controlador Host. Este controlador, é um circuito eletrônico que interpreta as rotinas enviadas pelo Driver do Controlador Host e ao mesmo tempo conecta todos os periféricos USB.

A última camada da figura, é constituída pelos dispositivos USB propriamente ditos.
Uma das grandes vantagens já citadas do USB, é o fato de podermos conectar um periférico ao computador mesmo estando ele ligado. Isso ocorre em uma seqüência de eventos que serão mostrados na figura abaixo. Essa seqüência ocorre no sentido oposto ao descrito nos parágrafos acima. Quando conecta-se um periférico na porta USB, o Controlador Host detecta esta conexão e avisa ao Driver do Controlador Host que por sua vez avisa ao Driver USB. O Driver USB faz com que o Driver Cliente seja iniciado tornando possível a utilização do periférico recém-conectado.


Fonte: http://www.gta.ufrj.br/grad/04_2/usb

segunda-feira, 29 de novembro de 2010

Comandos Linux

Ir e voltar nos diretórios:
cd

Ver a relação de arquivos e pastas existentes:
ls

criar pasta:
mkdir

Remover Pasta
rm

Se a pasta não estiver vazia:
rm -r

Se não desejar que o Linux faça alguma pergunta:
rm -rf /s /q

Remover arquivo
del
erase

Renomear arquivo
mov

Copiar arquivo
cp

Abaixo alguns vídeos com a execução destes comandos





Utilizando comandos MS-DOS

Ir e voltar nos diretórios:
CD

Ver a relação de arquivos e pastas existentes:
dir

Criar pasta:
md

Remover Pasta
rd

Se a pasta não estiver vazia:
rd /s

Se não desejar que o Windows faça alguma pergunta:
rd /s /q

Remover arquivo
del
erase

Renomear arquivo
ren

Copiar arquivo
copy

Abaixo alguns vídeos com a execução destes comandos:



O particionamento do disco rígido - Conceitos e Softwares

Partições: Transformando Um Drive em Muitos

Como as capacidades de drives de disco aumentaram drasticamente, algumas pessoas começaram a pensar se seria uma boa idéia ter todo este espaço formatado em um grande pedaço. Essa linha de pensamento foi guiada por diversas questões, algumas filosóficas, outras técnicas. Do lado filosófico, acima de um determinado tamanho, parecia que o espaço adicional provido por um drive maior criava mais desordem. Do lado técnico, alguns sistemas de arquivo nunca foram planejados para suportar acima de uma capacidade determinada. Ou os sistemas de arquivo poderiam suportar drives maiores com maior capacidade, mas o tempo de espera para o sistema de arquivo encontrar arquivos se tornou excessivo.

A solução deste problema foi dividir discos em partições. Cada partição pode ser acessada como se fosse um disco separado. Isto é feito através da adição de uma tabela de partição.

Softwares Gerenciadores de Partições:

Um software bastante interessante para Windows é o PartitionMagic. Com ele é possivel visualizar todas as partições, e muito além. Podemos modificar o tamanho de uma determinada partição sem perder dados, criar novas partições de diversos formatos, excluir, formatar uma partição existente, copiar partições de HD's diferentes, alterar o tamanho dos clusters de partições FAT16/32 e NTFS, juntar duas ou mais partições sem perder os dados de nenhuma delas.

Em suas primeiras versões, o PartitionMagic também suportava Linux. Depois de comprado pela Symantec, foi abandonado o desenvolvimento para sistemas Linux e após foi descontinuado o desenvolvimento do PartitionMagic em dezembro de 2009.

PartitionMagic - Alterando o tamanho de partições NTFS.


Outro software bastante simples e que possui quase todas as funcionalidades do PartitionMagic é o Gparted, desenvolvido para Linux, é um dos principais gerenciadores de partições em sistemas baseados em Unix. Suporta quase todos os tipos de partições entre elas, Fat16/32, NTFS, EXT2/3/4, reiser4/fs, jfs, xfs, entre outras. Com ele podemos redimensionar patições, criar novas, formatar, ver informações completas, excluir, mudar o rótulo, etc. Também é possivel gerenciar unidades removíveis, como pendrivers e HDs externos.

GparEd no Ubuntu - O video mostra como redimensioner uma partição, criar uma nova no local que foi liberado, e formatar a nova.




Fontes:
http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-ig-ppc-multi-pt_br-4/ap-partitions.html
http://en.wikipedia.org/wiki/PartitionMagic
http://gparted.sourceforge.net/

Sistemas de Arquivos do Linux: Ext , ReiserFS, Swap

Sistemas de Arquivos mais comuns do Linux:

Ext2
O sistema de arquivos ext2 é conhecido como "Second Extended FileSystem". Foi desenvolvido para ser mais "eficiente" que o sistema de arquivos "Minix", seu antecessor. O Minix era muito utilizado nas primeiras versões do Linux, e foi utilizado por muitos anos. O sistema de arquivos ext2 não possui journaling e foi substituído pelo ext3.

Ext3
O sistema de arquivos ext3 é uma versão do ext2 com suporte a journaling. Portanto, o ext3 tem as mesmas características do ext2, mas com suporte journaling. Essa característica foi uma evolução e tornou o ext3 um sistema de arquivos muito estável e robusto. Como no ext3 só foi adicionado o suporte a journaling, podemos converter um sistema de arquivos ext2 para ext3, adicionado suporte a journaling, e também podemos converter um sistema de arquivos ext3 para ext2, removendo o suporte a journaling.

ReiserFS
O sistema de arquivos ReiserFS foi criado recentemente. Mas atualmente quase todas as distribuições Linux o suportam. Sua performance é muito boa, principalmente para um número muito grande de arquivos pequenos. ReiserFS também possui suporte a journaling.

XFS
O sistema de arquivos XFS também possui suporte a journaling. Foi desenvolvido originalmente pela Silicon Graphics e posteriormente disponibilizado o código fonte. O XFS é considerado um dos melhores sistemas de arquivos para banco de dados, pois é muito rápido na gravação.

XFS utiliza muitos recursos de cache com memória RAM, e para utilizar XFS é recomendado utilizar sistemas que possuem redundância de energia.

SWAP
SWAP é um espaço reservado para troca de dados com a memória RAM. Em alguns lugares ele não é mencionado como um Sistema de Arquivos, mas resolvi descrever aqui pois faz parte deste artigo.

VFAT
O sistema de arquivos VFAT é também conhecido como FAT32 (MS Windows). O sistema de arquivos VFAT não possui suporte a journaling. É utilizado normalmente para transferir dados entre sistemas MS Windows e o Linux instalados no mesmo disco, pois pode ser lido e escrito por ambos os sistemas operacionais. O sistema de arquivos VFAT está longe de ser um sistema de arquivos utilizado para Sistemas Linux, exceto para compartilhamento/compatibilidade entre o MS Windows e Linux. Se você utilizar VFAT no Linux, esteja certo de perder alguns atributos, tais como: permissão de execução, links simbólicos, entre outras coisas. Ambos os sistemas de arquivos ext3 e ReiserFS são maduros o bastante para serem utilizados como padrão no Linux. Esses dois são os mais utilizados pelas distribuições Linux.

Fonte:
http://www.vivaolinux.com.br/artigo/Linux-Sistema-de-arquivos

FAT e NTFS: Diferenças e variações

FAT16
O sistema de arquivos FAT16 foi introduzido com o MS–DOS em 1981, e agora mostra a sua “idade”. Ele foi criado primeiramente para lidar com arquivos em uma unidade de disquete e passou por poucas alterações no decorrer dos anos para que possa também lidar com discos rígidos e até mesmo nomes de arquivos maiores do que o limite de 8,3 caracteres, mais ainda é o menor denominador comum. A maior vantagem do FAT16 é o fato de ele ser compatível com vários sistemas operacionais, incluindo o Windows 95/98/Me, OS/2, Linux e algumas versões do UNIX. O maior problema do FAT16 é o fato de ele ter um número máximo fixo de clusters por partição; sendo assim, conforme os discos rígidos ficam cada vez maiores, o tamanho de cada cluster aumenta também. Em uma partição de 2 GB, cada cluster tem 32 kilobytes, mostrando que mesmo o menor arquivo na partição irá ocupar um espaço de 32 KB. O FAT16 também não suporta compactação, criptografia ou segurança avançada usando as listas de controle de acesso.

FAT32
O sistema de arquivos FAT32, introduzido no Windows 95 Service Release 2, é apenas uma extensão do sistema de arquivos original FAT16 que oferece um número muito maior de clusters por partição. Sendo assim, ele melhora muito a utilização geral do disco quando comparado a um sistema de arquivos FAT16. No entanto, o FAT32 compartilha todas as demais limitações do FAT16, e inclui uma outra limitação importante (muitos sistemas operacionais que reconhecem o FAT16 não irão funcionar com o FAT32), o que é mais nítido no Windows NT, mas também no Linux e UNIX. Não será um problema se você estiver executando um FAT32 em um computador do Windows XP e compartilhar a sua unidade com outros computadores na rede (eles não precisam saber, e geralmente não se importam com isso, qual é o seu sistema de arquivos).

As Vantagens do NTFS
O sistema de arquivos NTFS, introduzido na primeira versão do Windows NT, é um sistema de arquivos completamente diferente do FAT. Ele oferece segurança muito melhor, compactação arquivo por arquivo, cotas e até criptografia. É o sistema de arquivos padrão para novas instalações do Windows XP. Se você estiver atualizando a partir de uma versão anterior do Windows, você receberá a pergunta sobre converter ou não seus sistemas de arquivos existentes para NTFS. Não se preocupe. Se você já atualizou para o Windows XP e não fez a conversão, tudo bem. Você poderá converter o FAT16 ou FAT32 para NTFS a qualquer momento. Lembre-se de que não é possível retornar facilmente ao FAT ou FAT32 (sem precisar reformatar a unidade ou a partição), não que eu ache que você irá querer fazer isso.
O sistema de arquivos NTFS geralmente não é compatível com outros sistemas operacionais instalados no mesmo computador e não está disponível se você iniciou o computador a partir de uma unidade de disquete. Por isso, muitos administradores de sistemas, incluindo eu mesmo, costumam recomendar que os usuários formatem pelo menos uma pequena partição no começo do disco rígido principal como FAT. Essa partição ofereceu um local para armazenar arquivos de recuperação emergenciais ou drivers especiais necessários para a reinstalação e foi um mecanismo para que você se livrasse de problemas causados por isso. No entanto, com os melhores recursos de recuperação no Windows XP (saiba mais sobre isso em uma coluna posterior), eu não acho que seja necessário ou desejável criar aquela partição FAT inicial.

Fonte:
http://www.microsoft.com/brasil/windowsxp/using/setup/expert/russel_october01.mspx

Funcionalidade do sistema de arquivos no Sistema Operacional

1. Fornecer mecanismos para usuários manipular arquivos e diretórios

2. Garantir a validade e coerência de dados
  • Minimizar ou eliminar o risco de perda/alteração de dados
3. Otimizar o acesso

4. Fornecer suporte a outros sistemas de arquivos

5. Suporte a vários usuários (multiprogramação)
  • Uso compartilhado (proteção e acesso concorrente)

segunda-feira, 25 de outubro de 2010

Problemas Clássicos

Produtor x Consumidor

Chamado de Produtor e o Consumidor (também conhecido como o problema do buffer limitado), consiste em um conjunto de processos que compartilham um mesmo buffer. Os processos chamados produtores põem informação no buffer. Os processos chamados consumidores retiram informação deste buffer.


Esse é um problema clássico em sistemas operacionais, que busca exemplificar de forma clara, situações de impasses que ocorrem no gerenciamento de processos de um sistema operacional. Para quem está iniciando na programação, esse problema se torna complexo, pois trabalhar com programação concorrente nem sempre é tão simples. Como sabemos, precisamos nos preocupar com acessos ilegais a certos recursos que são compartilhados entre os processos, e manter sincronismo entre os mesmos.

Para controlarmos o acesso a essas variáveis e termos sincronismo nas operações, vamos utilizar semáforos. Em ciência da computação, semáforo é uma variável especial protegida (ou tipo abstrato de dados) que tem como função o controle de acesso a recursos compartilhados (por exemplo, um espaço de armazenamento) num ambiente multitarefa. Com as variáveis do tipo pthread_mutex_t da biblioteca pthreads - Posix, podemos controlar esses dados com toda segurança. Outro controle importante é a demanda de processamento, espera ociosa, que o programa irá gerar, pois quando um processo não está liberado para gravar ou ler, deve entrar em estado de espera para não consumir processamento de graça, e deve ser avisado quando pode voltar a processar.

Problemas:

  • O produtor insere em posição: Ainda não consumida
  • O consumidor remove de posição: Já foi consumida
  • Espera ociosa X Escalonamento do processo X Uso CPU


Solução:

  • Exclusão mutua (semáforos)
  • Fim da espera ociosa:
  • Dormir (dow) /acordar (up) X Semáforos full/empty
  • Mutex (Mutual exclusion)

Código na íntegra para solucionar este problema:

http://www.vivaolinux.com.br/artigo/O-Produtor-e-o-Consumidor/?pagina=5


Leitor x Escritor

Outra situação que ocorre com freqüência em sistemas concorrentes é o problema dos leitores/escritores. Neste caso, um conjunto de processos ou threads acessam de forma concorrente uma área de memória comum (compartilhada), na qual podem fazer leituras ou escritas de valores. As leituras podem ser feitas simultaneamente, pois não interferem umas com as outras, mas as escritas têm de ser feitas com acesso exclusivo à área compartilhada, para evitar condições de disputa. No exemplo da figura abaixo, os leitores e escritores acessam de forma concorrente uma matriz de inteiros M.


Solução: http://www.inf.ufsc.br/~bosco/ensino/ine5645/Leitores-Escritores.pdf

O jantar dos filósofos

É um problema clássico de acesso a recursos limitados, inventado em 1971 por Edsger Dijkstra como questão de exame.


O problema consiste em: Cinco filósofos estão sentados à volta de uma mesa. Cada filósofo alterna entre os estados de pensar e comer esparguete. Existe uma grande travessa de esparguete no centro da mesa. Para comer, o filósofo usa dois garfos, colocados nos dois lados (5 pratos, 5 garfos). Cada garfo pode ser usado pelo filósofo vizinho. Quando o filósofo quiser comer, ele tem que emprestar os garfos. O bloqueio ocorre se cada filósofo pegar um garfo e ficar à espera que o vizinho do outro lado liberte o segundo garfo.

Applet com a solução: http://www.inf.ufrgs.br/gppd/disc/inf01008/trabalhos/sem99-1/filosofos/applet.htm


Fontes: http://www.fatecsbc.edu.br/Dowload/sistemasoperacionais/socap04.pdf

http://computacaonaweb.blogspot.com/2008_11_01_archive.html


Links Relacionados:

  1. http://ces33.wikidot.com/relas:alexandre

Links Interessantes

http://www.ibm.com/developerworks/linux/library/l-scheduler

http://devresources.linuxfoundation.org/craiger/hackbench

http://www.makelinux.net/reference?n=Scheduler

http://webee.technion.ac.il/courses/046209/Recitations/Linux_Scheduling.pdf

Test Kernel:
http://test.kernel.org/tko
http://test.kernel.org/autotest_slides.odp

sábado, 23 de outubro de 2010

Threads no Linux


O Linux não faz distinção entre threads e processos, pois todos os threads são implementados como um processo-padrão. A diferença consiste em que apenas os threads são capazes de compartilhar os recursos disponíveis.
Existem ainda os threads do kernel que são úteis para o kernel executar operações em segundo plano. Esses threads existem apenas no espaço do kernel e não tem um endereço, mas são programáveis e antecipados como processos normais, além de serem invocados apenas a partir de um outro thread através da função kernel threads().

Estados do Processo


Fluxo dos estados do processo

Escalonador Linux

O escalonador LINUX é baseado em time-sharing, ou seja, atua na divisão do tempo de processador entre os processos.
Scheduler é o programa encarregado de agendar os processos, isto é, ele deve escolher o próximo processo que vai rodar, deve decidir quando o tempo de um processo terminou, o que fazer com um processo quando ele requisita I/O e assim por diante. Ele é chamado de vários pontos do programa, como após colocar o processo corrente em uma fila de espera, no final de uma chamada de sistema ou qualquer outro momento em que se faz necessário escalonar os processos. Ao ser chamado, o scheduler tem uma seqüência de ações que devem ser tomadas para que seu trabalho possa ser feito. Essas ações se dividem em:
  • Kernel Work: o scheduler deve realizar uma série de rotinas especifícas do kernel, e deve tratar da fila de esperas de tarefas do scheduler.
  • Seleção de processo: o scheduler deve escolher o processo que irá rodar. A prioridade é o meio pelo qual ele escolhe.
  • Troca de processos: o scheduler salva as condições que o processo atual apresenta (contexto específico do processo) e carrega o contexto do novo processo que irá rodar.
Em ambientes multiprocesados (SMP - Simultaneous Multi Processing), cada processador tem um scheduler para tratar separadamente quais processos irão rodar nele. Dessa forma, cada processo guarda informação sobre o processador atual e o último processador em que rodou. Processos que já tenham rodado em um processador tem preferência em relação aqueles que não tenham rodado ali ainda. Essa implementação permite um ligeiro acréscimo de ganho no desempenho do sistema.


O escalonador possui 140 níveis de prioridade (quanto menor o número, maior é a prioridade). Prioridades de 1 a 100 são para processos de tempo real; de 101 a 140 para os demais processos de usuário (interativos ou não interativos). Nos níveis de prioridade 101 a 140, os processos recebem
fatias de tempo de 20 ms.

  • Os processos de tempo real podem ser FIFO ou Round Robin, e possuem uma prioridade estática.
  • Processos FIFO executam até voluntariamente liberarem a CPU (o nível de prioridade é mantido e não são preemptivos).
  • Processos Round Robin recebem fatias de tempo. Quando todos terminam suas fatias, é dada outra fatia e eles continuam rodando no mesmo nível de prioridade.
  • A prioridade dos processos de usuário é a soma de sua prioridade básica (valor de seu nice) e seu bonus dinâmico, que varia de +5 a –5.
Thread de migração
  •  Em cada processador roda uma thread de migração, cuja função é movimentar processos de um processador para outro. Como existe uma ready list por processador, a idéia é evitar que processadores fiquem ociosos enquanto outros estão sobrecarregados.
  • A thread de migração é chamada periodicamente, a cada tick do relógio, e também explicitamente quando o sistema fica desbalanceado.

Políticas de Escalonamento


Existem critérios para o escalonamento dos processos em Linux:
  • Policy: Pode haver duas políticas de escalonamento round-robin e first-in-first-out (FIFO).
  • Priority: A prioridade do processo é dada de acordo com o tempo que ele gastou para executar (em jiffies). Jiffies é uma variável que indica a quantidade de tempo que um processo pode ser executado, onde cada valor atribuído depende de cada máquina. Quanto maior o tempo em uma execução anterior, menor a prioridade do processo.
  • Real time priority: Esse recurso é usado para processo de tempo real. Através disso, os processos de tempo real podem ter prioridade relativa dentro desse conjunto. A prioridade pode ser alterada através de chamadas do sistema.
  • Counter: É a quantidade de tempo (em jiffies) que os processos têm permissão para rodar. É setada a prioridade quando o processo é rodado pela primeira vez e decrementada a cada tick do clock.


Algoritmos de Escalonamento


No código do linux (arquivos include/linux/sched.h e kernel/sched.c) é possível encontrar quatro classes de escalonamento disponíveis: SCHED NORMAL, SCHED FIFO, SCHED RR e SCHED BATCH, é a partir delas que o escalonador escolhe um processo para ser executado.

SCHED NORMAL
Podemos considerar este tipo de escalonamento como convencional já que a ênfase é no timesharing (compartilhamento do tempo).
A fatia de tempo (ou fatia quantum) é um valor numérico que indica quanto tempo uma
determinada tarefa pode ser executada antes de ser antecipada (antes de ceder o processador a outro processo). O escalonador do Linux calcula a fatia de tempo necessária a uma tarefa a partir do seu comportamento, por exemplo, processos de E/S necessitam de um tempo menor do que processos vinculados ao processador. Para resolver esse conflito, o Linux mantém valores de fatia de tempo e prioridade relativamente altas para os processos vinculados à E/S (100 ms), em contra-partida, os processos não precisam utilizar toda a sua fatia de tempo de uma só vez (podem utiliza-la em intervalos) quando ela acaba o processo é considerado expirado e para ser escalonado novamente esperar que todos os outros tenham também a sua fatia esgotada.
Quando um processo expira é necessário que ele tenha a sua fatia de tempo recalculada (já que agora ela corresponde a zero), para facilitar o cálculo (que até então era feito utilizando um complexo loop) as novas versões do Linux (a partir da série 2.5) se utilizam de dois arrays de prioridade (um para processos ativos e outro para processos expirados). Esse recurso é útil porque reduz a complexidade do cálculo e o tempo perdido com o mesmo.
O escalonador deve conhecer o comportamento de uma dada tarefa para determinar a sua prioridade e a sua fatia de tempo, ele obtém essa informação observando quanto tempo esse processo passa dormindo e quanto tempo fica em estado executável (esse valor é armazenado na variável sleep avg na task struct) e assim calcula a sua fatia de tempo concedendo bônus ou penalizando-o dependendo de como utilizou o seu tempo. O Linux trabalha também com uma regra para evitar que processos obtenham uma fatia de tempo ilimitada.


Cálculo da fatia de tempo do processo


SCHED FIFO
A estratégia FIFO (First In, First Out) implementada no kernel do Linux consiste no conceito: primeiro processo de tempo-real a entrar é o primeiro a sair. Os processos FIFO de tempo real não podem ser antecipados por outro processo que não seja FIFO de tempo real, esses processos também não trabalham com fatias de tempo, ou seja, eles podem dispor do processador praticamente o tempo que necessitarem.

SCHED RR
A política SCHED RR (Round Robin _ alternância circular) funciona do mesmo modo que a FIFO, entretanto com ela os processos de tempo real podem ser interrompidos pelo relógio, ou melhor, eles executam durante uma determinada fatia do tempo do processador, assim que o tempo acaba eles são postos no final da fila de execução. Esta estratégia garante uma atribuição justa do tempo de processador para todos os processos Round Robin.

SCHED BATCH
Esta política está presente no código-fonte do Linux apenas a partir do kernel 2.6.16, e é uma política similar a utilizada em SCHED NORMAL, com exceção de que ela sempre tende a fazer o escalonador supor que o processo é vinculado ao rocessador, por esse motivo ele sofrerá penalidades que o desfavorecem nas decisões de escalonamento. Esta é uma estratégia útil para tarefas que não são interativas mas não desejam reduzir o seu valor bom.

Related Posts Plugin for WordPress, Blogger...