Solaris的线程模型
KEY:操作系统 线程 进程 用户线程 轻量进程
INTRO
Solaris实现了一种不一般的多层的线程模型,这种线程模型为开拓处理器性能提供有效且灵活的方案。
KEMIN: 应用程序功能复杂化使程序具有很好的并发性,而一开始操作系统实现的是多进程模型,但当多进程的模型的实现代价超出并发带来效益时,人们开始改造这种并发模型,线程概念及线程模型出现。
多线程构架
Solaris2.X引入了四个线程相关的概念:
- 进程(process):这是直接引用原来的UNIX的进程概念,包括用户地址空间、堆栈和进程控制块;
- 用户级线程(User-level threads)用户级线程是通过在进程地址空间内的线程库实现的,这种线程是内核不可见的。
- 轻量进程(Lightweight processes)一个轻量进程可以看成是用户级线程到内核线程之间的映射。每个轻量进程可以把一个或多个用户级线程映射为一个内核线程。轻量进程被内核单独调度并且可在多处理器间并行运行。
- 内核线程(Kernel thread)内核线程是基本被调度实体,并且也是被指派(dispatch)到多处理器之中一个上运行的独立实体。
下图展示了这四个概念之间的关系。注意每个轻量进程都对应一个内核线程的。轻量进程在进程内是可见的,所以轻量进程的数据结构存放相应的进程地址空间内。同时,每一个轻量进程都绑定到单独可指派的(dispatchable)内核线程,而内核线程数据结构是在内核空间内的。
上面图例子中,
一对一
进程一(process1)是单用户级线程绑定到单轻量进程的。这是传统进程的单线程运行情况。
多对一
进程二则是应用用户级线程策略的典型例子。所有的用户级线程由单独的内核线程支持,也就是说,每次只有一个用户级线程可以执行。这种结构适合那些有并发性(concurrency)而不需并行(parallel)运行的计算任务。
多对少
进程三是多个用户线程复用少量轻量进程的情况。Solaris通常允许应用把用户级线程复用到等数目或少一些的轻量进程上去。这样应用可以指定进程在内核中的并行程度(degree)。
N对N
进程四中的线程是以一对一映射的方式永久绑定轻量进程上的。这种结构使用内核的并行性对应用完全可见的,这很适合线程常常遇到阻塞而被挂起的情况。
M对N
进程五是进程三和进程一的混合。
动机
用户级和内核级线程的两层模型让应用程序员能够使用最有效和最适合的线程结构来开拓他们的应用的并发性。
多对一
有一些程序在逻辑结构上有并行性,代码结构化很好,但是不需要硬件并行运行它。比如,一个程序有多个交互的窗口,但是一次只有一个窗口是活动的,这个程序很适合使用多对一的线程模型。多对一模型的优点在于限制没有硬件级并行性的应用不浪费内核资源,因为多个用户线程是在用户空间内被创建、阻塞、激活和消毁的,不会涉及内核。如果用户级线程要在内核,那么内核必须为其分配内核数据结构并对用户级线程进行调度。下面列出三种上下文切换的代价,从中可看到内核级线程切换比用户级切换代价大很多。
少对多
如果应用中有些线程可能会被阻塞,比如进行输入输出操作,可使轻量进程等于或多于用户级线程的数目,这样应用或线程库都不用引入辅助手段解决线程被阻塞,因为如果进程中有一个用户线程被阻塞,其它用户线程还有剩余的轻量进程使用。
N对N
用户级线程到轻量进程的一对一的映射对一些应用是非常有效率的。比如并行数组计算,数组各行分给不同的线程执行,一对一的情况下,计算过程中没有线程切换的。
M对N
有一些复杂的应用适合使用混合模型。比如一些实时应用,这些应用需要有一部分线程任务在系统级优先级和实时调度,一部分线程任务执行后台服务并共享一个或一池的轻量进程。
进程控制块结构
下图大体的对比了Solaris 和传统UNIX系统的进程结构的区别。传统UNIX系统的进程结构包含了处理器ID、用户ID、信号分派表(signal dispatch table)(内核用其来决定在给进程发送信息时做些什么)、文件描述符(descriptors)、内存映射表和一个处理器状态结构(processor state structure)。处理器状态结构里保存着进程的内核堆栈。Solaris则保持这个基本结构,只是把单一的处理器状态结构替换多个数据结构,每个轻量进程一个。
轻量进程数据结构有如下的内容:
- 一个轻量进程的ID
- 轻量进程的优先级
- 一个信号屏蔽(signal mask),用来过滤信号
- 用户级寄存器的数据
- 轻量进程的内核堆栈
- 资源使用和profiling data
- 内核线程的指针
- 进程结构的指针
线程执行
下图是用户级线程和轻量进程执行状态转换的精简图。用户级线程的执行由线程库负责管理。让我们先看看非绑定线程(也就是多个用户级线程共用数个轻量进程)。非绑定线程有四种状态:可运行、活动、休眠和停止。处在活动状态的用户线程被赋给一个轻量进程,当对应的内核线程执行时,用户线程被执行。有很多事件能导致用户级线程离开活动状态。我们假设一个活动的用户级线程叫T1。如下的事件可能发生:
同步(synchornization):T1触发了一条并发原语而被排斥进行休眠状态。当同步的条件达到后再被转为可运行状态。
挂起(suspension):任何一个线程(包括T1自己)都可挂起T1(stop信号),把T1转为停止状态。T1必须等待其它线程向它发出一条continue信号才能离开挂起状态进入可运行状态。
抢占(preemption):当一活动线程(T1或其它线程)执行时触发另一个优先更高的线程(T2)进入了可运行状态,T1会被T2抢先,从活动状态转入可运行状态。
交出(yielding):如果T1执行库命令thr_yield()时,库的调度器查找是否有相同优先级的线程可运行,如果有,则调度它进入活动状态并运行;如果没有,则T1继续运行。
在如上的所有情况,如果T1被移离活动状态,线程库将选择另一个可运行的非绑定线程,将其绑定到一个可用的轻量进程进行运行。
图中还展示了轻量进程的状态转换图。我可以看到轻量进程的状态转换图是对用户级线程在活动状态的放大。这是两层模型不言自明的结果。
中断看作线程
大部分操作系统有两种基本的异步活动形式:进程和中断。进程(或线程)间相互协作时必须使用同步机制同步它的任务执行。
参考
http://blog.chinaunix.net/u/15906/showart_264682.html
分享到:
相关推荐
四、Solaris线程模型 Solaris是最早引入线程概念的操作系统之一,提供了丰富的线程API和高效的线程模型。Solaris支持多对多模型,可以创建多个内核线程来服务用户级线程。Solaris的线程模型称为LWP,它允许线程并行...
- **线程模型**: Solaris采用了混合线程模型,即用户空间线程与内核线程相结合的方式。 - **多线程的益处** - **提高应用程序响应性**: 通过多线程可以让用户界面即使在后台任务执行时仍保持活跃。 - **有效利用...
7. **Solaris线程模型**:Solaris操作系统支持轻量级进程(LWP),LWP是内核级线程,可以并发执行。 8. **线程状态**:线程的状态包括就绪、运行、阻塞等,当线程等待某个事件发生时,它会进入阻塞状态。 9. **...
通过对Solaris Spark内存模型的深入分析,我们不仅了解了硬件内存模型和软件内存模型的基本原理,还探讨了它们之间的关系及其对多线程程序行为的影响。这对于优化多处理器环境下的Java程序至关重要,有助于开发人员...
多线程模型允许进程利用SMP架构的优势,在多处理器环境中同时执行多个线程,从而达到最大的并行度和效率提升。即使在单处理器环境下,多线程编程也能提高程序的设计灵活性和执行效率。 在Solaris的内核中,每个进程...
多线程模型是为了解决同一时间需要执行多个任务的问题,提高资源利用率,而不是提高单个任务的运行速度。例如,在Web服务器中,Servlet可以利用多线程处理并发的HTTP请求,提高服务器响应效率。实现多线程的方式有...
Linuxthreads,一种流行于早期Linux的线程实现,采用了一对一线程模型,每个轻量级进程对应一个线程,调度由内核完成,用户态则提供线程管理机制,包括信号处理等。 Linux中的线程分为用户级线程和内核级线程。用户...
- **示例**: Sun Solaris中的轻量级进程(lightweight process, LWP)就是一个典型的混合线程模型的应用实例。在这种模型下,用户级线程被映射为LWP,从而实现了对多处理器的有效利用。 ##### POSIX线程调度模型 ...
Solaris的线程模型是高度可移植的,符合ANSI/POSIX标准。 #### 网络编程 Solaris支持标准的BSD套接字接口,使得网络编程变得简单高效。常见的网络编程任务包括创建套接字、绑定地址、监听连接请求等。Solaris还...
1. **线程模型**:Oracle Solaris支持两种线程模型,即LWP(轻量级进程)和MT(多线程)。LWP是操作系统内核级别的线程,每个LWP对应一个单独的处理器上下文;MT则是在用户空间实现的线程库,如POSIX线程(pthread)...
2. **进程和线程管理**:解释Solaris中的多任务模型,线程的创建、调度和同步,以及如何使用`ps`、`truss`等工具来跟踪和分析进程行为。 3. **I/O子系统**:涵盖文件系统、块设备驱动、网络I/O等方面,如何优化I/O...
【多线程程序设计】是计算机编程中的一个重要概念,...在实际应用中,根据系统需求和性能要求,选择合适的线程模型(如单一线程模型、多线程模型等)以及线程实现方式(内核线程、用户线程或轻权进程)是非常关键的。
多线程模型是理解线程在不同操作系统中实现方式的关键。5.11节至5.13节分别介绍了用户线程、内核线程和混合实现。用户线程完全由应用程序或库管理,不依赖于操作系统内核的支持,因此可以在没有内核参与的情况下进行...
6. **安全与权限**:Solaris的安全模型基于多级安全策略(MLS)和强制访问控制(MAC),如SUNWsmack和TOMOYO,以及用户和组权限管理。Solaris还引入了zones,一种轻量级容器技术,用于提供资源隔离和安全性。 7. **...
5. **并行化支持**:支持并行编程模型,如OpenMP,有助于编写高性能的多线程应用程序。 #### 三、编译流程详解 1. **预处理阶段**: - **宏替换**:根据预处理器指令进行宏定义替换。 - **文件包含**:通过`#...
2. **线程编程**:Solaris是最早支持多线程的Unix系统之一,其线程模型非常先进。线程的创建、同步(互斥锁、条件变量、读写锁、信号量)和通信(线程间信号)是线程编程的重点。 3. **文件系统与I/O操作**:学习...
书中涵盖了Solaris中的进程创建、调度、信号处理、线程模型等关键概念。 4. **内存管理**:有效和高效的内存管理对于系统性能至关重要。书中详细解析了Solaris的虚拟内存系统,包括分页、交换、内存映射、内存碎片...
1. **线程模型**:Solaris支持POSIX线程(也称为pthreads),这是一种标准的多线程接口。了解如何创建、管理、同步和通信线程是多线程编程的基础。 2. **线程安全**:理解线程安全的概念,包括哪些函数是线程安全的...