Física Computacional - FSC-5705

só um divisor

O computador

O computador é um dispositivo que recebe, processa e devolve dados. Com base nessa subdivisão um computador possui uma ou varias unidades de entrada, uma ou varias unidades de processamento e uma ou varias unidades de saída. Comumente a unidade de entrada de um computador é o teclado e o mouse, mas também poderíamos considerar discos externos ("pendrive") e "scanners", entre outros; a unidade de saída temos o monitor e a impressora; enquanto que para a unidade de processamento colocamos os discos internos, memórias e os processadores.

O pc

A descrição dada anteriormente é uma descrição bastante genérica de um computador. O computador que vocês tem a sua frente é constituído por um monitor, teclado, mouse e o gabinete (chamado de "cpu" de forma errada). Dentro do gabinete temos as peças ilustradas na figura: a placa mãe, as memorias, os discos (disco duro ou HD - "hard disk"), placa de vídeo e a "cpu" ou processador. A placa mãe é a base onde os outros elementos são colocados, nela também se encontram as trilhas que servem de comunicação entre os diversos componentes do sistema (isso é conhecido como "bus" do sistema). O disco duro ou HD serve local de armazenamento permanente dos programas que o computador pode executar, muitas pessoas denominam este elemento de memoria, essa terminologia está correta porém mas é confusa já que a memoria do computador se carateriza por ser uma elemento de armazenamento volátil isto é, uma vez desligado o computador a memória perde toda a informação que é gravada em ela. O processador é o elemento que realiza o processamento mais intensivo, de fato o nome "CPU" são as sigla de Unidade Central de Processamento (em inglês "Central Processing Unit"). O processador é o responsável por traduzir tudo o que o usuário faz e tudo o que o usuário recebe, por exemplo, quando você clica com o mouse sobre um ícone a placa de vídeo informa ao processador que você colocou o mouse na posição (x,y), o mouse comunica ao processador que o botão esquerdo foi acionado (essa comunicação se da como impulsos elétricos) e é o processador quem interpreta essas duas ações como sendo a solicitação realizada a um programa; ele é capaz de realizar uma determinada ação pois quando o programa deu inicio, isto é, quando o programa foi lido do disco duro e colocado na memoria, na memória se cria uma especie de banco de dados onde são associadas ações com determinados comandos, assim, o processador se mantem verificando a memoria inúmeras vezes para realizar a interpretação dos dados que a ele chegam.

Do anterior podemos inferir que um computador rápido se carateriza por ter uma taxa de leitura e escrita alta para o disco duro, uma memoria rápida, um processador rápido e um bus que suporte a transmissão desses dados todos e se queremos realizar animações ou jogar no computador, precisamos de uma placa de vídeo igualmente rápida (uma placa de vídeo, na atualidade, pode ser considerada quase como uma computador dentro do próprio computador, com memoria e "gpu" - graphics processing unit - tão o mais poderosos que muitas cpus). Assim, teremos computadores com diversos usos, os Desktop - o computadores de messa, destinados ao uso doméstico, os note-net-book que são computadores portáteis e os servidores - que são computadores capazes de suportar muita demanda de processamento ou de acesso ao disco. Na verdade, na atualidade não há uma diferencia real entre estes tipos de computadores. Aproximadamente ante da deca dos $90$ existia uma divisão clara entre servidores e não servidores dada o tipo de arquitetura que esse tipo de maquina utilizava, mas o rápido desenvolvimento dos PCs obriga as companhias de todo o mundo a adotarem essa nova arquitetura como paradigma para servidores (os pcs se caraterizam por todos serem computadores com arquitetura x86 que é mais CISC do que RISC - utilizada pelos antigos servidores)

Um pouquinho de historia

Deveríamos iniciar nossa exposição sobre a historia do computador citando nomes importantes como os de Blaise Pascal, matemático, físico e filósofo francês, inventou a primeira calculadora mecânica em 1642; Charles Babbage, considerado o pai do computador atual, construiu em 1830 o primeiro computador do mundo, cem anos antes de se tornar realidade; Ada Lovelace, quem quem cria o primeiro programa de computador e compreende a essência da maquina de Babbage; George Boole, quem em $1854$ desenvolve a matemática utilizada pelos circuitos dos computadores; Alan Turing demostrou matematicamente que poderiam ser construídas máquinas que imitassem alguns processos (procedimentos para se obter um resultado) e estabeleceu quais eram esses processos; mas iremos mostrar aqui as primeiras maquinas que verdadeiramente se assemelham ao que hoje chamamos de computador.

a maça

