2010-11-01 6 views
1

J'étudie la gestion de la mémoire du système d'exploitation, et je souhaite vérifier que le mécanisme de base de l'allocation \ mémoire virtuelle \ pagination est correct.systèmes d'exploitation gestion de la mémoire - invocation malloc()

Supposons qu'un processus appelle malloc(), que se passe-t-il derrière les scènes? ma réponse: La bibliothèque d'exécution trouve un bloc de mémoire de taille appropriée dans son espace d'adresse mémoire virtuel. (Ceci est où des algorithmes d'allocation tels que première forme, meilleur ajustement qui traitent de la fragmentation entrent en jeu)

Maintenant, disons que le processus accède que la mémoire, comment est-ce fait? ma réponse: L'adresse mémoire, vue par le processus, est en fait virtuelle. Le système d'exploitation vérifie si cette adresse est actuellement mappée à une adresse de mémoire physique et, le cas échéant, effectue l'accès. Si elle n'est pas mappée, une erreur de page est déclenchée.

Est-ce que je comprends bien? c'est-à-dire que la bibliothèque compilateur \ runtime est responsable de l'allocation des blocs de mémoire virtuelle, et que le système d'exploitation est en charge d'un mappage entre l'adresse virtuelle et les adresses physiques des processus (et l'algorithme de pagination).

Merci!

Répondre

0

À propos de la droite. La mémoire doit exister dans la mémoire virtuelle du processus pour qu'une erreur de page alloue réellement une page physique. Vous ne pouvez pas commencer à fouiller n'importe où et attendre du noyau qu'il mette de la mémoire physique là où vous avez accès.

Il y a beaucoup plus que cela. Lire sur mmap(), anonyme et non, partagé et privé. Et brk() aussi. malloc() se base sur brk() et mmap().

0

Vous l'avez presque compris. La seule chose que vous avez manquée est la façon dont le processus demande au système d'avoir plus de mémoire virtuelle en premier lieu. Comme Thomas l'a souligné, vous ne pouvez pas écrire juste où vous voulez. Il n'y a aucune raison qu'un système d'exploitation ne puisse pas être conçu pour permettre cela, mais c'est beaucoup plus efficace s'il a une idée de l'endroit où vous allez écrire et de l'espace où vous le faites est contigu.

Sur les systèmes Unixy, les processus utilisateur ont une zone appelée segment de données, qui ressemble à ceci: c'est là que les données vont. Lorsqu'un processus a besoin de mémoire pour les données, il appelle brk(), ce qui demande au système d'étendre le segment de données à une valeur de pointeur spécifiée. (Par exemple, si votre segment de données existant était vide et que vous vouliez l'étendre à 2M, vous appelleriez brk(0x200000).)

Notez que bien que très commun, brk() n'est pas un standard; En fait, il a été retiré de POSIX.1 il y a une dizaine d'années parce que C spécifie malloc() et qu'il n'y a aucune raison de mandater l'interface pour l'allocation de segments de données.