35
Memory Models Gunnar Bergmann 30. November 2015

Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Memory Models

Gunnar Bergmann

30. November 2015

Page 2: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Table of contents

1 Manual memory management

2 RAII

3 Smart Pointers

4 Rust’s Ownership

5 Conclusion

Gunnar Bergmann Memory Models 30. November 2015 2

Page 3: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Manual memory management

Problems caused by manual memory management:

Memory leaks

use after free

double delete

repeated resource release on all paths

separation of allocation and release

exceptions only with finally

Gunnar Bergmann Memory Models 30. November 2015 3

Page 4: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Garbage Collection

memory overhead

unpredictable collection cycle

restricted to memory:

no deterministic destruction orderno immediate destruction

=⇒ Not always useful

Gunnar Bergmann Memory Models 30. November 2015 4

Page 5: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Local variables

memory automatically reclaimed after end of scope

stack allocated

returned by copying the value

pointers become invalid after end of scope

Gunnar Bergmann Memory Models 30. November 2015 5

Page 6: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

RAII

Classes contain constructor and destructor

Constructor allocates resource

Destructor frees resource

Resource Acquisition Is Initialization

Gunnar Bergmann Memory Models 30. November 2015 6

Page 7: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

c l a s s S t r i n g {pr i va te :

char∗ data ; // p o i n t e r to a c h a r a c t e rpub l i c :

// Con s t r u c t o rS t r i n g ( const char∗ s ) {

data = new char [ s t r l e n ( s )+1 ] ;s t r c p y ( data , s ) ;

}

// d i s a b l e copy ingS t r i n g ( const S t r i n g&) = de lete ;

// De s t r u c t o r˜ S t r i n g ( ) {

de lete [ ] data ;}

} ;

Gunnar Bergmann Memory Models 30. November 2015 7

Page 8: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Add a member function for appending strings:

concat ( const char∗ s ) {char∗ o l d = data ;i n t l e n = s t r l e n ( o l d )+ s t r l e n ( s )+1;data = new char [ l e n ] ; // more memorys t r c p y ( data , o l d ) ;s t r c a t ( data , s ) ;de lete [ ] o l d ; // f r e e o l d memory

}

Gunnar Bergmann Memory Models 30. November 2015 8

Page 9: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Automatic destruction at end of lifetime

Destructors of members and base classes automatically called=⇒ simple composition of classes

Immediate destructor call

Allows other resources than memory:

{l o c k gua rd<mutex> guard ( some mutex ) ;// . . . code i n s i d e the mutex

} // some mutex a u t oma t i c a l l y un locked

Gunnar Bergmann Memory Models 30. November 2015 9

Page 10: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Destruction Order

Destroy local variables at end of scope

First run code of the destructorthen destroy members and base classes

Reverse of construction order

Stack unwind on raised exception:Go back the call stack and destroy all objects.

Gunnar Bergmann Memory Models 30. November 2015 10

Page 11: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Already solved problems:

Memory leaks

double delete

repeated resource release on all paths

separation of allocation and release

exceptions only with finally

Remaining and new problems:

Use after free

Strict hierarchies required; no cyclic references

Gunnar Bergmann Memory Models 30. November 2015 11

Page 12: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Containers

can store multiple objects of the same type

use RAII to call all destructors

can move objects internally=⇒ can cause dangling references / iterators

Gunnar Bergmann Memory Models 30. November 2015 12

Page 13: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Smart Pointers

Definition (Owning pointer)

Pointer that may need to free its memory.

Definition (Raw pointer)

Pointer like in C, for example int*.

Definition (Smart pointer)

Pointer-like object that manages its own memory.

Gunnar Bergmann Memory Models 30. November 2015 13

Page 14: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Unique Pointer

C++: unique_ptrRust: Box

unique ownership

hold a reference

automatically deallocate it

Gunnar Bergmann Memory Models 30. November 2015 14

Page 15: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Shared Pointer

C++: shared_ptrRust: Rc

shared ownership

uses reference counting

increases counter in copy operation

decreases counter in destructor and maybe destroys object

reference cycles can cause leaks

Gunnar Bergmann Memory Models 30. November 2015 15

Page 16: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Weak Pointer

C++: weak_ptrRust: Weak

no ownership, pointer can dangle

can be upgraded to a shared pointer

used to break reference cycles

Gunnar Bergmann Memory Models 30. November 2015 16

Page 17: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

without weak pointer

Root

Object 1Object 2

Gunnar Bergmann Memory Models 30. November 2015 17

Page 18: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

with weak pointer

Root

Object 1Object 2

Gunnar Bergmann Memory Models 30. November 2015 18

Page 19: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

RAII in garbage collected languages

traditionally gc’ed languages use finally

finally is more verbose than RAII and can be forgotten easily

D uses garbage collector for memory and RAII for other resources

