Windows Memory Management, Memory- Mapped Files, and DLLs.

Slides:



Advertisements
Similar presentations
Dynamic memory allocation
Advertisements

Part IV: Memory Management
Indexing.
File Systems.
KERNEL MEMORY ALLOCATION Unix Internals, Uresh Vahalia Sowmya Ponugoti CMSC 691X.
User-Level Memory Management in Linux Programming
Chapter 10: File-System Interface
Chapter 8 Runtime Support. How program structures are implemented in a computer memory? The evolution of programming language design has led to the creation.
1 JMH Associates © 2004, All rights reserved Chapter 5 Memory Management, Memory-Mapped Files, and DLLs.
Chapter 11: File System Implementation
Chapter 12: File System Implementation
Memory Management Chapter 5.
1 Friday, July 07, 2006 “Vision without action is a daydream, Action without a vision is a nightmare.” - Japanese Proverb.
File System Implementation
1 JMH Associates © 2004, All rights reserved Chapter 1 Getting Started with Win32/64.
Chapter 51 Threads Chapter 5. 2 Process Characteristics  Concept of Process has two facets.  A Process is: A Unit of resource ownership:  a virtual.
Real-Time Concepts for Embedded Systems Author: Qing Li with Caroline Yao ISBN: CMPBooks.
System Calls 1.
Operating System Chapter 7. Memory Management Lynn Choi School of Electrical Engineering.
1 Memory Management Memory Management COSC513 – Spring 2004 Student Name: Nan Qiao Student ID#: Professor: Dr. Morteza Anvari.
MIPS coding. SPIM Some links can be found such as:
9 Chapter Nine Compiled Web Server Programs. 9 Chapter Objectives Learn about Common Gateway Interface (CGI) Create CGI programs that generate dynamic.
Win32 Programming Lesson 20: Advanced DLL Techniques.
Compiler Construction
Saves memory and reduces swapping No recompilation on changes A DLL can provide after-market support Programs written in different languages can call the.
File System Implementation Chapter 12. File system Organization Application programs Application programs Logical file system Logical file system manages.
Lecture 11 Dynamic link libraries. Differences between static libraries and DLLs In static library code is added to the executable. In DLL, the code is.
Win32 Programming Lesson 18: More Memory Mapped Files and the HEAP (Finally, cool stuff!)
Hardware process When the computer is powered up, it begins to execute fetch-execute cycle for the program that is stored in memory at the boot strap entry.
Pointers OVERVIEW.
CE Operating Systems Lecture 3 Overview of OS functions and structure.
1 File Management Chapter File Management n File management system consists of system utility programs that run as privileged applications n Concerned.
ITEC 502 컴퓨터 시스템 및 실습 Chapter 2-1: Process Mi-Jung Choi DPNM Lab. Dept. of CSE, POSTECH.
© Janice Regan, CMPT 300, May CMPT 300 Introduction to Operating Systems Memory: Relocation.
File Storage Organization The majority of space on a device is reserved for the storage of files. When files are created and modified physical blocks are.
CS 326 Programming Languages, Concepts and Implementation Instructor: Mircea Nicolescu Lecture 9.
1 Memory Management Chapter 7. 2 Memory Management Subdividing memory to accommodate multiple processes Memory needs to be allocated to ensure a reasonable.
File System Implementation
Dynamic Link Libraries: Inside Out. Dynamic Link Libraries  About Dynamic-Link Libraries  Dynamic-Link Libraries Hands On  Dynamic Link Library Reference.
Writing a Run Time DLL The application loads the DLL using LoadLibrary() or LoadLibraryEx(). The standard search sequence is used by the operating system.
1 Memory Management Chapter 7. 2 Memory Management Subdividing memory to accommodate multiple processes Memory needs to be allocated to ensure a reasonable.
Silberschatz, Galvin and Gagne  Operating System Concepts Chapter 12: File System Implementation File System Structure File System Implementation.
CE Operating Systems Lecture 17 File systems – interface and implementation.
Object-Oriented Programming Chapter Chapter
Why Do We Need Files? Must store large amounts of data. Information stored must survive the termination of the process using it - that is, be persistent.
CNIT 127: Exploit Development Ch 8: Windows Overflows Part 2.
Win32 Programming Lesson 17: Memory Mapped Files (Finally, cool stuff again, all this work is getting tedious!)
Processes and Virtual Memory
Operating Systems ECE344 Ashvin Goel ECE University of Toronto Memory Management Overview.
© Janice Regan, CMPT 300, May CMPT 300 Introduction to Operating Systems Operating Systems Processes and Threads.
11.1 Silberschatz, Galvin and Gagne ©2005 Operating System Principles 11.5 Free-Space Management Bit vector (n blocks) … 012n-1 bit[i] =  1  block[i]
Threads. Readings r Silberschatz et al : Chapter 4.
Win32 Programming Lesson 19: Introduction to DLLs.
NTFS Filing System CHAPTER 9. New Technology File System (NTFS) Started with Window NT in 1993, Windows XP, 2000, Server 2003, 2008, and Window 7 also.
FILE SYSTEM IMPLEMENTATION 1. 2 File-System Structure File structure Logical storage unit Collection of related information File system resides on secondary.
Part III Storage Management
Memory Management Chapter 5 Advanced Operating System.
CC410: System Programming Dr. Manal Helal – Fall 2014 – Lecture 10 – Loaders.
DYNAMIC MEMORY ALLOCATION. Disadvantages of ARRAYS MEMORY ALLOCATION OF ARRAY IS STATIC: Less resource utilization. For example: If the maximum elements.
Chapter 2 Memory and process management
File System Implementation
Chapter 11: File System Implementation
Optimizing Malloc and Free
Chapter 9: Virtual-Memory Management
Memory Allocation CS 217.
Lecture 3: Main Memory.
Operating System Chapter 7. Memory Management
File system : Disk Space Management
Windows Development Dynadata Copyright, 2014 © DynaData S.A. 1/22.
Memory allocation.
Presentation transcript:

