A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Ambiente de execução.

Apresentações semelhantes


Apresentação em tema: "Ambiente de execução."— Transcrição da apresentação:

1 Ambiente de execução

2 Estado de um programa S1  S2  ...  Sn
Execução de um programa é resultado de uma sequência de transições de estado S1  S2  ...  Sn

3 Representação da memória (de um programa em execução)
Área estática: espaço para meta- dados associados ao código Heap: espaço reservado para alocação dinâmica de memória Pilha: Contexto de chamada de funções Program Counter (PC): instrução corrente na prática, pilha cresce para endereços menores de memória e heap para endereços maiores, nos exemplos por conveniência de notação, a pilha vai crescer para endereços mais altos

4 Representação da memória (de um programa em execução)
Correção... Considerando concorrência, há um PC e pilha para cada thread do programa!

5 Compilador O compilador embute gerenciador de mémória em cada programa gerado Serve para fazer interface com SO gerenciador de memória Representação do programa em memória Sistema Operacional .exe

6 Área estática Área reservada para armazenar:
Variáveis globais Estrutura de dados Funções estáticas Tamanho da área estática determinado em tempo de compilação

7 Pilha Fluxo de controle de chamadas de funções
Cada frame da pilha corresponde ao registro de ativação de uma função. Criada pelo chamador da função Inclui parâmetros e endereço de retorno Função chamada retorna para aquele endereço

8 Exemplo Árvore de Execução
voltando ao nosso exemplo Adaptado de Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman Compilers: Principles, Techniques & Tools

9 Pilha de Chamadas (call stack)
o array é global, espaço é alocado antes da execução de main ativação do procedimento main Adaptado de Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman Compilers: Principles, Techniques & Tools

10 Exemplo ao controle alcançar a primeira chamada no corpo de main procedimento r é ativado e o registro é empilhado registro tem espaço para a variável i ao terminar ativação registro é desempilhado, deixando apenas main Adaptado de Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman Compilers: Principles, Techniques & Tools

11 Exemplo controle alcança chamada de qs com parâmetros reais 1 e 9, registro é empilhado, com espaço para parâmetros m e n e variável local i espaçø usado por r é reutilizado na pilha, nada de r é disponível para qs(1,9) Adaptado de Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman Compilers: Principles, Techniques & Tools

12 Exemplo veja que ao termos procedimentos recursivos, é natural que tenhamos vários registros de ativação na pilha ao mesmo tempo Adaptado de Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman Compilers: Principles, Techniques & Tools

13 Exemplo o array é global, espaço é alocado antes da execução de main ativação do procedimento main Adaptado de Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman Compilers: Principles, Techniques & Tools

14 Java Em Java, a pilha também é usada na interpretação de instruções => operand stack Como você representaria o estado de uma JVM?

15 Exemplo public class Foo { public static void main(String[] args){
int t = 10; t += t + 1; } $ javac Foo.java $ javap -classpath . -c Foo

16 Exemplo $ javac Foo.java $ javap -classpath . -c Foo class Foo extends java.lang.Object{ Foo(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(); 0: bipush 10 2: istore_0 3: iload_0 4: iload_0 5: iconst_1 6: iadd 7: iadd 8: istore_0 9: return } Total de 204 instruções; próximo de 100 quando consideramos apenas uma por grupo (iadd, dadd, etc.)

17 Exemplo para um procedimento
public static void main(); Code: 0: bipush 10 2: istore_0 3: iload_0 4: iload_0 5: iconst_1 6: iadd 7: iadd 8: istore_0 9: return } Reservado para variáveis locais 10 ?

18 Exemplo para um procedimento
public static void main(); Code: 0: bipush 10 2: istore_0 3: iload_0 4: iload_0 5: iconst_1 6: iadd 7: iadd 8: istore_0 9: return } Reservado para variáveis locais 10

19 Exemplo para um procedimento
10 public static void main(); Code: 0: bipush 10 2: istore_0 3: iload_0 4: iload_0 5: iconst_1 6: iadd 7: iadd 8: istore_0 9: return } Reservado para variáveis locais 10 10

20 Exemplo para um procedimento
1 10 public static void main(); Code: 0: bipush 10 2: istore_0 3: iload_0 4: iload_0 5: iconst_1 6: iadd 7: iadd 8: istore_0 9: return } Reservado para variáveis locais 10 10

21 Exemplo para um procedimento
11 public static void main(); Code: 0: bipush 10 2: istore_0 3: iload_0 4: iload_0 5: iconst_1 6: iadd 7: iadd 8: istore_0 9: return } Reservado para variáveis locais 10 10

22 Exemplo para um procedimento
public static void main(); Code: 0: bipush 10 2: istore_0 3: iload_0 4: iload_0 5: iconst_1 6: iadd 7: iadd 8: istore_0 9: return } Reservado para variáveis locais 21 10

23 Exemplo para um procedimento
public static void main(); Code: 0: bipush 10 2: istore_0 3: iload_0 4: iload_0 5: iconst_1 6: iadd 7: iadd 8: istore_0 9: return } Reservado para variáveis locais 21