Some languages provide RAII-like behavior

Gunnar Bergmann Memory Models 30. November 2015 19

Page 20: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

RAII in garbage collected languages

For example Python:

w i th open ( ” t e s t . f i l e ” ) as f :con t en t = f . r ead ( )

Gunnar Bergmann Memory Models 30. November 2015 20

Page 21: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Rust

Rust aims at memory safety, abstractions without overhead andmultithreading.

detect problems at compile time

no dangling references

thread safety

no overhead

It uses ownership, borrowing and lifetimes.

Gunnar Bergmann Memory Models 30. November 2015 21

Page 22: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Ownership

only a single variable can access a value

ownership can be transferred to another variable, e.g. inside afunction

can not use a variable after move

some exceptions when transferring and copying is equal

Gunnar Bergmann Memory Models 30. November 2015 22

Page 23: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Ownership

l e t a = vec ! [ 1 , 2 , 3 ] ;l e t b = a ;

// does not worka . push ( 4 ) ; // append 4

Gunnar Bergmann Memory Models 30. November 2015 23

Page 24: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Borrowing

temporarily borrow instead of transferring ownership

like references

move borrowed value is forbidden (no dangling references)

similar to read-write-lock

just one reference can mutate the variable=⇒ no dangling iterators

Gunnar Bergmann Memory Models 30. November 2015 24

Page 25: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Borrowing

f n foo ( ) −> &i32 {l e t a = 12 ;r e t u r n &a ;

}

l e t x = vec ! [ 1 , 2 , 3 ] ;l e t r e f e r e n c e = &mut x ;p r i n t l n ! ( ”{}” , x ) ;

Borrowing is not threadsafe but can be used for it:

{l e t guard = mutex . l o c k ( ) . unwrap ( ) ;mod i f y v a l u e (&mut guard ) ;

}

Gunnar Bergmann Memory Models 30. November 2015 25

Page 26: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Lifetimes

mechanism for implementing ownership and borrowing

every type has a lifetime

can not take a reference with a larger lifetimes

object can not be moved while a reference exists

often they can be automatically generated

Gunnar Bergmann Memory Models 30. November 2015 26

Page 27: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Lifetimes

s t r u c t Foo {x : i32 ,

}

// the l i f e t i m e ’ a i s a g e n e r i c paramete r// i t r e t u r n s a r e f e r e n c e wi th the same// l i v e t i m e as the i npu tfn f i r s t x <’a>( f i r s t : &’a Foo , second : &Foo )

−> &’a i 3 2 {&f i r s t . x

}

Gunnar Bergmann Memory Models 30. November 2015 27

Page 28: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Anonymous functions

skip

lambda functions

can access local variable

use ownership model for checks

simplest type borrows environment=⇒ can not be returned

second type takes ownership=⇒ variables can not be used from outside

Gunnar Bergmann Memory Models 30. November 2015 28

Page 29: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Anonymous functions

Some can be called only once.

ownership is transferred into the called functions

destroyed at end of call

function can consume data

same concept available for methods

Gunnar Bergmann Memory Models 30. November 2015 29

Page 30: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Anonymous functions in C++

no checks by the compiler

individual capture per value

allows more complex expressions to be captured (C++14)

more flexibility, less safety

no self consuming functions in C++

Gunnar Bergmann Memory Models 30. November 2015 30

Page 31: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Anonymous functions

l e t f = move | | {// . . .

} ;

f n do someth ing ( s e l f ) {// . . .} // s e l f i s d e s t r o y ed

[ x , // by va l u e&r , // by r e f e r e n c ep = make unique<int >(0)

// g e n e r a l i z e d cap tu r e] ( auto parameter1 ) {

// the code i n the f u n c t i o n}

Gunnar Bergmann Memory Models 30. November 2015 31

Page 32: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Ownership in C++

ownership was already used for reasoning about code

just the checks are new

At CppCon 2015 a tool for checks similar to Rusts’ wasannounced.

Gunnar Bergmann Memory Models 30. November 2015 32

Page 33: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Conclusion

RAII:

safe building blocks for resource handling

good program structure

dangling references

manually break cyclic references (not always possible)

need to choose adequate type

RAII is general solution for resources without cycles⇐⇒GC is general solution for memory handling

Gunnar Bergmann Memory Models 30. November 2015 33

Page 34: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Conclusion

Ownership:

prevents dangling references

improves safety

does not solve all issues

requires lots of annotations

Gunnar Bergmann Memory Models 30. November 2015 34

Page 35: Memory Models - uni-luebeck.de · Garbage Collection memory overhead unpredictable collection cycle ... D uses garbage collector for memory and RAII for other resources Some languages

Manual memory management RAII Smart Pointers Rust’s Ownership Conclusion

Thank you for listening.Questions?

Gunnar Bergmann Memory Models 30. November 2015 35