1 of 64

Lucas Eduardo Gulka Pulcinelli

Vitor Daniel de Resende

Murilo Leandro Garcia

e todo o time do ICMC IDE e emulador

Instituto de Ciências Matemáticas e de Computação (ICMC)

Universidade de São Paulo (USP)

Formulário de feedback: https://forms.gle/dhBAPxpej5H3nM6T7

ICMC IDE: Uma plataforma para desenvolvimento de jogos em linguagem montadora

2 of 64

Introdução

1

3 of 64

Os problemas atuais de ensinar arquitetura e organização de computadores

Conteúdo muito abstrato

Difícil visualizar componentes e o processo de execução de instruções

Sistemas atuais são complexos

Exceções em regras por otimização, instruções demais, convenções esquisitas

Tecnologias proprietárias ou pouca documentação

Quartus, Verilog, VHDL, manuais da intel e NVIDIA tem pouco material ou até incorreto sobre arquiteturas

Dependência de hardware

Para executar código, normalmente você precisaria da placa da arquitetura em si

4 of 64

Como tornar isso mais interessante?

5 of 64

ICMC-IDE: a plataforma perfeita para ensinar linguagem montadora

  • Forma mais amigável para nerds: via exemplos com jogos!

  • Tudo no navegador ou em um único executável, sem se preocupar com ter uma placa queimando

  • Software 100% aberto e com documentação

6 of 64

A arquitetura do ICMC

  • Uma linguagem montadora mais simples
    • perfeita para ensinar o conteúdo sem entrar nos detalhes complexos das arquiteturas modernas
    • nem as convenções esquisitas das arquiteturas antigas

  • Feita com o objetivo de ter interatividade de usuário, um sistema de tela e entrada de teclado fácil, mas ainda assim poderosa para criar o que você quiser!

7 of 64

O que nós vamos aprender?

  • Como usar o ICMC-IDE

  • A base da linguagem montadora do ICMC

  • Como montar jogos

completos a partir dessa linguagem

  • Como expandir o ICMC-IDE

  • Como o que a gente vai aprender serve para o mundo real

8 of 64

A plataforma do ICMC IDE

2

9 of 64

Versões do ICMC IDE

ICMC IDE (legado):

  • Ambiente disponível na web (proc.giroto.dev)
  • Estável

10 of 64

Versões do ICMC IDE

ICMC IDE (multiplataforma):

  • Disponível nativamente para Linux, Windows e na web
  • Experimental

11 of 64

Sobre a interface da IDE

Vamos explorar cada parte da IDE:

  • Editor de código;
  • Explorador de arquivos;
  • Janelas de visualização e simulação;
  • Controles de montagem;
  • Etc.

12 of 64

Linguagem Assembly

3

13 of 64

Introdução ao Assembly do ICMC

14 of 64

Registradores

Propósito geral:

  • R0 até R7: registradores de propósito geral

Uso interno:

  • FR: Flag Register
  • SP: Stack Pointer
  • PC: Program Counter
  • IR: Instruction Register
  • KB: Keyboard Register
  • WC: Write Count

15 of 64

Flags (FR)

  • Arithmetic Overflow;
  • Carry;
  • Equal, Less ou Greater;
  • Division by Zero;
  • Negative;
  • Zero;

16 of 64

Stack (SP)

  • Armazena valores numa estrutura de pilha (First In Last Out)
  • Para armazenar variáveis locais na memória principal
  • Para armazenar endereços de retorno de procedimentos

17 of 64

Program Counter (PC)

18 of 64

Instruction Register (IR)

  • Armazena a instrução do endereço de memória armazenado no PC

19 of 64

Keyboard Register (KB)

  • O teclado escreve o código ASCII de cada tecla nesse registrador;
  • O código 0xFF (255) representa nenhuma tecla pressionada;

20 of 64

Write Count (WC)

  • Indica o número de vezes que algo foi escrito na memória de vídeo

21 of 64

Tipos de Instrução

  • Aritméticas
  • Lógicas
  • Mover
  • Memória
  • Jump
  • Call
  • Stack
  • Controle

Referência disponível na aba de documentação da IDE

22 of 64

Instruções

Referência para as instruções do processador do ICMC

23 of 64

Load / Store / Move

Essas instruções basicamente movem informação entre registradores/memória:

  • store addr, ry | Armazena ry no endereço addr
  • storei rx, ry | Armazena ry no endereço contido em rx

  • load rx, addr | Carrega o valor contido no endereço addr para rx
  • loadi rx, ry | Carrega o valor contido no endereço contido em ry para rx
  • loadn rx, #n | Carrega o número n para rx

  • mov rx, ry | Copia o valor em ry para rx

24 of 64

Aritmética