Antes de continuar quero fazer uma homenagem a Alan Turing o pai da ciência da computação, quem desvendou o codigo utilizado pelos Alemães na II grande guerra e construe uma das primeiras maquinas de calcular. Encarcerado e humilhado pelo governo Britânico pela sua opção sexual, Turing comete suicídio ingerindo veneno (Uma das maiores lendas urbanas "geek" é que Alan Turing foi homenageado por Steve Jobs - Rob Janoff foi quem desenho na realidade - quando coloca como logotipo da sua companhia, a Apple, uma maça mordida que apareceu colorida muito similar à bandeira dos movimentos pelos direitos civis dos homosexuais no computador Apple II. Esse mito se fundamentou pelo fato de que uma maça mordida foi encontrada do lado do cadáver Alan Turing, se presume que ele tenha colocado o veneno na maça.).

o Z3

O primeiro computador programável no modelo de Von Neumann (na verdade foi Alan Turing quem estabelece os fundamentos de aquilo que conhecemos como computador) foi desenvolvido por Konrad Zuse e chamado de $Z3$ em $1941$. O $Z3$ era um computador eletro-mecanico programável capaz de realizar somas em $0.8$ segundos, multiplicações em $3$ segundos, com memoria de $64$ palavras de $22$ bits. A frequência de operação era de $5,3$ hz, pesava $1000$ kg e consumia $4,0$ kW.

o Eniac

O primeiro computador eletrônico foi o ENIAC - Electrical Numerical Integrator and Computer - criado em 1946. O peso do Eniac era de 30 toneladas e consumia 200 kW de energia. Ele conseguia realizar algo como $5000$ somas por segundo (uma soma a cada $0,2$ milissegundos) mas como ele era uma maquina que realizava operações em paralelo seu pico de operação deveria ser superior. Um fato histórico interessante que podemos associar ao Eniac é a origem do nome computador atribuído a aquelas maquinas que realizavam cálculos, antes da construção do Eniac, o exercito de USA utilizava uma equipe de $80$ mulheres da Universidade da Pensilvânia para calcular manualmente as equações diferenciais necessárias para os cálculos de balística. A essa equipe o exército chamava de computadores. Quando o Eniac foi introduzido 6 computadoras foram escolhidas para testar o equipamento.

o Baby

O primeiro computador a ter um sistema de armazenamento foi desenvolvido como sendo um projeto de pesquisa da universidade de Manchester em $1948$ e foi chamado de Manchester Small-Scale Experimental Machine, mas carinhosamente denominado de Baby. O computador possuía 2048 bits distribuídos em uma matriz de 64x32 bits; ele era capaz de armazenar os dados por até 4 horas e manter até 64 palavras de 32 bits. Uma palavra poderia ser lida, escrita o atualizada a cada $360$ microsegundos. Muita da arquitetura dos computadores atuais foi herdada desse projeto. O sistema consumia no total $3,5$ kW e pesava $1.0$ toneladas. O baby rodou 3 programas, o primeiro programa rodou por 52 minutos e foram realizadas $3,5$ milhões de operações o que resulta em um processador de $1,1$ kIPS (kilo instruções por segundo, um celeron da intel realiza, aproximadamente $3 000$ MIPS - milhões de instruções por segundo)

o bug

Um outro computador eletro-mecânico que merece ser citado é o Mark II. A importância do Mark II está em que foi na sua utilização que foi cunhada a expressão bug para denotar um problema num programa. Quando estava sendo realizado um determinado calculo o computador começou dar uma serie de resultados estranhos que levaram a equipe que cuidava do computador a analisar as causas do mal funcionamento. Depois de muito procurar eles encontraram um insecto (bug em inglês) em um dos contatos do computador (ele era eletro-mecânico). Se acostuma chamar a esse evento o primeiro bug de um computador.

o univac

O primeiro computador comercial de grande escala foi o UNIVAC - UNIVersal Automatic Computer - Embora de menores dimensões que outros computadores da época, o UNIVAC ocupava ainda uma área de cerca de $35,5$ metros quadrados - pesava cerca de $13$ toneladas, cada unidade continha mais de $5000$ válvulas de vácuo e conseguia efetuar pouco mais de 1900 operações por segundo, à velocidade de $2,25\, MHz$ o que permitia uma soma em $0,525$ mili-segundos, internamente era capaz de armazenar $1 0000$ palavras ou $12 000$ caracteres. O preço desse computador era de $1 500 000$ dollares.

o pdp 5

