多种 proc 探测器具有 lwpsinfo_t(proc(4) 中记录的一种结构)类型的参数。DTrace 使用者可以使用的 lwpsinfo_t 结构的定义如下所示:
typedef struct lwpsinfo { int pr_flag; /* flags; see below */ id_t pr_lwpid; /* LWP id */ uintptr_t pr_addr; /* internal address of thread */ uintptr_t pr_wchan; /* wait addr for sleeping thread */ char pr_stype; /* synchronization event type */ char pr_state; /* numeric thread state */ char pr_sname; /* printable character for pr_state */ char pr_nice; /* nice for cpu usage */ short pr_syscall; /* system call number (if in syscall) */ int pr_pri; /* priority, high value = high priority */ char pr_clname[PRCLSZ]; /* scheduling class name */ processorid_t pr_onpro; /* processor which last ran this thread */ processorid_t pr_bindpro; /* processor to which thread is bound */ psetid_t pr_bindpset; /* processor set to which thread is bound */ } lwpsinfo_t;
pr_flag 字段是存储用于说明进程的标志的位掩码。表 25–3 中说明了这些标志及其含义。
表 25–3 pr_flag 值
PR_ISSYS |
该进程为系统进程。 |
PR_VFORKP |
该进程是 vfork(2) 的子进程的父进程。 |
PR_FORK |
该进程具有从 fork 中继承的模式集。 |
PR_RLC |
该进程具有最后一次关闭时运行的模式集。 |
PR_KLC |
该进程具有最后一次关闭时中止的模式集。 |
PR_ASYNC |
该进程具有异步停止模式集。 |
PR_MSACCT |
该进程已启用微状态记帐。 |
PR_MSFORK |
进程微状态记帐继承于 fork。 |
PR_BPTADJ |
该进程具有断点调整模式集。 |
PR_PTRACE |
该进程具有 ptrace(3C) 兼容的模式集。 |
PR_STOPPED |
该线程是已停止的 LWP。 |
PR_ISTOP |
该线程是在出现关注的事件时停止的 LWP。 |
PR_DSTOP |
该线程是具有正在生效的停止指令的 LWP。 |
PR_STEP |
该线程是具有正在生效的单步指令的 LWP。 |
PR_ASLEEP |
该线程是系统调用的可中断休眠中的 LWP。 |
PR_DETACH |
该线程是拆离的 LWP。请参见 pthread_create(3C) 和 pthread_join(3C)。 |
PR_DAEMON |
该线程是守护进程 LWP。请参见 pthread_create(3C)。 |
PR_AGENT |
该线程是进程的代理 LWP。 |
PR_IDLE |
该线程是 CPU 的空闲线程。当 CPU 的运行队列为空时,空闲线程仅在 CPU 中运行。 |
pr_addr 字段是表示线程的专用、内核中的数据结构的地址。虽然该数据结构为专用,但 pr_addr 字段可用作在线程的生命周期中线程的唯一标记。
当线程在同步对象上休眠时,将设置 pr_wchan 字段。pr_wchan 字段的含义专用于内核实现,但该字段也可用作同步对象的唯一标记。
当线程在同步对象上休眠时,将设置 pr_stype 字段。表 25–4 中说明了 pr_stype 字段的可能值。
表 25–4 pr_stype 值
SOBJ_MUTEX |
内核互斥同步对象。用于串行化内核中共享数据区域的访问。有关内核互斥同步对象的详细信息,请参见第 18 章和 mutex_init(9F)。 |
SOBJ_RWLOCK |
内核读取器/写入器同步对象。用于同步内核中共享对象的访问,共享对象可以允许多个并发读取器或一个写入器。有关内核读取器/写入器同步对象的详细信息,请参见第 18 章和 rwlock(9F)。 |
SOBJ_CV |
条件变量同步对象。条件变量的设计是无限等待,直到某个条件变为 true。条件变量通常用于同步(出于访问共享数据区域之外的原因),它通常是当进程执行程序指令的无限等待时使用的机制。例如,在 poll(2)、pause(2)、wait(3C) 中阻塞,以及类似情况。 |
SOBJ_SEMA |
信号同步对象。一般用途的同步对象,与条件变量对象一样,不跟踪拥有权说明。由于在 Solaris 内核中实现优先级继承必须具有拥有权,所以信号对象中没有固有拥有权将使这些对象不能被广泛使用。有关详细信息,请参见 semaphore(9F)。 |
SOBJ_USER |
用户级同步对象。所有对用户级同步对象的阻塞都使用 SOBJ_USER 同步对象处理。用户级同步对象包括使用 mutex_init(3C)、sema_init(3C)、rwlock_init(3C)、cond_init(3C) 及其 POSIX 等效项创建的对象。 |
SOBJ_USER_PI |
实现优先级继承的用户级同步对象。一些跟踪拥有权的用户级同步对象还允许优先级继承。例如,使用 pthread_mutex_init(3C) 创建的互斥对象可以使用 pthread_mutexattr_setprotocol(3C) 设置为继承优先级。 |
SOBJ_SHUTTLE |
互动同步对象。互动对象用于实现门。有关更多信息,请参见 door_create(3DOOR)。 |
pr_state 字段设置为表 25–5 中的某个值。pr_sname 字段设置为同一个表中括号内说明的相应字符。
表 25–5 pr_state 值
SSLEEP (S) |
线程处于休眠状态。sched:::sleep 探测器就在线程的状态转换为 SSLEEP 之前的瞬间触发。 |
SRUN (R) |
该线程可运行,但当前未运行。sched:::enqueue 探测器将在线程的状态转换为 SRUN 之前的瞬间触发。 |
SZOMB (Z) |
该线程是僵 LWP。 |
SSTOP (T) |
由于显式 proc(4) 指令或一些其他停止机制,该线程已停止。 |
SIDL (I) |
该线程是进程创建期间的中间状态。 |
SONPROC (O) |
该线程正在 CPU 中运行。sched:::on-cpu 探测器将在线程的状态转换为 SONPROC 一段时间后,在 SONPROC 线程的上下文中触发。 |