Arquitectura de Computadores e Sistemas de Operação Arquitectura de computadores – CPU+Memória+Dispositivos de Entrada/Saída Sistema de Operação Pedro D. Medeiros ([email protected]) Grupo de Disciplinas de Arquitectura e Sistemas de Computadores Cadeiras obrigatórias 3º Sem 4º Sem ASC 1 Engenharia dos Sistemas de Objectos Distribuídos Complementos de Redes de Computadores ASC2 5º Sem Redes de Computadores 6º Sem Sistemas de Operação 8º Sem Teoria da Informação Sistemas de Processmento Paralelo e Distribuído Sistemas Distribuídos Desempenho de Sistemas de Computadores Cadeiras opcionais: a partir do 7º semestre Grupo de Arquitectura de Computadores, Sistemas de Operação e Redes de Computadores Objectivos principais – Ensinar os alunos a serem programadores eficientes e sofisticados, através da compreensão do que realmente se passa quando um programa está a ser executado Passos até termos um programa em execução Ficheiro com o código fonte Compilador Ficheiro com o código objecto Biblioteca com o código Das bibliotecas da linguagem Compilador Ficheiro com o código “assembly” “Assembler” Ligador Ficheiro carregado em memória Carregador Ficheiro executável O código fonte do programa hello.c #include <stdio.h> int main() { printf(“hello,world\n”); } O programa foi criado por um editor de texto e salvo num ficheiro hello.c. O ficheiro com código fonte é uma sequência de bits, organizados em bytes e que usam a codificação ASCII. # i n c l u d e < s t d i o . h > 35 105 110 99 108 117 100 101 32 60 115 116 100 105 111 46 104 62 104 ... Notar a existência de códigos para o espaço e a mudança de linha Toda a informação no sistema é um conjunto de bits O que distingue cada conjunto é o contexto que define a forma como os bits são interpretados. O mesmo conjunto de bits pode ser – – – – Um inteiro Um real representado em vírgula flutuante Uma sequência de caracteres Um conjunto de instruções máquina Os programas são transformados por outros programas prompt> gcc –o hello hello.c printf.o hello.c Source program (text) Prehello.i processor (cpp) Modified source program (text) Compiler (cc1) hello.s Assembler hello.o (as) Assembly program (text) Relocatable object programs (binary) Linker (ld) hello Executable object program (binary) -Fase de pré-processamento: o programa original é modificado de acordo com as directivas (#): exemplos: macros, inclusão de stdio.h -Fase de compilação: o compilador traduz o ficheiro hello.i para um ficheiro com mnemónicas em “assembly” -Fase de “assembly”: o “assembler” traduz o ficheiro hello.s para um ficheiro hello.o em que os seus bytes respresentam as instruções máquina correspondentes a cada mnemónica -Fase de ligação: o ligador inclui no ficheiro executável o código da função printf() e resolve as referências printf.o hello.c Source program (text) Prehello.i processor (cpp) Modified source program (text) Compiler (cc1) hello.s Assembler hello.o (as) Assembly program (text) Relocatable object programs (binary) Linker (ld) hello Executable object program (binary) O processador lê e interpreta instruções armazenadas na memória Para executar o programa hello é preciso interagir com o interpretador de comandos (shell) prompt> ./hello hello,world prompt> O interpretador de comandos executa o ciclo: – Lê uma linha – Interpreta essa linha, pondo um programa a executar – Espera que esse programa acabe A execução do programa hello Os slides seguintes apresentam as várias fases da vida do programa hello quando é executada num computador semelhante a um PC. O hardware inclui: – – – – “bus” de interligação Dispositivos de entrada/saída Memória central (RAM) Processador (CPU) Obtem instruções da memória e executa-as Unidade aritmética e lógica (ALU) Registos CPU Register file PC ALU System bus Memory bus Main memory I/O bridge Bus interface I/O bus USB controller Mouse Keyboard Graphics adapter Disk controller Display Disk Expansion slots for other devices such as network adapters hello executable stored on disk O interpretador de comandos lê os caracteres ASCII “./hello” cr do teclado Register file CPU PC ALU System bus Memory bus Main "hello" memory I/O bridge Bus interface I/O bus USB controller Mouse Keyboard User types "hello" Graphics adapter Disk controller Display Disk Expansion slots for other devices such as network adapters O ficheiro executável “hello” é carregado em memória central Register file CPU PC ALU System bus Memory bus "hello,world\n" Main memory hello code I/O bridge Bus interface I/O bus USB controller Mouse Keyboard Graphics adapter Disk controller Display Disk Expansion slots for other devices such as network adapters hello executable stored on disk Execução do programa hello CPU Register file "hello,world\n" PC ALU hello code System bus Memory bus Main memory I/O bridge Bus interface I/O bus USB controller Mouse Keyboard Graphics adapter Disk controller Display "hello,world\n" Disk Expansion slots for other devices such as network adapters hello executable stored on disk Arquitectura de computadores Definição de arquitectura de computadores – A visão do programador do hardware Arquitectura de Von Neumann – Usada em quase todos os computadores existentes – Computador constituído por 3 partes Processador ou Unidade central de Processamento (CPU) – elemento activo; executa instruções Memória central – armazenamento de dados e instruções Dispositivos de entrada e saída – Realizar entrada de dados – Realizar a saída de dados Arquitectura de Von Neumann Dispositvos de entrada CPU Dispositivos de saída Memória central (programa + dados) Memória central Ordem de leitura Ordem de escrita CPU Endereço Dados Funcionamento do CPU Extremamente Primitivo – Não percebe instruções em língua natural nem numa linguagem de programação – Não há nenhum comando para executar a construção while – A complexidade é sacrificada em favor da velocidade Usa-se um tradutor para transformar um programa escrito numa linguagem de alto nível para a linguagem nativa da máquina – Esse tradutir chama-se compilador – Um programa escrito numa linguagem de alto nível como Java, C++, C chama-se programa fonte – A linguagem para a qual se traduz chama-se linguagem máquina – A linguagem máquina é aquela que compreendida pelo hardware Linguagem máquina A linguagem máquina é a mais primitiva – – – – – Tudo é representado por números A nível hardware, os números são representados em binário Os números representam instruções (código) Os números representam dados O Contexto decide se um número representa um dado ou uma instrução Na prática, quase nunca se programa nessa linguage Usa-se uma linguagem, muito próxima da linguagem máquina chamada Assembler – – – – É simbólica por natureza (em oposição a numérica) A cada número de instrução corresponde uma mnemónica Ex., 12 é ADD Às posições de memória também se podem associar nomes (às vezes chamadas variáveis) Características de uma arquitectura Memória 0 1 2 3 4 5 6 7 8 9 00 10 20 30 O processador (CPU Central Processing Unit) contém um conjunto de Registos (cada registo N flip-flops) IP: Instruction pointer IR: Instruction Register AX: Arithmetic Register/Acumulador CF: Condition Flag Programa muito simples Mostrado em “assembler” e não em linguagem máquina copy ax, x add ax, y copy z, ax – Implementa z = x + y; Não esquecer, que na realidade TUDO SÃO NÚMEROS – Poderia ser: 20 101 12 102 21 103 – Se copy-into = 20, add = 12, e copy-out = 21 e x armazenado em 101, y em 102, e z em 103 Ciclo “Obter-Executar” Fetch Execute O relógio conduz sistematicamente o CPU através dos dois seguintes ciclos: FETCH (OBTENÇÃO) – Obter instrução da memória O registo IP (também chamado program counter ou PC) diz de onde se obtém – Incrementa o IP (para apontar para a próxima instrução) EXECUTE (EXECUTAR) – Descodificar a instrução Descobrir o que é pretendido (add?, copy? …) Extrair um endereço de memória da instrução Se necessário, obter informação da memória – Executar a instrução Por exemplo, somar a informação obtida ao Acumulador (AX) O simulador P88 Software de apoio ao livro “Great Ideas in Computer Science with Java”, de A.W. Biermann e D. Ramm, MIT Press 2001, ISBN 0-262-02497-7 Programa escrito em Java que simula um CPU que é uma versão simplificadíssima do Pentium Código fonte do simulador e programas exemplo acessíveis na página da cadeira e também em http://www.cs.duke.edu/~dept/Great_Ideas_with_Java/software.html Para usar: – Colocar todos os ficheiros numa directoria de trabalho – Compilar os ficheiros com extensão java – Usando um “browser” abrir o ficheiro P88.html Algumas instruções copy e add – Movimento da direita para a esquerda – Muitas instruções envolvem o acumulador (AX) in e out – Como write/cout/printf and read/cin/scanf em Pascal/C++/C – in transfere do teclado para AX – out transfere de AX para o ecrã { Exemplo -- programa para executar: readln(x); readln(y); z = (x + y); writeln(z); } sum.as 0 1 2 3 4 5 6 7 8 x y z in copy in copy copy add copy copy out 0 0 0 ax x, ax ax y, ax ax, x ax, y z, ax ax, z ax ; readln(x); ; readln(y) ; z = x + y ; writeln( z ); Exemplo de uma entrada e saída de dados: <23 <16 >39 Mais instruções Necessárias para suportar as construções if e while Usa a instrução cmp – Compara valores em AX e numa posição de memória – Posiciona a “carry flag” CF = B (below) : AX menor que o conteúdo da posição) ou CF = NB (not below): (AX maior ou igual ao conteúdo da posição de memória) Usa a instrução jump para tirar partido da informação na “carry flag” – Instrução jnb endereço: salta para o endereço se CF contém NB – Instrução jb endereço salta para o endereço se CF contém B – jmp salta sempre, independentemente do valor de CF Pode-se agora apresentar o código “assembler” equivalente ao if largest.as Programa para escrever o maior de dois números lidos: in ax ; readln( r ) copy r, ax in ax ; readln( s ) copy s, ax copy ax, s cmp ax, r ; if( s < r ) jnb there ; sim, saltar para there copy ax, r out ax ; writeln( r ); jmp quit there copy ax, s out ax ; writeln( s ); quit halt r 0 s 0 Exemplo de entradas/saídas: <33 <44 >44 Programar em “Assembler” Escrever programas em “assembler” – Não é demasiado difícil e adquire-se prática rapidamente – Em tempos fez-se por razões de eficiência O programador conseguia fazer melhor do que o compilador … Mas os compiladores cada vez são melhores – Contudo, a experiência mostra que um programador produz em média poucas dezenas de linhas de código por dia Este número é independente da linguagem! É melhor produzir poucas linhas de uma linguagem de alto nível Computador moderno comparado com o P88 Tamanho da memória – PC’s agora chegam a ter 1 Gbyte de memória central – As instruções máquina disponíveis são em muito maior número Muitos registos – É habitual ter-se 32 acumuladores – Registos e hardware dedicados a operações em vírgula flutuante Hierarquia de memória 1. 2. 3. 4. 5. Registos Memória Cache Memória central (RAM) Disco (memória virtual) Armazenamento “Offline” (bandas, CDROMs, DVDs, etc.) Papel do sistema de operação (SO) Ficheiro Executável Carregado em Memória Instruções máquina executadas directamente pelo CPU Instruções interpretadas pelo Sistema de Operação (por exemplo, escrita no écrã, leitura do disco ...) Sistema de Operação (sempre carregado em Memória) Hardware (Processador, Memória, Discos, ...) O sistema de operação faz a gestão do hardware • quando o programa hello correu ele não fez acesso directo aos dispositivos de entrada/saída • O sistema de operação (SO) interpõe-se entre os programas e o hardware •Funções do SO •Proteger o hardware de “maus usos” •Criar uma forma mais fácil e unificada de manipular o hardware que pode ser de diferentes tipos Programas de aplicação Software Sistema de Operação Processador Memória central Dispositivos de I/O Hardware Funções do SO Gestão do CPU Gestão da memória central Suporte do sistema de ficheiros Suporte das operações de E/S Suporte dos protocolos de rede Protecção e segurança Gestão do CPU – noção de processo Um processo é um programa em execução. Um processo necessita de recursos para efectuar a computação que lhe está associada - tempo de CPU - memória central - ficheiros, periféricos e dispositivos de comunicação com outros processos Em termos de gestão de processos, o SO tem de: – Criar e destruir processos. – Suspender e reactivar processos. Gestão de memória A memória central é partihada pelos processos, pelo SO e pelos periféricos O SO é responsável por: – Manter informação sobre que partes da memória estão livres e quais estão ocupadas e por quem. – Atribuir e desafectar memória de acordo com as necessidades dos processos. Gestão de ficheiros Um ficheiro é um conjunto de informação armazenado no disco. Pode conter dados ou programas O SO é responsável por: – Criar e destruir ficheiros. – Criar e destruir directorias. – Suportar primitivas para manipular ficheiros e directorias. – Fazer a correspondência (Mapping) dos ficheiros e directorias em blocos de disco. Suporte das operações de E/S Os programas do utilizador não podem executar directamente acções sobre os periféricos O suporte das operações de E/S é feito por uma parte do SO que é composto por: – Parte independente dos periféricos - conjunto de serviços comuns Relacionamento com outros componentes do sistema Optimização do desempenho (por exemplo caches) – Parte dependente de cada periférico - manipulação do controlador hardware, interrupções … “device driver” – gestor de periféricos Suporte de rede O hardware inclui dispositivos de comunicação com outros computadores (ex: Controladores de Rede Ethernet). A troca de informação entre máquinas exige um protocolo. Se o SO suportar esses protocolos podem ser usados recursos residentes noutras máquinas Protecção Protecção tem a ver com mecanismos para controlar o acesso aos recursos do sistema por processos ou utilizadores O mecanismo de protecção deve: – Distinguir entre uso autorizado e não autorizado. – Especificar as operações permitidas. – Fornecer meios para garantir o cumprimento das regras. O que é o sistema de operação ? Conjunto de código permanentemente carregado na memória central (RAM) – também chamado núcleo ou “kernel” A sua acção é complementada por – Programas de sistema: interpretador de comandos, carregadores, ligadores, ... – Processos de sistema O SO é carregado na RAM quando há: – Um “power up” ou um “reset” hardware Arranque do SO Memory Boot O “bootstrap loader em ROM” lê o programa de “boot” para memória Boot Operating system Memory O programa de “boot” lê o resto do sistema para memória Boot Operating system Operating system Inicialização Inicialização do hardware Inicialização das estruturas de dados que representam os vários recursos de sistema e que suportam os algoritmos de gestão desses recursos. Criação dos primeiros processos: - processos auxiliares de sistema (rede, sistema de ficheiros, …) - interpretador de comandos Aguardar