3

我需要测量 darwin 上单个线程的 cpu 使用率。在 linux 上我使用 getrusage(RUSAGE_THREAD, ...) 但它在 darwin 上不可用。

4

2 回答 2

2

getrusage 的 RUSAGE_THREAD 标志是特定于 Linux 的。

xnu 的 getrusage 只输出每个进程的总和。

每个线程的使用时间信息都保存在task_basic_info每个线程的结构中。

文档在这里http://www.gnu.org/software/hurd/gnumach-doc/Task-Information.html

这是一个如何获取task_basic_info结构 的简单示例http://blog.kuriositaet.de/?p=257

 task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count)
于 2011-04-13T16:38:35.873 回答
2

使用thread_info并传入mach_thread_self()获取当前线程的 CPU 使用时间。下面将这些转换为struct rusage.

#include <mach/mach.h>
#include <sys/resource.h>
#include <errno.h>

int getrusage_thread(struct rusage *rusage)
{
    int ret = -1;
    thread_basic_info_data_t info = { 0 };
    mach_msg_type_number_t info_count = THREAD_BASIC_INFO_COUNT;
    kern_return_t kern_err;

    mach_port_t port = mach_thread_self();
    kern_err = thread_info(port,
                           THREAD_BASIC_INFO,
                           (thread_info_t)&info,
                           &info_count);
    mach_port_deallocate(mach_task_self(), port);

    if (kern_err == KERN_SUCCESS) {
        memset(rusage, 0, sizeof(struct rusage));
        rusage->ru_utime.tv_sec = info.user_time.seconds;
        rusage->ru_utime.tv_usec = info.user_time.microseconds;
        rusage->ru_stime.tv_sec = info.system_time.seconds;
        rusage->ru_stime.tv_usec = info.system_time.microseconds;
        ret = 0;
    } else {
        errno = EINVAL;
    }

    return ret;
}

于 2019-04-04T00:00:54.927 回答