libc
, proporciona
las funciones malloc
, calloc
y
free
para el manejo de la memoria
dinámica.
HANDLE HeapCreate( DWORD flOptions, DWORD dwInitialSize, DWORD dwMaximumSize);Su uso viene explicado en el resumen. Simplemente resaltar que si se especifica un tamaño máximo de 0, se permite al montón crecer indefinidamente y se permite reservar memoria de ese montón sin límite de tamaño. Si no, el límite de cada reserva es de 0x7FFF8 bytes.
HeapAlloc
. Existen también funciones
para liberar memoria y para destruir un montón creado.
HEAP_NO_SERIALIZE
en CreateHeap
o similares, nos tendremos que encargar nosotros. Esto puede
llegar a interesar si las necesidades de rapidez son altas.
LPVOID VirtualAlloc( LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD flProtect);Reservaremos, si ponemos
MEM_RESERVE
en los
flAllocationType
. Confirmaremos con
MEM_COMMIT
. Respecto al primer parámetro, puede ser
NULL si, cuando hacemos la reserva (no cuando confirmamos)
dejamos al sistema que elija la dirección virtual donde reservar
la memoria.
VirtualFree
. También es posible
bloquear una zona de memoria de modo que no se haga paginación
con ella y permanezca en memoria principal a ser posible.
Esto se consigue con VirtualLock
y
VirtualUnlock
. Debido a que las prestaciones
del sistema pueden verse muy mermadas si se bloquea mucha
memoria, el sistema operativo sólo dejará bloquear pocas
páginas.
GlobalMemoryStatus
que nos dará información de la memoria disponible en el
sistema.
CreateFileMapping
y OpenFileMapping
,
como con los semáforos. Veamos, por ejemplo, la primera:
HANDLE CreateFileMapping(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpName);
hFile
tiene que ser:
DWORD
), el tamaño
se especifica de dos veces. Es decir, se construyen dos valores
de 32 bits a partir de la cantidad de 64 bits y se pasan como
argumentos diferentes.
LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, DWORD dwNumberOfBytesToMap);servirá para proyectar efectivamente el fichero en la zona de memoria. El significado de los parámetros es evidente. Sólo considerar que, de nuevo, el desplazamiento dentro del fichero es de 64 bits repartidos en dos pedazos de 32 bits. La función nos devolverá la dirección de memoria donde se ha realizado la proyección. La función opuesta la realiza
UnmapViewOfFile
. También se dispone de la función
FlushViewOfFile
para hacer efectivo el volcado
de la zona de memoria sobre el fichero.
Sleep
para controlar
esto).
El proceso B, por su parte, consumirá los caracteres según le
vayan llegando, con un gasto de CPU mínimo. Para consumir un
carácter, lo que hace es leerlo. A los caracteres que le llegan
en una posición par (segundo, cuarto, etc.) los imprime por
la pantalla tal cual. A los que le llegan en una posición
impar, los transforma en mayúsculas y los imprime por pantalla.
Para trasformar en mayúsculas usad la función de biblioteca
toupper
.
Haced un único programa fuente (.c
). Si es
necesario, podéis usar un argumento de la línea de órdenes
opcional.
mataoes
.
El programa, mediante proyección del fichero en memoria
eliminará todas las oes minúsculas ('o
') que
tenga el fichero, posiblemente quedando la longitud
de dicho fichero reducida.
HeapCreate
, HeapAlloc
,
HeapSize
, HeapRealloc
,
HeapFree