线程的基本概念
- 为什么要引入线程?
减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能。 - 线程是进程中的一个实体,是被系统调度和分配的基本单位,但是线程不拥有系统资源,除了线程标识符等运行时必不可少的资源,线程与同属一个进程的其他线程共享进程的所有资源。
- 线程也有就绪、阻塞、运行三种状态。
- 引入线程后,进程只作为除CPU之外的系统资源的分配单位,线程则作为处理机的分配单位。
线程的属性
- 每个线程有一个唯一的标识符和一个线程控制块,线程控制块记录了线程执行的寄存器和栈等现场状态。
- 不同的线程可以执行相同的程序。
- 同一进程中的所有线程共享该进程的所有资源。
- 线程是处理机的独立调度单位,多个线程可以并发执行。单CPU系统各线程交替占用CPU;多CPU系统各线程可占用不同的CPU。
线程的实现方式
- 用户级线程(User-Level Thread,ULT)
有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。应用程序通过线程库设计成多线程程序。 - 内核级线程(Kernel-Level Thread,KLT)
线程管理的工作由内核完成,应用程序没有线程管理的代码,只有一个到内核级线程的编程接口。 - 组合方式
线程创建完全在用户空间完成,线程的调度和同步也在应用程序中完成。一个应用程序中的多个用户级线程被映射到一些(小于等于用户级线程的数目)内核级线程上。
多线程模型
有些系统同时支持用户线程和内核线程,由此产生了不同的多线程模型,即实现用户级线程和内核级线程的连接方式。
- 多对一模型
多个用户级线程映射到一个内核级线程,线程管理在用户空间完成,效率较高,但一个线程被阻塞会导致整个进程阻塞。 - 一对一模型
一个线程被阻塞,允许另一线程继续运行,并发性较强,但是开销较大,性能较弱。 - 多对多模型
上述两种的折中方案,要求内核级线程数小于等于用户级线程数。
线程与进程的比较
- 线程是独立调度的基本单位,进程是拥有资源的基本单位。
- 进程和线程都可以并发执行。
- 进程切换的开销较大,线程切换时只需保存和设置少量寄存器的内容,开销较小。
- 进程的地址空间相互独立,线程共享进程的资源,线程对于其他进程不可见。
- 进程通信需要进程同步和互斥手段的辅助;线程间可以直接进行读/写进程数据段(如全局变量)来进行通信。
多线程和多任务
多任务是针对操作系统而言的,代表操作系统可以执行的程序个数;多线程是针对一个程序而言的,代表一个程序可以同时执行的线程个数,而每个线程可以完成不同的任务。