_vmalloc() May Allocate Larger Memory Block Than ExpectedID: Q93211
|
When an application uses the Virtual Memory Manager (VMM) functions _vmalloc() or _vrealloc(), one must consider the memory allocation mechanism the VMM uses. The text below provides the details of these two mechanisms.
When the VMM requests memory from the virtual memory pool, two
allocation schemes are available: block allocation and page
allocation. The VMM uses the block allocation scheme when the
application requests fewer than 2042 bytes. In the block allocation
scheme, the VMM allocates the exact number of bytes requested by the
application.
If the application requests 2042 or more bytes, the VMM uses the page
allocation scheme to allocate a multiple of 2048 bytes of memory. The
VMM adds six bytes for the block header to the size of the allocation
and rounds the result up to the next multiple of the virtual page size
(2048 bytes). The VMM function _vmsize() returns the number of bytes
allocated, not including the block header.
The sample code below illustrates using these functions.
/*
* Compile options needed: none
*/
#include <stdio.h>
#include <stdlib.h>
#include <vmemory.h>
void main()
{
_vmhnd_t handle, handle2;
unsigned long block_size;
if (!_vheapinit(0, _VM_ALLDOS, _VM_XMS | _VM_EMS))
{
printf("Could not initialize virtual memory manager.\n");
exit(-1);
}
printf("Requesting 100 bytes of virtual memory.\n");
if ((handle = _vmalloc(100)) == _VM_NULL)
{
_vheapterm();
exit(-1);
}
block_size = _vmsize(handle);
printf("Received %d bytes of virtual memory.\n", block_size);
printf("Requesting 2046 bytes of virtual memory.\n");
if ((handle2 = _vmalloc(2046)) == _VM_NULL)
{
_vheapterm();
exit(-1);
}
block_size = _vmsize(handle2);
printf("Received %d bytes of virtual memory.\n", block_size);
_vfree(handle2);
_vheapterm();
}
Additional query words: kbinf 7.00 1.00 1.50 _vmalloc _vrealloc
Keywords : kb16bitonly
Version :
Platform :
Issue type :
Last Reviewed: July 28, 1999