1. 多线程
l 操作系统引入进程的目的是,为了描述和实现多个程序的并发执行,以改善资源利用率级提高系统的吞吐量。
l 为什么引入线程?为了减少程序并发执行时系统所付出的额外开销,使操作系统具有更好的并发性。
l 进程的两个属性
n 进程是一个拥有资源的独立单位;
n 进程同时又是一个可以独立调度的基本单位。
2. 系统为进程进行的操作(进程带来的开销)
l 管理进程:创建进程、撤销进程、进程切换。
l 进程作为资源的拥有者和系统的调度对象,需要花费系统较大的额外开销。所以系统中同时存在的进程数目不宜过多,进程切换的频率也不宜过高,而这也就限制了并发度的进一步提高。
3. 由进程到线程(进程复制申请资源,线程负责调度资源)
l 目标:既能提高进程的并发度,又能降低系统的额外开销。
l 实现:将进程的资源申请和调度属性分开,即进程作为资源的申请和拥有者,但不作为调度的基本单位。如此便产生了线程的概念。
l 线程是进程中的一个实体,是调度的基本单位。
l 线程自身基本上不拥有系统资源,只拥有少许运行中必不可少的私有资源。线程可与同属一个进程的其他线程共享进程的全部资源。
例子:一对老夫妇,有3个子女。子女长大后要自己修房子(子进程)、找工作。如果没有分家,3个子女可以共享父亲(父进程)的房子,可以并发。如果他们分开了,资源是独立的,如果不分开,资源是共享的。
4. 线程的状态
l 进程中的所有线程共享该进程的状态。
l 线程具有三种基本状态:就绪、执行和阻塞。
l 线程一般不具备挂起状态。
5. 对线程的操作
l 一个进程可以创建和撤销一个或多个线程,同一进程中的多个线程可以并发执行。
l 对线程的操作
n 派生:当系统创建一个进程时,同时也为该进程派生了一个线程,同一进程中的线程可以再派生其他线程。
n 阻塞:当线程需要等待某事件时,它将被阻塞,释放处理机执行其他线程。
n 解除阻塞:当线程的阻塞事件发生,其状态转换为就绪,并插入到就绪队列,等待调度执行。
n 结束
6. 进程与线程
6.1 调度
l 传统操作系统,进程既是拥有资源的基本单位,也是独立调度的基本单位。
l 引入线程的操作系统,线程是独立调度的基本单位,进程是资源拥有的基本单位。
l 同一进程中的线程间切换不会引起进程切换,当一个进程中的线程切换到另一个进程中会引起进程切换。
6.2 并发
l 进程间可以并发执行。
l 同属一个进程的多个线程,也可以并发执行。
l 线程时操作系统拥有更好的并发性,从而能有效地使用系统资源和提供系统吞吐量。
l 当一个未引入线程的单处理机操作系统,若设置一个文件服务进程,当它由于某种原因阻塞,便没有其他的文件服务进程来提供服务。引入线程以后,可以为一个文件服务进程中设置多个服务线程,当其中一个线程阻塞时,文件服务进程中的其他线程可以继续运行,提供了文件服务的质量和系统吞吐量。
6.3 系统开销
l 操作系统管理进程的开销显著大于管理线程的开销。
l 进程切换的开销也大于线程切换的开销。
l 由于同一进程中的多个线程具有相同的地址空间,他们之间的同步和通信也比较容易。
l 有些类型的线程切换、同步和通信无需操作系统内核的干预。
7 线程的类型
1) 用户级线程
a) 定义:用户级线程的创建、撤销及切换等操作全部由支持线程的应用程序完成,内核并不知道线程的存在。
b) 如(a)图所示,纯粹的用户级线程,应用程序可以利用线程库设计多线程程序,该线程库包含各种用户管理用户级线程的例程。
c) 用户级线程阻塞是否会引起整个进程阻塞呢?
1) 当某进程中的一个线程需要等待另一线程的输出数据而阻塞时,整个进程并不会阻塞。即进程保持执行状态,其内的线程也是执行状态。
2) 当某线程因为I/O阻塞时,内核需要启动系统I/O,控制从用户级转到系统内核级,这时常会引起整个进程阻塞。
d) 用户级线程能节省大量的系统额外开销,提供并发性。
1) 线程的管理和控制权在用户级进行,线程切换无需内核干预,没有模式切换,减少了模式切换的开销。
2) 调度更灵活。应用程序可以根据需要选用线程库中不同的线程调度算法,而不受系统内核进程调度程序的约束。
3) 由于线程库独立于系统内核,可以运行在不同的操作系统上,时用户级线程可以得到不同的操作系统的支持,而无需修改操作系统内核。
e) 用户级线程也存在一些问题
1) 由于操作系统的系统调用会引起阻塞,用户级线程中的系统调用常常会引起线程级整个进程阻塞,削弱了线程的并发性。
2) 由于系统内核不知道用户级线程的存在,可能出现进程切换时,强行中断其内某个执行线程的情况。
3) 很难实现不同进程的线程并发。
2) 内核级线程
内核级线程的管理完全由系统内核完成,应用程序无权进程线程切换等操作,系统为应用程序提供相应的应用程序api