Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

252
Visualizações
¿mmap o malloc asignan RAM?

Sé que esta es probablemente una pregunta estúpida, pero he estado buscando por un tiempo y no puedo encontrar una respuesta definitiva. Si uso mmap o malloc (en C, en una máquina Linux), ¿alguno de ellos asigna espacio en RAM? Por ejemplo, si tengo 2 GB de RAM y quiero usar toda la RAM disponible, ¿puedo usar un combo malloc/memset , mmap , o hay otra opción que no conozco?

Quiero escribir una serie de programas simples que puedan ejecutarse simultáneamente y mantener toda la RAM utilizada en el proceso para forzar el uso del intercambio y el intercambio de páginas de entrada y salida con frecuencia. Ya probé esto con el programa a continuación, pero no es exactamente lo que quiero. Asigna memoria (¿RAM?) y fuerza el uso del intercambio (si se están ejecutando suficientes instancias), pero cuando llamo a sleep , eso no solo bloquea el uso de la memoria (por lo que en realidad no se intercambia nada dentro o fuera de otros procesos?), o estoy malinterpretando algo.

Por ejemplo, si ejecuto esto 3 veces, ¿estaría usando 2 GB (todos) de RAM de las dos primeras instancias, y la tercera instancia luego cambiaría una de las dos instancias anteriores (de RAM) y la instancia actual en RAM? ¿O la instancia n. ° 3 simplemente se ejecutaría usando el disco o la memoria virtual?

Esto trae otro punto, ¿necesitaría asignar suficiente memoria para usar toda la memoria virtual disponible también para usar la partición de intercambio?

Por último, ¿sería mejor mmap (o cualquier otra función de C. Diablos, incluso otro idioma si corresponde) para hacer esto?

 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MB(size) ( (size) * 1024 * 1024) #define GB(size) ( (size) * 1024 * 1024 * 1024) int main(){ char *p; p = (char *)malloc(MB(512)); memset(p, 'T', MB(512)); printf(".5 GB allocated...\n"); char *q; q = (char *)malloc(MB(512)); memset(q, 'T', MB(512)); printf("1 GB allocated...\n"); printf("Sleeping...\n"); sleep(300); }

** Editar: estoy usando CentOS 6.4 (con kernel 3.6.0) para mi sistema operativo, si eso ayuda.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Esto depende mucho del sistema operativo/máquina.

En la mayoría de los sistemas operativos, ninguno asigna RAM. Ambos asignan espacio de VM. Hacen que un cierto rango de sus procesos de memoria virtual sea válido para su uso. Normalmente, el sistema operativo asigna la RAM más tarde en la primera escritura. Hasta entonces, esas asignaciones no usan RAM (aparte de la tabla de páginas que las enumera como espacio de VM válido).

Si desea asignar RAM física, debe ensuciar cada página ( sysconf(_SC_PAGESIZE) le da el tamaño de página del sistema).

En Linux, puede ver sus asignaciones de VM con todos los detalles en /proc/self/smaps . Rss es su conjunto residente de esa asignación (cuánto reside en RAM), todo lo demás que está sucio se habrá cambiado. Toda la memoria no sucia estará disponible para su uso, pero no existirá hasta entonces.

Puedes ensuciar todas las páginas con algo como

 size_t mem_length; char (*my_memory)[sysconf(_SC_PAGESIZE)] = mmap( NULL , mem_length , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS , -1 , 0 ); int i; for (i = 0; i * sizeof(*my_memory) < mem_length; i++) { my_memory[i][0] = 1; }

En algunas implementaciones, esto también se puede lograr pasando el indicador MAP_POPULATE a mmap , pero (dependiendo de su sistema) puede fallar mmap con ENOMEM si intenta mapear más de la RAM disponible.

over 4 years ago · Santiago Trujillo Relatório

0

La teoría y la práctica difieren mucho aquí. En teoría, ni mmap ni malloc asignan RAM real, pero en la práctica lo hacen.

mmap asignará RAM para almacenar una estructura de datos de área de memoria virtual (VMA). Si mmap se usa con un archivo real para mapear, (a menos que se indique lo contrario explícitamente) asignará más páginas de RAM para obtener previamente el contenido del archivo mapeado.
Aparte de eso, solo reserva espacio de direcciones y la memoria RAM se asignará a medida que se acceda por primera vez.

malloc , de manera similar, solo reserva lógicamente cantidades de espacio de direcciones dentro del espacio de direcciones virtuales de su proceso diciéndole al sistema operativo, ya sea a través sbrk o mmap , que desea administrar un área de espacio de direcciones (generalmente mucho más grande de lo que solicita). Luego subdivide esta enorme área a través de un algoritmo más o menos complicado y finalmente reserva una parte de este espacio de direcciones (adecuadamente alineado y redondeado) para su uso y le devuelve un puntero.
Pero: malloc también necesita almacenar información adicional en alguna parte, o sería imposible hacer su trabajo de forma free en un momento posterior. Como mínimo, free necesita saber el tamaño de un bloque asignado además de la dirección de inicio. Por lo general, malloc asigna en secreto algunos bytes adicionales que preceden inmediatamente a la dirección que obtienes; no lo sabes, no te lo dice.

Ahora el quid de la cuestión es que mientras que en teoría malloc no toca la memoria que gestiona y no asigna memoria RAM física, en la práctica sí lo hace . Y esto, de hecho, hace que se creen fallas de página y páginas de memoria (es decir, se usa RAM).
Puede verificar esto en Linux llamando a malloc y observando cómo el asesino de programación orientada a objetos destruye su proceso porque el sistema se queda sin RAM física cuando, de hecho, debería quedar suficiente.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda