struct proc中的starttime和solaris中的struct psinfo_t之间的比较

时间:2017-06-25 12:48:43

标签: c unix solaris

在Solaris中,
我需要从内核空间和用户空间获取进程启动时间 我发现给定过程有2个开始时间,它们不相等! 一个位于proc struct(链接旧,但结构几乎相同),一个位于ps_info struct
在执行期间,在内核空间中,如果我使用

struct proc* iterated_process_ptr = curproc;

我得到以下结构:

typedef struct  proc {
/*
 * Microstate accounting, resource usage, and real-time profiling
 */
hrtime_t p_mstart;      /* hi-res process start time */

如果我用这样的用户空间结构填充psinfo_t:

char psfile[64];
psinfo_t psinfo;
sprintf(psfile, "/proc/ProcessID/psinfo");
if ((fd = open(psfile, O_RDONLY)) >= 0)
    if (read(fd, &psinfo, sizeof(psinfo_t)) != -1)     

填充了struct psinfo,它看起来像:

typedef struct psinfo {
timestruc_t pr_start;   /* process start time, from the epoch */

2个开始时间有什么区别?

如果我为同一个过程执行此操作,则值不同,这意味着高分辨率过程开始时间与过程纪元开始时间不同。

什么是高分辨率流程启动?

由于

1 个答案:

答案 0 :(得分:1)

p_mstart系统调用下is filled in here in OpenSolaris (see line 1008)结构的fork()字段:

    /*
     * Make proc entry for child process
     */
    mutex_init(&cp->p_splock, NULL, MUTEX_DEFAULT, NULL);
    mutex_init(&cp->p_crlock, NULL, MUTEX_DEFAULT, NULL);
    mutex_init(&cp->p_pflock, NULL, MUTEX_DEFAULT, NULL);
#if defined(__x86)
    mutex_init(&cp->p_ldtlock, NULL, MUTEX_DEFAULT, NULL);
#endif
    mutex_init(&cp->p_maplock, NULL, MUTEX_DEFAULT, NULL);
    cp->p_stat = SIDL;
    cp->p_mstart = gethrtime();
    cp->p_as = &kas;

Per the man page for gethrtime()

  

gethrtime()函数返回当前的高分辨率实数   时间。从某个任意时间开始,时间表示为纳秒   过去;它与时间没有任何关联

因此,p_mstart字段填充的时间可用于确定流程开始前几毫秒的确切时间,与当前调用gethrtime()的返回值有所不同:

hrtime_t duration = gethrtime - p->p_mstart;