Windows Memory Management, Memory- Mapped Files, and DLLs

– 2 – OBJECTIVES (1 of 2) Upon completion of this Chapter you will be able to: Describe the Windows memory management architecture and the role of heaps and memory-mapped files Use multiple independent heaps in applications requiring dynamic memory management Use Structured Exception Handling to respond to memory allocation errors Use memory-mapped files

– 3 – OBJECTIVES (2 of 2) Determine when to use the independent heaps and when to use memory-mapped files and to describe the advantages and disadvantages of each Describe Windows dynamic link libraries (DLLs) Describe the difference between static, implicit, and explicit linking Describe the advantages and disadvantages of each Use DLLs to load different implementations of the same function

– 4 – OVERVIEW (1 of 2)  32-bit operating system, so pointers are 4-byte objects  Win64 provides 64-bit pointers  Processes have a private 4GB virtual address space  Half (2GB) is available to a process  Remainder allocated to shared data and code  Win64 enlarges VA space; required for many applications  Programs can create independent memory “heaps” Processes can map files to memory  Processes can share memory through a mapped file  Fast and convenient for some file processing

– 5 – OVERVIEW (2 of 2)  Dynamic Link Libraries with Monolithic Programs Gather all the source code, including commonly used Chapters such as utility functions Put all the source code in a single project Build, test, debug, and use the program Inefficiency Recompile same code in all projects All executables include the same object code Waste of disc space and physical memory at run time Maintenance complexity as shared code changes

Part I Memory Management and Heaps

– 7 – Windows Program Heap API: HeapCreate, HeapDestroy, HeapAlloc, HeapFree MMF API: CreateFileMapping, CreateViewOfFile Virtual Memory API Windows Kernel with Virtual Memory Manager Physical Memory Disc & File System C library: malloc, free Memory Management Architecture

– 8 – HEAPS (1 of 2)  Pools of memory within the process virtual address space  Every process has a default process heap  A process may have more than one heap. Benefits of separate heaps include:  Fairness (between threads and between uses)  Allocation efficiency (fixed size blocks in each heap)  Deallocation efficiency (you can deallocate a complete data structure with one call)  Locality of reference efficiency

– 9 – HEAPS (2 of 2)  Every process has a process heap  Every heap has a handle  The programmer can use the process heap or create new ones  HANDLE GetProcessHeap (VOID)  Return: The handle for the process’ heap; NULL on failure

