Baixe o app para aproveitar ainda mais
Prévia do material em texto
ARQUITETURA DE COMPUTADORES E SISTEMAS OPERACIONAIS Wellington Barbosa 2 SUMÁRIO 1 INTRODUÇÃO À ORGANIZAÇÃO DE COMPUTADORES ............................. 3 2 PRINCIPAIS COMPONENTES DA ARQUITETURA DE COMPUTADORES .... 20 3 ARQUITETURAS DE COMPUTADORES BÁSICAS E AVANÇADAS .............. 34 4 FUNDAMENTAÇÃO DOS PRINCIPAIS CONCEITOS RELATIVOS À ÁREA DE SISTEMAS OPERACIONAIS ........................................................................ 49 5 ESTUDO DA ESTRUTURA DOS SISTEMAS OPERACIONAIS MAIS UTILIZADOS .............................................................................................. 65 6 PESQUISA SOBRE OS PRINCIPAIS SISTEMAS OPERACIONAIS UTILIZADOS NOS DIAS ATUAIS ..................................................................................... 84 3 1 INTRODUÇÃO À ORGANIZAÇÃO DE COMPUTADORES Olá, aluno! Neste bloco, vamos compreender um pouco melhor as diferenças entre organização e arquitetura de computadores, passando um pouco por seus modelos físicos e lógicos. Além disso, vamos nos apropriar melhor dos conceitos de sistemas de computação e de processamento de dados, diferenciar o que é dado, informação e conhecimento, e como os sistemas computacionais modernos nos ajudam a obter cada um deles. Vamos também fazer um passeio pelo tempo e analisar o histórico das gerações de computadores com suas principais características e mudanças no decorrer do tempo. E, para concluir o bloco, vamos conhecer a relação entre arquitetura de computadores e os sistemas operacionais, o que irá nos apoiar na escolha de bons sistemas operacionais para realização das nossas tarefas corporativas de maneira adequada ao hardware que temos à disposição. 1.1 Arquitetura vs. Organização de Computadores: a organização estruturada de computadores e a descrição dos componentes da arquitetura de computadores Os termos arquitetura de computadores e organização de computadores podem parecer um pouco redundantes e confusos a princípio, porém, ao nos familiarizarmos, fica fácil distingui-los. O termo arquitetura de computadores tem relação com os componentes mais visíveis ao programador durante o desenvolvimento de seus softwares, já organização de computadores é algo mais transparente, imperceptível ao programador e principalmente a usuários finais, muitas vezes sendo a forma de implementação dentro da arquitetura. Um sistema desenvolvido para determinada arquitetura pode não funcionar se implantado em uma arquitetura diferente da sua atual. Como exemplo disso, podemos reparar em diversos sistemas operacionais atuais a distinção entre arquitetura de 64 bits e 32 bits para processadores. Programas feitos para arquitetura de 32 bits não irão 4 funcionar em um processador 64 bits, a menos que haja uma adaptação para realizar a compatibilidade entre arquiteturas. Podemos ver com esse exemplo que a troca de arquitetura influencia diretamente no desenvolvimento e escolha de um software. Quando nos referimos à organização de computadores, não irá impactar diretamente no processo de utilização ou escolha de um software. Algo que pode estar relacionado, por exemplo, é a estratégia de multiplicação para pontos flutuantes. A mesma arquitetura pode suportar uma estratégia em que a unidade central de processamento, popularmente conhecida como CPU (do inglês, Central Processing Unit), realiza a multiplicação direta entre dois números; ou adotar a estratégia que, em vez de realizar a multiplicação direta, faz a soma de maneira equivalente à multiplicação. Por exemplo, em vez de realizar o cálculo direto de 3 x 5, pode ser realizado o cálculo 5 + 5 + 5. Em ambos os casos, se a CPU tem capacidade de realizar instruções de multiplicação, o resultado será 15, mas cada um foi realizado com uma organização diferente. A arquitetura também pode ser alterada de acordo com a funcionalidade que o computador terá. É bem comum utilizar processadores com arquiteturas diferentes em máquinas cliente (máquinas utilizadas por usuários finais) e máquinas com a função de servidor (que promovem serviços para diferentes pessoas simultaneamente). Normalmente, um servidor terá um processador que suporta mais tipos de virtualização e paralelismo de tarefas, além de maior capacidade de recebimento de diversas instruções simultaneamente. Por sua vez, uma máquina cliente pode até ter maior frequência de processamento para uma tarefa exclusiva, porém menor capacidade em multitarefas e virtualização. O conhecimento nessa área se faz fundamental, principalmente para uso em empresas, pois a escolha de uma arquitetura de computadores errada pode comprometer um projeto ou levar a empresa a trocar os seus sistemas em decorrência da arquitetura. Outro caso que pode acontecer é a compra de uma arquitetura muito mais cara do que a necessária e não utilizar suas vantagens, como, por exemplo, a compra de computadores com processadores de servidor para utilizar em estações 5 que irão realizar tarefas únicas, sem a necessidade de distribuição do processamento entre diversos computadores. Nesse exemplo, haveria computadores mais caros, provavelmente com menor desempenho para tarefas únicas e sem utilizar as vantagens de uma arquitetura voltada para grandes volumes de tarefas. Já a alteração da organização do computador é algo que não influencia diretamente na escolha do software, pois um mesmo fabricante pode manter uma arquitetura por décadas e só melhorar a sua organização, com isso, reduzindo custos e aumentando o desempenho. Se isso ocorrer, os clientes não terão problemas ao migrar os seus sistemas de um parque antigo de máquinas para um novo parque. Como citado acima, se o processador aceita instruções de multiplicação, não será relevante ao programador se tal tarefa está sendo realizada diretamente em uma unidade lógica aritmética com suporte à multiplicação, ou se esse cálculo é realizado por uma sequência de somas e depois retornado o resultado. 1.2 Conceituação de sistemas de computação e processamento de dados Para efeito de definição, iremos tratar computador como “uma máquina (conjunto de partes eletrônicas e eletromecânicas) capaz de sistematicamente coletar, manipular e fornecer os resultados da manipulação de informações para um ou mais objetivos” conforme Monteiro (2010) define em seu livro. Porém, essa definição em tempos atuais pode indicar muitas coisas. Se pararmos para analisar, temos computadores em todo nosso cotidiano e a todo momento. Hoje em dia, diversos aparelhos eletrônicos fazem coletas, manipulações e/ou fornecimento de dados para gerar informações, até mesmo um cartão de transporte público armazena dados que serão coletados em um computador ligado à catraca do ônibus. Antigamente, o serviço executado pelos computadores muitas vezes era conhecido como processamento eletrônico de dados, inclusive, em muitas empresas o que hoje é chamado de departamento de Tecnologia da Informação (TI), antes era conhecido como Centro de Processamento de Dado (CPD). Entretanto, essa mudança de nomenclatura ocorreu porque, atualmente, o papel desempenhado pelo 6 departamento vai além de exclusivamente processar dados, mas também está diretamente relacionado com a geração de informações que irão apoiar o negócio da empresa, e a produção dessa informação é através de recursos tecnológicos. O processamento de dados é apenas uma fase do processo de obtenção da informação. Após a coleta dos dados, temos a primeira fase, o processamento, quando os dados coletados serão manipulados de maneira sistemática e de acordo com as necessidades definidas, para então gerar as informações. A partir da sua análise gerada com auxílio do computador, será possível realizar uma análise humana e, com isso, obter conhecimento para apoiar as decisões da empresa e auxiliarna melhora dos resultados do negócio. Fonte: elaborado pelo autor. Figura 1.1 – Fases do processo de obtenção de informação: dados, processamento, informação, análise e conhecimento. 7 Os dados são a base dos processos, a matéria-prima antes de qualquer manipulação, ou seja, da forma como foi obtido da fonte de coleta. O dado puro é algo sem significado, não transmitindo nenhuma ideia se analisado de maneira bruta. Após o processamento dos dados, temos a informação, que pode ser entendida como dados organizados de acordo com alguma estrutura ou padrão para possibilitar a compreensão humana. Com os dados formatados de acordo com a necessidade, iremos para a fase da análise, para gerar o conhecimento humano e permitir tomadas de decisões mais assertivas. Conforme pode ser visto na figura, primeiro se coletam os dados, depois ocorre o processamento para gerar informações e, então, faz-se a análise que leva ao conhecimento. 1.3 Evolução histórica dos computadores Seguindo a definição clássica de computador, podemos dizer que o primeiro computador digital (baseado em dígitos) foi projetado pelo matemático inglês Charles Babbage, que viveu entre 1792 e 1871. Ele dedicou a maior parte de sua vida ao desenvolvimento dessa máquina; porém, devido à falta de tecnologia da época, faleceu antes de vê-la funcionando. Figura 1.2 – Charles Babbage (1792-1871). 8 Durante o projeto do primeiro computador digital, época que ainda nem se imaginava a existência de sistemas operacionais, Babbage identificou a necessidade da construção de rotinas lógicas e estruturadas, para que sua máquina pudesse realizar as tarefas necessárias. Para solucionar esse problema, Babbage contratou a pessoa que hoje podemos chamar de a primeira programadora da história: Ada Lovelace. Após essa tentativa da construção da primeira máquina digital para realização de cálculos analíticos, levou-se um tempo para existir mais alguma pesquisa relevante nessa área. Quando as pesquisas voltaram a acontecer, começou a história das arquiteturas de computadores modernos e dos sistemas operacionais. Como maneira de organização, podemos categorizar nossos estudos dividindo entre as quatro gerações de arquiteturas de computadores (TANENBAUM, 2016). Com o início da Segunda Guerra Mundial, a necessidade de efetuar cálculos mais rápidos e mais precisos foi aumentando, a sociedade já precisava de equipamentos que fizessem tal tarefa para terem vantagens estratégicas sobre os inimigos. Por esse motivo, nessa época, a evolução dos computadores deu um grande salto, fazendo com que diversos pesquisadores idealizassem suas máquinas e começassem o processo de construção. A maioria das máquinas dessa geração eram baseadas em válvulas e levavam segundos para realizar até mesmo os cálculos mais simples. Tinham grande problema de falta de confiabilidade, pois usavam uma quantidade muito grande de válvulas que frequentemente queimavam; logo, não se podia confiar muito no equipamento. A utilização desses equipamentos era muito complicada, desde seu armazenamento (pois eram computadores enormes) até a manutenção. Isso acontecia porque era necessária uma equipe de profissionais com qualificação muito específica para que tivessem seu funcionamento da maneira adequada. Outro fator que complicava muito a utilização desses equipamentos era o fato de que a única maneira de interagir com eles, para realizar as tarefas, era por meio de painéis de programação. A ausência de sistemas operacionais nessa geração de computadores limitava seu uso a somente técnicos altamente capacitados, pois todas as instruções 9 deveriam ser passadas em linguagem de máquina. Nessa época, não existia nem a assembly, linguagem de segunda geração que faz uso de instruções semelhantes às de máquinas, mas com uso de algumas palavras em inglês. Somente no começo da década de 1950 foi inserido o cartão perfurado: o “programador”, podia desenvolver cartões perfurados para criar algum tipo de rotina, que seria executado sem a necessidade de intervenção continua no painel de programação. Essa difícil manipulação dos equipamentos normalmente fazia com que somente o próprio criador conseguisse fazer uso adequado de sua invenção. Figura 1.3 – Cartões perfurados da década de 1940. Na segunda geração de computadores, que teve início em meados da década de 1950, as condições se alteraram bastante, pois foi inserido o uso de transistores para substituir a utilização de válvulas. Com o uso de transistores, já era possível ter computadores capazes de funcionar tempo o suficiente para executar tarefas úteis sem a necessidade de manutenção tão frequente. Porém, nessa geração, os computadores ainda eram equipamentos enormes e de alto custo, onde somente grandes cooperações, universidades ou instituições governamentais tinham a possibilidade de comprá-los e mantê-los. Essa evolução já permitiu que os computadores da época começassem a ser comercializados e não mais operados somente por seus próprios fabricantes. Foi nesse momento da história que houve a possibilidade de separar as equipes que fariam uso dos computadores, sendo possível distinguir o projetista do fabricante, do 10 programador e do técnico de manutenção. Isso porque, a partir de então, cada um tinha seu próprio papel e sua função ao utilizar o equipamento. Começaram a existir diferentes funções e diferentes qualificações para utilização de computadores, mas que ainda demandava alto conhecimento técnico para sua execução. O processo de desenvolvimento dos programas nessa geração de computadores também evoluiu bastante, pois já começaram as linguagens de programação assembly e Fortran, sendo que a princípio havia a necessidade de cada programa ser escrito primeiramente no papel em uma das duas linguagens, e depois as instruções eram passadas para os cartões perfurados. Esses cartões perfurados eram entregues a um operador, que faria a inserção no computador e esperaria um bom tempo até ter a saída do resultado. Essa saída seria entregue novamente para o programador, para que conferisse o resultado e, assim, fizesse uso das informações processadas pela máquina. Esse processo consumia uma quantidade de tempo muito alta para que fosse operacionalizado, pois em diversos pontos havia o deslocamento de um operador andando entre salas para que pudesse pegar todas as instruções de entradas e todos os resultados já processados para levar para os programadores. Foi dessa necessidade que surgiram os primeiros sistemas operacionais. A funcionalidade dos primeiros sistemas operacionais já se assemelhava aos de hoje em dia, o que facilitava a utilização dos recursos de hardware pelo usuário final. Os primeiros sistemas operacionais serviam para fazer a leitura de diversos cartões, armazenar o conteúdo deles em fitas magnéticas para, só depois de uma grande quantidade de instruções armazenadas, começar a executá-las. Quando terminava a execução do processo, a saída era gravada em uma segunda fita magnética. Com isso, ao término de uma instrução, outra já começava automaticamente, podendo assim executar instruções em lote (batch), sem a necessidade de troca de cartões a cada instrução ou um operador para ficar andando entre sala sempre que precisasse começar ou terminar uma instrução. Agora o processo podia executar por mais tempo e com mais instruções sem intervenção humana. 11 No começo da década de 1960 iniciou-se a terceira geração, onde existiam basicamente dois tipos de computadores: os mais potentes, utilizados por grandes empresas e universidade, que tinham grande capacidade de processamento para realização de cálculos e eram orientados a palavras; e os de menor porte, que tinham como principal funcionalidade a ordenação e impressão de fitas, utilizados por companhias de seguros e bancos, orientadosa caracteres ao invés de palavras. Porém, essa segunda estrutura tinha um problema sério de impossibilidade de utilizar programas feitos para uma das arquiteturas funcionar na outra: se, por exemplo, uma empresa comprasse um computador de menor porte e sua demanda crescesse, não poderia fazer a migração dos seus programas para um computador de maior porte. A terceira geração de sistemas operacionais teve seu início em meados da década de 1960, e veio junto com uma solução para o problema de diferentes arquiteturas para os dois tipos de computadores existentes até então. A IBM lançou a primeira geração de computadores baseados em circuitos integrados e não mais em transistores individuais. Isso permitiu que os equipamentos ficassem com um custo-benefício muito mais acessível, e também possibilitou que computadores de diversos portes executassem o mesmo sistema operacional. Esse fato permitiu que os programas pudessem ser desenvolvidos para funcionar em qualquer porte de equipamento. Em relação as suas antecessoras, essa geração tinha a vantagem de poder ser executada em qualquer tamanho de equipamento e para qualquer funcionalidade. Porém, esse também era seu maior defeito, pois um sistema operacional que funcione para qualquer porte de máquina precisava ser muito grande e com muitas funcionalidades. Era um sistema com milhões de linhas de código, escrita por milhares de programadores e, consequentemente, diversos erros durante sua programação. Eram necessárias atualizações constantes para correções, mas estas vinham com erros diferentes e novamente precisavam de atualizações. 12 Os sistemas operacionais de terceira geração, mesmo tendo suas características negativas, também começaram a implementar técnicas fundamentais para a evolução da computação como a multiprogramação. Ou seja, os computadores IO-bound (Input and Output-bound), equipamentos que tinham a maior utilização para tarefas com entrada e saída de dados, podiam executar tarefas de processamento enquanto executavam tarefas de escrita nas fitas ou esperavam sua reposição. O contrário também acontecia em computadores CPU-bound, equipamentos que tinham maior utilização de funcionalidades que exigiam processamento (tipo computadores utilizados para cálculos de previsão do tempo), também conseguiam realizar tarefas de entrada e saída de dados enquanto seus cálculos eram realizados. O que possibilitou essa técnica de multiprogramação foi o fato de a memória começar a ser dividida em partes (MACHADO & MAIA, 2017), podendo deixar uma parte da memória responsável para o sistema operacional e outras partes livres para cada uma armazenar uma tarefa diferente, criando essa concorrência entre processos IO-bound e CPU-bound de maneira a diminuir a ociosidade da máquina. Ainda durante o processo de evolução dos sistemas operacionais de terceira geração, identificou-se que, tendo os sistemas grande capacidade de processamento, suportando multiprogramação e atendendo necessidade de vários tipos de sistemas ao mesmo tempo, ainda tinham grande ociosidade, pois continuavam agindo como sistema de execução em lotes, ou seja, eles executavam uma série de instruções de maneira sequencial (Batch). Isso gerava desperdício de tempo, pois, se um programador errasse uma vírgula durante sua programação, teria que esperar o término da execução de todas as instruções de todos os outros programadores para que pudesse corrigir a sua. Para solucionar esse problema de usabilidade foi colocado um esquema de rodízio de utilização dos recursos computacionais fazendo a divisão por tempo, chamado time sharing. Esse recurso identifica quantas pessoas estão utilizando o computador e destina uma fração de tempo, normalmente muito inferior a um segundo para cada 13 usuário, de maneira que não consigam perceber que estão compartilhando o mesmo hardware com outros usuários, pois a fração de tempo reservado a cada um é tão pequena que fica completamente transparente a quem ele está dividindo o recurso. Na década de 1980, deu-se início a quarta geração de arquitetura de computadores e consequentemente houve mais uma evolução grande nos sistemas operacionais. Graças ao desenvolvimento de circuitos integrados em larga escala, em que se consegue construir chips com milhares de transistores em apenas um centímetro quadrado de silício, foi possível impulsionar a computação pessoal. A partir dessa geração, tanto o tamanho quanto o custo para a produção de computadores diminuíram muito, gerando a possibilidade de que as pessoas pudessem adquirir esses equipamentos para uso inclusive em suas residências, e não mais se limitando apenas à empresa ou aos profissionais com qualificação específica na área de computação. Nessa época se popularizou a nomenclatura microcomputador, pois os computadores com circuito integrados em larga escala tinham seu tamanho bem menor do que as antigas máquinas, que necessitavam muitas vezes de uma sala inteira para funcionar. Junto dessa geração de computadores começaram a surgir novos equipamentos, como, por exemplo, os discos flexíveis, dando início a uma era. Então, com uma computação mais portátil e mais acessível, houve a necessidade de novos sistemas operacionais que acompanhassem essa evolução. Com isso, algumas empresas começaram a surgir nessa área. Hoje podemos dizer que a empresa dessa época que mais se destacou com o desenvolvimento do sistema operacional foi a Microsoft, com o MS-DOS (Microsoft disk operating system), fundada por Bill Gates. Talvez a principal característica que tenha levado esse sistema operacional a fazer tanto sucesso e se popularizar da maneira que aconteceu tenha sido o fato da Microsoft atrelar a venda de seu sistema operacional ao hardware que o usuário final comprava. Isso fez com que os computadores de diversos modelos, vendidos pela IBM na época, fossem com esse sistema operacional já como padrão. 14 Porém, os sistemas operacionais do começo dessa geração de computadores eram totalmente baseados em comandos digitados pelo usuário; em pouco tempo houve a evolução do desenvolvimento de sistemas operacionais baseados em GUI (graphical user interface), ou seja, sistemas operacionais baseados em janelas, ponteiros, ícones e menus. Esse tipo de interface começou a tornar os computadores mais intuitivos e visualmente mais agradáveis para usuários finais, outro fato que ajudou a popularizar mais ainda a computação pessoal. 1.4 Aplicação de sistemas numéricos e conversão entre bases: breve abordagem sobre aritmética de ponto flutuante Números são representações de um conceito abstrato, normalmente utilizado para representar quantidades. Devido à necessidade das sociedades modernas de quantificar, fazemos uso de números diversas vezes ao dia, seja para calcular um troco ao realizar pagamentos, quantificar idade em aniversário ou mesmo para olhar a hora. Todas as nossas necessidades casuais são em sistemas numéricos de base decimal, ou seja, temos dez números para representar a quantidade que queremos e quando esses dez números acabam acrescentamos mais um dígito, com isso, aumentando a ordem de grandeza no numeral utilizado. Os dez números que costumamos trabalhar são [0,1,2,3,4,5,6,7,8,9]. Reparem que começamos do 0 e vamos até o 9. Se quiséssemos representar com dois dígitos essa mesma sequência numérica, poderíamos escrever [00, 01, 02, 03, 04, 05, 06, 07, 08, 09], que transmitiria a mesma ideia de valor, pois o 0 à esquerda de um número inteiro não altera em nada o seu valor. Porém, com essa quantidade de números isolados, é muito limitada a nossa contagem, então, quando é necessário representar algum valor acima de 9, juntamos mais dígitos para representar. Por exemplo, se seguirmos a sequência, o próximo valor é o 10, e depois o 11. Reparem que o número 10 é o segundo algarismo quetínhamos em nossa sequência numérica decimal (1) seguido pelo primeiro algarismo (0), então iremos alterando o último número da esquerda para aumentar o valor da nossa 15 representação, e se quisermos representar o próximo número, iremos utilizar o segundo número tanto na esquerda quanto na direita (11). Esse processo se repetirá até chegarmos ao 19, a partir de então iremos mudar para 20 e repetiremos o processo. Contar com uma base decimal é muito natural, pois somos ensinados com ela desde a infância. Por isso, muitas vezes não paramos para analisar o como é feita, só a assimilamos e aceitamos; porém, dentro da computação, outras bases numéricas se fazem necessárias, pois trabalhamos com diferentes tipos de medições. Uma base muito utilizada na computação é a binária, onde só temos [0,1]. Essa base frequentemente é utilizada, pois representa a menor unidade de medida da computação, o bit. O bit é utilizado para indicar se há ou não tensão, se uma porta está aberta ou fechada, ligado ou desligado e vários outros estados dentro de circuitos eletrônicos, porém, sempre situações que só podem ter duas possibilidades. Logo, o cálculo com bases binárias facilita o processo. Há momentos em que é mais interessante realizar as representações computacionais por meio de bytes. Um byte é um conjunto de oito bits, e normalmente essa unidade de medida é utilizada para quantificar armazenamento de dados. O tráfego de redes de computadores normalmente é medido em bits, e o tamanho do armazenamento é medido em bytes. Na escrita, utilizamos a letra b minúscula para representar bits ou o B maiúsculo para bytes; podemos contratar um link de internet com velocidade de 100mbps (100 mega bits por segundo) ou ter uma foto com tamanho de 15mB (15 mega bytes). Como normalmente trabalhamos com valores grandes, esse fato pode tornar a representação de dados em binário muito extensa, sendo necessário utilizar outras bases para facilitar a visualização. Essas bases podem ser octal (com oito dígitos [0,1,2,3,4,5,6,7,]) ou hexadecimal (com dezesseis dígitos [0,1,2,3,4,5,6,7,8,9,A,B,C,D,F]). 16 Um momento bem comum de utilizar a base hexadecimal é em padrão de cores RGB (Red, Green, Blue), onde se determina a cor pela mistura de uma dada quantidade de vermelho, verde ou azul. Uma cor de tom alaranjado no padrão RGB seria EEAD2D, sendo os dois primeiros dígitos a quantidade de vermelho, os dois dígitos do meio a quantidade de verde e os últimos dois dígitos a quantidade de azul da cor. Caso essa mesma cor fosse representada em binário, seria 111011101010110100101101. É perceptível que a representação em binário fica muito extensa, bem mais difícil de manusear ou mesmo memorizar, sendo a representação hexadecimal bem mais enxuta. Enquanto a representação binária tem vinte e quatro dígitos, a representação hexadecimal tem apenas 6. O mesmo valor em octal seria 73526455, já uma representação com 6 dígitos. É importante perceber que, embora existam várias bases para representação de valores, todas elas seguem o mesmo padrão de contagem, em acrescentar um novo dígito à esquerda quando o número de possibilidades se esgotou para determinada quantidade de dígitos, como vimos no exemplo da base decimal. Compreendendo essa lógica de funcionamento das bases é fácil reparar que todas elas permitem contar até valores que tendem ao infinito, sempre aumentando a quantidade de dígitos, ou seja, por maior que for um número, sempre será possível escrever um número com valor maior que ele. 1.5 Relação entre a arquitetura de computadores e os sistemas operacionais Os sistemas operacionais evoluíram muito com o passar do tempo e com as diversas necessidades das diferentes arquiteturas dos computadores. Cada modelo de arquitetura tem uma necessidade de um sistema operacional diferente e os sistemas operacionais visam melhorar a usabilidade das principais funcionalidades do computador. Logo, um computador com uma funcionalidade específica também precisa de um sistema operacional específico. 17 O sistema operacional tem a finalidade de servir como intermediário entre o usuário e o hardware, de maneira que aquele não precise conhecer instruções deste, e não precise saber nem mesmo qual a arquitetura do computador para realizar as tarefas básicas com o seu computador. Um questionamento interessante a se fazer nesse momento: o processador do computador que está fazendo uso nesse momento é de 32 ou 64 bits? A grande maioria das pessoas não devem saber responder essa pergunta, pois o sistema operacional cuida de tal diferenciação. Embora um profissional precise saber responder isso com muita convicção, até mesmo para poder realizar a escolha de softwares adequados, essa é uma informação suprimível a um usuário padrão, que usa o computador exclusivamente como meio para realizar suas tarefas e não como atividade final de seu serviço. Mas se você trocar a placa mãe do seu computador, existe a grande possibilidade de ter que apagar o sistema operacional instalado no disco rígido e instalar novamente, pois, no momento da instalação, o sistema operacional irá identificar os componentes de hardware acoplados na placa mãe e tentará instalar os drivers necessários. Drivers são softwares responsáveis por realizar uma boa comunicação entre o sistema operacional e os hardwares conectados a ele. Então, se você trocar a placa mãe de um computador por uma placa que não seja exatamente o mesmo modelo, provavelmente os drivers antigos não irão funcionar por estarem preparados para outro tipo de arquitetura dos componentes da placa mãe. Se houvesse só uma atualização de todos os componentes de hardware, sem que não houvesse nenhuma alteração de arquitetura, mas somente de organização, todos os sistemas instalados teriam tendência de funcionar normalmente, inclusive o sistema operacional. Mas como cada fabricante adota a sua arquitetura, isso seria bem difícil. Então entra outra vantagem do sistema operacional em relação à utilização do hardware por programas desenvolvidos por terceiros: um programa pode ser desenvolvido para ser utilizado em um sistema operacional, onde a principal preocupação do programador será a utilização das chamadas do sistema operacional, 18 ou até mesmo de funções prontas de algum framework instalado no sistema operacional, deixando o programador ainda mais isento da preocupação da interação direta com a arquitetura do hardware. As versões mais recentes do sistema operacional Windows possuem até modo de compatibilidade para a arquitetura do processador. Se você tiver uma versão do Windows voltado para processadores de 64 bits e desejar instalar um programa (normalmente antigo) feito para arquitetura de 32 bits, o próprio sistema operacional irá identificar e realizar uma instalação em diretório separado, com modo de compatibilidade. Isso pode gerar uma pequena perda de desempenho na utilização do programa, porém irá funcionar de maneira adequada. Sistemas operacionais e arquitetura de computadores têm um histórico muito semelhante pois os sistemas operacionais são desenvolvidos para um usuário final tirar o melhor proveito possível do hardware sem ter grande conhecimento técnico sobre o assunto. As gerações de sistemas operacionais sempre foram ligadas às gerações de arquiteturas de computadores; a cada passo que as gerações de computadores deram, os sistemas operacionais foram adequados para atender os novos potenciais dos equipamentos e a nova demanda dos usuários desses computadores. Até nos dias atuais existem sistemas operacionais voltados para arquiteturas especificas como, por exemplo, temos versões de Windows voltadas para servidores, que podem fazer uso de recursos avançados de virtualização; tais recursos de virtualização não poderiam ser utilizados em versões do Windowsvoltadas ao uso pessoal. Também existem versões de sistemas operacionais para dispositivos móveis, um tipo de computador que tem necessidades específicas. Atualmente, uma das principais é a economia de energia, que, embora seja importante em qualquer tipo de computador, em um dispositivo móvel é primordial. 19 Conclusão Neste bloco pudemos ver as características introdutórias aos temas sistemas operacionais e arquitetura de computadores, passando por definições básicas de arquitetura e organização de computadores, tendo uma prévia da definição de sistemas operacionais e analisando os sistemas numéricos utilizados dentro da computação. Além disso, passamos pelo histórico dos computadores e pelas necessidades dos sistemas operacionais em cada geração de computadores. Para finalizar, vimos o ponto de convergência entre sistemas operacionais e arquitetura de computadores. REFERÊNCIAS MACHADO, F. B.; MAIA, L. P. Arquitetura de Sistemas Operacionais. Rio de Janeiro: LTC, 5. ed. 2017. MONTEIRO, M. Introdução à Organização de Computadores. Rio de Janeiro: LTC, 5. ed. 2010. TANENBAUM, A. S. Sistemas Operacionais Modernos. São Paulo: Pearson, 4. ed. 2016. 20 2 PRINCIPAIS COMPONENTES DA ARQUITETURA DE COMPUTADORES Neste bloco, vamos conhecer um pouco mais a fundo alguns dos componentes de um computador e iremos discutir modelos de arquiteturas de algumas partes isoladas. Além disso, vamos nos apropriar das partes que compõem uma CPU, entender mais a fundo o conceito de interrupção, analisar a hierarquia de memórias e entender a importância de cada uma delas. Para complementar o nosso conhecimento sobre essas componentes, também vamos falar sobre dispositivos de entrada e saída e tipos de barramentos. 2.1 Descrição do funcionamento dos processadores. Apresentação da CPU (Unidade de Controle, ULA, Registradores) Se pararmos para analisar, o computador tem certas semelhanças com o ser humano: enquanto este possui olhos para possibilitar a visão, ouvidos que têm parte da responsabilidade pela audição, e o tato para percepção de condições diversas, aquele conta com diversos dispositivos de entrada de informação, como teclado, microfone e mouse. O computador também tem dispositivos de saída como microfone e monitor, que são capazes de transmitir as informações após processadas; de maneira semelhante, os seres humanos utilizam a fala (MONTEIRO, 2010). Mais uma semelhança que temos entre os dois é que toda a informação que entra é processada por um “cérebro” – no caso do computador, pela CPU (Unidade Central de Processamento, sigla do nome em inglês Central Processing Unit). A computação atual se baseia na arquitetura de Von Neumann, que considera que um computador deve conter três estruturas principais: • Unidade lógica e aritmética: Essa parte do processador é responsável pela execução das operações algébricas e decisões sobre as operações booleanas (E, OU, NÃO etc.). Também na ALU (do inglês, Arithmetic Logic Unit) ficam os acumuladores, partes responsáveis por receber informações vindas dos dispositivos de entrada e a última parte por onde os dados passam antes de irem para os dispositivos de saída. 21 • Unidade de controle: A unidade de controle é responsável pela interpretação e execução das instruções passadas para o processador, e irá decidir o que fazer com os dados. • Memória: Na arquitetura de Von Neumann, é previsto que nem todas as instruções podem ser executadas de imediato, inclusive é o grande diferencial desse modelo em relação aos anteriores a ele. Logo, é necessário que haja memória, dividia em hierarquia, para armazenar as instruções que não estão sendo processadas no exato momento. A figura abaixo ilustra a estrutura básica de um processador previsto no conceito da arquitetura de Von Neumann: Fonte: elaborado pelo autor. Figura 2.1 – Estrutura básica de um processador: conceito da arquitetura de Von Neumann. Embora todos os processadores contenham essa divisão de componentes, e cada um seja responsável por suas funcionalidades, fazendo com que o processador funcione com troca de mensagens entre eles, os processadores modernos são fabricados de modo que todos os componentes necessários caibam em apenas um chip. Ao observar um processador, não será capaz de ver cada componente, até porque a tecnologia está evoluída a ponto dos processadores serem compostos por bilhões de transistores (o processador Intel Core i7-6950X tem 4,7 bilhões de transistores) e tudo isso em um espaço de poucos cm². 22 2.2 Conceito de interrupção A maioria dos sistemas operacionais modernos tem a capacidade de executar diversas ações simultaneamente. Hoje em dia, um usuário de computadores costuma executar diversas funções ao mesmo tempo. Por exemplo, ao usarmos nosso notebook, queremos acessar a internet, assistir vídeos e editar planilhas ou documentos de texto ao mesmo tempo; ou, quando utilizamos nossos celulares, também utilizamos os aplicativos de troca de mensagens enquanto ouvimos músicas e alternamos frequentemente para algum jogo ou qualquer outra funcionalidade de nosso dispositivo móvel. Os computadores da segunda geração de arquitetura de computadores só tinham a capacidade de executar um processo por vez, sendo que, ao acabar um programa, o operador tinha que ir até o equipamento e manualmente colocar outro programa para executar até se automatizar esse processo e possibilitar a execução de arquivos em lote (batches) onde era possível organizar para ao término de uma execução o início de outra. Na geração seguinte de arquitetura de computadores, os sistemas operacionais já conseguiram fazer uso de um novo conceito de execução de processos, que possibilitou a execução de diversos programas diferentes ao mesmo tempo, aparentemente. O conceito central utilizado em um sistema operacional é o de processos, afinal, a principal funcionalidade de um sistema operacional é facilitar a interação do usuário com o hardware, sendo o intermediário na hora de executar programas diversos, fazendo isso com o melhor aproveitamento possível do hardware. O processo é uma abstração do programa em execução que permite a capacidade de pseudoparalelismo ao executar diversas tarefas ao mesmo tempo, mesmo havendo apenas uma CPU. O processo a divide em diversas CPUs virtuais e consegue, assim, alternar entre elas, gerando concorrência de tarefas. 23 Essa característica de um ambiente permitir a execução de múltiplos processos ao mesmo tempo é chamada de multiprogramação. Em um ambiente multiprogramado, o sistema operacional chaveia (efetua a troca) do processo que está na CPU a todo momento, disponibilizando algumas dezenas de milissegundos de processamento a cada programa em execução, de maneira que nenhum processo fique sem ter sua necessidade atendida. Devido ao fato de cada processo ficar apenas alguns milissegundos na CPU e depois entrar outro processo, dizemos que é um pseudoparalelismo, pois não se executam diversos processos paralelos na CPU, mas há uma troca rápida do processo que está sendo executado no momento, gerando a sensação de que vários estão em execução simultaneamente; porém, o paralelismo real só pode ocorrer em sistemas distribuídos que possuam diversos processadores trabalhando em conjunto de maneira transparente ao usuário, sendo que cada processador ficará responsável por um processo por um determinado tempo. Em determinados momentos, pode acontecer de um evento em especial interromper essa distribuição justa de tempo para cada processo e ter a necessidade de ser executado naquele exato momento; esse tipo de situação é chamado de interrupção. Fonte: elaborado pelo autor. Figura 2.2 – Exemplo de interrupção. Processos A Processos B Interrupção 24 O mecanismo de interrupção é de suma importânciano modelo de processamento multitarefas, pois, como cada fração de tempo é dedicada a um processo, que ficam enfileirados, seria impossível a identificação de um evento com necessidade de execução imediata caso não houvesse o mecanismo de interrupção. Esse mecanismo é utilizado para indicar a CPU quando ocorrem eventos de grande importância relacionados a elementos do sistema ou periféricos (PAIXÃO, 2014). Por exemplo, em Linux, ao processar um shell script, é possível parar imediatamente o seu processamento com a combinação das teclas Ctrl+C; isso só é possível pois o mecanismo de interrupção captura o comando do teclado antes mesmo da conclusão do script, porém não seria possível, em um mesmo terminal, iniciar um novo script antes da conclusão do anterior, já que os processos são enfileirados e gerenciados pelo escalonador de processos. Porém, quando há uma interrupção, o script tem prioridade de execução no momento e, após a interrupção, os processos novamente seguirão a ordem normal definida pelo escalonador de processos. 2.3 Memória interna O ideal para todo desenvolvedor de software (e embora eles não saibam, mas para os usuários modernos também) seria que os computadores tivessem uma quantidade infinita de espaço de armazenamento, com alta velocidade, de maneira não volátil e a um custo baixo. Porém, juntar todas essas características em apenas um tipo de memória é algo utópico (TANENBAUM, 2016). Para compensar essa impossibilidade de ideal, os sistemas operacionais gerenciam hardwares que possuem o que pode ser chamado de memória hierárquica, onde existem diferentes tipos de memória, sendo cada tipo de memória responsável por um tipo de armazenamento diferente. Como maneira de segmentar as memórias pertencentes a um computador atual, podemos dividir em memória cache, na qual cabem apenas alguns poucos megabytes (um processador Intel® Core™ i7-3770 de 3.9 Ghz de processamento, por exemplo, possui apenas 8 MB de cache), porém, é uma memória de altíssimo custo e com velocidade de leitura e gravação grande. Esse tipo de memória normalmente fica no processador, sendo a responsável por armazenar os dados que serão processados imediatamente. 25 O segundo tipo de memória que podemos citar é a memória principal. Nessa memória ficam armazenados os dados voláteis, ou seja, aqueles que serão apagados ao término da execução dos programas ou ao desligar o computador. Essa memória também pode ser chamada de RAM (do inglês Random Access Memory, em português seria memória de acesso aleatório) e, normalmente, tem alguns gigabytes de capacidade de armazenamento. Outro tipo de memória que normalmente encontramos nos computadores é a memória secundária, na qual atualmente chegamos a alguns terabytes de armazenamento. Essa memória é onde armazenamos maiores volumes de dados de maneira não volátil, sendo que, ao desligarmos o computador ou ao terminarmos a execução de algum programa, o que for armazenado nessa memória não irá sumir automaticamente. Essa memória depende de comandos específicos do usuário, para que seus dados sejam alterados ou apagados, e normalmente ela é utilizada no HD (hard disk) do computador. A memória RAM é a parte do computador que irá alocar o conteúdo que está em execução no momento. Essa é a memória que se comunicará com o processador. Para que possa acontecer o escalonamento de processos, o conteúdo e os programas que estejam no estado de “pronto” ou “bloqueado” serão guardados na memória principal (RAM). Por esse motivo, quando um computador está com lentidão ao executar os aplicativos, é comum recomendar que se aumente a sua memória – justamente a primária, pois, quanto mais memória RAM tivermos, maior a quantidade de conteúdos executados simultaneamente. Lembrando sempre que, nesses casos, ainda é necessário verificar a limitação do processador. Embora a memória RAM não seja tão rápida quanto a memória cache, ela é muito mais rápida do que a memória secundária. Em geral, a memória RAM fica próxima ao processador para facilitar a troca de dados entre eles. 26 Ao calcular o preço do byte (por exemplo, dividindo o preço total da peça pela quantidade de bytes que tem), o custo da memória principal é intermediário entre o HD e a memória cache, o que possibilita colocar uma quantidade razoável de memória primária no computador; a quantidade de memória cache, por seu valor, é pouquíssima; e a quantidade de memória secundária é grande. A memória principal é conhecida como memória de acesso aleatório (RAM, do inglês Random Access Memory), pois um programa carregado nela pode ser armazenado em qualquer parte, sendo possível fazer sua leitura e gravação de maneira aleatória a qualquer momento, não havendo a necessidade de alocação dos dados em alguma parte específica. A velocidade da memória principal é boa, mas, em geral, com baixa capacidade de armazenamento. Dentre outros motivos, a memória principal tem baixa capacidade de armazenamento pelo seu elevado custo por byte. Em uma configuração padrão de computadores pessoais, um equipamento possui em torno de 4 ou 8 Gigabytes de memória principal. Essa quantidade de memória é muito baixa, às vezes o próprio sistema operacional pode ocupar mais espaço de armazenamento do que isso. Nesse momento, nossa hierarquia de memória entra em ação, pois a memória principal é utilizada somente para armazenamento de dados que estão sendo usados no momento, onde há maior necessidade de velocidade para enviar o conteúdo ao processador, porém, para armazenamentos não voláteis. Ou seja, quando os dados precisam continuar armazenados, mesmo não sendo utilizados e guardados por tempo indeterminado, fazemos uso da memória secundária. A memória secundária mais conhecida para computadores pessoais é o HD (do inglês Hard Disk). Esse componente de nossos computadores é onde o sistema operacional irá armazenar todo o conteúdo permanente, que só será removido caso haja alguma instrução por parte do usuário, ou algum software faça essa solicitação. 27 Diferente da memória primária, o custo de um byte da secundária costuma ter um valor muito baixo, e sua velocidade de leitura e escrita também é muito inferior à velocidade da memória principal. Um computador de uso pessoal padrão hoje em dia costuma ter algo entre 500 GB a 2 TB de armazenamento para conteúdo não volátil. Para que tenhamos ideia da necessidade de espaço de armazenamento de uma memória secundária, para armazenarmos um filme com qualidade full HD, precisamos de aproximadamente 4,7 Gigabytes de espaço disponível em nossa memória, que estará ocupado o tempo todo, independente do filme estar sendo assistido no momento ou não, pois essa memória é não volátil. Outro fator relevante nessa memória é sua velocidade que, computacionalmente falando, costuma ser muito lenta. Embora hoje em dia existam Hard Disks do tipo SSD que dispensam a leitura mecânica dos dados, a grande maioria ainda são os HDs que possuem um disco com agulhas para efetuar a leitura e gravação magnética do conteúdo. Esse processo de movimentação do disco e movimentação da agulha é muito mais demorado do que o simples processo de transferência de pulsos elétricos dentro de um chip. A memória principal armazena dados voláteis e os que estão em sendo utilizados no momento. Logo, de uma maneira geral, temos a necessidade de armazenamentos menores. Porém, como essa memória tem comunicação com o processador, tem a necessidade de maior velocidade. Mas mesmo com a tecnologia tendo evoluído nos últimos anos e a capacidade de armazenamento da memória principal tendo aumentado bastante, os softwares cresceram mais ainda. Por esse motivo muitas vezes somente a memória RAM não é capaz de armazenar todo o conteúdo que está aberto no computador no mesmo momento. Para resolver o problema de haver necessidadede mais memória RAM do que o que tem instalado no computador, os sistemas operacionais modernos adotam um conceito de memória virtual. Esse conceito consiste em usar parte da memória secundária como memória principal. Ou seja, o conteúdo que foi iniciado, mas não está em uso exatamente naquele momento, pode ser guardado no HD caso a memória principal esteja quase toda sendo utilizada por outros processos. 28 Com isso, é possível manter a execução de todos os conteúdos simultâneos, porém com grande perda de desempenho, pois a velocidade de leitura e gravação da memória secundária é muito menor do que a da memória principal. Entretanto, essa técnica só é utilizada quando a memória principal está quase toda ocupada e, se acontecer com frequência, provavelmente o hardware do computador deve ser alterado, colocando mais memória principal. Como mencionado anteriormente, o ideal seria que todos os computadores possuíssem uma quantidade ilimitada de memória, com alta velocidade, de maneira não volátil e a um baixo custo. Mas isso não é possível mesmo com a tecnologia atual, e, para contornar esse problema e possibilitar múltiplas ações por um mesmo equipamento, os sistemas operacionais adotam uma hierarquia de memórias. Essa hierarquia permite que cada necessidade de memória tenha uma tecnologia diferente para que possa atendê-la. Onde é necessário ter memória mais rápida, tem- se menos memória; onde se precisa mais memória, adota-se uma memória economicamente mais viável, tornando possível, com isso, ter um sistema com muita memória e com memórias rápidas, mas cada uma delas fazendo o seu papel. 2.4 Interfaces de Entrada e Saída De acordo com a arquitetura de Von Neumann, um computador deve ter a capacidade de armazenar dados e instruções que serão executadas em memória, para realização de tarefas futuras. Esse pensamento foi proposto em 1946 para substituir o então modelo que só processava os dados passados no momento. Com isso, todos os dados são armazenados na memória e depois enviados à CPU, então o usuário irá obter os resultados de acordo com as instruções recebidas. Porém, todos esses dados precisam ser inseridos na memória de alguma forma, e todo o resultado do processamento também precisa ser apresentado ao usuário. Para isso, são utilizados os periféricos de entrada e saída. 29 Os periféricos de entrada e saída são interfaces para a troca de mensagens entre o homem e a máquina. Podemos definir interface como sendo um ponto de contato entre os dois, artefato que permite o ser humano transmitir dados para o computador de uma maneira que seja interpretável pela máquina e vice e versa. Para o computador, a letra “A” não é interpretada como para nós, seres humanos; enquanto enxergamos um desenho convencionado com o som de A, para o computador a mesma letra é uma sequência de pulsos elétricos que poderia ser representada em binário por 01000001 (letra A maiúsculo em binário). Porém, devido às nossas interfaces, podemos apertar uma letra no teclado, passar tal instrução para o computador, ele interpretar e retornar no monitor o desenho da letra que estamos acostumados a enxergar, por isso dizemos que tanto o teclado como o monitor são interfaces para troca de dados entre homem e máquina. Os elementos que têm a função de receber ou transmitir dados em um computador são chamados de dispositivos ou periféricos de entrada e saída. Esse tipo de periférico compõe um subsistema computacional chamada subsistema de entra e saída, que muitas vezes pode ser abreviado para E/S, ou do inglês I/O (Input and Output). É, portanto, muito comum encontrar em especificações técnicas uma unidade de medida chamada taxa de I/O, onde indica a capacidade de entrada e saída de dados de determinado periférico. Essa unidade de medida é uma das principais características a ser observada em um HD. Os periféricos de entrada e saída podem ser divididos em duas categorias, dispositivos de entrada e dispositivos de saída, porém existem alguns dispositivos que ficam nas duas categorias, simultaneamente. Como exemplo de dispositivos de entrada temos o teclado, que citamos anteriormente, em que ao apertar um botão ele transmite informações ao computador, permitindo-o interpretá-las. Outro exemplo de periférico de entrada é o microfone, onde podemos enviar informações de áudio para o computador e posteriormente até tratá-las. Ou seja, qualquer equipamento que tenha a capacidade de receber dados e os transmitir para o computador são periféricos de entrada. 30 Um exemplo que podemos citar de periférico de saída é o monitor, no qual o computador converte as instruções binárias processadas pela CPU em formas visuais interpretáveis pelos seres humanos e repassa ao monitor, mostrando imagens. Outro exemplo muito tradicional de periférico de saída seria a impressora, que através de tinta em um papel envia informações do computador para o ser humano. Podemos considerar como periférico de saída qualquer equipamento que tenha a função de transmitir dados do computador para os seus usuários. Conforme citado, também existem alguns equipamentos que são periféricos tanto de entrada quanto de saída, nessa categoria temos algumas unidades de armazenamento, como HD ou mesmo pen drive. Esses dispositivos podem receber e enviar dados ao computador, não se limitando apenas à entrada ou saída dos dados. Componentes como esse têm como principal unidade de medida a taxa de transferência de dados. Os dados trocados entre os periféricos de entrada e saída podem ser transmitidos de maneira serial ou paralela. Uma interface de comunicação serial faz o envio de cada bit de maneira sequencial, ou seja, envia um bit de cada vez através do canal de comunicação. Esse é o principal método utilizado para comunicações de longa distância, como nas comunicações de redes de computadores, devido ao fato de reduzir custos com cabeamento e menor dificuldade em relação a sincronização dos bits transmitidos. Outra característica da transmissão serial é poder ser síncrona ou assíncrona. A primeira acontece de maneira em que os bits são enviados de maneira contínua e em um intervalo de tempo fixo, não havendo espaços maiores ou menores entre o enviado de cada bit. Caso o emissor não tenha dados para transmitir, serão enviados bits especiais que serão desconsiderados no receptor, mas não irá parar enviar os dados em um tempo fixo. Já na assíncrona, os dados serão enviados conforme a demanda, tendo intervalos diferenciados para o enviado de cada bit. Já em uma interface paralela é possível enviar muitos bits simultaneamente, porém há necessidade de cabos com muitas vias e é preciso sempre manter o sincronismo para evitar o envio redundante de dados. 31 2.5 Barramentos Um computador é composto por diversos componentes, e de uma maneira geral há intercomunicação entre eles. Por exemplo, todos os dados de todas as partes de um computador precisam passar pelo processador. Também há casos em que a parte gráfica de um computador pode ser processada em uma placa de vídeo que possui processador próprio e entregará dados já pré-processados. Além disso, as diferentes memórias trocam dados constantemente para poder manter a hierarquia necessária. Fonte: elaborado pelo autor. Figura 2.3 – Esquema de comunicação dos componentes sem e com barramento. Mas para tantos componentes diferentes poderem transmitir informações um para o outro, é necessário que todos estejam interligados de alguma maneira e, para isso, existem os barramentos. O barramento é um conjunto de linhas de comunicação que permitem a interligação entre os diversos componentes do computador por meio de um caminho único. Em vez de ligar um componente diretamente ao outro, o que iria gerar um número muito grande de interconexões, todos os componentes são ligados ao barramentoe as mensagens trocadas por essa via. Componente 1 Componente 3 Componente 2 Componente 4 Se não houvesse barramento Com barramento Componente 1 Componente 3 Componente 2 Componente 4 32 Figura 2.4 – Placa mãe. Ao olharmos a imagem de uma placa mãe, podemos perceber que existem alguns espaços para ligar mais componentes, como placas de memórias, vídeo e até a fonte de alimentação. Esses espaços são conhecidos por slot, os responsáveis por conectar os novos componentes ao barramento central da placa mãe e realizar a troca de informações necessárias entre cada parte. Além destes, a própria placa mãe já vem com muito componentes inseridos nela, chamados de onboard, e os componentes que são colocados posteriormente são chamados de offboard. Os barramentos são divididos em barramentos internos e de extensão, os barramentos internos são os que permitem a comunicação dos componentes onboard da placa e suas estruturas principais, como comunicação entre memória e processador. Já os barramentos de extensão são os que possibilitam a inserção de novos componentes por meio dos slots. 33 Conclusão Neste bloco, conhecemos os principais componentes de um computador e como eles trocam informações entre si. Para isso, foi apresentado o que é um processador e cada um dos componentes que o constituem. Também vimos que existe mais de um tipo de memória dentro do computador, e as vantagens e desvantagens de cada tipo de memória, como a velocidade de gravação e leitura e o custo para sua utilização. Conhecemos também os dispositivos de entrada e saída, falamos sobre os barramentos e como eles ajudam a comunicação interna da placa mãe de um computador. REFERÊNCIAS MONTEIRO, M. Introdução à Organização de Computadores. Rio de Janeiro: LTC, 5. ed. 2010. PAIXÃO, R. R. Arquitetura de Computadores – PCs. São Paulo: Érica, 2014. TANENBAUM, A. S. Sistemas Operacionais Modernos. São Paulo: Pearson, 4. ed. 2016. 34 3 ARQUITETURAS DE COMPUTADORES BÁSICAS E AVANÇADAS Neste bloco, vamos discutir os modelos avançados para processamento de informação. Também entenderemos as técnicas básicas de multiprocessamento e como elas são utilizadas no mercado de computadores atuais. Em posse desse conhecimento básico, vamos discutir os modelos avançados e como os supercomputadores atuais fazem uso dessa técnica para aumentar exponencialmente o seu poder de processamento. Além disso, vamos analisar as formas como multiprocessamento pode ser implementado e traremos algumas noções sobre computação distribuída. Vamos lá? 3.1 Conceituação de multiprocessamento simétrico e assimétrico Ao analisarmos a história da arquitetura de computadores, podemos ver que houve grandes mudanças nos conceitos de utilização dos computadores e em suas especificações técnicas. Cálculos que eram efetuados em dias nos supercomputadores da década de 1950, podem ser realizados em segundos em qualquer computador moderno (MACHADO & MAIA, 2017). Porém, mesmo com toda essa evolução, os computadores atuais ainda têm suas limitações, principalmente com relação a processamento. Nos dias atuais, o processamento ainda é o maior gargalo que se tem na computação. É muito mais comum encontrar problemas que esbarram na falta de poder de processamento do que em outros aspectos, como, por exemplo, o armazenamento de dados. Fatores como armazenamento de dados ou até mesmo consumo de energia elétrica são contornáveis quando nos referimos a supercomputadores, mas o processamento tem algumas limitações que iremos discutir mais adiante. Com a evolução dos processadores, foi possível aumentar muito a velocidade de processamento de cada chip, porém ainda temos limitações. Um famoso processador da década de 1980 foi o Intel 386 – em sua versão de lançamento, tinha velocidade de 12 MHz, o que, para a época, era uma revolução um processador comercial com tamanha velocidade. 35 Para que possamos entender um pouco melhor o tamanho da evolução e das limitações que ainda temos, é necessário conhecer a unidade de medida que utilizaremos para comparar os núcleos de processamento. Essa unidade é o Hertz (Hz), cuja função é medir eventos por segundo. Como as outras unidades de medida utilizadas na computação, essa também faz uso frequente das abreviações para indicar múltiplo. Então, se quisermos nos referir a 1000 Hz, podemos utilizar o múltiplo quilohertz, que abreviado fica KHz; em caso de 1000 Khz, temos 1 MHz; para 1000 MHz, temos 1 GHz e assim por diante. Voltando ao processador Intel 386, este tinha uma arquitetura de 32 bits, o qual indica que cada instrução que era recebida em seu ciclo de processamento tinha o tamanho de 32 bits. Já um processador de 64 bits recebe uma instrução com o dobro de tamanho do Intel 386. Uma curiosidade interessante sobre essas duas diferentes arquiteturas de processadores: na computação pessoal, em especial no Brasil, a arquitetura de 32 bits foi amplamente utilizada até por volta de 2014, devido aos recursos tecnológicos e à necessidade de migração de vários sistemas, porém o vídeo game Nintendo 64, lançado em 1996, levava esse nome por seu processador ser de 64 bits e clock de 93 MHz. Isso mostra como a migração de arquitetura de computadores é mais complexa para computadores que possuem sistemas utilizados por muitos usuários diversificados. Agora, comparando o processador Intel 386 a um processador mais atual, podemos usar como referência o Intel Core i9-10900KF, que possui velocidade máxima de 5,3 GHz (quase 4417 vezes mais rápido que o Intel 386 da década de 1980), e arquitetura de 64 bits. Isso quer dizer que esse processador tem capacidade máxima de execução de 5.300.000.000 instruções de 64 bits por segundo em cada núcleo, sem utilizar uma técnica de aumento de desempenho chamada overclock. Em uma busca rápida pela internet, é possível encontrar diversos vídeos de pessoas realizando overclock em seus processadores. Essa técnica é utilizada para forçar o processador a trabalhar em uma frequência acima da qual ele foi projetado para suportar. Alguns vídeos mostram processadores indo além dos 7 GHz, porém, isso 36 exige um sistema de resfriamento muito avançado, normalmente à base de nitrogênio líquido, para que o processador não queime. Um clock muito alto em apenas um núcleo do processador leva a temperaturas altíssimas, o que gera um limitador de velocidade nos processadores modernos. Como forma de contornar essa limitação de velocidade dos processadores modernos, o que se fez para aumentar a velocidade dos processadores foi a inserção de mais núcleos de processamento dentro do mesmo processador. O processador Intel Core i9-10900KF, citado anteriormente, possui 10 núcleos de processamento, o que lhe permite a execução de diversas tarefas simultaneamente a uma velocidade máxima. Com isso, introduzimos o conceito de multiprocessamento! Um computador pode processar diversas tarefas simultaneamente, ou mesmo dividir uma tarefa maior em pequenas tarefas menores, e enviar cada uma dessas tarefas para um processador diferente. Dessa forma, é possível aumentar o poder de processamento sem ter que aumentar de maneira exagerada o clock de cada núcleo. Essa divisão pode acontecer em um mesmo processador com vários núcleos ou dividindo em vários processadores diferentes, e cada um deles com vários núcleos. Quando utilizamos vários processadores distintos, a conexão entre eles pode ser denominada como fortemente acoplada ou fracamente acoplada (Tanenbaum, 2016). A fortemente acoplada é quando a ligação entre os processadores é feita por meio de barramento; e a fracamente acoplada é quando a ligação entre os diversos processadores é feita por rede de computadores. Figura 3.1 – Tipos de processadores 37 Outra característica é se a estratégia utilizada para realizaro multiprocessamento é simétrico ou assimétrico. Em um sistema simétrico, todos os processadores são de mesma arquitetura e compartilham a memória; já em multiprocessamento assimétrico, cada processador tem sua própria memória e pode ser de arquiteturas diferentes. 3.2 Multiprocessadores de memória compartilhada O multiprocessamento permite aumentar bastante a capacidade de processamento dos computadores. Os supercomputadores são todos feitos por meio da junção de diversos processadores e organizados de maneira a resolverem tarefas em conjunto. Existe um projeto que reúne uma lista dos 500 supercomputadores mais poderosos do mundo. Essa lista pode ser conferida no site TOP 500 (vide referências). Confira a lista abaixo com os 5 supercomputadores mais potentes do mundo em novembro de 2020. Fonte: TOP 500, 2020. Figura 3.2 – Os 5 supercomputadores mais potentes do mundo (até novembro de 2020). 38 Nela, são apresentadas diversas características dos supercomputadores, das quais podemos destacar algumas, como o nome do supercomputador, a nacionalidade, o modelo do processador com clock de cada núcleo e a placa de vídeo utilizada. Porém, o que nos é mais interessante neste momento é reparar na quantidade de “Cores” (traduzindo do inglês, quer dizer núcleos), que cada supercomputador possui. O primeiro supercomputador da lista (Supercomputer Fugaku) tem 7.630.848 núcleos, que trabalham em conjunto para entregar uma capacidade de 442.010,0 TFlop/s, podendo teoricamente chegar a 537.212,0 TFlop/s em momentos de pico; em contrapartida, consome 29.899 kW de energia para funcionar. A unidade de medida TFlop/s indica quantas operações com pontos flutuantes o equipamento consegue realizar por segundo. Um Flop/s (acrônimo para floating point operations per second) indica que pode ser realizado uma operação de pontos flutuantes por segundo. Portanto, se 1 KFlop/s são 1000 Flop/s, então 1 TFlop/s é 1.000.000.000.000 Flop/s. Para efeito de comparativo, o processador Intel Core i9-10900KF tem capacidade de processamento de 1,696.0 GFlop/s. Quando nos referimos a computadores com diversos processadores e que trabalham em conjunto para realizar as tarefas, estamos falando em processamento simétrico e assimétrico. No caso de processamento simétrico, todos os processadores devem ser iguais e trabalhar de maneira igualitária, não possuindo um processador mestre e outros escravos (normalmente encontra-se na literatura com os termos em inglês master = mestre e slave = escravo). Esse modelo de processamento exige que todos os processadores tenham acesso direto a mesma memória, além de todos poderem receber demandas do próprio Sistema Operacional. O programador que utilizar computadores com essa estratégia de multiprocessamento terá que tomar cuidados específicos para que seu software não permita que um mesmo processo vá para processadores distintos, pois nesse modelo isso pode ocorrer. Como não há nenhum processador checando o que os outros processadores estão recebendo, a programação para esse tipo de multiprocessamento precisa de cuidados especiais (MONTEIRO, 2010). Porém, tem como vantagem um melhor balanceamento 39 de carga entre os processadores, evitando a sobrecarga de um dos processadores enquanto outro fica ocioso. Com essa estratégia, também é possível adotar uma fila de processos comum entre todos os processadores, em que o escalonamento é feito direto do sistema operacional para o processador disponível no momento da requisição. Além do multiprocessamento simétrico, ou multiprocessamento de memória compartilhada, existe o multiprocessamento assimétrico. No multiprocessamento assimétrico também é possível dividir tarefas entre diversos processadores, porém cada processador terá sua própria memória e cada um pode ser de um modelo diferente, não havendo compartilhamento de memória entre eles. A principal característica que diferencia os processadores é o fato de possuir apenas um processador mestre e todos os outros processadores serem escravos; logo, o único que terá acesso ao sistema operacional será o processador mestre, o qual será responsável pela distribuição das tarefas a cada um dos processadores escravos. Figura 3.3 – Multiprocessamento Assimétrico. Outra diferença do multiprocessamento com compartilhamento de memória (simétrico) em relação ao multiprocessamento sem memória compartilhada (assimétrico) é que, nesse segundo modelo, os processadores não precisam trocar informações entre eles; a comunicação será somente entre o processador mestre e os escravos, da qual dois processadores escravos nunca irão precisar troca dados. 40 No quesito de tolerância a falhas, caso um processador mestre pare de funcionar, um dos processadores escravos irá assumir o lugar dele, e caso algum processador escravo pare de funcionar, somente irá sair da fila de escalonamento dos processos que o processador mestre gerencia. Outra vantagem do multiprocessamento assimétrico é a facilidade em desenvolvimento de sistemas para ele, pois tem um processador mestre gerenciando a fila do escalonador de processos. Isso fica transparente ao programador, não demandando nenhum controle especial por estar usando multiprocessamento. 3.3 Multicomputadores de troca de mensagens Um sistema distribuído é uma coleção de computadores independentes entre si que se apresentam ao usuário como um sistema único e coerente. No sistema distribuído, diversos computadores independentes entre si são interligados e fornecem serviços de uma maneira transparente ao usuário, que não sabe qual (ou quais) dos computadores interligados está atendendo a sua solicitação. Assim, a computação distribuída consiste em adicionar o poder computacional de diversas máquinas interligadas por uma rede de computadores. Essa união tem como objetivo compartilhar a execução de tarefas, conhecida como sistema distribuído. Para que o sistema seja considerado distribuído, no momento em que um usuário fizer qualquer tipo de solicitação, ele não deve passar ou mesmo visualizar o endereço do computador que está realizando a tarefa. Isso implica em uma apresentação única ao usuário, mostrando uma real distribuição do serviço, a ponto de não ser possível identificar qual dos nós está sendo responsável pela requisição. Existem vários exemplos de sistemas distribuídos que utilizamos em nosso dia a dia. Talvez, entre os mais famosos, estejam os compartilhadores de arquivos do tipo P2P (peer to peer). Esse é um modelo famoso e que, em teoria, segue claramente os conceitos de sistemas distribuídos. Redes como gnutella2 e eDonkey fazem uso de aplicativos para compartilhamento de arquivos entre vários dispositivos distintos e independentes, de maneira que, se em algum momento um dos nós falhar, outros computadores poderão assumir o seu lugar, e o usuário nem percebe essa alteração. 41 Ao ingressar sua máquina em uma rede do tipo, qualquer pessoa que esteja na rede poderá fazer solicitação a sua máquina; igualmente, você poderá fazer solicitação a qualquer máquina pertencente à rede, sem necessidade alguma de passar endereços específicos ou mesmo saber onde está localizado o nó que está realizando as tarefas no momento. Outra característica interessante das redes P2P que fazem parte das definições de sistemas distribuídos é a heterogeneidade, que independe do sistema operacional instalado em cada um dos nós. Estes conseguem ter comunicação e troca de conteúdo para realização da tarefa necessária de maneira a desconsiderar o sistema operacional. Os nós fazem todas as trocas de mensagens por meio de uma rede de computadores, usando uma camada intermediária que podemos chamar de middleware. Essa parte é a responsável pela real distribuição das tarefas. A denominação de multicomputador é aplicada a sistemas distribuídos que são compostospor processadores com suas próprias memórias. Isso possibilita que o sistema distribuído seja de fácil escalabilidade. O fato de cada processador do multicomputador possuir memória própria faz com que nenhum processador precise acessar endereçamentos de memória compartilhados com outros processadores; mas, para garantir o sincronismo entre todos, é feita a comunicação interna do sistema por meio de troca de mensagens, aumentando a robustez do sistema como um todo e melhorando a tolerância a falhas, o que facilita uma computação de alto desempenho e alta disponibilidade. O hardware necessário para montar um multicomputador pode ser simples, necessitando apenas de processadores, memórias e uma interface de rede para realizar a conexão entre todos os equipamentos. Com isso, os custos de montagem do sistema são reduzidos e se permite adição de mais poder de processamento sempre que necessário. Existem diversas tecnologias para interconexão dos computadores ligados ao sistema de multicomputadores, como se pode conferir na figura abaixo (TANEMBAUM, 2016): 42 Fonte: TANENBAUM, 2016. Figura 3.4 – Tecnologias para interconexão dos computadores ligados ao sistema de multicomputadores. a) Um comutador simples: topologia em que todos os computadores do multicomputador se ligam a apenas um equipamento (por exemplo, um switch) e trocam mensagens entre eles. b) Um anel simples: cada computador tem dois fios conectados, um que o liga ao computador da esquerda e outro que o liga ao computador da direita; não precisa de nenhum equipamento específico para realizar a interconexão, possui baixa tolerância a falhas. c) Uma grade: também chamada de malha, tem a vantagem da distância máxima entre dois computadores ser a raiz quadrada da quantidade de computadores na rede; possui boa tolerância a falhas. d) Um toro duplo: uma variação da grade, sendo uma topologia bem parecida, porém com ligação entre as margens, o que diminui ainda mais a distância máxima entre os computadores e aumenta mais ainda a tolerância a falhas. 43 e) Um cubo: uma topologia tridimensional, com custo de implantação elevado, mas com alta tolerância a falhas. f) Um hipercubo 4D: um cubo tetradimensional constituído por dois cubos tridimensionais, com os nós correspondentes conectados. Cada uma das topologias tem suas características positivas e negativas mas, de forma geral, quanto maior a tolerância a falhas e maior o desempenho na troca de mensagens, maior o custo também. 3.4 Introdução ao processamento paralelo Nos computadores modernos é possível processar diversos programas simultaneamente, havendo apenas um processador ou vários processadores. Porém, se houver apenas um processador, terão que ser adotadas estratégias especiais para isso dar certo, não permitindo processamento paralelo, mas somente concorrente. A principal estratégia para processar diversos programas simultaneamente é a divisão em processos. O processo é uma abstração do programa em execução, que permite a capacidade de pseudoparalelismo na execução de diversas tarefas ao mesmo tempo, ainda havendo apenas uma CPU. Essa característica de um ambiente permitir a execução de múltiplos processos ao mesmo tempo é chamada de multiprogramação. Em um ambiente multiprogramado, o sistema operacional chaveia o processo que está na CPU a todo o momento, ou seja, efetua a troca do processo, disponibilizando algumas dezenas de milissegundos de processamento a cada programa em execução, de modo que nenhum processo fique sem ter sua necessidade atendida. Devido ao fato de cada processo ficar apenas alguns milissegundos na CPU e depois entrar outro processo, dizemos que é um pseudoparalelismo, isto é, não se executam diversos processos paralelos na CPU, mas há uma troca rápida do processo que está sendo executado no momento, gerando a sensação de que vários processos estão em execução simultaneamente. No entanto, o paralelismo real só pode ocorrer em 44 sistemas distribuídos que possuam diversos processadores que trabalhem em conjunto de forma transparente para o usuário, sendo que cada processador ficará responsável por um processo diferente por um determinado tempo. O modelo de dividir uma mesma CPU entre vários processos, de maneira que cada processo entende ter uma CPU exclusivamente sua, mas na verdade o processador é dividido em diversas CPUs virtuais, é conhecido como modelo de processos sequenciais. Os projetistas de sistemas operacionais modernos utilizam dessa técnica para poderem implementar ambientes multiprogramados. Para que seja possível vários processos dividirem o mesmo processador, cada processo tem fluxo de controle de processo, ou seja, seu próprio contador de programa lógico independente dos outros processos. A CPU também tem um contador de programa físico, que será utilizado por todos os processos que passarem por ela. Então, a cada vez que um processo entra na CPU, ele é processado por determinado tempo; o processador faz sua contagem no contador de programa físico e, quando acabar o tempo desse processo a ser executado, ele sairá do processamento. Porém, seu contador de programa físico será atualizado para a posição na qual o contador de programa físico estava no momento da saída do processo. Por sua vez, quando o próximo processo entrar em execução, a CPU iniciará seu contador de programa físico a partir do contador de programa lógico do processo, dando continuidade exatamente de onde ele estava quando saiu do processamento da última vez, possibilitando que todos os processos possam entrar e sair do processador sem que haja perda ou reprocessamento de qualquer instrução a ser executada pelo programa. Com isso, é gerado um ambiente de processamento concorrente. Já em um sistema de processamento paralelo, é possível que diversos processos estejam em execução exatamente ao mesmo tempo, sem concorrer pelo menos processador. Mas, esse modelo exige a utilização de diversos processadores distintos para realizar a tarefa, sendo que cada processador irá ficar responsável por um ou mais processos; caso ele fique com mais de um, seguirá a mesma estratégia de processamento concorrente, porém, só para seus próprios processos, não impedindo o paralelismo em relação aos outros processadores. 45 3.5 Tendências tecnológicas no mercado de computadores A computação é uma área muito nova se comparada com diversas outras. Na administração, são utilizados conceitos que puderam amadurecer por séculos. Na matemática e na filosofia, são discutidos problemas que têm milhares de anos. Já na computação moderna, temos apenas algumas décadas de estudos, e ainda estamos realizando diversos experimentos para identificar quais a melhores soluções para determinados casos. Algumas soluções vêm se mostrando viáveis para tipos específicos de problemas, o que nos leva a crer que serão as tendências a serem seguidas nos próximos anos e, provavelmente, nas próximas décadas. Uma das tendências mais fortes de mercado é a distribuição do processamento entre vários equipamentos para aumento da capacidade dos processadores. Isso não só para realização de tarefas únicas, mas principalmente para tarefas distribuídas. Com o avanço das tecnologias móveis e portáteis em muitas situações, é mais fácil utilizar dezenas de pequenos processadores em vez de um supercomputador. Além do avanço dos computadores, as redes para transmissão de mensagens também evoluíram muito; o protocolo LTE (também conhecido como 4G), de redes móveis de comunicação, tem potencial para velocidade máxima de 100 Mbps. Considerando esses avanços na arquitetura de computadores e nas redes de comunicação, é possível identificar uma tendência das coisas, cada vez mais, começarem a ter seus próprios processadores e seu próprio acesso à internet. Esse modelo é chamado de internet das coisas (IoT,
Compartilhar