effacer la mémoire cache sur Mac OS X
Est-il un moyen de par programmation d'effacer le cache de tampons sur le Mac, de préférence en C?
En gros, je suis à la recherche de l'équivalent de la source de 10.5 (et plus)'s purge
de commande. EDIT: je vois maintenant ce est une partie de l'CHUD outils, pour qui il semble que la source n'est pas directement disponible. Cependant, je suis toujours à la recherche d'un peu de code pour faire la même chose.
Quel est votre véritable objectif? Est-ce pour s'assurer que les données que vous avez écrit dans un fichier qui est vraiment sur le disque? Si oui, puis envisager la POSIX O_DSYNC ou O_SYNC options dans le open() de l'appel.
wow c'était il y a 5 ans, mais encore pouvez-vous m'aider à atteindre le même objectif s'il vous plaît ? la accepté de répondre ressemble gr8 mais je ne sais pas assemblée , de sorte qu'il est un peu inutile pour moi 🙁
wow c'était il y a 5 ans, mais encore pouvez-vous m'aider à atteindre le même objectif s'il vous plaît ? la accepté de répondre ressemble gr8 mais je ne sais pas assemblée , de sorte qu'il est un peu inutile pour moi 🙁
OriginalL'auteur Sophie Alpert | 2009-01-19
Vous devez vous connecter pour publier un commentaire.
J'ai démonté la fonction en question (
_utilPurgeDiskBuffers
) à partir du CHUD cadre. La fonction ne semble pas être très complexe, mais je suis pas MacOS programmeur, les importations et appelé sys Api ne font pas beaucoup de sens pour moi.La première chose que l'API n'est pour appeler une autre fonction, à savoir
_miscUtilsUserClientConnect_internal
. Cette fonction semble établir une connexion à l'CHUD l'extension du noyau.Pour ce faire, il appelle
_getCHUDUtilsKextService
qui tente de localiser le CHUD l'extension du noyau par l'énumération de tous les kexts à l'aide de laIORegistryCreateIterator
importés de l'I/O kit. Après le kext a été trouvé, il est ouvert par_IOServiceOpen
.À ce point, nous avons une connexion à l'CHUD kext (du moins c'est ma compréhension du démontage de l'inscription).
Enfin un appel à
IOConnectMethodStructureIStructureO
est faite, qui, j'imagine, réalise la véritable magie.Sans savoir quelques détails internes ou de la signature de cette fonction, les paramètres n'ont pas de sens pour moi.
Voici le démontage, si:
Noter que
var_1C
a été mis à zéro avant.J'espère que certains d'entre vous peuvent faire plus de sens de ces appels. Si vous souhaitez plus d'informations, laissez-moi savoir.
Mise à jour:
Pour commencer, il suffit de prendre le
AppleSamplePCIClient.c
exemple à partir de l'OI kit SDK. Ce n'est fondamentalement ce que la purge de l'application de la CHUD outils.La seule chose que vous aurez à changer sont les paramètres de la finale
_IOConnectMethodStructureIStr
appel. Du démontage de la liste ci-dessus. Je ne peux pas tester tout ça car je n'ai pas de Mac.OriginalL'auteur newgre
Il semble que:
Prises à partir d'un commentaire de l'utilisateur canons.
OriginalL'auteur lpfavreau
Vous pouvez utiliser
sync(2)
plusieurs fois (comme dans le bien-connu idiomesync; sync; sync
). Je n'arrive pas à trouver lapurge
code source, mais c'est peut être juste une partie de l'homme des progiciels de en 10.5.6 codeDonc, est-ce à dire que la source n'est pas disponible, ou tout simplement cacher?
Keltia, qui ne fera que de la force de l'écrit pour être écrits sur le disque, il ne fait pas effacer le buffer cache.
Mise à part essayer de la démonter ou exécuter en vertu de DTrace, je ne vois pas une manière d'accéder au code source alors.
OriginalL'auteur Keltia
Ne seriez-vous pas intéressé par la désactivation du cache d'un fichier à la place? En fonction de ce que vous essayez d'atteindre, il pourrait être une alternative. Bon résumé ici.
C'est mon impression que même lors de la désactivation de la cache comme ceci (avec F_NOCACHE ou F_GLOBAL_NOCACHE), si il y a des pages du fichier déjà dans le cache de la page, ceux-ci vont encore être utilisés. J'ai essayé de tester cela en utilisant la fio(1) avec direct=1. Il semble confirmer mes soupçons (je reçois ~1200MB/s de débit sur une lecture aléatoire, sur un axe de disque dur dans mon MBP, pas un SSD). J'ai confirmé avec dtruss que la fio(1) appelle fcntl correctement.
Après l'exécution de "sudo purge" et en essayant de la même fio(1) l'invocation, c'est bien plus lent. Donc, oui, il semble que
F_NOCACHE
a pas d'équivalent direct deO_DIRECT
sur Linux.OriginalL'auteur lpfavreau
Lorsque vous n'avez pas le code source de l'outil que vous souhaitez reproduire (comme c'est le cas ici), il y a un certain nombre de façons d'aller à ce sujet.
1/à Partir de votre code en C, il suffit d'appeler l'outil avec une
system()
appel de fonction. Cela fonctionne bien tant qu'il n'y a pas d'effet visible (comme l'ouverture d'une fenêtre graphique). Vous pouvez utilisersystem("/path/to/purge -purgargs >/dev/null 2>&1");
, par exemple.2/désosser le code pour voir comment il est en train de faire. C'est un peu plus délicat car il nécessite la connaissance de l'assembleur, le langage, les appels système et beaucoup d'autres choses.
3/Contacter les développeurs pour obtenir des conseils sur la façon dont il a été fait. Ce n'est pas un "envoyez-moi le code afin que je puisse l'arracher et faire de l'argent" question. Vous pourriez phrase comme "j'ai un intérêt dans l'utilisation de purge pour le développement, mais je n'en suis pas sûr exactement ce qui est fait", ou "j'ai des problèmes de sécurité liés à l'exécution du code, les pouvoirs en place ne me permet pas de l'exécuter, à moins que nous savons exactement ce qu'il fait". Ensuite, vous code le vôtre à faire de même.
Moi, je voudrais juste utiliser l'option 1 si possible (je suis par nature paresseux :-). Si vous allez écrire un outil de rivaliser avec purge (et ça va être dur étant donné qu'il est gratuit), l'option 2 est probablement le meilleur pari.
Non, je ne pense pas qu'ils seraient soit, c'est pourquoi j'ai dit la phrase d'une façon plus subtile 🙂 de toute façon, vous n'avez pas besoin de code (et en l'utilisant, il serait peut-être de rendre votre code d'un dérivé de travail/violation du droit d'auteur). Vous avez seulement besoin de savoir comment le faire sur le plan conceptuel.
OriginalL'auteur paxdiablo