FACULDADE DE TECNOLOGIA SENAC GOIÁS Sistemas Operacionais Leandro Soares, Rodrigo Mascarenhas, Pedro Henrique, Jonatas Edward Características Linux - CentOS Lucília Ribeiro GOIÂNIA, 2015
Leandro Soares, Rodrigo Mascarenhas, Pedro Henrique, Jonatas Edward Características Linux - CentOS Relatório apresentado como requisito parcial para obtenção de aprovação na disciplina Sistemas Operacionais, no Curso de Gestão da Tecnologia da Informação, na Faculdade de Tecnologia Senac Goiás. Lucília Ribeiro GOIÂNIA, 2015 2
RESUMO Este trabalho apresenta as características exigíveis para a apresentação dos relatórios nas disciplinas ministradas pela Lucília. O objetivo e disponibilizar aos alunos um modelo de apresentação de relatório te cnico-científico para ser utilizado nestas disciplinas. Omitiram-se alguns elementos opcionais descritos nas normas da ABNT, bem como alguns itens mais específicos, simplificando-o. 3
SUMÁRIO 1 INTRODUÇÃO 2 OBJETIVO 3 PROCESSOS LINUX 3.1 Implementação de processos no Linux 3.2 Threads no Linux 3.3 Escalonamento em Linux 3.4 Gerência de Memória 3.5 Sistema de arquivos do Linux 4 RESULTADOS 5 CONCLUSÃO 6 REFERENCIAS 4
1 INTRODUÇÃO O CentOS é uma distribuição Linux Enterprise derivada dos códigos fonte disponibilizados pela Red Hat (empresa que fornece o RHEL, Red Hat Enterprise Linux) e mantida pelo CentOS Project. CentOS proporciona um grande acesso aos softwares padrão da indústria, incluindo total compatibilidade com os pacotes de softwares preparados especificamente para os sistemas da Red Hat Enterprise Linux. Isso lhe dá o mesmo nível de segurança e suporte, através de updates, que outras soluções Linux Enterprise, porém sem custo. Suporta tanto ambientes de servidores para aplicações de missão crítica quanto ambientes de estações de trabalho e ainda possui uma versão Live CD. Escolhemos CentOS por possui varias vantagens: por ter uma comunidade activa e crescente, um rápido desenvolvimento e teste de pacotes, uma extensa rede para downloads, desenvolvedores acessíveis, múltiplos canais de suporte incluindo suporte em português e suporte comercial através de parceiros. 2 OBJETIVO A escolha do Sistema Operacional Linux foi feita pelo melhor atendimento aos servidores, e pontos positivos na área da segurança, dos métodos de tratamento dos processos e sua gerencia de memória. 3 PROCESSOS LINUX O Linux é um sistema multiprogramado, de modo que múltiplos processos independentes podem executar ao mesmo tempo. Nele para cada usuário é possível haver centenas ou talvez milhares de processos executando. No Linux os processos são criados com a chamada ao sistema fork que cria uma cópia exata do processo original. Pai é o nome dado ao processo criador. O novo processo é chamado de processo filho. Cada um tem sua própria imagem da memória privada. Se ocorrer qualquer alteração em suas variáveis após o processo pai criado, essas não serão visíveis pelo processo filho ou vice e versa. 3.1 Implementação de processos no Linux Cada processo apresenta uma parte do usuário, que executa o programa do usuário. No entanto, quando um de seus threads faz uma chamada ao sistema, ele troca o modo de execução e passa a executar no contexto do núcleo, com um diferente mapa da memória e acesso a todos os recursos da máquina. Embora continue sendo o mesmo thread, agora ele tem mais poder e também sua própria pilha e seu próprio contador de programa no modo núcleo. Esses recursos são importantes porque uma chamada ao sistema pode ser bloqueada até que uma operação de disco se complete, por exemplo. O contador de programa e os registradores são então salvos, de modo que o thread possa ser reiniciado no modo núcleo posteriormente. O núcleo mantém duas estruturas de dados principais relacionadas aos processos: a tabela de processos e a estrutura do usuário. A tabela de processos permanece residente todo o 5
tempo e contém as informações necessárias a todos os processos, ainda que eles não estejam presentes atualmente na memória. A estrutura do usuário é paginada ou trocada para o disco quando o processo associado não está na memória, pois desse modo não há desperdício de memória com informações que não estejam sendo necessárias. As informações contidas na tabela de processos se enquadram nas seguintes categorias: Parâmetros de escalonamento. Prioridade do processo, quantidade de tempo de CPU consumida recentemente, quantidade de tempo gasto dormindo recentemente. Juntos, esses parâmetros são usados para determinar qual processo será o próximo a executar. Imagem da memória. Ponteiros para os segmentos de código, dados e pilhas, ou, caso seja usada à paginação, ponteiros para suas tabelas de páginas. Se o segmento de texto é compartilhado, o ponteiro do código aponta para a tabela de código compartilhada. Quando um processo não está localizado na memória, informações sobre como encontrar suas partes no disco também estão aqui na imagem da memória. Sinais. Mascaras que mostram quais sinais estão sendo ignorados, quais estão sendo capturados, quais estão sendo bloqueados e quais estão em procedimento de ser entregue. Miscelâneas. Estado do processo atual, evento sendo esperado caso exista, tempo que resta até disparar o relógio do alarme, PID, PID do processo pai e identificação de grupo e usuário. As informações sobre os descritores de arquivos podem ser mantidas na estrutura do usuário e buscadas somente quando o processo se encontrar na memória e em execução. As informações contidas na estrutura do usuário incluem os seguintes itens: Registradores da máquina. Quando ocorre um desvio de execução para o espaço do núcleo, os registradores da máquina são salvos aqui nesse item da estrutura (incluindo os de ponto flutuante, caso sejam usados). Estado da chamada ao sistema. Informações sobre a chamada ao sistema atual, incluindo parâmetro e resultados. Tabela de descritor de arquivos. Quando e feita uma chamada ao sistema que envolva o descritor de arquivo, o descritor de arquivo é usado como um índice para essa tabela, a fim de localizar a estrutura de dados na memória correspondente a esse arquivo. Contabilidade. Ponteiro para uma tabela que guarda o caminho do usuário e o tempo de CPU do sistema usado pelo processo. Alguns sistemas também mantêm aqui nesse item da estrutura os limites sobre a quantidade de tempo de CPU que um processo pode usar, o tamanho máximo de sua pilha, o número de molduras de página que ele pode consumir e outros itens. Pilha do núcleo. Uma pilha fixa a ser usada pela parte do núcleo do processo. 6
3.2 Threads no Linux A ideia central de threads no Linux é uma nova chamada ao sistema, clone, que não está presente em nenhuma outra versão do Unix. Ela é chamada como segue: PID = clone A chamada cria um novo thread, ou no processo atual ou em um novo processo, dependendo do parâmetro sharing_flags. Se o novo thread está no processo atual, ele compartilha o espaço de endereçamento com os threads existentes e toda escrita subsequente a qualquer byte no espaço de endereçamento por qualquer thread é imediatamente visível a todos os demais threads do processo. 3.3 Escalonamento em Linux O problema básico de escalonamento em sistemas operacionais é como satisfazer simultaneamente objetivos conflitantes: tempo de resposta rápido, ter boa throughput (taxa de transferência) para processos background (antecedentes), evitar ampliação de prazo indefinida, conciliar processos de alta prioridade com de baixa prioridade, etc. O conjunto de regras utilizado para determinar como, quando e qual processo deverá ser executado é conhecido como política de escalonamento. Vamos ver agora como o Linux implementa seu escalonador e qual a política empregada para determinar quais processos recebem o processador. Tradicionalmente, os processos são divididos em três grandes classes: processos interativos, processos batch e processos tempo real. O escalonador do Linux não distingue processos interativos de processos batch, diferenciando-os apenas dos processos tempo real. Como todos os outros escalonadores UNIX, o escalonador Linux privilegia os processos I/O bound em relação aos CPU bound de forma a oferecer um melhor tempo de resposta às aplicações interativas. O escalonador do Linux é baseado em time-sharing, ou seja, o tempo do processador é dividido em fatias de tempo (quantum) as quais são alocadas aos processos. Se, durante a execução de um processo, o quantum é esgotado, um novo processo é selecionado para execução. Esse procedimento é completamente transparente ao processo e baseia-se em interrupções de tempo. Esse comportamento confere ao Linux um escalonamento do tipo preemptivo. O algoritmo de escalonamento do Linux divide o tempo de processamento em intervalos de tempos. Cada processo, no momento de sua criação, recebe um quantum calculado no início de um intervalo. Diferentes processos podem possuir diferentes valores de quantum. O valor do quantum corresponde à duração do intervalo. Outra característica do escalonador Linux é a existência de prioridades dinâmicas. O escalonador do Linux monitora o comportamento de um processo e ajusta dinamicamente sua prioridade, visando a equalizar o uso do processador entre os processos. Processos que recentemente ocuparam o processador durante um período de tempo considerado longo têm sua prioridade reduzida. De forma análoga, aquele que está há muito tempo sem executar recebe um aumento na sua prioridade, sendo então beneficiados em novas operações de escalonamento. 7
O sistema Linux trabalha com dois tipos de prioridades: estática e dinâmica. Nesse caso, a prioridade do processo tempo real é definida pelo usuário e não é modificada pelo escalonador. Somente usuários com privilégios especiais têm a capacidade de criar e definir processos tempo real. O escalonador do Linux executa os processos de prioridade dinâmica apenas quando não há processos de tempo real. Para selecionar um processo para execução, o escalonador do Linux prevê três políticas diferentes: SCHED_FIFO: Essa política é válida apenas para os processos de tempo real. Na criação, o descritor do processo é inserido no final da fila correspondente à sua prioridade. Nessa política, quando um processo é alocado ao processador, ele executa até que uma de três situações ocorra: 1. Um processo de tempo real de prioridade superior torna-se apto a executar; 2. O processo libera espontaneamente o processador para processos de prioridade igual à sua; 3. O processo termina, ou bloqueia-se, em uma operação de entrada e saída ou de sincronização. SCHED_RR: Na criação, o descritor do processo é inserido no final da fila correspondente à sua prioridade. Quando um processo é alocado ao processador, ele executa até que uma de quatro situações ocorra: 1. Seu período de execução (quantum) tenha se esgotado nesse caso o processo é inserido no final de sua fila de prioridade. 2. Um processo de prioridade superior torna-se apto a executar. 3. O processo libera espontaneamente o processador para processos de prioridade igual a sua. 4.O processo termina, ou bloqueia-se, em uma operação de entrada e saída ou de sincronização. Essa política também só é válida para processos de tempo real. SCHED_OTHER: Corresponde a um esquema de filas multi nível de prioridades dinâmicas com time-sharing. Os processos interativos e batch recaem nessa categoria. No momento da criação, o processo pai (o que fez o fork) cede metade de seu quantum restante ao processo filho. Esse procedimento é, na verdade, uma espécie de proteção que o sistema faz para evitar que um usuário, a partir de um processo pai, crie um processo filha que execute o mesmo código do pai. O escalonador do Linux é executado a partir de duas formas diferentes. A primeira é a forma direta através de uma chamada explícita à rotina que implementa o escalonador. A segunda forma, denominada de lazy (preguiçoso), também é consequência do procedimento de escalonamento, ocorrendo em uma de três situações. 8
A primeira dessas situações é a rotina de tratamento de interrupção de tempo que atualiza os temporizadores e realiza a contabilização de tempo por processo. Essa rotina, ao detectar que um processo esgotou seu quantum de execução aciona o escalonador para que seja efetuada uma troca de processo. A segunda situação ocorre quando um processo de mais alta prioridade é desbloqueado pela ocorrência do evento que esperava. A terceira, e última forma de execução lazy, são quando um processo explicitamente invoca o escalonador através de uma chamada de sistema do tipo yield. Essa chamada de sistema permite a um processo passar sua vez de execução, para isso, parece claro, e necessário executar o escalonador. 3.4 Gerência de Memória Uma das partes mais importantes e críticas dos sistemas operacionais em geral. A necessidade de utilização de mais memória que a fisicamente disponível em uma máquina tornou-se uma constante no projeto de sistemas operacionais. A memória virtual é sem dúvida o melhor. Essa técnica baseia-se, na tradução de endereços lógicos em endereços físicos auxiliados por mecanismos alocados no hardware do próprio processador. Os dois mecanismos básicos de tradução são a paginação e a segmentação. Embora alguns processadores, entre eles os da família Intel, suportem a segmentação, o Linux utiliza muito pouco. Entre as razões pelas quais o Linux não explora a segmentação, estão: A gerência da paginação é mais simples que a da segmentação. Normalmente é possível transformar a segmentação em paginação, mapeando-se todo o espaço virtual em um único segmento. 3.5 Sistema de arquivos do Linux O Linux tem como principal sistema de arquivo ext4. O Linux ainda suporta mais de uma dúzia de sistemas de arquivos por meio do sistema de arquivos NTFS. 4 RESULTADOS O Linux é um sistema operacional de código aberto e de livre distribuição mesmo não sendo muito intuitivo, ele utiliza o hardware de uma forma mais inteligente, não exige muitos upgrades. Ele é um sistema mais seguro, é mais difícil a contaminação com vírus, falhas de segurança e etc. 5 CONCLUSÃO Entendemos que o sistema possui sua estrutura e maneira de tratar a criação de um processo e threads, como acontece o escalonamento do processo ou o thread que irá rodar. 9
Compreendemos o gerenciamento de memória, assim como seus sistemas de arquivos e o mais importante que nós usuários vemos é apenas a menor parte de um sistema operacional que mais a fundo existe um sistema complexo e robusto que satisfaz nossas necessidades e de outros sistemas menores. 6 REFERENCIAS Tanenbaum, Andrews; Sistemas Operacionais Modernos. São Paulo: Pearson, 2005. 503 p. Oliveira, Rômulo Silva de; Sistemas Operacionais. Porto Alegre: 04.d, 2010. 249-265 p. 10