[[cap_so]] == Introdução aos Sistemas Operacionais .Objetivos do capítulo ____ Ao final deste capítulo você deverá ser capaz de: * Descrever as funções de um Sistema Operacional; * Apresentar os principais fatos na evolução dos Sistemas Operacionais durante a evolução da arquitetura dos computadores; * Descrever os principais conceitos de Sistema Operacional e como o mesmo abstrai o uso do hardware de um computador. ____ Um sistema computacional moderno consiste em um ou mais processadores, memória principal, discos, impressoras, teclado, monitor, interfaces de rede e outros dispositivos de entrada e saída. Enfim é um sistema complexo. Desenvolver programas que mantenham o controle de todos esses componentes e os utilizem corretamente e de maneira otimizada é um trabalho extremamente difícil. Por isso, os computadores têm um dispositivo de software denominado Sistema Operacional, cujo trabalho é gerenciar esses componentes e fornecer aos programas do usuário uma interface com o hardware mais simples. A maioria dos usuários de computador já teve alguma experiência com um Sistema Operacional, mesmo assim é difícil reconhecer de modo preciso o que é um Sistema Operacional. Este problema ocorre porque os Sistemas Operacionais realizam basicamente duas funções não relacionadas: estender a máquina e gerenciar recursos. Este capítulo irá descrever suas principais funções para o usuário do computador. === Introdução Sem o software, um computador seria um pedaço de metal sem uso. Muitos consideram o software como a alma do computador. Existem dois tipos de software para computadores: Programas do sistema:: responsáveis por operações de gerenciamento do próprio computador, Programas aplicações:: implementados por usuários do computador para resolver seus problemas específicos. O principal programa do sistema é o ((Sistema Operacional)) (SO), responsável por gerenciar o acesso aos recursos do computador e prover serviços extras da máquina. Nos computadores modernos, muitos são os dispositivos a serem gerenciados: um ou mais processadores, memória principal, terminais de acesso, disco rígido, interfaces de rede e etc. Imagine a complexidade de implementar um programa que faz uso de cada um destes dispositivos, controlando o acesso concorrente de outros programas para não interferir no resultado final do seu. [[fig_so]] .Recursos gerenciados pelo Sistema Operacional image::images/sistemas-operacionais/so-perifericos.png[scaledwidth="60%"] O leitor deve perceber que seriam programações muito complexas e é uma das funções do Sistema Operacional, permitir as aplicações de usuário o uso destes dispositivos de forma mais simplificada. Para isso, o Sistema Operacional fornece as aplicações, uma coleção de funções pré-programadas para atuarem sobre estes dispositivos, as chamadas do sistema (_((system calls))_). [[fig_camdas]] .Sistema de um computador: hardware, programas do sistema e aplicações. image::images/sistemas-operacionais/camadas.png[scaledwidth="60%"] Podemos observar na <> a arquitetura em camadas de um sistema computacional. Na camada inferior encontram-se os circuitos integrados, fonte de energia, barramentos, placas de rede e etc. Um conjunto de instruções é interpretado pela camada de Microprogramação. Esta camada conversa diretamente com os dispositivos providenciando funcionalidades para a camada acima através das instruções de máquina. (((Sistema Operacional))) A principal função da camada do Sistema Operacional é diminuir a complexidade e fornecer ao programador um conjunto de instruções de mais alto nível, sem a preocupação dos detalhes das instruções, como a movimentação do cabeçote de leitura dos discos rígidos contidos na memória secundária para ler os dados de um programa em execução. Acima do Sistema Operacional, existem outros programas do sistema, como os Compiladores, Editores e os Interpretadores de Comandos, que auxiliam as aplicações a fazerem uso das funcionalidades do Sistema Operacional. E por fim, a camada de aplicações, escritas pelos usuários para resolver seus problemas específicos, como processamento de imagens, serviços de comunicação na rede, aplicações comerciais, científicas e etc. Muitos confundem o Sistema Operacional com a sua interface gráfica. No Windows, Sistema Operacional da Microsoft, existe um programa do sistema, chamado gerenciador de janelas, responsável por controlar as ações do usuário e ativar os recursos do Sistema Operacional, dando assim uma falsa impressão que o mesmo seja o Sistema Operacional de fato. Para podermos definir bem a fronteira do que é o papel do Sistema Operacional, elencamos e em seguida descrevemos suas duas principais funções: Extensão da Máquina e Gerenciador de Recursos. ==== O Sistema Operacional como uma Máquina Estendida A arquitetura, conjunto de instruções, organizações de memória, E/S e estrutura de barramentos da maioria dos computadores em nível de linguagem de máquina é primitivo e de difícil programação. Examinando como é feita a E/S da unidade de discos flexíveis (disquete), são realizados inúmeros comandos para leitura e escrita de dados, movimentação do braço do disco e formatação de trilhas. Além da inicialização, sinalização, reinicialização e recalibração do controlador e das unidades de disquetes. Sem entrar em detalhes de fato, é claro que um programador de nível médio provavelmente não se envolverá com os detalhes de programação das unidades de disco, em vez disso, busca lidar com essas unidades de modo mais abstrato e simples. Esse programa que oculta a “verdade” ao programador sobre o hardware e apresenta uma visão simples é o Sistema Operacional, permitindo que o usuário trabalhe com o conceito de arquivos com nomes para dividir o disco. Em todo caso a abstração oferecida pelo sistema operacional é mais simples e mais fácil de usar que a do hardware, oferecendo ao usuário o equivalente a uma máquina estendida. ==== Gerenciador de Recursos O segundo trabalho do Sistema Operacional é fornecer uma alocação ordenada e controlada de processadores, memórias e dispositivos de E/S entre vários programas que competem por eles. Imagine o que aconteceria se três programas em execução em algum computador tentassem imprimir suas saídas simultaneamente na mesma impressora. As primeiras linhas poderiam ser do programa 1, as linhas seguintes do programa 2 e algumas outras do programa 3. O resultado seria uma confusão. O Sistema Operacional pode trazer ordem a essa confusão, armazenando temporariamente no disco todas as saídas destinadas à impressora, tratando a impressão de cada saída por vez. Além disso, os usuários muitas vezes precisam compartilhar não somente hardware, mas também informação (arquivo, banco de dados e etc). O gerenciamento de recursos realiza o compartilhamento desses recursos de duas maneiras: no tempo e no espaço. Quando o recurso é compartilhado no tempo, diferentes usuários aguardam sua vez para utilizar um recurso. Por exemplo, com somente uma CPU e múltiplos programas, o Sistema Operacional aloca a CPU a um programa, e depois que executou o suficiente, outro programa obtém seu uso, então outro e por fim o primeiro programa novamente. No compartilhamento do espaço, os usuários não esperam a sua vez, cada um ocupa sua parte no recurso. Por exemplo, a memória principal é normalmente dividida entre vários programas em execução, assim, cada um pode residir ao mesmo tempo na memória. === Evolução dos Sistemas Operacionais A história dos Sistemas Operacionais está diretamente ligada a arquitetura dos computadores em que os mesmos iriam executar. Nesta seção iremos abordar alguns exemplos desta evolução casada entre o hardware e o software. ==== Computadores a Vácuo (1945-1955) Durante a segunda guerra mundial uma aceleração na evolução dos computadores ocorreu devido à necessidade de aplicações que pudessem quebrar a codificação das mensagens dos inimigos. Neste período alguns pesquisadores como John Von Newman em Princeton, Konrad Zuse na Alemanha e Howard Aiken em Harvad construíram dispositivos capazes de computar através de tubos a vácuo, sendo estes equipamentos grandes o bastante para ocupar salas inteiras. Nesta geração as instruções eram dadas diretamente em código de máquina. Não havia linguagem de programação (nem mesmo linguagem de montagem). E os Sistemas Operacionais não tinham qualquer funcionalidade, ou seja, não existiam. ==== Transistores e Sistemas em Lote (1955-1965) (((Transistores))) Com o surgimento dos transistores, os computadores se tornaram confiáveis e passaram a ser comercializados, isto em meados da década de 50. O computador passou a ter mais clara a separação dos papeis de seus atores: os projetistas do computador, programadores e os operadores da máquina. Antes estes papeis eram realizados pelos mesmos desbravadores da Computação. Para executar um programa, o programador desenvolvia seu algoritmo e entregava o cartão contendo seu código ao operador. O operador era responsável por entrar com o cartão no computador e acionar sua computação, ao final, a saída era impressa e o resultado entregue de volta ao programador. Como os computadores iniciais eram muito caros, uma empresa compartilhava seus diversos processos em uma única máquina, para isso, desenvolveu-se o conceito de sistema em lote. O sistema em lote trabalhava com fitas magnéticas que possuíam diversos programas a serem executados em sequencia. Um programa especial (ancestral do Sistema Operacional) carregava cada programa da fita, executava o programa e enviava sua saída para a impressora. Após o encerramento deste programa o sistema configurava a próxima atividade para entrar em execução. Este ciclo se repetia até acabarem todas as atividades do lote. ==== Circuitos Integrados e Multiprogramação (1965-1980) (((Circuitos Integrados))) (((Multiprogramação))) No início da década de 60, os computadores passaram a ter duas utilizações no mercado: os computadores científicos de larga escala para a ciência e a engenharia e os computadores comerciais adotados por bancos, companhias de seguro e departamentos de recursos humanos. O principal responsável pela sua popularização foi a adoção da tecnologia de Circuitos Integrados que diminuiu o tamanho e o preço dos computadores. O IBM 360 foi o principal computador adotado pelos dois filões do mercado. A principal mudança para os Sistemas Operacionais foi a criação da Multiprogramação, permitindo que vários programas pudessem compartilhar a memória principal ao mesmo tempo, cada uma com seu espaço reservado na memória, compartilhamento do espaço (<>(a)), podendo estas atividades serem executadas ao mesmo tempo. [[fig_compartilhar_tempo_espaco]] .Multiprogramação em um Sistema Operacional, tipos de compartilhamento dos recursos do computador. image::images/sistemas-operacionais/Compart_tempo_espaco.png[scaledwidth="60%"] Entretanto os computadores desta época não tinham mais de um núcleo de processamento (processador), logo era de responsabilidade do Sistema Operacional, dividir o uso do único processador com os diversos programas em execução durante pequenas frações de tempo, compartilhamento do tempo (<>(b)). ==== Computadores Pessoais (1980-1995) (((Computadores Pessoais))) Com o advento dos minicomputadores na década de 80, o computador passou a ser usado na vida privada das pessoas, passou-se a comprar computadores como se comprava vídeo cassete, surgindo assim o conceito de Computador Pessoal (Personal Computer - PC). A popularização do computador se deu pelas interfaces gráficas propostas pelos Sistemas Operacionais, permitindo que leigos da área pudessem manipular suas aplicações pessoais, sem o auxílio dos antigos operados de máquina. Os principais Sistemas operacionais da época foram o MS-DOS, precursor do Windows da Microsoft, o Unix, base para as diversas distribuições do Linux, Sistema Operacional aberto ao público (podendo usa-lo e modificar seu código) e o Mac OS, sistema criado pela Apple que trouxe a revolução na Interface Gráfica, adotado até hoje nos Sistemas Operacionais modernos. No final da década de 80, começou-se a criar Sistemas Operacionais para manipular computadores interligados por redes de comunicação, chamados Sistemas Operacionais de Rede ou de Sistemas Distribuídos. Nele o usuário passou a controlar diversos computadores ao mesmo tempo, podendo até se logar em um computador remoto, localizado a quilômetros de distância, e controla-lo como se estivesse usando seu teclado ou mouse local. ==== A Guerra dos Sistemas Operacionais image::images/sistemas-operacionais/appleXmicrosoft.png[scaledwidth="60%"] Na década de 70 dois jovens estudantes tiveram visões distintas sobre o futuro dos computadores, na época dominada por grandes computadores da poderosa IBM. Seus nomes Steven Jobs e Bill Gates. O primeiro entendeu que o computador deveria ser usado por pessoas comuns para auxiliá-los em tarefas do trabalho e de casa, criando assim o conceito de Computador Pessoal, materializado pelo lançamento do Apple 2 no ano de 1977, que passou a ser o nome de sua empresa, a atual gigante Apple. Sua proposta era ter controle total sobre o desenvolvimento do computador, sendo responsável pelo projeto do hardware e do software. Inicialmente o design de seus produtos fizeram muito sucesso e a interface gráfica de seu sistema operacional (Mac OS), adota da empresa Xerox, foi tão revolucionária que grupos de usuários passaram a se intitular fãs dos produtos e seu mentor o profeta da revolução da Computação que iria livrar o mundo da opressão dos grandes computadores da IBM. O segundo criou a Microsoft, e tinha uma visão mais voltada para o software, o seu Sistema Operacional, o Windows, foi pensado para funcionar em qualquer hardware, fato que diminuiu a qualidade do mesmo. Entretanto aliado à funcionalidade da interface gráfica, copiado dos produtos da Apple, a um conjunto de aplicações muito funcionais nas empresas e em trabalhos domésticos como o Word, Excel, Powerpoint e etc (``Killed Applications''), o Sistema Operacional dos computadores comerciais por muito tempo passou a ser sinônimo de Windows. Na década de 90 a Microsoft se torna a maior empresa de informática do mundo, tornando seu dono o homem mais rico do planeta. Nada mal para um estudante pobre que só vendia software. A disputa entre Jobs e Gates tinha se tornada pública, e na década de 90 a aposta total no software parecia ter sido declarada como campeã. Steven Jobs fora demitido da sua própria empresa e chegou a trabalhar no ramo da animação, tendo como frutos a empresa Pixel, hoje um renomado estúdio de desenhos animados, criadora do famoso desenho Toy Story. No final da década de 90 Jobs retorna a Apple, e com sua capacidade de inovação e a busca constante pela perfeição no design de seus produtos sempre pensando na interface com o usuário, a Apple lança em série novos produtos revolucionários, o iPod, iPhone e iPad, além de uma série de computadores pessoais e seus notebooks sempre elegantes e modernos. A ideia de ter o controle sobre o projeto do hardware influenciando o projeto do software permitiu que na primeira década do século XXI a Apple tomasse o posto de maior empresa de informática da Microsoft, chegando em 2012 a valer o dobro da concorrente. O iPod (tocador de música em mp3) foi o equipamento eletrônico mais vendido da história, desbancando o posto do Walkman da Sony. O tablete iPad tirou a funcionalidade de leitura e entretenimento do computador pessoal, este agora um aparelho para trabalho. Agora sem o comando de Gates a Microsoft quer voltar a ser a empresa inovadora de antes, mas para isso tem que percorrer o caminho já trilhado por suas concorrentes. Em 2012 a Microsoft lançou seu primeiro computador, chamado Surface, um híbrido de notebook e tablet e para controlar seu hardware foi desenvolvido um novo Sistema Operacional, o Windows 8, com boa aparência mas com a velha obsessão da Microsoft de colocar seus softwares para serem compatíveis com vários hardwares, logo o Windows 8 foi adaptado para telas de toque e computadores com teclado e mouse, o que leva o usuário a confusões de navegabilidade. O importante é que nesta briga ganham os usuários, com novas ferramentas mais amigáveis e novas funcionalidade para os dispositivos que um dia serviam apenas para cálculos científicos ou contabilidades empresariais. === Tipos de Sistemas Operacionais Como vimos na seção anterior, muitos Sistemas Operacionais possuem características distintas devido à arquitetura do hardware em que irão executar. Esta seção traz alguns dos tipos de Sistemas Operacionais existentes descrevendo suas principais características ==== Computadores de Grande Porte Estes computadores distinguem dos PCs em termos de capacidade de E/S. Possui milhares de discos com milhares de 'terabytes' de dados. Atualmente ressurgiram como sofisticados servidores web e servidores para transações entre empresas. Seus Sistemas Operacionais são, sobretudo, orientados para o processamento simultâneo de muitos jobs com quantidades volumosas de E/S. Esses sistemas oferecem normalmente três tipos de serviços: em lote ('batch'), processamento de transações e tempo compartilhado. ==== Sistema Operacional de Servidores Servidores são computadores pessoais grandes, estações de trabalho e até computadores de grande porte. Eles servem múltiplos usuários de uma vez em uma rede e permitem-lhe compartilhar recursos de hardware e software. Seu Sistema Operacional deve prover um bom gerenciamento de recursos, como serviços de impressão, serviços de arquivos ou serviços web. ==== Sistema Operacional de Multiprocessadores Um módulo cada vez mais comum de obter potência computacional é conectar múltiplas CPUs em um único sistema. Dependendo da forma como são interligados os processadores e o que os mesmos compartilham, esses sistemas são denominados computadores paralelos, multicomputadores ou multiprocessadores. São Sistemas Operacionais com aspectos especiais de comunicação e conectividade. ==== Sistema Operacional de PC Seu trabalho é oferecer uma boa interface para um único usuário. São amplamente usados para processadores de texto, planilha e acesso a internet. ==== Sistema Operacional de Tempo Real Os Sistemas Operacionais de tempo real são caracterizados por terem o tempo como um parâmetro fundamental. Por exemplo, em sistemas de controle de processos industriais é muito comum a existência de prazos rígidos para a execução de determinadas tarefas, podendo uma ação, ocorrendo em um momento incorreto, soldar uma região errada de uma peça, estragando o produto final. Existem dois tipos de Sistema Operacionais de tempo real, o crítico, onde as ações precisam ocorrer em determinados instantes. E o não crítico no qual o descumprimento ocasional de um prazo é aceitável. Sistemas multimídia pertencem a esta última categoria. ==== Sistema Operacional Embarcado (((Sistemas embarcados))) Sistemas embarcados são pequenos computadores, geralmente computadores de mão, celulares e set-top-box para TV Digital. Realizam um pequeno número de funções, seu Sistema Operacional deve lidar com restrições de tamanho, memória e consumo de energia. ==== Sistema Operacional de Cartões Inteligentes Sistemas de Cartões Inteligentes são dispositivos do tamanho de cartões de crédito que contém um chip de CPU. Possui restrições severas de consumo de energia e de memória. Alguns deles podem realizar apenas uma única função, como pagamentos eletrônicos, mas outros podem tratar múltiplas funções. O gerenciamento dos recursos e a proteção das mesmas são tratados pelo Sistema Operacional, geralmente muito primitivo, contido no cartão. === Conceitos de Sistemas Operacionais Todos os Sistemas Operacionais têm certos conceitos básicos, como processos, memória e arquivos, que são fundamentais para entendê-los. Nesta seção iremos dar uma introdução sobre seus principais conceitos. ==== Processos Um processo é basicamente um programa em execução. Associado a cada processo está o seu espaço de endereçamento e uma lista de posições de memória que este processo pode ler e escrever. Também associado a cada processo está um conjunto de registradores, que inclui o contador de programa, o ponteiro para a pilha de execução e demais informações necessárias para executar um programa. Em um sistema multiprogramado, a CPU salta de programa para programa, executando cada um deles por dezenas ou centenas de vezes por segundo. Estritamente falando, enquanto a cada instante a CPU executa somente um programa, no decorrer de um segundo ela pode trabalhar sobre vários programas, dando a ilusão de um verdadeiro paralelismo. Fala-se em pseudoparalelismo para contrastar com o real paralelismo dos sistemas multiprocessadores. Quando um processo é suspenso temporariamente dessa maneira, ele deverá ser reiniciado mais tarde, exatamente do mesmo ponto em que ele estava quando foi interrompido. Logo, todas as informações relativas ao processo devem ser explicitamente salvas. Por exemplo, um processo pode ter vários arquivos abertos para leitura. Existe um ponteiro associado a cada um desses arquivos, que indica a posição atual, assim quando o processo retorna a execução, a chamada de sistema `read` sobre o arquivo poderá ler os dados corretamente de sua última posição manipulada. Em muitos sistemas operacionais os dados relativos ao processo, que não estejam em seu espaço de endereçamento, são armazenados em uma tabela do Sistema Operacional chamada de tabela de processos, contendo uma entrada para cada processo. ===== Estados de Processos Os processos em um Sistema Operacional possuem três estados ilustrados na <>, estes estados são: Em execução:: realmente usando a CPU naquele instante; Pronto:: executável, temporariamente parado para dar lugar a outro processo; Bloqueado:: incapaz de executar enquanto um evento externo esperado não ocorrer. [[fig_transicao_de_estados]] .Transição de estados de um processo. image::images/sistemas-operacionais/estados.png[scaledwidth="60%"] As transições entre os estados também estão ilustradas na <>, estas transições são: 1. Processo bloqueia aguardando uma entrada dos dispositivos de E/S. 2. O escalador de processos seleciona outro processo. 3. O escalador de processos seleciona este processo. 4. A entrada torna-se disponível. A transição 1 ocorre quando um processo descobre que ele não pode prosseguir. No UNIX, quando um processo lê de um arquivo especial e não há entrada disponível, o processo é automaticamente bloqueado. As transições 2 e 3 são causadas pelo escalonador de processos sem que o processo saiba disso. A transição 2 ocorre quando o escalonador decide que o processo em execução já teve tempo suficiente de CPU e é momento de deixar outro processo ocupar o tempo de CPU. A transição 3 ocorre quando o escalonador define que é justo que o processo retorne a ser executado, após ter compartilhado a CPU com outros processos. A transição 4 ocorre quando um evento externo pelo qual um processo estava aguardando (por exemplo, a chegada de uma dado vindo da placa de rede). Note que a transição 4 não leva o processo diretamente para o estado “Em Execução”, pois pode existir um outro processo em execução e este processo que estava bloqueado deve aguardar sua vez no escalonador. ===== Threads (((Threads))) Em Sistemas Operacionais tradicionais, cada processo tem um espaço de endereçamento e um único thread (fluxo) de controle. Na verdade, isso é quase uma definição de processo. Contudo, frequentemente há situações em que é desejável ter múltiplos threads de controle no mesmo espaço de endereçamento executando quase em paralelo como se fossem dois processos separados. Este conceito, chamado de multithread, pode ser observado na <>(b) a seguir. [[fig_processos_x_threads]] .(a)Três processos, cada um com um Thread de execução. (b) Um processo com três threads de execução. image::images/sistemas-operacionais/processXthread.png[scaledwidth="60%"] //// Faltou referenciar a parte b? //// Threads distintos em um processo não são tão independentes quanto processos distintos. Todos os threads têm exatamente o mesmo espaço de endereçamento, o que significa que eles compartilham as mesmas variáveis globais. Como os threads têm algumas das propriedades dos processos, eles são chamados de processos leves. É importante perceber que cada thread tem sua própria pilha de execução. Logo os estados dos processos são os mesmos para os threads, ocorrendo as mesmas transações de estados, como se cada thread fosse um processo separado. Havendo a necessidade de salvar o estado da pilha de execução de cada thread toda vez que o mesmo perder a vez na CPU, podendo futuramente retornar a execução no ponto em que foi interrompido. A vantagem de se criar thread está na rapidez de sua criação e no menor gasto de recursos do sistema para o mesmo. ==== Gerenciamento de memória O que todo programador deseja é dispor de uma memória infinitamente grande, rápida e não volátil, a um custo muito baixo. Infelizmente, a tecnologias atuais não comportam essas memórias. Por isso, a maioria dos computadores utiliza uma hierarquia de memórias, que combina: uma pequena quantidade de memória cache, volátil, muito rápida e de alto custo; uma grande memória principal (RAM), volátil com alguns gigabytes, de velocidade e custo médios; e uma memória secundária, constituída de armazenamento não volátil em disco, com centenas de gigabytes e custo baixo. Cabe ao Sistema Operacional coordenar a utilização dessas memórias. A parte do Sistema Operacional, responsável pela gerência das hierarquias de memória, é denominado gerenciador de memória. Sua função é manter o controle de quais partes da memória estão em uso e quais não estão, alocando memória aos processos quando precisam e liberando a memória quando os processos terminam. ===== Monoprogramação (((Monoprogramação))) Quando se utiliza o esquema mais simples de gerenciamento de memória, a mesma é compartilhada entre o programa e o Sistema Operacional, e somente um programa é executado por vez. Tão logo um usuário tecle um comando, o Sistema Operacional carrega o programa solicitado do disco na memória e o executa. Quando o processo finaliza, o Sistema Operacional espera por um novo comando. Ao receber um novo comando, carregará o novo programa na memória, no espaço de endereçamento ocupado pelo programa anterior. ===== Multiprogramação (((Multiprogramação))) A maioria dos sistemas modernos permite a multiprogramação, onde múltiplos processos estejam em execução simultânea, coexistindo na memória principal, através do particionamento da memória entre os processos. Das técnicas de compartilhamento e gerenciamento desta memória a mais utilizada nos microcomputadores é a Memória Virtual. ===== Memória Virtual (((Memória Virtual))) O conceito básico da Memória Virtual é que um programa pode está com sua parte ativa em memória e o restante em disco, por exemplo, um programa com 16MB de memória pode rodar em um computador de 4MB de memória, sendo parte do programa dinamicamente carregado em memória de acordo com a necessidade de execução. Na multiprogramação vários programas podem ter pedaços ativos deles em memória, enquanto o resto se encontra em disco. Ficando como responsabilidade do Sistema Operacional o controle de indicar que programas devem ficar na memória e quais devem ficar em disco, chaveando estes programas a medida que forem sendo exigidos pelo usuário. ==== Entrada/Saída (E/S) (((Entrada & Saída))) O Sistema Operacional deve controlar todos os dispositivos de E/S de um computador. Deve emitir comandos para os dispositivos, interceptar interrupções e tratar os erros, deve também fornecer uma interface simples e fácil de usar, na medida do possível, esta interface deveria ser a mesma para todos os dispositivos. Ou seja, para o usuário ler dados de um arquivo ou de um dispositivo de rede as chamadas ao sistema são iguais, mudando apenas os parâmetros de entrada. ===== Dispositivos de E/S Os dispositivos de E/S podem ser de modo genérico, divididos em duas categorias: dispositivos de blocos e dispositivos de caractere. Um dispositivo de bloco é aquele que armazena informação em blocos de tamanho fixo, cada um com seu próprio endereço. Os tamanhos de blocos variam de 512 bytes a 32.768 bytes. A propriedade essencial de um dispositivo de blocos é que cada bloco pode ser lido ou escrito independente de todos os outros. Discos são dispositivos de blocos mais comuns. O outro tipo de dispositivos de E/S é o dispositivo de caractere, o qual envia ou recebe um fluxo de caracteres, sem considerar qualquer estrutura de blocos. Ele não é endereçável e não dispõe de qualquer operação de posicionamento. Impressoras, interface de rede, mouses e a maior parte de outros dispositivos que são diferentes do disco são considerados dispositivos de caractere. ==== Sistema de Arquivo (((Sistema de Arquivo))) Um problema em manter a informação dentro do espaço de endereçamento do processo é quando o mesmo termina, e sua informação é perdida. Em muitas aplicações a informação precisa ficar retida por semanas, meses ou até para sempre. A solução usual para esse problema é armazenar a informação em disco, em unidades chamadas arquivos. Chamadas ao sistema são obviamente necessárias para criar, remover, ler e escrever arquivos. Antes que possa ser lido, um arquivo deve ser localizado no disco, aberto e depois de lido, fechado. Desse modo, chamadas ao sistema são fornecidas para realizar estas tarefas. Para ter um local para guardar os arquivos, a maioria dos Sistemas Operacionais fornece o conceito de diretório como um modo de agrupar arquivos. São necessárias chamadas ao sistema para criar e remover diretórios. São também fornecidas chamadas para colocar um arquivo em um diretório e removê-los de lá. Entrada para diretórios também podem ser outros diretórios, formando uma hierarquia de diretórios como ilustrado na <>. [[fig_sistema_de_arquivos]] .Sistema de Arquivos de um computador pessoal. image::images/sistemas-operacionais/hierarquiaArquivos.png[scaledwidth="60%"] Antes que possa ser lido ou escrito, um arquivo precisa ser aberto e, nesse momento as permissões são verificadas. Se o acesso ao arquivo, pelo usuário, for permitido, o sistema retorna o descritor de arquivo para usá-lo em operações subseqüentes. Se o acesso for proibido, um código de erro é retornado. === Recapitulando Neste capítulo introduzimos o conceito de Sistema Operacional, descrevendo suas duas principais funções paras os programadores de aplicações: Extensão da Máquina e Gerenciamento dos Recursos da máquina. Analisamos a evolução dos Sistemas Operacionais na história, ligados a evolução da arquitetura dos computadores a eles associados e ainda identificamos os tipos de Sistemas Operacionais baseado nas necessidades de cada arquitetura. Por fim, descrevemos os principais conceitos de um Sistema Operacional na visão de seus usuários, estes conceitos são: Processos, Thread, seus estados e transições; Gerenciamento de Memória e Sistemas de Arquivos. // FIXME Faltando ponte para o próximo capítulo. === Atividades 1. Quais as principais funções de um Sistema Operacional? Para quem se destinam estas funções? 2. Descreva o que é um Processo. Quais seus possíveis estados? Quais são as transições entre estes estados? 3. Descreva três tipos de Sistemas Operacionais, destacando suas principais funções para a arquitetura do computador que o mesmo executa. 4. Durante a programação de uma aplicação de usuário, para que serve o uso de chamadas de sistema (system calls)? 5. Como o Sistema Operacional abstrai o uso dos dispositivos de E/S? Quais são os dois tipos de dispositivos de E/S manipulados pelo Sistema Operacional? 6. Qual a função do Sistema de Arquivo no Sistema Operacional?