在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个开始时间有什么区别?
如果我为同一个过程执行此操作,则值不同,这意味着高分辨率过程开始时间与过程纪元开始时间不同。
什么是高分辨率流程启动?
由于
答案 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;