O primeiro minicomputador criado foi o da pdp5 da DEC - Digital Equipament Corporation. Era capaz de realizar $55555$ somas por segundo ($18$ somas em 1 microssegundo) e tinha tinha uma memoria com 4096 palavras. Ele podia ser programado em Fortran, a primeira linguagem de programação de alto nível, introduzido pela IBM - International Business Machines - no IBM 704 (primeiro computador produzido em massa com hardware capaz de realizar operações de ponto flutuante.).

a valvula

O seguinte passo se da com a descoberta do transistor em $1947$ por $3$ físicos que ganharam o premio nobel por esse descobrimento (um deles ganho duas vezes o premio nobel). Esse descobrimento permitiu a diminuição do tamanho e a redução de consumo de energia dos computadores pois substituíram as válvulas que eram utilizadas tradicionalmente (o impulso do uso do transistor em dispositivos eletrônicos é um feito que devemos atribuir à SONY). Em $1958$ é construído o primeiro circuito integrado (IC), ou chip, é construído, um circuito integrado é um pequeno dispositivo que pode substituir todo um circuito elétrico. Na figura de acima podemos ver os tamanhos relativos desses componente, válvula, transistor e IC. Do lado direito da figura podemos ver a cpu do pdp8i, essa cpu foi construída com ICs cada um deles contendo até $100$ transistores.

a Intel

O primeiro microprocessador criado foi pela Intel corporation - INTegrated ELectronics Corporation - em 1972. Tinha aproximadamente $2300$ transistores e um relógio interno de $740\,kHz$, era programável e utilizava 4 bits (um bit é a menor unidade de informação que pode ser armazenada o transmitida. Bit significa digito binário - BInary digiT. Um bit pode representar um de dois possíveis estados como acima e abaixo, 1 ou zero) . Posteriormente foram lançados o Intel $8008$ (de 8 bits ou um byte. Com um byte é possível representar entre 0 e 255 ($2^8$) coisas como números inteiros entre -127 e 128 ou 256 caráteres. O código ASCII é representável com 7 bits). Finalmente em $1974$ aparece o Intel 8080, esse microprocessador tinha $3500$ transistors e uma frquência de operação de $2\,Mhz$. O $8080$ foi um grande sucesso e tornou-se a base para os primeiros microcomputadores pessoais na década de $1970$ graças ao sistema operacional CP/M.

o Apple I e II

Em $1976$ Steve Wozniak desenvolve o Apple 1 utilizando o microprocessadores MOS 6502, um processador de 8-bits e frequência de $1\, Mhz$. O precio incial de venda foi de $666,66$, mas logo passou para $500$. Em $1978$ aparece o Apple II, fabricado com o mesmo processador MOS 6502, trazia $4\,kB$ de memoria RAM (1 kB = 1024 Bytes), uma interface de áudio-cassette para carregar e armazenar programas, linguagem de programação Basic e podia ser ligado à Tv. O preço incial de venda foi de $1298,00$. Posteriormente a unidade de cassette foi subtituida por uma unidade de disco flexível de 5 1/4 de polegadas. O sistema operacional utilizado foi desenvolvido pelo próprio Wozniak e chamado de Apple DOS - DOS disk operating system. Como nota curiosa podemos citar que a MicroSoft criou uma linguagem de programação em Basic que foi substitui o Basic inicial da Apple na suas maquinas, esse sistema foi conhecido como AppleSoft II.

o PC

A IBM, a fim de entrar no mercado dominado pela Commodore PET, Atari 8-bit family, Apple II, Tandy Corporation's TRS-80s, e varias maquinas que utilizavam o sistema operacional CP/M, decide construir um computador de baixo custo pois no seu primeiro intente tinham falhado construindo um micro-computador de $20000$ dólares o IBM 5100. A ideia revolucionaria dos desenvolvedores da IBM foi construir um microcomputador com peças facilmente encontradas no mercado, de uma grande variedade de fornecedores OEMs - original equipment manufacturers. Eles cogitaram utilizar seu próprio microprocessador o 801, mais poderoso que o Intel 8080 (o 801 é o pai dos processadores RISC - Reduced Instruction Set Computer - utilizado até pouco nos computadores de grande porte) com seu próprio sistema operacional, mas finalmente decidiram utilizar o 8080 com o sistema operacional DOS da MicroSoft, essa decisão foi terrível para a IBM, mas benéfica para o pc e sua arquitetura X86 da intel, já que rapidamente surgiram os clones. Em $1981$ é lançado o IBM pc, originalmente consistia de até $256\, kB$ de RAM, não tinha disco rígido e podia utilizar Tv ou monitor e podia utilizar fita cassette ou unidades de disco flexível. O preço incial de venda foi de $1565$ dólares.

