Presentation is loading. Please wait.

Presentation is loading. Please wait.

Win32 Programming Lesson 18: More Memory Mapped Files and the HEAP (Finally, cool stuff!)

Similar presentations


Presentation on theme: "Win32 Programming Lesson 18: More Memory Mapped Files and the HEAP (Finally, cool stuff!)"— Presentation transcript:

1 Win32 Programming Lesson 18: More Memory Mapped Files and the HEAP (Finally, cool stuff!)

2 Where are we?  We’ve gotten pretty familiar with the idea of memory-mapped files but there are some important concepts we haven’t looked at  Finish up today, and then look at the heap

3 Sharing Data  There are lots of different ways to share data between processes  But the “lowest level” way is really in memory, via a memory-mapped file Two or more processes map the same base address – hence they are sharing the same physical memory

4 Avoiding the “real” File system  Very inconvenient if every memory-mapped file actually had to exist on disk Imagine that you simply wanted to use the mechanism to pass data, not keep it Can call CreateFileMapping with INVALID_HANDLE_VALUE as the hFile parameter, and the memory-mapped file is backed by the page file

5 30 Second Quiz  What’s wrong with this code?  HANDLE hFile = CreateFile(...); HANDLE hMap = CreateFileMapping(hFile,...); if (hMap == NULL) return(GetLastError());

6 Answer…  You’ll get back INVALID_HANDLE_VALUE from the first call  Which means…

7 MMFExample  Simple program  When it maps the view of the file, it transfers data between the two programs  Nice method of sharing between two processes!

8 Sparsely Committing…  Remember we talked about how to commit memory for files?  Same discussion for Memory-mapped files – that is, we don’t need to commit all our memory at once

9 Consider  CELLDATA CellData[200][256];  If sizeof(CELLDATA) is 128 that’s about 6MB.  Better to share as a sparsely-committed file mapping object  If we’re sharing via the paging file, can use SEC_RESERVE or SEC_COMMIT

10 SEC_RESERVE  When you pass in SEC_RESERVE you don’t actually commit the space  Just returns a HANDLE to the file mapping object  Any attempts to access the memory cause a memory violation

11 VirtualAlloc (again)  Solution: Call VirtualAlloc to allocate the memory as we use it!

12 The HEAP  Heap is a fantastic tool for allocating small blocks of memory Perfect for linked lists and trees Advantage: can ignore allocation granularity Disadvantage: slow, with no direct control of physical allocation Better yet, internals not entirely documented

13 Default  Each process gets a default heap of 1MB  Can specify at link time (/HEAP:)  Used by many Windows/C RTL functions  Access to the HEAP is serialized (why, and what does this mean?)  Can obtain a handle via: HANDLE GetProcessHeap();

14 More than 1 Heap is a…  Five reasons you might want to do this: Component protection More efficient memory management Local access Avoiding thread sync overhead Quick free

15 1: Component Protection  Imagine you have two structures: a linked list and a binary tree  If you share one heap, and one has a bug, the problem may show up in the other structure  If we have different heaps, problems tend to be localized (unless you *really* mess up!)

16 2: Memory Management  Heaps work best when all the objects in them are the same size  Imagine mixing two different sizes; when you free object 1 object 2 may not be a perfect fit  Better to allocate all objects of the same size in the same place

17 3: Local Access  Swapping to disk is really expensive  Best to keep things you use together close together

18 4: Avoiding thread-sync issues  Heaps are serialized by default  CPU overhead involved in keeping heap access thread safe  If you tell the system a heap is single- threaded, you can lose this overhead DANGER WILL ROBINSON: YOU ARE NOW RESPONSIBLE FOR THREAD SAFETY!!!

19 5: Quick free  Instead of freeing things up block by block you can choose to free the entire heap in one go  That’s *really* quick

20 So… how?  HANDLE HeapCreate( DWORD fdwOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize);  Options: 0, HEAP_NO_SERIALIZE, HEAP_GENERATE_EXCEPTIONS  Serialize turns off checking for Alloc and Free  Can manage this yourself via Critical Sections if you want to

21 HEAP_GENERATE_EXCEPTIONS  Raise an exception whenever an allocation request fails  Basically, it’s just about whether you want to catch exceptions or check return values – depends on the application  Oh… if dwMaximumSize is 0 the size is unlimited…

22 Allocating Memory from the Heap  PVOID HeapAlloc( HANDLE hHeap, DWORD fdwFlags, SIZE_T dwBytes);  Flags: HEAP_ZERO_MEMORY, HEAP_GENERATE_EXCEPTIONS, HEAP_NO_SERIALIZE  Exceptions: STATUS_NO_MEMORY, STATUS_ACCESS_VIOLATION

23 Changing the size…  PVOID HeapReAlloc( HANDLE hHeap, DWORD fdwFlags, PVOID pvMem, SIZE_T dwBytes);  New flag: HEAP_REALLOC_IN_PLACE_ONLY  Means that the location won’t change

24 Obtaining the Size  SIZE_T HeapSize( HANDLE hHeap, DWORD fdwFlags, LPCVOID pvMem);  Flags: 0 or HEAP_NO_SERIALIZE

25 Freeing a block  BOOL HeapFree( HANDLE hHeap, DWORD fdwFlags, PVOID pvMem);  Flags? You tell me…

26 Destroying a Heap  BOOL HeapDestroy(HANDLE hHeap);  TRUE on success  You can’t destroy the default heap!

27 Heaps with C++  Under C you would use malloc  In C++ can use new/delete CSomeClass *pSomeClass = new CSomeClass; delete pSomeClass; Now the clever bit: overload new/delete…

28 Prototype  class CSomeClass { private: static HANDLE s_hHeap; static UINT s_uNumAllocsInHeap; // Other private data and member functions public: void* operator new (size_t size); void operator delete (void* p); // Other public data and member functions };

29 Code… HANDLE CSomeClass::s_hHeap = NULL; UINT CSomeClass::s_uNumAllocsInHeap = 0; void* CSomeClass::operator new (size_t size) { if (s_hHeap == NULL) { // Heap does not exist; create it. s_hHeap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0); if (s_hHeap == NULL) return(NULL); } // The heap exists for CSomeClass objects. void* p = HeapAlloc(s_hHeap, 0, size); if (p != NULL) { // Memory was allocated successfully; increment // the count of CSomeClass objects in the heap. s_uNumAllocsInHeap++; } // Return the address of the allocated CSomeClass object. return(p); }

30 And delete… void CSomeClass::operator delete (void* p) { if (HeapFree(s_hHeap, 0, p)) { // Object was deleted successfully. s_uNumAllocsInHeap--; } if (s_uNumAllocsInHeap == 0) { // If there are no more objects in the heap, // destroy the heap. if (HeapDestroy(s_hHeap)) { // Set the heap handle to NULL // so that the new operator // will know to create a new heap if a // new CSomeClass // object is created. s_hHeap = NULL; } } }

31 Misc Functions…  DWORD GetProcessHeaps – returns handles to all heaps in the process  BOOL HeapValidate – check that a heap is a-okay…  UINT HeapCompact – coalesce free blocks  HeapLock and HeapUnlock – used for thread sync  HeapWalk – for debugging; lets you enumerate sections/blocks in the heap

32 Next  Next, it gets difficult DLLs


Download ppt "Win32 Programming Lesson 18: More Memory Mapped Files and the HEAP (Finally, cool stuff!)"

Similar presentations


Ads by Google