Operações de soma, subtração, multiplicação, divisão, módulo e incremento/decremento:

  • add rx, ry, rz | rx = ry + rz
  • addc rx, ry, rz | rx = ry + rz + carry
  • sub rx, ry, rz | rx = ry - rz
  • subc rx, ry, rz | rx = ry - rz + carry
  • mul rx, ry, rz | rx = ry * rz
  • mulc rx, ry, rz | rx = ry * rz + carry
  • div rx, ry, rz | rx = ry / rz
  • divc rx, ry, rz | rx = ry / rz + carry
  • mod rx, ry, rz | rx = ry % rz
  • inc rx | rx++
  • dec rx | rx--

25 of 64

Lógica

Operações lógicas and, or, xor, not, além de bitshift e comparação de inteiros

  • and rx, ry, rz | rx = ry & rz
  • or rx, ry, rz | rx = ry | rz
  • xor rx, ry, rz | rx = ry ^ rz
  • not rx, ry | rx = ~ry
  • rotl rx, #bits | Rotação de bits à esquerda
  • rotr rx, #bits | Rotação de bits à direita
  • shiftl0 rx, #bits | rx = rx << bits
  • shiftl1 rx, #bits | rx = rx << bits | (1 << bits - 1)
  • shiftr0 rx, #bits | rx = rx >> bits
  • shiftr1 rx, #bits | rx = rx >> bits | (0xFFFF >> bits << bits)
  • cmp rx, ry | Compara rx e ry, e coloca a flag (<, =, >) em FR

26 of 64

Jump / Call

Instruções fundamentais, permitem fazer controle de fluxo (o if/else de linguagens de alto nível, e chamar funções)

  • jmp addr | Pula da atual instrução para a instrução contida em addr (PC = addr)
  • call addr | Mesma coisa do jmp, mas também empilha PC na stack.
  • rts | Desempilha a stack e pula para esse endereço

Tanto as instruções de jmp quanto call possuem as variações que executam condicionalmente a uma flag (FR).

Exemplos: jeq (jmp se ‘eq’ for verdadeiro), cne (call se ‘eq’ for falso).

27 of 64

Abreviações do Jump / Call

  • ‘eq’ - Equal
  • ‘z’ - Zero
  • ‘c’ - Carry
  • ‘gr’ - GReater
  • ‘le’ - LEss
  • ‘n’ - Negative
  • ‘ov’ - OVerflow
  • ‘dz’ - Divide by Zero
  • ‘ne’ - Not Equal
  • ‘nz’ - Not Zero
  • ‘nc’ - Not Carry
  • ‘eg’ - Equal or Greater
  • ‘el’ - Equal or Less
  • ‘nov’ - Not OVerflow
  • ‘ndz’ - Not Divide by Zero

28 of 64

Stack

Essas instruções lidam com a stack do processador:

  • push rx | Empilha rx na stack
  • pop rx | Desempilha a stack e guarda em rx

29 of 64

Controle

Instruções úteis durante o debug do seu programa, mexem com o estado do emulador:

  • setc, clearc | Define e limpa flag carry
  • halt | Interrompe a execução do programa
  • nop | Não faz nada
  • breakp | Muda para estado de breakpoint

30 of 64

Input / Output

Por fim, as instruções mais interessantes:

  • inchar rx | Lê um caracter do teclado e guarda em rx
  • outchar rx, ry | Escreve o char rx na posição ry

31 of 64

ICMC IDE & Jogos

4

32 of 64

simas bomber

Jogo desenvolvido no processador do ICMC, similar ao bomberman.

33 of 64

Desenvolvendo um jogo

5

34 of 64

Restrições

Caracteres

Resolução

Input/Output

Você tem um conjunto limitado de caracteres 8x8 pixels para editar

Você só pode desenhar caracteres num grid

40x30, não pode controlar pixels

As únicas instruções de IO são inchar e outchar, e o código congela enquanto espera um inchar

35 of 64

Fazendo seu personagem se mover

O grid da tela é representado internamente como uma linha contínua.

Para ir para direita/esquerda basta incrementar ou decrementar a posição.

Todavia, para subir/descer, você precisa somar/subtrair 40 da sua posição.

36 of 64

Fazendo seu personagem se mover

Use o inchar para ler movimentos do teclado, e então compare com as teclas. 255 é valor de quando nenhum botão é pressionado, 70 é a seta pra cima, etc.

37 of 64

Fazendo seu personagem se mover

Não se esqueça de apagar sua posição anterior!

38 of 64

Outra coisa importante nos jogos é ter um cenário fixo, para usar em menus, background, etc.

39 of 64

Checando colisões

Para checar se colidiu, você precisa saber se sua posição atual corresponde a um caracter de parede. Se for, houve colisão, então você deve desfazer esse movimento.