A historia dos computadores é fascinante porque tem mostrado que nem sempre o melhor sistema é que se mantem, o mercado é quem tem determinado o rumo das coisas, o padrão PC é um exemplo disso. Na atualidade eu associo o padrão PC ao processador que está dentro dos PC. Duas companhias são as lideres de mercado, Intel e AMD - Advanced Micro Device. Mas na verdade é a arquitetura interna dos processadores que domina, essa arquitetura é conhecida como x86 (ou AMD-64, como a nova extensão de 64 bits). Quando foi desenvolvido o primeiro microprocessador a IBM percebeu que um grande passo poderia ser dado se fora utilizada uma camada de interpretação entre o programa de alto nível e o hardware. Basicamente o microcódigo traduz os programas para os impulsos elétricos dentro do processador, dessa forma a linguagem de programação não precisava mudar, o que mudava era o microcódigo utilizado, nem mesmo o assembler (chamado de linguagem de maquina) acessa o microcódigo. A opção da IBM em 1964 foi construir processadores onde as instruções básicas eram implementados por micro programas (microcódigos) complexos, a esse tipo de arquitetura foi denominado de CISC - complex instruction set computer. Em 1974 a própria IBM percebe que era muito mais benéfico em termos de performance utilizar um conjunto reduzido de instruções no desenho de uma CPU, assim é implementado o padrão RISC -Reduced instruction set computing - tipicamente instruções do tipo RISC podiam ser interpretada em um ciclo de relógio do processador o que permite paralelismo em nível de processador, enquanto que as CISC tomavam mais ciclos. A x86 foi um conjunto de instruções complexas (por isso mais do tipo CISC) desenvolvida pela Intel para seu processador 8086 (16 bits). Como mencionado anteriormente esse tipo de arquitetura se proliferou devido a seu baixo custo em comparação a RISC (a IBM cogitou utilizar o processado 801 - primeiro processador RISC). Posteriormente a Intel (e Microsoft) bloquearam outros intentos de se construírem processadores RISC . Na atualidade os processadores da arquitetura x86 e x86-64 são bem mais parecidos a um RISC do que a um CISC, na verdade o seu núcleo é RISC. De qualquer forma já não é tão simples afirmar se um processador é RISC ou CISC pois os próprios RISC tem se convertido também em CISC com o passar do tempo.

Introdução ao Linux

Sistemas operacionais

Durante este curso precisaremos fazer programas para alguns problemas matemáticos, alimentar esse programa com dados e analisar os dados que esse programa nos fornece, como fazer isso? Para isso devemos dedicar um pouco de tempo a fim de entender o sistema base que gerência o computador, o sistema operacional.

Existem diversos sistemas operacionais, provavelmente vocês conhecem alguns, o pelo menos um deles, o Windows. Um sistema operacional é uma serie de programas muito complexos que dizem ao computador o que deve ser feito através da administração dos recursos que o computador tem, como memoria, processador, disco, interface de rede, monitor, teclado, mouse, etc, o hardware. Todos esse programas trabalham de forma coordenada de fim de responder adequadamente a um comando dado pelo ser humano que controla o computador, pois o sistema operativo oferece uma interface entre o computador e o ser humano.

Unix antigo

Uns dos primeiros sistemas operacionais foi o UNIX (1969), criado por Ken Thompson, Dennis Ritchie, Douglas McIlroy e Peter Weiner (os dois primeiros inventaram o C). Este sistema operacional é um sistema multitarefa e multiusuário. Basicamente consiste de duas partes ou camadas, o núcleo (Kernel) e a camada superior onde está o Shell (mediador entre o núcleo e o usuário), Servidor X (servidor de janelas) e as outras aplicações (ver o video no youtube).

Um outro sistema operacional é o Windows. O Windows passou do sistema de janelas do sistema operacional MS-DOS, para ele próprio ser o sistema operacional. O MS-DOS (MicroSoft Disk Operating System) derivou do QDOS sistemas operacional criado por Tim Paterson quem vendeu este para Willian Gate por US\$ 50.000. A grande importância do MS-Dos no mundos da informática é que ele foi o primeiro sistema operacional direcionado a PCs (Personal Computers) os quais foram criados em 1981 pela IBM com o intuito criar computadores domésticos de Baixo custo diferentemente dos MainFrames (onde o UNIX era usado) que eram computadores enormes utilizados em empresas e universidades. O Windows (o server, especificamente) é um sistema operacional multitarefa e multiusuário. Atualmente não é muito claro que exista uma independência entre o Núcleo, o Shell e o Servidor de janelas.

Gnu and Tux