– 10 – Node Record Not allocated Process Heap RecHeap NodeHeap Virtual Address Space Program ProcHeap = GetProcessHeap ( ); pRoot = HeapAlloc (ProcHeap); RecHeap = HeapCreate ( ); NodeHeap = HeapCreate ( ); while ( ) { pRec = HeapAlloc (RecHeap); pNode = HeapAlloc (NodeHeap); · · · } HeapFree (RecHeap, 0, pRec); HeapFree (NodeHeap, 0, pNode); HeapDestroy (RecHeap); HeapDestroy (NodeHeap); · · · MEMORY MGT. IN MULTIPLE HEAPS

– 11 – HEAP MANAGEMENT (1 of 2)  HANDLE HeapCreate (DWORD flOptions, DWORD dwInitialSize, DWORD dwMaximumSize)  Return: A heap handle or NULL on failure  dwMaximumSize — How large the heap can become 0 — “growable heap”; no fixed limit non-zero — “non-growable heap” The entire block is allocated from the virtual address space But only the initial size is committed in the paging file

– 12 – HEAP MANAGEMENT (2 of 2)  flOptions is a combination of two flags: HEAP_GENERATE_EXCEPTIONS HEAP_NO_SERIALIZE  By generating exceptions, you can avoid explicit tests after each heap management call

– 13 – HEAPS  BOOL HeapDestroy (HANDLE hHeap) hHeap — a heap generated using HeapCreate Do not destroy the process’ heap (obtained using GetProcessHeap ) Benefits of HeapDestroy : No data structure traversal code No need to deallocate each individual data structure element, which can be time-consuming

– 14 – MANAGING HEAP MEMORY (1 of 4)  LPVOID HeapAlloc (HANDLE hHeap, DWORD dwFlags, DWORD dwBytes)  Return: A pointer to the allocated memory block (of size dwBytes ) or NULL on failure (unless exception generation is specified)  hHeap — Handle from GetProcessHeap or HeapCreate  dwFlags — A combination of: HEAP_GENERATE_EXCEPTIONS HEAP_NO_SERIALIZE HEAP_ZERO_MEMORY — Allocated memory initialized to zero

– 15 – MANAGING HEAP MEMORY (2 of 4)  BOOL HeapFree (HANDLE hHeap, DWORD dwFlags,  LPVOID lpMem)  dwFlags — Should be zero (or HEAP_NO_SERIALIZE )  lpMem — Should have a value returned by HeapAlloc or HeapReAlloc  hHeap — Should be the heap that lpMem was allocated from

– 16 – MANAGING HEAP MEMORY (3 of 4)  LPVOID HeapReAlloc (HANDLE hHeap, DWORD dwFlags,  LPVOID lpMem, DWORD dwBytes)  Return: Pointer to the reallocated block. Failure returns NULL or causes exception.  dwFlags — Some essential control options: HEAP_GENERATE_EXCEPTIONS and HEAP_NO_SERIALIZE HEAP_ZERO_MEMORY — Only newly allocated memory is initialized HEAP_REALLOC_IN_PLACE_ONLY — Do not move the block  lpMem — Existing block in hHeap to be reallocated  dwByte — New block size

– 17 – MANAGING HEAP MEMORY (4 of 4)  DWORD HeapSize (HANDLE hHeap, DWORD dwFlags,  LPVOID lpMem)  Return: The size of the block or zero on failure.

– 18 – HEAP FLAGS (1 of 2)  HEAP_NO_SERIALIZE Specified in HeapCreate, HeapAlloc, and other functions Performance gain (about 15% in tests) as functions do not provide mutual exclusion to threads accessing the heap Can safely be used if (BUT, BE CAREFUL): Your process uses only a single thread Each thread has its own heap(s) that no other thread can access You provide your own mutual exclusion mechanism to prevent concurrent access to a heap by several threads You use HeapLock and HeapUnlock

– 19 – HEAP FLAGS (2 of 2)  HEAP_GENERATE_EXCEPTIONS Allows you to avoid error tests after each allocation

