Как top может видеть использование памяти

#c #macos #memory

#c #macos #память

Вопрос:

На каком языке написан top? Я хочу написать программу на c , которая может видеть, сколько памяти используют отдельные процессы в OSX. Я не могу использовать /proc, потому что этого нет в OSX. top может узнать, сколько памяти используют процессы, поэтому он ее тоже не использует. Я хочу знать, как это выясняется.

Комментарии:

1. Я только что попробовал запустить top через dtruss и получил массу информации о системных вызовах, которые он выполнял. Двумя, которые выделялись, были sysctl и proc_info . Возможно, вы захотите попробовать запустить его самостоятельно для получения дополнительной информации.

Ответ №1:

Требуется некоторое изучение исходного кода, чтобы понять это, но Top использует вызов task_info () для взаимодействия с ядром Mach и сбора статистики памяти. Вы можете прочитать некоторую в основном правильную информацию о task_info () на http://www.gnu.org/software/hurd/gnumach-doc/Task-Information.html. Я говорю в основном правильно, потому что есть по крайней мере одно отличие, которое я обнаружил в реализации OS X: размеры памяти указаны в байтах, а не в страницах.

В качестве резюме вы передаете task_info () «целевую задачу» (mach_task_self(), если вам нужна информация о самой вашей программе, в противном случае используйте task_for_pid() или processor_set_tasks()) и говорите, что вам нужна «базовая информация», категория, к которой относятся размеры виртуальной и резидентной памяти. Затем task_info () заполняет структуру task_basic_info нужной информацией.

Вот класс, который я написал, чтобы получить размер резидентной памяти. Здесь также показано, как вы можете использовать sysctl для получения информации о вашей системе (в данном случае, о том, сколько у вас физической оперативной памяти):

 #include <sys/sysctl.h>
#include <mach/mach.h>
#include <cstdio>
#include <stdint.h>
#include <unistd.h>

////////////////////////////////////////////////////////////////////////////////
/*! Class for retrieving memory usage and system memory statistics on Mac OS X.
//  (Or probably any system using the MACH kernel.)
*///////////////////////////////////////////////////////////////////////////////
class MemoryInfo
{
    public:
        /** Total amount of physical memory (bytes) */
        uint64_t physicalMem;

        ////////////////////////////////////////////////////////////////////////
        /*! Constructor queries various memory properties of the system
        *///////////////////////////////////////////////////////////////////////
        MemoryInfo()
        {
            int mib[2];
            mib[0] = CTL_HW;
            mib[1] = HW_MEMSIZE;

            size_t returnSize = sizeof(physicalMem);
            if (sysctl(mib, 2, amp;physicalMem, amp;returnSize, NULL, 0) == -1)
                perror("Error in sysctl call");
        }

        ////////////////////////////////////////////////////////////////////////
        /*! Queries the kernel for the amount of resident memory in bytes.
        //  @return amount of resident memory (bytes)
        *///////////////////////////////////////////////////////////////////////
        static size_t Usage(void)
        {
            task_t targetTask = mach_task_self();
            struct task_basic_info ti;
            mach_msg_type_number_t count = TASK_BASIC_INFO_64_COUNT;

            kern_return_t kr = task_info(targetTask, TASK_BASIC_INFO_64,
                                         (task_info_t) amp;ti, amp;count);
            if (kr != KERN_SUCCESS) {
                printf("Kernel returned error during memory usage query");
                return -1;
            }

            // On Mac OS X, the resident_size is in bytes, not pages!
            // (This differs from the GNU Mach kernel)
            return ti.resident_size;
        }
};
  

Комментарии:

1. Резидентный размер, по-видимому, является как частной, так и общей памятью. Есть ли способ вычесть общую память?

2. Привет, можно ли его также использовать для извлечения %CPU ?

Ответ №2:

Возможно, информации больше, чем вы ищете, но top в OS X выпущен по лицензии с открытым исходным кодом:

http://opensource.apple.com/source/top/top-67/

Комментарии:

1. Я не могу понять это, просто взглянув на исходный код. Может быть, более опытный программист может?