Linux 2: Threads, Escalonamento, Gerenciamento de Memória e Sistemas de
Arquivos
Sistemas Operacionais II
Threads Suporte a threads no núcleo;
Foi definida uma nova chamada ao sistema não presente no Unix: Pid = clone(function, stack_ptr, sharing_flags, arg);
Esta chamada cria uma nova thread no processo atual ou em outro processo de acordo com o parâmetro sharing_flags;
2
Threads Se a thread foi criada compartilhando o
processo, qualquer escrita no espaço de endereçamento é imediatamente visível as demais threads do processo. Caso contrário a nova thread recebe uma cópia exata do espaço de endereçamento.
3
Threads O novo thread começa a execução em function, a qual é chamada com arg sendo seu único parâmetro;
4
Threads O novo thread obtem obtém sua própria
pilha privada, com o ponteiro da pilha inicializado com stack_ptr;
Este parâmetro permite uma granularidade muito mais fina de compartilhamento que os sistemas Unix tradicionais.
5
Escalonamento Baseado em threads e não em processos;
Classes de threads: FIFO em tempo real:
Maior prioridade;
Não sofre interrupção exceto por um outro mais prioritário que tenha ficado pronto para executar.
Alternância circular em tempo real:
Podem ser interrompidos pelo relógio.
Tempo compartilhado.
Cada thread possui uma prioridade cujo padrão é 20;
6
Escalonamento - Regras Através da chamada nice a prioridade pode
ser alterada para valores entre 1 e 40;
Cada thread possui também um quantum;
O escalonador calcula a bondade de cada thread de acordo com as seguintes regras:
7
Escalonamento - Atualização O algoritmo de escalonamento
simplesmente escolhe a thread com maior bondade;
Ao ser executada cada tique do relógio (10 ms) reduz o quantum de 1;
A thread é retirada da CPU caso:
◦ Seu quantum chegue a 0;
◦ A thread tenha ficado bloqueada;
◦ Uma thread bloqueada de bondade maior ficou pronta.
8
Escalonamento - Recalculo Quando o quantum de todas as threads
prontas forem iguais a 0, o escalonador reinicializa o quantum de todas as threads usando a seguinte regra:◦ quantum = quantum_restante + (quantum/2) +
prioridade
Threads orientadas a E/S que estão bloqueadas podem ter algum quantum restante;
Como conseqüência, threads orientadas a E/S recebem quantum maiores e assim bondades maiores do que as orientadas a CPU;
9
Escalonamento – Threads CPU Quando threads orientados a computação
estão competindo pela CPU, aquelas com maiores prioridades obtêm uma fração maior da CPU. Por exemplo:
◦ A, prioridade 20; B, prioridade 5;
◦ A executa e após 20 tiques zera o quantum;
◦ B executa e após 5 tiques também zera o quantum;
◦ A obtem 20 e B 5;
◦ Essa atualização segue assim para sempre, com A obtendo 80% da CPU e B 20%.
10
Gerenciamento de Memória Em máquinas de 32 bits, cada processo
dispõe de 3 GB de espaço de endereçamento virutal para si próprio com 1 GB restante reservado para suas tabelas de páginas e dados do núcleo;
O EE é dividido em áreas organizadas em páginas com proteção e propriedades de paginação idênticas;
11
Gerenciamento de Memória O segmento de código e arquivos mapeados
são exemplos de áreas;◦ O tamanho da página é fixo: 4 KB para Pentium
e 8 KB para o Alpha;
Cada área é descrita no núcleo por meio de uma entrada vm_area_struct
Ela lista as propriedades da área:◦ Modo de proteção;
◦ Para qual direção cresce;
◦ Se é privada ao processo ou compartilhada;
◦ Se possui armazenamento de apoio no disco e onde.
12
Esquema de Paginação
13
Esquema de Paginação O Linux utiliza um esquema de paginação
em 3 níveis;
No Pentium, que utiliza paginação em 2 níveis, cada diretório Intermediário possui apenas uma entrada
Usos da memória física:
Núcleo: residente na memória, não sofre paginação;
14
Usos da memória física: Páginas de usuários;
Cache de blocos de arquivos: possui tamanho dinâmico e compete com páginas dos usuários;
Cache de paginação: conjunto de páginas dos usuários não utilizadas a muito tempo e que estão esperando para serem trocadas para o disco.
15
Algoritmo de Alocação de Memória O Linux gerencia memória usando o
algoritmo companheiro, com a adição de um vetor no qual:◦ o primeiro elemento é a cabeça de uma
lista de blocos com tamanho de uma unidade;
◦ o segundo elemento é a cabeça de uma lista de blocos com tamanho de duas unidades;
◦ o próximo elemento aponta para blocos de quatro unidades, e assim por diante;
Dessa maneira, qualquer bloco de potência de 2 pode ser encontrado rapidamente;
16
Algoritmo de Alocação de Memória
17
Algoritmo de Alocação de Memória
A figura ilustra o uso do algoritmo:
◦ uma solicitação de 8 páginas é atendida em (d);
◦ outra solicitação de 8 páginas é atendida em (e);
◦ outra solicitação de 4 páginas é atendida em (g);
◦ o segundo bloco de 8 páginas é liberado em (h);
◦ o primeiro bloco de 8 páginas é liberado em (i);
18
Fragmentação Interna O algoritmo utilizado gera considerável
fragmentação interna;
Solicitando-se um bloco de 65 páginas, obtêm-se 128;
Para amenizar este problema:
◦ Linux utiliza uma segunda alocação de memória que obtém blocos a partir do resultado retornado pelo algoritmo companheiro, e depois os divide para gerenciar unidades menores separadamente.
19
Algoritmo de Substituição de Páginas
O daemon de paginação, kswapd, executa uma vez por segundo e possui um laço que chama três procedimentos:
Tenta recuperar páginas da cache de paginação e da cache de blocos do sistema de arquivos que não foram referenciadas recentemente;
Páginas compartilhadas que nenhum dos usuários esteja usando muito;
Páginas comuns dos usuários.
20
Algoritmo de Substituição de Páginas
Um segundo daemon, bdflush, verifica periodicamente se a quantidade de páginas sujas é grande. Se for, inicia a escrita em disco.
21
Sistema de Arquivos Originalmente compatível com o Minix que
limita a 14 caracteres os nomes de arquivo e a 64 MB seu tamanho;
A primeira melhoria surgiu com o Ext, que permite 255 caracteres de nome e 2 GB de tamanho;
O Ext2 foi inventado com nomes longos de arquivos, arquivos grandes e melhor desempenho, tornando-se o principal sistema de arquivos.
22
Esquema dos Sistemas de Arquivo
23
Sistema de Arquivos Superbloco
Informa quantos blocos e i-nodes existem e qual o tamanho do bloco;
Descritor do grupo
Localização dos mapas de bits, número de blocos e i-nodes livres no grupo;
Mapas de bits
Controlam os blocos e i-nodes livres.
24
I-nodes Possui 128 bytes, o dobro do Unix
tradicional;
Possui 12 endereços diretos e 3 indiretos;
Endereços estendidos de 3 para 4 bytes, para tratar partições de disco maiores que 224 blocos (16 GB);
Possui campos para listas de controle de proteção minucioso ainda não utilizados.
25
Diretório /proc Cada processo possui uma entrada neste
diretório virtual contendo informações sobre o mesmo como sua linha de comandos, variáveis ambientais e máscaras de sinais;
O /proc do Linux possui ampla variedade de informações sobre:◦ CPU;◦ partições do disco;◦ Dispositivos;◦ vetores de interrupções;◦ módulos carregados, etc
Estas informações podem ser lidas por programas dos usuários desprivilegiados.
26
CPUInfo
27