2010-03-13 5 views
44

Je comprends que la mémoire doit être réservée avant d'être validée. Et quand c'est réservé, aucun autre processus ne peut l'utiliser. Cependant, la mémoire réservée ne compte pas dans la RAM disponible. Mais ne devrait-il pas? Parce que si personne d'autre ne peut l'utiliser, alors à quoi cela sert-il d'être "disponible"?Quelle est la différence entre la mémoire réservée et la mémoire validée?

Ou y at-il une plus grande différence?

+0

Pourriez-vous fournir une référence pour laquelle vous avez trouvé cette définition de «réservé»? –

+0

http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx – glutz78

+3

Découvrez la présentation de Mark Russinovich au PDC 10. Elle s'appelait 'PDC10: les mystères de la gestion de la mémoire de Windows révélée: partie Un.' Il parle beaucoup à ce sujet. http://player.microsoftpdc.com – NigelTufnel

Répondre

44

Dans le contexte de Win32, "réservé" signifie que l'espace adresse est affecté dans le processus qui l'a demandé. Cela peut être utilisé, par exemple, pour réserver de l'espace pour un grand tampon qui n'est pas immédiatement nécessaire, mais lorsque cela est nécessaire, il doit être contigu.

La réservation de mémoire n'interagit pas du tout avec d'autres processus, car chaque processus a son propre espace d'adressage privé. Ainsi, l'affirmation selon laquelle «quand il est réservé, aucun autre processus ne peut l'utiliser» n'a aucun sens, puisque les processus ne peuvent normalement pas allouer de la mémoire dans l'espace d'adressage d'un autre processus.

Lorsque les pages réservées doivent être validées (banque de stockage allouée pour elles), cette opération peut potentiellement échouer en raison d'un manque de mémoire physique (ou de fichier d'échange).

+1

"banque de sauvegarde allouée pour eux": Voulez-vous dire quand les données qui sont seulement stockées dans le cache sont appelées réservées, et quand elles sont écrites dans la RAM ou le fichier de page, elles sont appelées "validées"? – idbrii

+7

@pydave: Non, "cache" et "reserved" sont des concepts sans rapport. Réserver de la mémoire est un peu comme un promoteur qui revendique des terres qui contiendront plus tard des maisons. Il n'y a rien encore, mais personne d'autre ne peut y construire des maisons non plus. Commettre est en fait la construction des maisons et la mise en place de l'infrastructure comme l'électricité et les égouts. D'un autre côté, le cache est une optimisation pour accélérer le fonctionnement des processeurs, toutes les données sont stockées quelque part dans la RAM. –

+1

L'écriture de données sur une page de mémoire entraîne-t-elle cette page? (Ensuite, la différence entre reserved et committed est que reserved a été alloué, mais commit a été utilisé.) – idbrii

4

La mémoire virtuelle du processus (espace d'adressage) et la RAM réelle sont toutes deux différentes. Vous pouvez avoir 512 Mo de RAM physique mais votre processus peut toujours traiter 4 Go d'espace d'adressage virtuel (2 Go d'espace utilisateur) Chaque adresse d'un processus peut être considérée comme libre, réservée ou validée à tout moment.

Un processus commence par toutes les adresses libres, ce qui signifie qu'ils sont libres d'être commis à la mémoire ou réservée à l'avenir use.Before toute adresse libre peut être utilisé, il doit d'abord être réparti comme réservé OU commis. Mais n'a pas besoin d'être réservé pour qu'il soit commis. Des moyens de mémoire de réservation en réservant de l'espace d'adresse virtaul à des fins futures. elle n'est pas associée à la RAM physique (mappée aux adresses RAM). Dans le cas où la mémoire validée signifie qu'elle sera associée à la RAM réelle afin que vous puissiez y stocker des données.

http://msdn.microsoft.com/en-us/library/ms810627.aspx

+2

Un problème: la mémoire virtuelle n'a pas besoin d'être réservée _ comme une étape distincte_ avant d'être validée. VirtualAlloc peut réserver et valider en un seul appel. Mais la "réserve" doit être fait. De plus, commettre n'attribue pas réellement de RAM; seulement une faute de page suivante fait cela. J'ai (essayé de?) Modifier "il sera associé" à "il peut être associé" en conséquence. J'ajouterais également la phrase suivante à la fin: «La mémoire RAM réelle n'est pas allouée jusqu'à ce que vous accédiez à la région validée, et est effectuée page par page. Et une autre chose: Une autre façon d'utiliser des pages libres est pour la mémoire mappée. –

7

J'aime à voir Reserved comme la réservation de la adresse espace pour que personne ne puisse l'affecter (mais je ne peux pas utiliser la mémoire à cette adresse, car il est pas encore disponible). Et Committed comme mappage cet espace adresse à la mémoire physique de sorte qu'il peut être utilisé. Pourquoi voudrais-je réserver? Pourquoi ne pas simplement avoir de la mémoire engagée? Il y a plusieurs raisons pour lesquelles j'ai à l'esprit:

  1. Certaines applications a besoin d'une plage d'adresses spécifique, par exemple de 0x400000 à 0x600000, mais n'a pas besoin de mémoire pour stocker quoi que ce soit. Il est utilisé pour intercepter l'accès à la mémoire. Par exemple, si du code accède à cette zone, il sera capturé. (Utile pour une raison quelconque.)

  2. Certains threads doivent stocker des données en expansion progressive. Et les données doivent être dans un morceau contigu de la mémoire. Il est préférable de ne pas engager une grande quantité de mémoire physique à la fois, car cela n'est pas nécessaire et serait un gaspillage. La mémoire peut être utilisée par d'autres threads en premier.La mémoire physique est validée uniquement à la demande.

Questions connexes