– 20 – OTHER HEAP FUNCTIONS  HeapValidate Determine whether a heap has been corrupted  HeapCompact Combine adjacent free blocks; decommit large free blocks  HeapWalk Determine all blocks allocated within a heap

– 21 – EXAMPLE-A  Write a program, sortHP, which reads fixed-size records from a file into a memory-allocated buffer in a heap, where the first 8 characters are a birth date (CCYYMMDD format). The rest of the record is a line of text. Enter each date in an array, along with a file position. Each array element will contain the date and the file position of the record (which is not fixed length). Sort the array using the C library qsort function. Print out the complete file sorted by birth date. Repeat the process for each file on the command line. Before each new file, destroy the heaps from the preceding file.

– 22 – EXAMPLE-A  The TestData directory contains two text files with 64- byte records that can be used to test your program. Or, use the RandFile program to generate sortable files of any size.

– 23 – EXAMPLE-A  Modify the sort program to create sortBT, which enters the records in to a binary search tree and then scans the tree to display the records in order. Allocate the tree nodes and the data in separate heaps. Destroy the heaps before sorting the next file, rather than freeing individual tree nodes and data elements. Test the program with and without heap serialization and determine whether there is a detectable performance difference.

Part II Memory-Mapped Files

– 25 – MEMORY-MAPPED FILES  Advantages to mapping your virtual memory space directly to normal files rather than the paging file: You never need to perform direct file I/O Data structures you create are saved in the file You can use in-memory algorithms (string processing, sorts, search trees) to process data even though the file may be much larger than available physical memory There is no need to manage buffers and the file data they contain Multiple processes can share memory (this is the only way), and the file views will be coherent There is no need to consume space in the paging file

– 26 – PROCESS ADDRESS SPACE MAPPED TO A FILE Program fH = CreateFile ( ); mH = CreateFileMapping (fH); while ( ) { pRecA = MapViewOfFile (mH); pRecB = MapViewOfFile (mH); pRecB -> Data = pRecA -> Data; · · · UnmapViewOfFile (pRecA); UnmapViewOfFile (pRecB); } CloseHandle (mH); CloseHandle (fH); · · · Process Address Space File

– 27 – FILE-MAPPING OBJECTS (1 of 4)  HANDLE CreateFileMapping (HANDLE hFile,  LPSECURITY_ATTRIBUTES lpsa,  DWORD dwProtect, DWORD dwMaximumSizeHigh,  DWORD dwMaximumSizeLow, LPCTSTR lpMapName)  Return: A file mapping handle or NULL

– 28 – FILE-MAPPING OBJECTS (2 of 4)  Parameters hFile — Open file handle; protection flags compatible with dwProtect LPSECURITY_ATTRIBUTES — NULL for now dwProtect — How you can access the mapped file: PAGE_READONLY — Pages in the mapped region are read only PAGE_READWRITE — Full access if hFile has both GENERIC_READ and GENERIC_WRITE access PAGE_WRITECOPY — When you change mapped memory, a copy is written to the paging file

– 29 – FILE-MAPPING OBJECTS (3 of 4) dwMaximumSizeHigh and dwMaximumSizeLow — Specify the size of the mapping object; 0 for current file size. The file is extended if the current file size is smaller than the map size. lpMapName — Names the mapping object, allowing other processes to share the object

– 30 – FILE-MAPPING OBJECTS (4 of 4)  You can also obtain a file-mapping handle by specifying an existing mapping object name  HANDLE OpenFileMapping (DWORD dwDesiredAccess,  BOOL bInheritHandle, LPCTSTR lpNameP)  Return: A file mapping handle or NULL  CloseHandle destroys mapping handles

– 31 – MAPPING PROCESS ADDRESS SPACE (1 of 3)  LPVOID MapViewOfFile (HANDLE hMapObject,  DWORD dwAccess, DWORD dwOffsetHigh,  DWORD dwOffsetLow, DWORD cbMap)  Return: The starting address of the block (file view) or NULL on failure  hMapObject — Identifies a file-mapping object  dwAccess — Must be compatible with mapping object’s access: FILE_MAP_WRITE FILE_MAP_READ FILE_MAP_ALL_ACCESS

