Solaris2.4 多线程编程指南1--线程基础
统结构(略)
1.3.2轻进程(Lightweight Porcesses:LWP)
线程库采用内核支持的称为轻进程的底层控制线程。你可以把LWP看作一个 可以执行代码和系统调用的虚拟的CPU。
大多数程序员使用线程是并不意识到LWP的存在。下面的内容仅仅帮助理解 bound和unbound线程之间的区别。
------------------------------------
NOTE:Solaris2.x的LWP不同于SunOs4.0的LWP库,后者在solaris2.x中不再被支持。
------------------------------------
类似于在stdio中fopen和fread调用open和read,线程接口调用LWP接口, 原因是一样的。
LWP建立了从用户级到内核级的桥梁。每个进程包含了一个或更多LWP,每个 LWP运行着一个或多个用户线程。创建一个现成通常只是建立一个用户环境 (context),而不是创建一个LWP。
在程序员和操作系统的精心设计下,用户级线程库保证了可用的LWP足够驱动 当前活动的用户级线程。但是,用户线程和LWP之间不是一一对应的关系,用户级 线程可以在LWP之间自由切换。
程序员告诉线程库有多少线程可以同时"运行"。例如,如果程序员指定最多有 三个线程可以同时运行,至少要有3个可用的LWP。如果有三个可用的处理器,线程 将并行进行。如果这里只有一个处理器,操作系统将在一个处理器上运行三个LWP。 如果所有的LWP阻塞,线程库将在缓冲池内增加一个LWP。
当一个用户线程由于同步原因而阻塞,它的LWP将移交给下一个可运行的线程。 这种移交是通过过程间的连接(coroutine linkage),而不是做系统调用而完成。
操作系统决定哪一个LWP什么时候在哪一个处理器上运行。它不考虑进程中线 程的类型和数量。内核按照LWP的类型和优先级来分配CPU资源。线程库按照相同 的方法来为线程分配LWP。每个LWP被内核独立地分发,执行独立的系统调用,引 起独立的页错误,而且在多处理器的情况下将并行执行。
一些特殊类型的LWP可以不被直接交给线程。(!?不明)
1.3.3非绑定线程Unbound Threads
在LWP缓冲池中排队的线程称为unbound thread。通常情况下我们的线程都是 unbound的,这样他们可以在LWP之间自由切换。
线程库在需要的时候激活LWP并把它们交给可以执行的线程。LWP管理线程的 状态,执行线程的指令。如果线程在同步机制中被阻塞,或者其他线程需要运行, 线程状态被存在进程内存中,LWP被移交给其他线程。
1.3.4绑定线程Bound Threads
如果需要,你可以将一个线程绑定在某个LWP上。
例如,你可以通过绑定一个线程来实现:
1. 将线程全局调度(例如实时)
2. 使线程拥有可变的信号栈
3. 给线程分配独立的定时器和信号(alarm)
在线程数多于LWP时,bounded比unbound线程体现出一些优越性。
例如,一个并行的矩阵计算程序在每个线程当中计算每一行。如果每个处理器 都有一个LWP,但每个LWP都要处理多线程,每个处理器将要花费相当的时间来切换 线程。在这种情况下,最好使每个LWP处理一个线程,减少线程数,从而减少线程 切换。
在一些应用程序中,混合使用bound和unbound线程更加合适。
例如,有一个实时的应用程序,希望某些线程拥有全局性的优先级,并被实时 调度,其他线程则转入后台计算。另一个例子是窗口系统,大多数操作都是 unbound的,但鼠标操作需要占用一个高优先级的,bound的,实时的线程。
1.4多线程的标准
多线程编程的历史可以回溯到二十世纪60年代。在UNIX操作系统中的发展是从 80年代中期开始的。也许是令人吃惊的,关于支持多线程有很好的协议,但是今 天我们仍然可以看到不同的多线程开发包,他们拥有不同的接口。
但是,某几年里一个叫做POSIX1003.4a的小组研究多线程编程标准。当标准完 成后,大多数支持多线程的系统都支持POSIX接口。很好的改善了多线程编程的可 移植性。
solaris多线程支持和POSIX1003.4a没有什么根本性的区别。虽然接口是不同 的,但每个系统都可以容易地实现另外一个系统可以实现的任何功能。它们之间没 有兼容性问题,至少solaris支持两种接口。即使是在同一个应用程序里,你也可 以混合使用它们。
用solaris线程的另一个原因是使用支持它的工具包,例如多线程调试工具 (multighreaded debugger)和truss(可以跟踪一个程序的系统调用和信号), 可以很好地报告线程的状态。
1.3.2轻进程(Lightweight Porcesses:LWP)
线程库采用内核支持的称为轻进程的底层控制线程。你可以把LWP看作一个 可以执行代码和系统调用的虚拟的CPU。
大多数程序员使用线程是并不意识到LWP的存在。下面的内容仅仅帮助理解 bound和unbound线程之间的区别。
------------------------------------
NOTE:Solaris2.x的LWP不同于SunOs4.0的LWP库,后者在solaris2.x中不再被支持。
------------------------------------
类似于在stdio中fopen和fread调用open和read,线程接口调用LWP接口, 原因是一样的。
LWP建立了从用户级到内核级的桥梁。每个进程包含了一个或更多LWP,每个 LWP运行着一个或多个用户线程。创建一个现成通常只是建立一个用户环境 (context),而不是创建一个LWP。
在程序员和操作系统的精心设计下,用户级线程库保证了可用的LWP足够驱动 当前活动的用户级线程。但是,用户线程和LWP之间不是一一对应的关系,用户级 线程可以在LWP之间自由切换。
程序员告诉线程库有多少线程可以同时"运行"。例如,如果程序员指定最多有 三个线程可以同时运行,至少要有3个可用的LWP。如果有三个可用的处理器,线程 将并行进行。如果这里只有一个处理器,操作系统将在一个处理器上运行三个LWP。 如果所有的LWP阻塞,线程库将在缓冲池内增加一个LWP。
当一个用户线程由于同步原因而阻塞,它的LWP将移交给下一个可运行的线程。 这种移交是通过过程间的连接(coroutine linkage),而不是做系统调用而完成。
操作系统决定哪一个LWP什么时候在哪一个处理器上运行。它不考虑进程中线 程的类型和数量。内核按照LWP的类型和优先级来分配CPU资源。线程库按照相同 的方法来为线程分配LWP。每个LWP被内核独立地分发,执行独立的系统调用,引 起独立的页错误,而且在多处理器的情况下将并行执行。
一些特殊类型的LWP可以不被直接交给线程。(!?不明)
1.3.3非绑定线程Unbound Threads
在LWP缓冲池中排队的线程称为unbound thread。通常情况下我们的线程都是 unbound的,这样他们可以在LWP之间自由切换。
线程库在需要的时候激活LWP并把它们交给可以执行的线程。LWP管理线程的 状态,执行线程的指令。如果线程在同步机制中被阻塞,或者其他线程需要运行, 线程状态被存在进程内存中,LWP被移交给其他线程。
1.3.4绑定线程Bound Threads
如果需要,你可以将一个线程绑定在某个LWP上。
例如,你可以通过绑定一个线程来实现:
1. 将线程全局调度(例如实时)
2. 使线程拥有可变的信号栈
3. 给线程分配独立的定时器和信号(alarm)
在线程数多于LWP时,bounded比unbound线程体现出一些优越性。
例如,一个并行的矩阵计算程序在每个线程当中计算每一行。如果每个处理器 都有一个LWP,但每个LWP都要处理多线程,每个处理器将要花费相当的时间来切换 线程。在这种情况下,最好使每个LWP处理一个线程,减少线程数,从而减少线程 切换。
在一些应用程序中,混合使用bound和unbound线程更加合适。
例如,有一个实时的应用程序,希望某些线程拥有全局性的优先级,并被实时 调度,其他线程则转入后台计算。另一个例子是窗口系统,大多数操作都是 unbound的,但鼠标操作需要占用一个高优先级的,bound的,实时的线程。
1.4多线程的标准
多线程编程的历史可以回溯到二十世纪60年代。在UNIX操作系统中的发展是从 80年代中期开始的。也许是令人吃惊的,关于支持多线程有很好的协议,但是今 天我们仍然可以看到不同的多线程开发包,他们拥有不同的接口。
但是,某几年里一个叫做POSIX1003.4a的小组研究多线程编程标准。当标准完 成后,大多数支持多线程的系统都支持POSIX接口。很好的改善了多线程编程的可 移植性。
solaris多线程支持和POSIX1003.4a没有什么根本性的区别。虽然接口是不同 的,但每个系统都可以容易地实现另外一个系统可以实现的任何功能。它们之间没 有兼容性问题,至少solaris支持两种接口。即使是在同一个应用程序里,你也可 以混合使用它们。
用solaris线程的另一个原因是使用支持它的工具包,例如多线程调试工具 (multighreaded debugger)和truss(可以跟踪一个程序的系统调用和信号), 可以很好地报告线程的状态。

