SOP29005-2020-1

De MediaWiki do Campus São José
Revisão de 07h24min de 21 de fevereiro de 2020 por Eraldo (discussão | contribs)
Ir para navegação Ir para pesquisar

AULA 1 - Dia 11/02/2020

Objetivos/Conteúdos

  • Apresentação do Plano de Ensino
    • Objetivos e Conteúdo Programático da Disciplina (ver SIGAA)
    • Forma de Avaliação (ver SIGAA)
  • Introdução a Sistemas Operacionais (Cap1. do Silberschatz)
    • O que faz um sistema operacional (1.1)
    • Organização e Arquitetura de um Sistema Computacional (1.2 e 1.3)
      • Importância da Interrupção e Timers (1.2.1)
      • Estrutura de Armazenamento (1.2.2)
      • Estrutura de IO (1.2.3)
    • Estrutura e Operações de um Sistema Operacional (1.4 e 1.5)

Material de Referência

Arliones:

Leitura Recomendada

  • Cap.1 do Silberschatz principalmente:
    • 1.1 a 1.9

Exercícios Práticos de Apoio a Aula

Na sequência. com fins motivacionais, são apresentados alguns exercícios ilustrando conceitos de processos, arquivos e permissionamento.

  1. Comando para ver todos os processos no linux:
      $ ps aux
    
  2. Colocar 2 processos se executando no contexto de um terminal e verificar número dos processos e então "destruí-los":
    $ yes > /dev/null
    $ yes > /dev/null
    $ ps 
    $ kill -9 <pid_yes>
    $ kill -9 <pid_yes>
    

    Observe que dois processos foram criados a partir do programa "yes". Os processos associados ao terminal são visualizados e então destruídos. Tente destruir também o interpretador de comando (shell) associado ao terminal.

  3. Criar um terminal adicional
    $ xterm
    

    Ir no terminal criado e listar os processos que se executam associados a este terminal. Verificar qual o dispositivo de entrada e saída associado a ele. Voltar ao terminal original e enviar uma mensagem. Destruir o terminal criado:

    $ echo Alo Terminal > /dev/pts/2
    $ kill -9 <pid_terminal>
    
  4. Comunicação entre processos:
    $ cat /etc/passwd | grep home | wc -l
    
  5. Retirando a permissão de leitura de um arquivo em nível de usuário proprietário:
    $ echo Alo Mundo > alfa.txt
    $ ls -l alfa.txt
    $ cat alfa.txt
    $ chmod u-r alfa.txt
    $ cat alfa.txt
    $ chmod u+r alfa.txt
    $ cat  alfa.txt
    

AULA 2 - Dia 14/02/2020

Objetivos/Conteúdos

  • Estruturas do Sistema Operacional (cap.2)
    • Serviços do Sistema Operacional (2.1)
    • Interfaces com Usuários (2.2)
    • Chamadas do Sistema (2.3)
    • Tipos de Chamadas de Sistema (2.4) ver Fig.2.8
      • Chamadas de Controle de Processos


Material de Referência

Leitura Recomendada

  • Cap.2 do Silberschatz principalmente:
    • 2.1 a 2.8

Exercícios

  1. Estudar e executar o código em http://cs.lmu.edu/~ray/notes/gasexamples/ Detalhes das chamadas na arquitetura x86_64 ver em https://lwn.net/Articles/604287/
  2. Estudar e executar o código usando a função (em conformidade com a API POSIX) write() para o hello world:
    #include <unistd.h> 
    
    main()
    {
      write(1,"Alo Mundo\n",10);
    }
    
  3. Use o comando strace para verificar todas as chamadas de sistema dos programas acima.
  4. DESAFIO 1: Estude a seção "Mixing C and Assembly Language" da http://cs.lmu.edu/~ray/notes/gasexamples/ e construa uma função meu_hello_world() usando o código em assembly do exercício inicial. Estude como poderia disponibilizar esta e outras funções de interface (a sua API) em uma biblioteca. Note que esta função deve ser chamada da forma:
    main()
    {
      meu_hello_world();
    }
    
  5. Gere o assembly do código em C e discuta a diferença entre uma chamada de função e uma chamada de sistema.
  6. DESAFIO 2: Estude o link http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/ e melhore a função meu_hello_world para suportar uma mensagem adicional da forma:
    #include <string.h>
    main()
    {
      char *p="Tudo bem com vocês?";
      meu_hello_world(p, strlen(p));
    }
    

    Solução:

    Solução
    modificado de http://cs.lmu.edu/~ray/notes/gasexamples/
            .global meu_hello_world
    
            .text
    meu_hello_world:
    
            push    %rdi                    # salva primeiro parâmetro
            push    %rsi                    # salva segundo parâmetro
            mov     $1, %rax                # system call 1 é write
            mov     $1, %rdi                # file handle 1 é stdout
            mov     $message, %rsi          # endereço da string
            mov     $13, %rdx               # número de bytes da string
            syscall                         # chamada ao sistema
    
            pop     %rdx                    # o que havia sido passado em rsi (número de bytes) é colocado em rdx
            pop     %rsi                    # o que havia sido colocado em rdi (endereço da string) é colocado em rsi
            mov     $1, %rax                # system call 1 is write
            mov     $1, %rdi                # file handle 1 é stdout
            syscall                         # nova chamada ao sistema
    
            ret
    
    message:
            .ascii  "Hello, World\n"
    

    AULA 3 - Dia 18/02/2020

    Objetivos/Conteúdos

      • Interfaces com Usuários (2.2)
      • Chamadas do Sistema (2.3)
      • Tipos de Chamadas de Sistema (2.4) ver Fig.2.8
        • Chamadas de Controle de Processos

    AULA 4 - Dia 21/08/2019

    Objetivos

    • PARTE 2A: Gerenciamento de Processos (cap.3)
    • 3.1.Conceito de Processo
    • 3.2.Escalonamento de Processos
    • 3.3.Operações sobre Processos (Laboratório Operações sobre Processos no Linux: Fork/Exec/Wait)

    Material de Referência

    • Slides do Cap.3 - Silberschatz
    • Laboratório Fork/Exec/Wait

    Exercícios de Demonstração

    1. Executar em um terminal o comando top. Em um outro terminal executar:
      yes > /dev/null &
      yes > /dev/null &
    
    1. Parar um dos processos yes
      kill -STOP <pid_yes>
    
    1. Continuar o processo
      kill -CONT <pid_yes>
    
    1. Destruir todos
      killall yes