segunda-feira, agosto 30, 2010

Aula 3 de Projeto Lógico de Computadores

Fonte: Livro de D.A. Patterson, e J.L. Hennessy, Computer Organization and Design, 4ed


2.1 - Introdução


2.2 - Operações do Hardware do Computador


2.3 - Operandos do Hardware do Computador

Lista de Exercícios

Os exercícios devem ser entregues individualmente, até o dia 20/07/2010, as 11:59 da manhã, por email para o prof. Henrique Marks. O email deve conter no título:

FACIMA - PLC - Trabalho X
onde X é o número do trabalho, PLC é a nossa disciplina.

Meu email é henriquemarks@gmail.com

Lista 1 - PLC - 2010

O trabalho/lista consiste em fazer os exercícios 2.1 até 2.12.

Aula 2 de Sistemas Operacionais Abertos

Vimos alguns comandos na aula 2, principalmente aqueles relativos a visualização de processos no Linux. Vamos ver mais alguns comandos nas outras aulas.

A interface de linha de comando é bastante poderosa para realizar tarefas automatizadas, ou realizar a mesma tarefa para múltiplos usuários. Por exemplo, você poderia ter um sistema com 100 usuários e gostaria de trocar o nome de uma pasta qualquer, dentro da pasta de dados de cada usuário.

É claro que você poderia ir ao gerenciador de arquivos e fazer isto, para cada usuário, mas seria uma tarefa monótona e extremamente demorada. Se fossem mil usuários, seria impossível fazer usando uma interface "point-and-click". Nesta hora a linha de comando torna-se poderosa.

Você precisa saber comandos para usar Linux ? Quase certamente NÃO. Esta idéia antiquada ainda permanece, mas não é mais verdadeira.

Se você tiver problemas com suporte a algum hardware, precisará usar linha de comando no Linux ? Quase certamente SIM. Porque você irá procurar informações na internet (tal aparelho funciona no Ubuntu XX.X ?) e as respostas serão fornecidas iniciando com a frase "abra um terminal e digite". Isto é um pouco intimidador, mas não esqueça que para usuários comuns, qualquer problema com Hardware é intimidador, em qualquer SO. A vantagem de receber instruções pela linha de comando é que, em geral, você copia e cola as instruções no terminal, e as coisas funcionam.

Se você trabalha com informática, você precisa saber comandos ? Claro que SIM. Afinal de contas, os profissionais devem conhecer uma das maneiras de trabalhar com o sistema. Se você não aprender, não será tão qualificado quanto outros que aprenderam, simples assim.

Os comandos tornam-se especialmente úteis nos seguintes dois casos:


  1. Tarefas de Gerenciamento de Sistemas.
  2. Tarefas de instalação de servidores diversos.
Note que estas tarefas são executadas por profissionais, não sendo necessárias no dia-a-dia.

