очистить буферный кеш в Mac OS X - PullRequest
12 голосов
/ 20 января 2009

Есть ли способ программно очистить буферный кеш на Mac, желательно в C?

По сути, я ищу эквивалент команды purge источника из 10.5 (и выше). РЕДАКТИРОВАТЬ: Теперь я вижу, что это часть инструментов CHUD, для которых кажется, что источник не доступен напрямую. Тем не менее, я все еще ищу какой-то код, чтобы сделать то же самое.

Ответы [ 5 ]

11 голосов
/ 07 февраля 2009

Я разобрал рассматриваемую функцию (_utilPurgeDiskBuffers) из среды CHUD. Эта функция не кажется слишком сложной, но, поскольку я не программист MacOS, импорт и вызываемые sys API не имеют для меня особого смысла.

Первое, что API делает, это вызывает другую функцию, а именно _miscUtilsUserClientConnect_internal. Эта функция, кажется, устанавливает соединение с расширением ядра CHUD.
Для этого он вызывает _getCHUDUtilsKextService, который пытается найти расширение ядра CHUD, перечисляя все кексы с помощью IORegistryCreateIterator, импортированного из набора ввода-вывода. После того, как kext был найден, он открывается через _IOServiceOpen.

На данный момент у нас есть связь с файлом CHUD (по крайней мере, так я понимаю из списка разборки).

Наконец-то сделан вызов IOConnectMethodStructureIStructureO, который, я думаю, совершает настоящую магию.
Не зная внутренних деталей или подписи этой функции, параметры не имеют смысла для меня.

А вот разборка:

__text:4B0157A7 lea     eax, [ebp+var_1C]
__text:4B0157AA mov     dword ptr [esp+14h], 0
__text:4B0157B2 mov     [esp+10h], eax
__text:4B0157B6 mov     [esp+0Ch], eax
__text:4B0157BA mov     dword ptr [esp+8], 0
__text:4B0157C2 mov     dword ptr [esp+4], 0Eh
__text:4B0157CA mov     [esp], edx
__text:4B0157CD call    _IOConnectMethodStructureIStr

Обратите внимание, что var_1C был обнулен ранее.

Надеюсь, некоторые из вас найдут больше смысла в этих системных вызовах. Если вам нужна дополнительная информация, дайте мне знать.

Обновление:
Для начала просто возьмите пример AppleSamplePCIClient.c из комплекта IO kit SDK. Это в основном то, что делает приложение очистки из инструментов CHUD.
Единственное, что вам нужно изменить, - это параметры последнего вызова _IOConnectMethodStructureIStr. Возьмите их из списка разборки выше. Я не могу проверить все это, так как у меня нет Mac.

7 голосов
/ 07 февраля 2009

Кажется, что:

Вы можете использовать usr / bin / purge (введите purge в терминале) очистить диск кеш (неактивная память), или вы можете сделать много случайных чтений с жесткого диска сделать то же самое .

Взято из комментария от пользователя guns .

3 голосов
/ 07 февраля 2009

Разве вам не интересно отключить кеш для файла? В зависимости от того, чего вы пытаетесь достичь, это может быть альтернативой. Хорошее резюме здесь .

UBC можно очистить, запустив 'purge' который выделяет много памяти принудительно очистить кеш.

fcntl(fd, F_GLOBAL_NOCACHE, 1)  

можно использовать для отключения кеширования файл. Это можно сделать в любом процессе и файл может быть закрыт после.

3 голосов
/ 20 января 2009

Вы можете использовать sync(2) несколько раз (как в известной идиоме sync; sync; sync). Я не могу найти исходный код purge, но он может быть просто частью пакетов man, доступных в коде 10.5.6

2 голосов
/ 06 февраля 2009

Если у вас нет исходного кода для инструмента, который вы хотите эмулировать (как в данном случае), есть несколько способов сделать это.

1 / Из вашего кода C просто вызовите инструмент с помощью вызова функции system(). Это работает хорошо, пока нет видимого эффекта (например, открытие графического окна). Вы можете использовать system("/path/to/purge -purgargs >/dev/null 2>&1");, например.

2 / Обратный инжиниринг кода, чтобы увидеть, как он на самом деле это делает. Это несколько сложнее, поскольку для этого потребуются знания языка ассемблера, системные вызовы и многое другое.

3 / Свяжитесь с разработчиками, чтобы получить советы о том, как это было сделано. Это не должен быть вопрос «пришлите мне код, чтобы я мог его сорвать и заработать». Вы можете сформулировать это так: «У меня есть интерес к использованию purge для разработки, но я точно не уверен, что именно», или «У меня проблемы с безопасностью при запуске кода, поскольку эти возможности не позволят мне запустить его, если мы не знаем именно то, что он делает ". Затем вы пишете свой код, чтобы сделать то же самое.

Я, я бы просто использовал вариант 1, если это возможно (я по своей сути ленив :-). Если вы собираетесь написать инструмент для конкуренции с продувкой (и это будет сложно, если он бесплатный), возможно, лучшим вариантом будет вариант 2.

...