24 Exemplo para um procedimento
public static void main(); Code: 0: bipush 10 2: istore_0 3: iload_0 4: iload_0 5: iconst_1 6: iadd 7: iadd 8: istore_0 9: return } Retorna ao chamador 21 O registro de ativação contém endereço para onde o controle deve retornar. Isto é, próximo PC.

25 Exemplo para vários procedimentos
public class Foo { public static void main(String[] args){ bar(10); } static void bar(int t){ t += t + 1;

26 Exemplo para vários procedimentos
public class Foo { public static void main(String[] args){ bar(10); } static void bar(int t){ t += t + 1; 10 main

27 Exemplo para vários procedimentos
public class Foo { public static void main(String[] args){ bar(10); } static void bar(int t){ t += t + 1; 10 bar 10 main main

28 Exemplo para vários procedimentos
public class Foo { public static void main(String[] args){ bar(10); } static void bar(int t){ t += t + 1; 10 10 10 bar bar 10 ... main main main

29 Exemplo para vários procedimentos
public class Foo { public static void main(String[] args){ bar(10); } static void bar(int t){ t += t + 1; Referência para variáveis locais e parâmetros do procedimento. 10 10 10 bar bar 10 ... main main main

30 Heap Grafo Nós correspondem as alocações dinâmica de dados
Aresta correspondem a referências para tais dados Importante! Referências podem partir da pilha ou da área estática também

31 Exemplo public class Tree { Node root; static class Node {
Node l, r; int val; Node(int v) { val = v; }... } Tree(int v) { if (root == null) root = new Node(v); else ... } ...

32 Exemplo public class Tree { ...
public static void main(String[] args){ Tree t = new Tree(5); } Objetos estão na heap! Instâncias não alcançáveis a partir da pilha ou campos estáticos estão sujeitas a garbage collection! val=5, l= null , r=null root

33 Liberação explícita de memória
Eficiente quando realizada adequadamente Depende do programador Quando liberação é inadequada: Em excesso, causa corrupção de memória Em falta, causa uso excessivo de memória

34 Memory Leaks O programador pode esquecer de liberar espaço de memória
Em C(++), usa-se explicitamente comando (delete) para liberar objetos alcançáveis por uma determinada referência Em Java, o programador precisa liberar referência para objetos

35 Memory Leaks: Exemplo Neste cenário, objeto referenciado por p não é mais usado. Porém, o programador esqueceu de liberar o objeto aponta por p! Heap p

36 Memory Leaks: Exemplo Este cenário mostra o objeto sendo liberado. Os nós em cor escura estão disponíveis para coleta. Heap Heap p p null

37 Garbage Collection Evita problemas relacionados a liberação explícita de memória Faz limpeza de memória automaticamente Garbage collection pode funcionar… Ocasionalmente (ex. Mark-Sweep) Incrementalmente (ex. Reference Counting)

38 Garbage collection (Mark-Sweep)
Heap

39 Garbage collection (Mark-Sweep)
Heap

40 Garbage collection (Mark-Sweep)
Heap

41 Garbage collection (Mark-Sweep)
Heap

42 Garbage Collection (Reference Count.)
Reference counting Adiciona campo extra a cada célula de memória Atualiza campo de acordo com operação Quando contador de um objeto chega a zero, elimina-se todos objetos alcançáveis a partir dele Pros Promove previsibilidade - Evita interrupção da execução com eventual execução do processo de GC Cons Custo de incrementar-decrementar Problemas com estruturas cíclicas (recursivas)

43 Heap e Pilha public class Tree { ...
public static void main(String[] args){ Tree t = new Tree(5); } $ javap -classpath . -c Tree public class Tree extends java.lang.Object{ public static void main(java.lang.String[]); Code: 0: new #2; //class Tree 3: dup 4: iconst_5 5: invokespecial #3; //Method "<init>":(I)V 8: astore_1 9: return }}

44 Heap e Pilha root=null ? ? $ javap -classpath . -c Tree
public class Tree extends java.lang.Object{ public static void main(java.lang.String[]); Code: 0: new #2; //class Tree 3: dup 4: iconst_5 5: invokespecial #3; //Method "<init>":(I)V 8: astore_1 9: return }}

45 Heap e Pilha root=null ? ? $ javap -classpath . -c Tree
public class Tree extends java.lang.Object{ public static void main(java.lang.String[]); Code: 0: new #2; //class Tree 3: dup 4: iconst_5 5: invokespecial #3; //Method "<init>":(I)V 8: astore_1 9: return }}

46 Heap e Pilha 5 root=null ? ? $ javap -classpath . -c Tree
public class Tree extends java.lang.Object{ public static void main(java.lang.String[]); Code: 0: new #2; //class Tree 3: dup 4: iconst_5 5: invokespecial #3; //Method "<init>":(I)V 8: astore_1 9: return }}

47 Heap e Pilha val=5, l= null , r=null root ? ?
$ javap -classpath . -c Tree public class Tree extends java.lang.Object{ public static void main(java.lang.String[]); Code: 0: new #2; //class Tree 3: dup 4: iconst_5 5: invokespecial #3; //Method "<init>":(I)V 8: astore_1 9: return }}

48 Heap e Pilha val=5, l= null , r=null root ?
$ javap -classpath . -c Tree public class Tree extends java.lang.Object{ public static void main(java.lang.String[]); Code: 0: new #2; //class Tree 3: dup 4: iconst_5 5: invokespecial #3; //Method "<init>":(I)V 8: astore_1 9: return }}

49 Heap e Área Estática Como organizar os dados ?
Como implementar dynamic binding ?

50 Exemplo class Point { protected int x,y; public Point (int x, int y) {
this.x=x; this.y=y; } public void move(int dx, int dy) { this.x += dx; this.y += dy; public float area() { return 0.0; public float dist(Point that) { int dx= this.x – that.x; int dy= this.y – that.y; return Math.sqrt(dx*dx + dy*dy);

51 Exemplo 1: código init Área Estática move area dist x y Heap
Instâncias Heap

52 Exemplo 2: atualização de estado
3 Construtor move area dist q Point p = new Point(2,3); Point q = new Point(0,0); Pilha Heap Área Estática

53 Exemplo 2: atualização de estado
3 4 Construtor move area dist q Point p = new Point(2,3); Point q = new Point(0,0); p.move(1,1); Pilha Heap Área Estática

54 Exemplo 2: atualização de estado
Heap p 3 4 q Construtor move area dist Point p = new Point(2,3); Point q = new Point(0,0); p.move(1,1); q = p; Pilha Área Estática

55 Dynamic binding class Circle extends Point { protected int r;
public Circle (int x, int y, int r) { this.x = x; this.y = y; this.r = r; } public int radius() { return this.r; } public double area() { double pi=3.1416; return pi*this.r*this.r; class Box extends Point { protected int w,d; public Box (int x, int y, int w, int d) { this.x = x; this.y = y; this.d=d; this.w = w; } public int width() { return this.w; } public int depth() { return this.d; } public double area() { return (double) this.w * this.d;

56 Criação de objetos e herança
Point p = null; Circle c = new Circle(0,12,4); Box b = new Box(0,4,8,8); Construtor move(herdado) area(sobreposto) dist(herdado) radius p 12 4 c b Construtor move(herdado) dist(herdado) area(sobreposto) width depth 4 8 Pilha Heap Área Estática

57 Polimorfismo Construtor move(herdado) area(sobreposto) dist(herdado)
p = c; p.move(20,20); double a = p.area(); Construtor move(herdado) area(sobreposto) dist(herdado) radius p 20 c 32 4 b a 50.3 Construtor move(herdado) dist(herdado) area(sobreposto) width depth 4 8 Pilha Heap Área Estática

58 Geração de Código

59 Geração de código Assembler é usado para isolar programador de detalhes de implementação de arquitetura Exemplos: Jasmin MSIL (Microsoft Intermediate Language)

60 Exemplo Jasmin (para Java)
Projetista não precisa se preocupar como bytecode (arquivo) é organizado .class public HelloWorld.j .super java/lang/Object .method public <init>()V aload_0 invokenonvirtual java/lang/Object/<init>()V return .end method .method public static main([Ljava/lang/String;)V .limit stack 2 .limit locals 2 getstatic java/lang/System/out Ljava/io/PrintStream; ldc "Hello World." invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V

61 Exemplo: MSIL (1/3) // Metadata version: v2.0.50215
.assembly extern mscorlib { .publickeytoken = (B7 7A 5C E0 89 ) // .z\V.4.. .ver 2:0:0:0 } .assembly sample .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( ) .hash algorithm 0x .ver 0:0:0:0 .module sample.exe // MVID: {A224F460-A049-4A03-9E71-80A36DBBBCD3} .imagebase 0x // SEE NEXT SLIDE

62 Exemplo: MSIL (2/3) // SEE PREVIOUS SLIDE .file alignment 0x00000200
.stackreserve 0x .subsystem 0x // WINDOWS_CUI .corflags 0x // ILONLY // Image base: 0x02F20000 // =============== CLASS MEMBERS DECLARATION =================== .class public auto ansi beforefieldinit Hello extends [mscorlib]System.Object { .method public hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size (0xd) .maxstack 8 IL_0000: nop IL_0001: ldstr "Hello World!" IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: ret } // SEE NEXT SLIDE

63 Exemplo: MSIL (3/3) // SEE PREVIOUS SLIDE
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size (0x7) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } // end of method Hello::.ctor } // end of class Hello

64 Aula prática—ilasm.exe
ilasm.exe é o assembler da Microsoft Entrada: MSIL Saída: código x86 executável nas máquinas Windows do laboratório


Carregar ppt "Ambiente de execução."

Apresentações semelhantes


Anúncios Google