40 of 64

Gerador de números pseudo-aleatórios

Existem diversos algoritmos que são capazes de gerar números pseudo-aleatórios.

Números aleatórios são fundamentais para criação de jogos, desde de determinar a posição da maçã no jogo da cobrinha, até geração procedural.

41 of 64

PRNG (LCG)

  • Gerador congruencial linear (LCG)

É dado pela relação de recorrência:

O valor

é chamado de seed (semente).

42 of 64

PRNG (LCG)

  • Gerador congruencial linear (LCG)

43 of 64

Contribuindo com o ICMC IDE

6

44 of 64

um pouquinho sobre emuladores

7

45 of 64

Como a arquitetura do ICMC compara com a do seu computador?

  • Mais do que você imagina!

  • Todos os computadores tem mais ou menos os mesmos componentes base

  • Todos os programas atuais são máquinas baseadas em stack em execução

46 of 64

Ciclo de instrução

47 of 64

Exemplos de assembly

AVR (do arduino)

ARM (do seu celular)

x86 (do seu computador)

48 of 64

O general emulator

  • Se todas as arquiteturas são tão parecidas, por que não fazer um emulador para todas?
  • Configurado em TOML e código de rust
  • Em progresso!

49 of 64

E linguagens de programação?

  • Hoje em dia quase ninguém escreve em assembly, então porque não dá para executar código em alguma linguagem no processador do ICMC?

  • Esforços atuais:
    • ICMC-cc
      • Compilador atual da IDE, um subset de C99

    • LLVM ICMC Backend
      • Compilador otimizado e completo, ainda em desenvolvimento pela complexidade

50 of 64

Obrigado!

Perguntas?

Formulário de feedback: https://forms.gle/dhBAPxpej5H3nM6T7

51 of 64

SLIDES PARA TEMPLATE

52 of 64

Why microservices and cloud systems

  • Pay as you go model
  • Scaling down with demand makes costs minimal
  • Easier to add more replicas and load balance between them
  • Simple provision for more regions

Cost efficiency

Scalability

53 of 64

In-depth Analysis of Challenges in Microservice Monitoring

Volatile replica number

Depends on system load, which itself depends on time of day, season, etcetera

High number of services

Each with their own resource utilization and network connections, which lead to more metrics

Huge metric variety

A relatively simple monitoring setup already has about 300 metrics available, with CPU, network and disk bound services, as well as metrics granulated by container or node

Lack of smart monitoring

There is a plethora of services for monitoring everything, however its the developer’s job to locate what is useful

54 of 64

What are we contributing with?

  • Aim to locate patterns in metrics during error scenarios, considering the context of an online shop

  • Finding the essential metrics to locate different kinds of errors in certain types of services, such that analysis has less dimensionality

55 of 64

Setup and Methodology

2

56 of 64

The cloud application to be tested on

  • Simulates a cloud native online shop

  • Many different application frameworks
    • Compiled and interpreted languages
    • Relational and non relational databases
    • Messaging queue systems between some services
    • Server-side caching service

Socks-shop Polyglot App Original Design

https://redthunder.blog/2018/07/30/socks-shop-polyglot-app-in-kubernetes

57 of 64

Deployment system

  • Kubernetes (in the form of EKS) and AWS for hosting the sock-shop application
  • Terraform and CircleCI for deployment in a standardized way
  • CircleCI CI/CD system for deploying applications

58 of 64

Testing framework

  • CircleCI triggers tests executions
  • Locust stresses the application
  • Chaos mesh, after some time of running the test, introduces errors

59 of 64

Obtaining and analyzing the Metrics

  • Metrics are gathered every 30 seconds via two services
    • Cadvisor, that obtains metrics for every container in the system
    • Node-exporter, that obtains metrics for each EC2 processing node

  • After the test, a python application is run to get all metrics during the period of the test

  • Then the standard deviation and moving average per 3 minutes and the is compared for each metric during the test, and if the change passes a threshold, it is output to be interpreted.

60 of 64

Results and Discussion

3

Analysis related to pod unavailability errors

61 of 64

Pre crash loop backoff disk readings

62 of 64

Memory freeing in compiled languages

63 of 64

Our future works

Node overloading

Disk reading errors in databases

Connection failure or delays between services

Finally, the development of a system that continuously reads metrics and, given the types of services involved, is able to determine errors in a more lightweight manner, instead of relying on machine learning or individual trace analysis, which would have a too high monetary cost to keep running

64 of 64

Thanks!

Do you have any questions?

linkedin.com/in/lucas-pulcinelli

lucasegp@usp.br

diegopedroso@usp.br

sarita@icmc.usp.br

icmc.usp.br