进程的概念
两个特点
- 资源所有权:总是拥有对资源的控制或所有权 —— 进程或任务
- 调度/执行:可被操作系统调度和分派的实体 —— 线程或轻量级进程
多线程
多线程是指操作系统在单个进程内支持多个并发执行路径的能力。
在多线程环境中,进程被定义成资源分配的单位和一个被保护的单位。
与进程相关联的有:
- 存放进程映像的虚拟地址空间
- 受保护地对处理器、其他进程、文件和I/O资源的访问
线程中有:
- 线程的执行状态
- 在未运行时保护的线程上下文
- 一个执行栈
- 用于每个线程局部变量的静态存储空间
- 与进程内的其他线程共享的对进程的内存和资源的访问
线程优点:
- 在已有进程中创建一个新线程比创建一个全新进程所需的时间要少许多
- 终于一个线程比终止一个进程花费的时间少
- 同一进程内线程间切换比进程间切换花费的时间少
- 线程提高了不同的执行程序间通信的效率
线程功能特性
两方面功能特性
- 线程状态 —— 运行态、就绪态和阻塞态
四种改变线程状态的相关操作
- 派生——新进程派生出一个线程,进程中的线程可以在同一个进程中派生另一个线程
- 阻塞——等待一个事件时被阻塞,此时保存它的用户寄存器、程序计数器和栈指针
- 解除阻塞——阻塞一个线程的事件发生时,该线程被转移到就绪队列中
- 结束——当一个线程完成时,其寄存器上下文和栈都被释放线程同步
2. 线程同步 —— 一个进程中的所有线程共享同一个地址空间,因此对资源的任何修改都会影响同一个进程中其他线程环境。
线程分类
用户级线程 —— 在一个纯粹的用户级线程软件中,所有活动都发生在用户空间中,并且发生在一个进程内,而内核并不知道这些活动
任何应用程序都可以通过使用线程库被设计成多线程程序。线程库是用于用户级线程管理的一个例程包,它包含用于创建和销毁线程的代码、在线程间传递消息的数据的代码、调度线程执行的代码,以及保存和恢复线程上下文的代码。线程上下文实际上包括用户寄存器的内容、程序计数器和栈指针。
优点
- 线程切换节省开销
- 调度算法由应用程序决定,为应用程序量身定做而不扰乱底层的操作系统调度程序
- 用户级线程可以在任何操作系统中运行,不需要对底层内核进行修改以支持用户级线程
缺点
- 在典型的操作系统中,许多系统调用都会引起进程中的所有线程阻塞
- 在纯粹的用户级线程策略中,一个多线程应用程序不能利用多处理技术
内核级线程 —— 在一个纯粹的内核级线程软件中,有关线程管理的所有工作都是由内核完成的,应用程序部分没有进行线程管理的代码,只有一个到内核线程设施的应用程序编程接口(API)
优点
- 内核可以同时把同一个进程中的多个线程调度到多个处理器中
- 如果进程中的一个线程被阻塞,内核可以调度同一个进程中的另一个线程
- 内核例程自身也是可以使用多线程的
缺点
- 同一进程内的线程切换需要到内核的状态切换,开销大
混合方式 —— 在混合系统中,线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些(小于或等于用户级线程的数目)内核级线程上。
其他方案
线程和进程的数量关系
- 一对一关系 —— 执行的每个线程是一个唯一的进程,有它自己的地址空间和资源。实例系统:传统的UNIX
- 多对一关系 —— 一个进程定义了一个地址空间和动态资源所有权,可以在该进程中创建和执行多个线程。实例系统:Windows NT, Solaris, Linux、OS/2、OS/390、MACH等
- 一对多关系 —— 一个线程可以从一个进程环境迁移到另一个进程环境,允许线程可以很容易地在不同系统中移动。实例系统:RS(Clouds)、Emerald
- 多对多关系 —— 结合了多对一和一对多的属性,有效的解决了存储管理的缺陷,节省进程管理的开销。实例系统:TRIX
多核和多线程
多核架构带来的潜在的性能提示取决于一个应用程序有效使用可用并行资源的能力。
Amdahl定律:加速比 =
f代表可以被无限并行化且没有调度开销的代码,(1-f)代表串行代码,N代表处理器个数
列举一些从多核系统中直接获益的应用程序
- 原生多线程应用程序
多线程应用的特征是具有少数几个高度线程化的进程
- 多进程应用程序
即具有多个单线程的进程
- Java应用程序
Java从根本上支持线程的概念。不仅仅Java语言本身能够很方便地支持多线程应用程序开发,Java虚拟机也是一个多线程进 程,它为Java应用程序提供调度机制和内存管理。
- 多实例应用程序