– 32 – MAPPING PROCESS ADDRESS SPACE (2 of 3)  dwOffsetHigh and dwOffsetLow Starting location of the mapped file region Must be a multiple of 64K Zero offset to map from beginning of file  cbMap — Size in bytes of the mapped region Zero indicates entire file Note: The map size is limited by the 32-bit address

– 33 – MAPPING PROCESS ADDRESS SPACE (3 of 3)  MapViewOfFileEx is similar, but you can specify an existing address  BOOL UnmapViewOfFile (LPVOID lpBaseAddress) To release file views

– 34 – FILE-MAPPING LIMITATIONS Disparity between Windows’s 64-bit file system and 32-bit addressing With a large file (greater than 4GB) you cannot map everything into virtual memory space Process data space is limited to 2GB You cannot use all 2GB; available contiguous blocks will be smaller When dealing with large files, you must create code that carefully maps and unmaps file regions as you need them

– 35 – BASED POINTERS (1 of 2)  If you use pointers in a mapped file region, they should be of type _based A conventional pointer refers to the virtual address This address base will almost certainly be different the next time that file is mapped or a new view is created of the same region The pointer should be based on the view address

– 36 – BASED POINTERS (2 of 2)  int *pi;  int __based(pi) *bpi, i; ...  pi = MapViewOfFile (...);  *pi = 3;  bpi = pi;  i = *bpi; ...

– 37 – EXAMPLE-B  Rewrite the atou (ASCII to UNICODE) program to create atouMM Use memory mapping only; do not use ReadFile and WriteFile You do not need to change the main function in atou.c. Instead, change the asc2un.c function to create asc2unMM.c.

– 38 – EXAMPLE-B  Rewrite the sort program of the previous section to create sortMM, so that key records (in the array) are mapped to a “key” file Do not use the file pointers; instead, use based pointers to address in a view of the original file As part of the test of _based pointers, have a program option to simply use the saved key file to produce a sorted listing without actually performing a sort. The next slide shows diagrams the operation. This is a difficult exercise!

– 39 – sortMM OPERATION sortMM MyFile MyFile.idx K i : Key S i : String P i : Based Pointer KiKi PiPi KjKj PjPj KkKk PkPk ··· K0K0 S0S0 K1K1 S1S1 K2K2 S2S2 MyFile ··· K0K0 P0P0 K1K1 P1P1 K2K2 P2P2 qsort

Part III Dynamic Link Libraries

– 41 – STATIC LIBRARIES Build one or more libraries as “static libraries” Link the libraries with each project as needed  Advantages Simplifies and expedites project building  Disadvantages Disc and memory space issues Maintenance requires relinking and redistribution Different programs may use different library versions Programs cannot use alternate utility implementations for different situations

– 42 – DYNAMIC LINK LIBRARIES (1 of 4)  DLLs solve these and other problems very neatly Library functions are linked at: Program load time — implicit linking Program run time — explicit linking Program image can be much smaller It does not include the library functions Multiple programs can share a single DLL Only a single copy will be loaded into memory All programs map their process address space to DLL code Each thread will have its own copy of non-shared storage on the stack

– 43 – DYNAMIC LINK LIBRARIES (2 of 4)  New versions or alternate implementations: Supplying a new version of the DLL All programs can use the new version without modification  Explicit linking: Program decides at run time which library version to use Different libraries may be alternate implementations of the same function May carry out totally different tasks Just as separate programs do The library will run in the same process and thread as the calling program

– 44 – DYNAMIC LINK LIBRARIES (3 of 4)  DLLs are used in nearly every operating system Including UNIX and Windows 3.1 Windows (all versions) uses DLLs to implement the OS interfaces, among other things Windows 3.1 DLLs run at the same address space for all processes Windows DLLs run in the process’ virtual address space

– 45 – DYNAMIC LINK LIBRARIES (4 of 4)  Multiple Windows processes can share DLL code  Code, when called, runs as part of the calling process and thread Library can use the calling process’ resources (file handles,...) Uses the calling thread’s stack  DLLs must be thread-safe  DLLs can also export variables as well as function entry points

– 46 – IMPLICIT LINKING (1 of 2)  Implicit, or load-time, linking is the easiest of the two techniques  Steps: Collect and built function source as a DLL Build process constructs a.LIB library file “stub” for the actual code Place.LIB in project library directory Build process also constructs a.DLL file