Dois comandos que vimos na aula são ps e top. O primeiro mostra informações de processo, e ose gundo também mas de uma forma mais dinâmica. Tão importante quanto os comandos, é saber que estes programas contém opções e uma página de manual instalada no seu sistema. Se você abrir um terminal e digitar (não precisa digitar $, é só para indicar que estou na "linha  de comando"
$ man ps
Será aberta a página de manual do comando ps. Para correr uma folha, pressione a barra de espaço, para sair aperte q. Veja a figura:

Captura de Tela da página de manual do comando  ps.

A página de manual mostra qual é o comando, mostra que este comando tem opções, mostra alguns exemplos (teste TODOS no seu computador), e prove algumas explicações. Muitas vezes estas páginas estão traduzidas. Não esqueça: a barra de espaço vai para a outra página, q sai, b volta, etc.

É possível visualizar estas páginas de uma forma mais bonita. Usando o programa konqueror (se não estiver isntalado, pode fazê-lo pelo instalador de programas), que é um navegador Web, gerenciador de arquivos, visualizador, etc. pode-se ver a mesma página de manual digitando na barra de endereço
man:ps

Veja a figura como fica

Visualização do comando ps no konqueror

Para os outros comandos, valem as mesmas instruções. É sempre a mesma sintaxe: (comandos opções). E a página de manual está em man comando, na linha de comando, ou man:comando, no konqueror.

Aula 2 de Sistemas Operacionais Abertos

Nosso livro teórico da disciplina é o livro de Sistemas Operacionais do Tanembaum. Podem usar a segunda ou terceira edição, sem nenhum problema, visto que as diferenças entre elas sao mínimas, para o nosso uso.

Nossa referência de linguagem C já passei num outro post do blog, e a referência para o kernel Linux será o livro

Linux Kernel Development, 3ed, 2010

Está em inglês, o que é normal visto que o livro é de Junho de 2010.

domingo, agosto 29, 2010

Aula 2 de Projeto Lógico de Computadores

Visão Geral do Funcionamento de um Computador


Máquina de von Neumann/Turing:

  • Conceito de programa guardado dentro do computador.
  • Dentro da memória, são guardados os dados e as instruções para operar sobre estes dados.
  • Unidade aritmética e lógica realizações essas operações.
  • Unidade de controle interpreta as instruções da memória e as executa
  • Entrada e Saída operada pela unidade de controle
Esta figura está em W. Stallings, Computer Organization and Architecture, ed. 6, pag.18, cap2
Na figura, podemos ver as partes principais do computador, numa figura de nível bem baixo. A Unidade de controle e aritmética interagem com a memória principal, e entre si. CREIO que a figura tem um ERRO, visto que é a unidade de controle que faz E/S, e não a unidade aritmética. Passei esta figura em aula e não percebi o suposto erro, ou interpretei mal. Minha interpretação é que esta errada a figura. Mas continua válida a interpretação desta, de qualquer modo.

Vimos também o ciclo de execução de um programa, e as partes do computador numa visão "mais próxima". Nesta vião, mostrada na figura seguinte, temos a CPU, composta das unidades de controle e aritmética/lógica e alguns registradores na CPU. Estes são posições de memória utilizadas para guardar certas informações, e a quantidade e a funcionalidade destes definem todo o funcionamento do processador, ou o projeto lógico da CPU. Comunicando-se com a CPU temos a memória principal e algum dispositivo de entrada e saída.
As partes do computador. Figura de W. Stallings, Computer Organization and Architecture, ed. 6, pag.53, cap3

Os registradores tem nomes, conforme seu uso. Por exemplo, nesta figura temos:
  • Contador de Programa (PC). É usado para guardar qual instrução está sendo executada num dado instante.
  • Registrador de instrução. Guarda a instrução que foi buscada da memória e que será executada.
  • MAR/MBR: Registradores para guardar endereços de memória
  • IO/AR,IO/BR: Registradores para guardar endereços de Entrada/Saída
Na memória, podemos verificar que guardamos tanto DADOS quanto INSTRUÇÕES. Estas instruções especificam como aCPU irá operar nos próprios dados que ali também estão.

Um computador terá um ciclo de execução, que será repetido a exaustão. De uma maneira simplificada, o ciclo de execução mais simples é aquele que contém dus partes. Uma parte é a de busca (de instruções e/ou dados) e outra de execução da instrução buscada. A figura abaixo mostra este ciclo.

O ciclo de execução mais básico (fetch cycle = ciclo de busca, execute cycle = ciclo de execução). Figura de W. Stallings, Computer Organization and Architecture, ed. 6, pag.54, cap3

Vamos dar um exemplo de um programa rodando num sistema simplificado. Nosso sistema pode acumular (somar) valores inteiros, que devem ser trazidos da memória. Além disso, nosso sistema é de 16 bits, ou seja, os registradores são de 16 bits, e a memória é dividida em pedaços de 16 bits. É importante entender que no endereço x, temos 16 bits, e no endereço x+1, mais 16 bits (em geral, as memórias são divididas em regiões de 8 bits, ou byte).

Nosso sistema simplificado conterá três registradores:
  • PC, contendo o endereço da próxima instrução buscada.
  • IR, que conterá a instrução buscada a ser executada
  • AC, um acumulador, que acumulará (somará) os valores ali colocados.
Além disso, nosso sistema terá três INSTRUÇÕES. Cada uma delas estará associada a um código numérico.
  •  0001 - 0x1 - Carregar valor da memória para o acumulador
  •  0010 - 0x2 - Carregar o valor do acumulador de volta na memória
  •  0101 - 0x5 - Somar valor da memória ao acumulador.
Nestas três instruções, verificamos que:
  • Todas elas referem-se a uma memória. O valor da memória está dentro do valor de 16 bits buscado, conforme a figura abaixo.
  • Como o "código de operação" tem 4 bits, o endereço de memória só pode ter 12 bits.
Visão do que pode haver numa palavra (word) de 16 bits da nossa plataforma. Uma instrução, com código e endereço (acima), ou um valor inteiro, em sinal/magnitude. Figura de W. Stallings, Computer Organization and Architecture, ed. 6, pag.55, cap3

Vamos agora considerar o programa exemplo propriamente dito. Na figura abaixo, temos a disposição da memória, com algumas instruções guardadas em posições específicas desta, e com dados em outras posições. Além disso, o contador de programa tem guardado dentro dele o endereço da próxima instrução a ser buscada.


Na primeira figura, vemos que o registrador PC contém o endereço da primeira instrução que será buscada, ou seja, 0x300 (hexadecimal). Deve-se notar que este registrador somente alcança endereços de 12 bits, visto que a memória só é endereçavel até 12 bits neste exemplo (lembre-se do código de operação). Logo, no primeiro ciclo de busca, o valor do endereço 0x300 ( 0x1940) é buscado e colocado em IR, o registrador de instrução. Além disso, o contador de instrução é incrementado em 1, indica que no próximo ciclo de busca  a instrução será obtida em outro endereço. Ficamos com a figura a seguir:


Agora que o primeiro ciclo de busca foi realizado, devemos realizar o primeiro ciclo de execução: Tomamos a instrução que está em IR, e executamos esta. Os 4 bits iniciais de IR constituem o código de execução, e os 12 bits subsequentes o endereço de memória. Código 1 significa guardar o valor da memória (no caso, 0x940) no acumulador AC. Ora, o valor que está em 0x940 é o número 0x3, que então é colocado em AC, como mostra a figura seguinte.


Terminamos com isto o primeiro ciclo de busca e execução. Vamos ao segundo ciclo. Buscamos no endereço 0x301 a instrução, que é colocada em IR, no lugar da anterior. O PC é incrementado.

O Registrador IR contém o valor 0x5941, que significa que no ciclo de execução deveremos realizar a operação de "somar ao acumulador" (operação 5), o valor que está no endereço 0x941 (que é 2). Então somamos 2 ao acumulador, obtendo 5. Note que, na prática, o acumulador deve "saber" o que fazer com o valor recebido, que neste caso é a soma. A figura a seguir mostra como ficam os registradores.

Agora iniciamos o último ciclo. Buscamos o valor em 0x302, conforme apontado por PC, e guardamos este valor em IR, além de incrementar PC. Veja a figura:

Agora, no ciclo de execução, devemos realizar a operação. No caso, a operação indicada é colocar na memória (endereço 0x941) o valor do acumulador AC, que é 0x5. Fazemos isto, e ficamos com:

Exercício para vocês:

Nossa máquina hipotética contém duas instruções de E/S:
  • 0011 = carregar AC a partir de um dispositivo de E/S
  • 0111 = carregar AC em um dispositivo de E/S
Nestas instruções, o valor de 12 bits designa um dispositivo de E/S particular. Descreva a execução do seguinte programa:
  1. Carregar AC a partir do dispositivo 5.
  2. Somar com o conteúdo da posição de memória 940
  3. Armazenar o conteúdo de AC no dispositivo 6
Suponha que o próximo valor obtido do dispositivo 5 seja 3 e que a posição de memória 940 contenha o valor 2.

Me entreguem até o dia 06/07, as 11:59 da manhã, por email (henriquemarks@gmail.com).

P.S. Podem fazer a mão e me mandar uma foto (ou mais) do trabalho, sem problemas. Mas por favor, reduzam o tamanho do arquivo da foto para algo aceitável, ou seja, algo que eu possa ler e que não seja muito grande. Tenho certeza que, após tirar a foto, pode-se colocar em qualquer programa de imagens (digikam, por exemplo, e salvar a foto em png, com um tamanho MUITO menor). 

sexta-feira, agosto 27, 2010

Trabalho 1 de Sistemas Operacionais Abertos - Cancelado

Não vou passar trabalho de sistemas operacionais abertos esta semana, acho que não é necessário, ainda. É muito cedo no semestre (apenas duas aulas) e percebi na aula que os alunos entenderam a necessidade de acompanhar as aulas trabalhando nos sistemas que usaremos nos seus computadores (ou seja, precisa ter e usar Linux!).

Vou tentar passar alguns problemas de C e instruções de compilação e execução, para que vocês possam treinar. De qualquer modo, na apostila de C, no capítulo de funções e ponteiros, há exemplos e exercícios.

Aparentemente, o blog tem uma facilidade de seguir posts por email. Ou seja, se você "seguir" o blog, qualquer post nele irá para o seu email, fazendo com que fique mais fácil acompanhar modificações. Alguém fez isto e confirma esta possibilidade, por favor.

Apesar de não ter trabalho, é uma boa idéia aprender a usar estes comandos, ps e top, e alguma interface para eles, como o ksysguard, para entender as informações de processo geradas pelo sistema.

A aula 2 também virá para a internet tão cedo quanto possível.

quarta-feira, agosto 25, 2010

Sistemas Operacionais Abertos

Material de C disponível

Material de C para a disciplina. Provavelmente vou pedir para serem feitos os exemplo do livro, e seus exercícios, para entregar. Principalmente o capítulo de Funções, Ponteiros e Estruturas. Na aula combinaremos isto. A linguagem C é condição essencial para esta disciplina, sem ela não podemos trabalhar os conceitos de sistemas operacionais necessários.

Apostila de C

Tomara que este link do DropBox funcione

Java e Swing

Primeira Aula


Introdução

Ementa da disciplina

Desenvolvimento de aplicações com interface gráfica usando Java e Swing. Implementação de programas utilizando componentes diversos. Integração com bancos de dados. Utilização de Frameworks de Desenvolvimento. Aplicações para sistemas embarcados.

Bibliografia

  • Livros diversos sobre Java, e sobre Java e Swing, a escolha dos alunos.
  • Livros específicos sobre Java e Frameworks diversos, dependendo do FrameWork utilizado
  • Documentação oficial do Java e Swing, em: Documentação oficial do Java
Plano da disciplina

Vamos realizar uma breve introdução ao Java, lembrando conceitos previamente conhecidos. Depois, iremos começar com o Swing, analisando componentes, estrutura de programas, como integrá-los ao IDE utilizado, e fazendo vários programas. A integração aos bancos de dados será trabalhada após termos adquirido um conhecimento sólido em Swing. Após, estudaremos algum FrameWork de Desenvolvimento escolhido no curso e que for considerado adequado, e no final faremos o desenvolvimento de aplicações Java visando os sistemas embarcados, utilizando a plataforma Android.

Tutorial Java, o velho Hello World



Sistemas Operacionais Abertos

Primeira Aula
  • O que é um sistema Operacional, informações sobre a disciplina, bibliografia, ementa.
  • Chamadas de sistema
  • Linux: Histórico, Distribuições, Licenças. Prática de instalação de uma Distribuição (Ubuntu 10.04) e instalação de programas (usando o instalador de programas Synaptic)


Sistema Computacional: Hardware, Sistema Operacional e Programas de Aplicação

Esquema:
Aplicativos em geral
Compiladores | Shell | Desktop
Sistema Operacional
Linguagem de Máquina
Micro-Arquitetura
Dispositivos Físicos

O que é um Sistema Operacional (SO) ?
  • O SO é um computador virtual, que esconde das aplicações o hardware, fornecendo aos programas uma interface comum.
  • O SO gerencia os recursos de hardware, permitindo que estes sejam acessados pelos programas.
Tipos de Sistemas Operacionais
  • De servidores (UNIX (BSD, OpenSolaris)m Windows Server, Linux
  • De Multi-Processadores (UNIX, Linux)
  • Computadores Pessoais (Windows, MAC OS X, Linux)
    • Nova Geração: Android, Meego, Chrome OS (é tudo Linux)
  • Tempo Real (VxWorks, IOS, Linux)
  • Embarcados (Windows CE, JAVA ME, Linux, Symbian, Iphone OS, Android, Meego
Conceitos de Sistemas Operacionais e Nossa Ementa
  • Processos
  • Impasses (Deadlocks)
  • Gerenciamento de Memória
  • Entrada e Saída
  • Sistema de Arquivos
  • Segurança
Introdução: Chamadas de sistemas(syscalls)
O sistema Operacional separa o modo de operação dos programas em modo kernel e modo usuário. O Hardware inclusive faz esta distinção, se o sistema operacional quiser. Todos os SO querem isto. Deste modo os SO atendem requisições dos programas em espaço de usuário, atuando no espaço de kernel, e retornando ao espaço de usuário. A interface que conecta os dois modos são as chamadas de sistema (ou "ao sistema").

Exemplo: Lendo dados de um disco
No espaço de usuário, faremos algumas ações:

Primeiro, o que o programa faz
  • 1 - Armazena nbytes na pilha (que serão escritos)
  • 2 - Armazena &buffer na pilha (endereço de buffer)
  • 3 - Armazena fd na pilha (fd = descritor de arquivo, sua identificação)
  • 4 - Chama read
  • 5 - Incrementa SP (ou limpa a pilha do que não é mais necessário)
Segundo, o que a chamada a read faz
  • 6 - Coloca o código para read no registrador
  • 7 - Trap para o Núcleo
  • 8 - Retorna a quem chamou
No espaço de kernel, outras ações são tomadas:
  • 9 - Despacho
  • 10 - Acesso Físico
  • 11 - Rotinas de Tratamento da syscall
Qual é a ordem das ações ?
  • Primeiro, temos os passos 1, 2 e 3.
  • O Passo 4 chama o passo 6.
  • O Passo 7 faz um trap e manda para o kernel a execução, ou seja, vai para 9.
  • Os passos 9, 10 e 11, feitos em espaço de kernel, são realizados sequencialmente.
  • O kernel retorna para 8, que irá retornar ao programa de usuário, desbloqueando este, no passo 5.
Quais chamadas de sistema iremos ver neste curso ?

Muitas. Primeiro as que tratam de processos, porque é o primeiro tópico. Depois as de memória,e assim por diante.

As chamadas de sistema que usaremos, e as rotinas de biblioteca que as usam, estão em C. Logo, trabalharemos em linguagem C.