home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
msdn_vcb
/
samples
/
vc98
/
sdk
/
winbase
/
winnt
/
mpheap
/
readme.txt
< prev
next >
Wrap
Text File
|
1996-05-02
|
3KB
|
62 lines
Multithreaded Heap Manager
Summary
-------
The MPHEAP sample is a DLL that provides an implementation of multiple heaps
and serializes access to the heaps. It will only work on Windows NT 4.0 and
later.
Many multithreaded applications that use the standard memory allocation
routines pay a significant performance penalty when running on a
multiprocessor machine. This is due to the serialization used by the
default heap. On a multiprocessor machine, more than one thread may try to
allocate memory simultaneously. One thread will block on the critical section
guarding the heap. The other thread must then signal the critical section
when it is finished to release the waiting thread. This adds significant
overhead.
By providing multiple heaps, MPHEAP.DLL allows simultaneous operations on
each heap. A thread on processor 0 can allocate memory from one heap
at the same time that a thread on processor 1 is allocating from a
different heap. The additional overhead in this DLL is offset by
drastically reducing the number of times a thread must wait for heap access.
The TMPHEAP sample is a simple program that demonstrates the functionality of
MPHEAP.DLL.
More Information
----------------
The basic scheme is to attempt to lock each heap in turn with the
TryEnterCriticalSection function. This will enter the critical section if
it is unowned. If the critical section is owned by a different thread,
TryEnterCriticalSection returns failure instead of blocking until the
other thread leaves the critical section.
Another trick to increase performance is the use of a lookaside list to
satisfy frequent allocations. By using InterlockedExchange to remove
lookaside list entries and InterlockedCompareExchange to add lookaside
list entries, allocations and frees can be completed without needing a
critical section lock.
The final trick is the use of delayed frees. If a chunk of memory is
being freed, and the required lock is already held by a different
thread, the free block is simply added to a delayed free list and the
function completes immediately. The next thread to acquire the heap lock
will free everything on the list.
Every application uses memory allocation routines in different ways.
To allow better tuning, MpHeapGetStatistics allows an application to monitor
the contention. Increasing the number of heaps increases the potential
concurrency, but also increases memory overhead. Some experimentation
is recommended to determine the optimal settings for a given number of
processors.
Some applications can benefit from additional techniques. For example,
per-thread lookaside lists for common allocation sizes can be very
effective. No locking is required for a per-thread structure, since no
other thread will ever be accessing it. Because each thread reuses the
same memory, per-thread structures also improve locality of reference.