– 47 – IMPLICIT LINKING (2 of 2) Contains the actual executable image Placed in the same directory as the application that uses it The current working directory is the secondary location Then system directory, Windows directory, PATH The program loads the DLL during its initialization You must “export” the function interfaces in the DLL source

– 48 – EXPORTING AND IMPORTING INTERFACES (1 of 3)  DLL entry point must be declared Microsoft C, using the _declspec (dllexport) storage modifier:  _declspec (dllexport)  DWORD MyFunction (...);  Calling program declares the function is to be imported Use the _declspec (dllimport) storage modifier

– 49 – EXPORTING AND IMPORTING INTERFACES (2 of 3)  Standard technique in include file Use a preprocessor variable such as “MYPROJ_EXPORTS“ “MYPROJ” is the project name #ifdef MYPROJ_EXPORTS #define LIBSPEC _declspec (dllexport) #else #define LIBSPEC _declspec (dllimport) #endif LIBSPEC DWORD MyFunction (...);

– 50 – EXPORTING AND IMPORTING INTERFACES (3 of 3) The DLL project defines MYPROJ_EXPORTS Calling application leaves MYPROJ_EXPORTS undefined  You can export and import variables as well as function entry points

– 51 – EXAMPLE–C  Build one or more of the ASCII to Unicode functions ( asc2un ) as a DLL. Export the entry point. Chapter 2 version is straightforward file I/O. It can be made faster with larger buffers, sequential scan flags, etc. Chapter 4 version uses memory mapping The two versions exhibit different performance characteristics depending on the file system type (NTFS or FAT)  Rebuild the atou calling program (Chapter 2) so that it implicitely links to a asc2un DLL

– 52 – EXPLICIT LINKING (1 of 4)  Explicit (run-time) linking requires: Program loads a DLL be loaded — LoadLibrary Finds the address of the entry point(s) — GetProcAddress Cast the address pointer to the function type Call the function using the pointer Optionally free the library — FreeLibrary NOTE: The function is not declared in the calling program; you declare a variable as a pointer to a function. Therefore, there is no need for the.LIB file at link time

– 53 – EXPLICIT LINKING (2 of 4)  HINSTANCE LoadLibrary (LPCTSTR lpLibFileName)  Returned handle is NULL on failure  HINSTANCE, rather than a conventional HANDLE It contains different information

– 54 – EXPLICIT LINKING (3 of 4)  BOOL FreeLibrary (HINSTANCE hLibModule)  You are done with the library or want a different version  LoadLibraryEx is similar Several flags for specifying alternate search paths and loading the library as a data file

– 55 – EXPLICIT LINKING (4 of 4)  To obtain the entry point: FARPROC GetProcAddress (HMODULE hModule, LPCSTR lpProcName)  hModule is an instance produced by LoadLibrary Or GetModuleHandle (not described here)  lpProcName is the entry point name Cannot be Unicode  NULL in case of failure  FARPROC, like “long pointer,” is an anachronism

– 56 – Loading a DLL  BOOL (*Asc2Un)(LPCTSTR, LPCTSTR, BOOL);  FARPROC pA2U;  /* Load the ASCII to Unicode function DLL file */  hDLL = LoadLibrary (argv [LocDLL]);  /* Get the entry point address */  pA2U = GetProcAddress (hDLL, "Asc2Un");  /* Convert to a function pointer */  Asc2Un = (BOOL (*)(LPCTSTR, LPCTSTR, BOOL)) pA2U;  /* Call the function */  Asc2Un (argv [LocFileIn], argv [LocFileOut],  FALSE);

– 57 – EXAMPLE–D (1 of 2)  Modify the atou program so that the name of the DLL file is on the command line Then load the DLL and call it, as illustrated on the previous slide

– 58 – EXAMPLE–D (2 of 2)  Here are some suggested extensions, not included in the lab solution: Modify the calling program so that it sequentially loads and calls several alternative implementations Modify the calling program so that it determines the operating environment (OS version, file system types, etc.) and then loads the most efficient implementation for the environment. Use your knowledge from previous performance experiments to determine the best implementation for a given situation.