A fim de portar o UNIX para os PCs, um estudante filandes, Linux Tolvard, criou o LINUX, sua intensão era criar um sistema operacional melhor do que o Minix, que era um clone do UNIX para PCs gratuito. Basicamente o LINUX é o que se denomina de um UNIX-like, ele não é UNIX mas é parecido. Uma vez criado foi totalmente disponibilizado sob a licencia GPL (Gnu Public License), basicamente essa licença permite que qualquer um possa mexer mas, se é criado algo a partir dele (o programa sob GPL), é obrigatório distribuir o código do novo programa. Com isso o Linus convidou uma serie de programadores a contribuir no projeto (ver video). Contudo o LINUX sozinho não é nada, a gente precisas se comunicar com ele; é aqui onde entra o Gnu (Gnu is Not Unix). Em 1984 Richard Stallman funda o projeto GNU com o objeto de cria um sistema operacional totalmente livre. Nesse projeto foram desenvolvidos o compilador com o qual foi compilado o LINUX, o gcc (GNU Compiler Collection - que tem o c, c++, gfortran, gcj, objetive-c e pascal), o Bash (Bourne Again SHel) que é o interpretador de comandos, Emacs que é o editor de texto, Gnome (GNU Network Object Model Environment) que é o ambiente gráfico, Gimp (GNU Image Manipulation Program) programa de edição de imagem, Gzip (Gnu Zip) compressão de dados, Maxima que é um sistema para cálculos algébricos, etc. Finalmente o projeto GNU + o LINUX formam o sistema operacional GNU/LINUX ou abreviadamente LINUX (ver video). Mas, por que usar linux, a resposta é que a grande maioria dos "cluster" do mundo usa Linux, e se temos a sorte de acessar algum devemos ter alguma familiaridade com o sistema.

Cluster com Slax

Bash

A fim de nos comunicar com o núcleo do sistema operacional, é necessário criar um programa que permita este tipo de interação. Nos sistemas UNIX-like foram desenvolvidos diversos "shell" (concha ou camada) a fim de mediar essa comunicação, entre eles temos o csh, tcsh, sh, bash, ksh, zsh. No Linux o shell mais usado é o Bash (atualmente os ubuntus estão utilizando o dash).

Ao ligarmos um computador, onde o GNU/LINUX está instalado, o Linux é comandado por uma serie de scripts (programas do bash) que indicam o que fazer. Uma vez que o Linux finaliza devolve o controle ao Bash e este fica esperando que os comando sejam digitados. Se não foi instalado um gerenciador de janelas, o computador entra na "tela preta" onde aparece um prompt (caso o computador inicie um servidor de janelas o prompt pode ser acessado ao digitar Ctrl + Alt + F1 onde o sistema pede seu logging e senha para entrar. Uma vez dentro que assume o controle é o bash. (Para voltar à tela gráfica basta digitar Ctrl + Alt + F7.

Abrindo um chamador de comandos

Tanto no Xfce, no Gnome como no Kde (os mais famosos ambientes gráficos do Linux) é possível iniciar um programa utilizando a combinação de teclas Alt + F2. Iniciemo agora um terminal. Basicamente um terminal é um programa que disponibiliza um prompt de forma a podermos interagir com o sistema operacional. Para abrir um terminal basta digitar Alt + F2 e no requadro digitar o nome do terminal desejado. O terminal mais simples que existe é o xterm, porem no ambientes gráficos Gnome podemos encontrar o gnome-terminal e no Kde temos o konsole.

No console podemos digitar coisas e o Bash interpreta aquilo digitado e executa o comando desejado. Por exemplo se queremos saber a quem pertence a sessão atual simplesmente digitamos whoami e o bash respondera. Se queremos saber em que diretório estamos simplesmente digitamos pwd, ou si queremos ver os arquivos dentro desse diretório digitamos ls.

Interagindo com o Bash

Se queremos criar un diretorio digitamos "mkdir nome_do_diretorio", exemplo: mkdir aula1 (DICA: não utilize espacos, cedilha, acentos). Para entrar nesse novo diretorio digitamos cd aula1. Para volver ao diretório anterior cd .. Na figura a continuação está uma pequena lista de comandos que poderão ser uteis.

Lista de comandos Bash

É logico que se estamos dentro de um ambiente gráfico temos um navegador de arquivos (que no caso do Kde é o konqueror e no caso do Gnome é o nautilus) que é "mais simples" do que o terminal porém, o bash nos brinda um interatividade maior: o bash é programável é isso é muito importante. Para sair do bash (terminal, ou tela preta) simplesmente digitamos exit.

konqueror