Sun Studio 12:性能分析器

显式多线程

在 Solaris OS 中,简单程序在单个 LWP(lightweight process,轻量级进程)上的单个线程中执行。多线程可执行程序调用线程创建函数(执行的目标函数会传递到该函数)。目标退出时,会销毁线程。

Solaris OS 支持两种线程实现:Solaris 线程和 POSIX 线程 (Pthread)。从 Solaris 10 OS 开始,这两种线程实现都包括在 libc.so 中。在 Solaris 9 OS 中,线程实现包含在单独的库(即 libthread.solibpthread.so)中。

对于 Solaris 线程,新创建的线程从名为 _thread_start() 的函数开始执行,该函数调用在线程创建调用中传递的函数。对于涉及目标由此线程执行的任何调用栈,堆栈的顶部是 _thread_start(),与线程创建函数的调用者没有任何联系。因此,与所创建的线程关联的包含度量仅传播至 _thread_start()<Total> 函数。除了创建线程外,Solaris 线程实现还在 Solaris 上创建 LWP 以执行线程。每个线程都绑定到特定的 LWP。

Pthread 在 Solaris 10 OS 中以及 Linux OS 中可用于显式多线程。

在这两种环境中,为创建新线程,应用程序会调用 Pthread API 函数 pthread_create(),将指针作为函数参数之一传递到应用程序定义的启动例程。

在 Solaris OS 上,新的 pthread 开始执行时,将会调用 _lwp_start() 函数。在 Solaris 10 OS 上,_lwp_start() 调用中间函数 _thr_setup(),该中间函数随后调用在 pthread_create() 中指定的应用程序定义的启动例程。在 Solaris 9 OS 上,_lwp_start() 直接调用应用程序的启动例程。

在 Linux OS 上,新的 pthread 开始执行时,将会运行 Linux 特定的系统函数 clone(),该系统函数调用另一个内部初始化函数 pthread_start_thread(),该初始化函数又调用在 pthread_create() 中指定的应用程序定义的启动例程。可用于收集器的 Linux 度量收集函数是线程特定的。因此,collect 实用程序运行时,会在 pthread_start_thread() 和应用程序定义的线程启动例程之间插入一个名为 collector_root() 的度量收集函数。