Comment connaître la taille de page d'une machine Unix en utilisant malloc()?Taille de page d'une machine Unix en utilisant malloc
Répondre
Je ne sais pas ce que malloc doit faire avec, cependant:
#include <unistd.h>
(size_t) sysconf(_SC_PAGESIZE);
Je suppose que si vous allouez assez un grand tampon, il faudra obtenir encore quelques pages, puis il va Mettez le tampon au début de la première page. Vous pouvez donc allouer deux tampons très volumineux, supprimer le décalage de l'en-tête de la mémoire tampon, puis GCD les deux tampons. Travaillé assez bien sur mon système.
#include <stdlib.h>
#include <stdio.h>
unsigned gcd(unsigned a, unsigned b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
void main() {
void *p1 = malloc(1000000);
void *p2 = malloc(1000000);
unsigned p1r = (unsigned) p1 & 0xfffffff0;
unsigned p2r = (unsigned) p2 & 0xfffffff0;
printf("page size = %u\n", getpagesize());
printf("p1 = %p, p2 = %p\n", p1, p2);
printf("p1r = %p, p2r = %p\n", p1r, p2r);
printf("gcd = %u\n", gcd(p1r, p2r));
}
Ugly, mais il a la nature de hacker. – dmckee
Quelle est la signification de p1 & 0xfffffff0, pourquoi masquons-nous les 4 derniers bits? – Anonymous
Parce que chaque tampon alloué a un en-tête qui lui est associé. La structure dépend de l'implémentation du tas, mais il y a généralement quelque chose là-bas. La valeur de retour est la mémoire allouée plus un décalage pour masquer cette structure. Donc, pour obtenir le début de la page, nous devons ignorer ce décalage. – kichik
Pourquoi avez-vous besoin d'utiliser malloc()? Pourquoi ne pas utiliser getpagesize()? – OmnipotentEntity
il a été demandé dans l'interview, donc probablement qu'ils voulaient demander si je sais ce que retourne malloc et ce qu'il réserve réellement (peut-être une page) – Anonymous