传送门:操作系统——处理器管理http://t.csdnimg.cn/avaDO
1.1 线程的概念
回忆:[未引入线程前] 进程有两个基本属性:拥有资源的独立单位、处理器调度和分配的基本单位。
引入线程以后,线程将作为处理器调度和运行的基本单位,进程作为分配资源的基本单位,计算机可以通过创建线程来完成任务,以减少程序并发执行时的时空开销。
线程的组成
-
线程ID
-
程序计数器
-
寄存器集合
-
堆栈
一个线程与同属一个进程的其它线程共享其代码段
、数据段
和其它操作系统资源
(如打开文件和信号)。
一个进程可以有多个控制线程,它就能同时做多个任务。因此,我们可以得知引入线程的目的是提高系统内程序并发执行的程度,进一步提高系统的吞吐量。
线程的特点
-
线程是程序中一个单一的顺序控制流程
-
在单个程序中可以同时运行多个线程完成不同的工作,称为多线程
-
多线程是为了同步完成多项任务,通过提高资源使用效率来提高系统的效率
-
多线程是在同一时间需要完成多项任务的时候实现的
1.2 多线程编程优点
-
响应程度高。如果对一个交互式应用程序采用多线程,即使它部分阻塞或执行较冗长的操作,那么,该程序仍然能继续工作,从而提高对用户的响应程度。
-
资源共享。线程默认共享自身所属进程的内存和资源。
-
经济。创建进程所需要的内存和资源的分配比较昂贵,而由于线程允许共享自身所属进程的资源,所以,创建线程和上下文切换会更经济。
-
多处理器体系结构的利用。多线程的优点之一是能充分使用多处理器体系结构,以便每个线程能够并行运行在不同的处理器上。
1.3 线程的实现
线程的实现主要分为两种方式:用户级线程、内核级线程
用户级线程
-
用户级线程仅存在于用户空间中
-
用户级线程的创建、撤销、线程间的同步与通信等功能都无需通过系统调用来实现
-
用户级线程的切换,常发生在一个应用进程的诸多线程之间,且无需内核的支持
-
线程间的切换速度非常快(线程的切换规则简单)
-
因为用户级线程与内核无关,所以,内核完全不知道用户级线程的存在
内核级线程
-
内核级线程是在内核的支持下运行的
-
内核线程的创建和管理要慢于用户线程的创建和管理(用户线程 > 内核线程)
-
内核为每个内核级线程设置了一个PCB,内核根据该PCB感知线程的存在,并对其进行控制
1.4 多线程模型
多对一模型
-
多对一模型将许多用户级线程映射到一个内核线程
-
线程管理是在用户空间进行的,因此效率比较高
-
如果一个线程执行了阻塞系统调用,那么,整个进程就会阻塞,而且,由于任何时刻只允许一个线程访问内核,因此多个线程不能并行运行在多处理器上
-
该模型,处理器调度的单位仍然是进程
一对一模型
-
一对一模型将每个用户线程映射到一个内核线程
-
当一个线程执行阻塞时,该线程模型能够允许另一个线程继续执行,所以,它提供了比多对一模型更好的并发功能
-
该模型允许多个线程运行在多处理器系统上
缺点:
-
每创建一个用户线程就需要创建一个相应的内核线程。由于创建内核线程的开销会影响应用程序的性能,所以,这种模型的绝大多数实现限制了系统所支持的线程数量。
多对多模型
-
多对多模型使用多路复用技术,使许多用户级线程映射到同样数量或更小数量的内核线程上
-
多对多模型克服了前两种模型的缺点,开发人员可以创建任意多个必要的线程,并且相应的内核线程能够在多处理器系统上并行运行
-
当一个线程执行阻塞系统调用时,内核能够调度另一个线程来执行
1.5 线程池
流程:
-
预先创建若干数量的线程,并让这些线程都处于睡眠状态,不消耗CPU资源
-
当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求
-
当处理完这个请求后,线程又处于睡眠状态
基于这种预创建技术,线程池将线程创建和销毁所带来的开销均摊到各个具体的任务上,执行次数越多,每个任务分担到的线程自身开销就越小。
线程池具有以下优点:
-
(1) 用现有线程处理请求通常比等待创建新线程快
-
(2) 线程池限定了任何时候可存在线程的数量