1,什么是线程(Thread)
- 线程是处理代码的执行流,有着自己的程序计数器,用来追踪下一次执行的指令,系统寄存器持有它的变量,栈包含了它的执行历史。
- 线程间可进行数据共享。当一个线程改变了内存,其他线程亦可以看到。
- 线程也叫做轻量级进程。线程基于并行工作提高应用程序的性能。线程是一种提高操作系统性能的软件方法,但是其开销小于多进程。
- 每一个线程都存在一个特定的进程中。没有任何一个线程可存在于一个进程外。线程成功地被用于实现网络服务器和web服务器。
下图就是单进程单线程和单进程多线程示意图。
2,进程和线程的不同
序号 | 进程 | 线程 |
1 | 进程是重量级,资源密集型 | 轻量级,消耗更小的资源(与进程比) |
2 | 进程切换需要与操作系统交互 | 线程切换不需要与操作系统交互 |
3 | 多进程,相同代码,但每个进程拥有自己的资源 | 所有的线程可共用资源 |
4 | 当一个进程阻塞,其他进程等待 | 当一个线程阻塞,后续线程可执行 |
5 | 多进程中不用线程会用更多的资源 | 多线程进程用更傻少的资源 |
6 | 多进程中,每个进程都是相互独立的 | 一个线程可以改变读,写,改变其它线程的数据 |
3,线程的优点
- 线程降低了上下文切换的时间
- 多线程使得在进程中并发执行任务
- 有效的通信
- 线程的创建和切换上下文更加经济
- 线程使得多处理器架构伸缩性更高、更有效
4,线程的类别
- 用户级线程——用户管理的线程
- 内核级线程——操作系统管理线程
4.1 用户级线程
在这种情况下,线程管理内核没有意识到线程的存在。线程库包含了创建和销毁线程的代码,包含了在线程间传递消息和数据的代码,以及调度线程执行和保存、恢复线程上下文的代码。应用被一个线程启动。下图是该类线程的示意图。
4.1.1,优点
- 线程切换不需要内核模式权限
- 用户级线程可以在任何操作系统上运行
- 用户级线程可以快速创建和管理
- 根据应用特定需要允许进程选择线程调度算法
4.1.2,缺点
- 多线程程序没有利用多处理器的优势
- 在传统的操作系统中,大多数系统调用被阻塞
4.2,内核级线程
该线程被操作系统的内核管理,在应用程序中没有线程管理代码。线程的创建、调度、销毁等操作均由内核来管理。内核维护了进程上下文切换以及单个进程中线程间的上下文切换。
4.2.1,优点
- 内核可以同时调度同一进程的多个线程
- 如果一个线程被阻塞,内核可以调度另一个
- 内核本身就是多线程的
4.2.2,缺点
- 线程创建和管理速度慢
- 统一进程的线程间的控制传输需要内核的模式切换
5,多线程模型
一些操作系统提供了上述两种线程,比如Solaris系统。在混合操作系统中,同一程序中多个线程可以并行地运行于多个处理器上,一个阻塞的系统调用不会阻塞整个进程进行。多线程模型有三种。
- 多对多关系
- 多对一关系
- 一对一关系
5.1,多对多关系
多对多关系线程模型是任意数量N的用户线程到相等或者小于N的内核线程的多路复用。
下图显示了多对多线程模型,其中6个用户级线程与6个内核级线程进行多路复用。在此模型中,开发人员可以根据需要创建任意数量的用户线程,并且相应的内核线程可以在多处理器计算机上并行运行。此模型提供了并发的最佳准确性,当线程执行阻塞系统调用时,内核可以调度另一个线程来执行。
5.2,多对一关系
多对一模型将许多用户级线程映射到一个内核级线程。线程管理由在用户空间由线程库中完成。当线程进行阻塞系统调用时,整个进程将被阻止。 一次只有一个线程可以访问内核,因此多个线程无法在多处理器上并行运行。
如果用户级线程库在操作系统中以系统不支持它们的方式实现的,则内核线程使用多对一关系模式。
5.3,一对一关系
用户级线程与内核级线程之间存在一对一的关系。与多对一模型相比,此模型提供更多并发性。 当线程进行阻塞系统调用时,它还允许另一个线程运行。 它支持多个线程在微处理器上并行执行。
该模型的缺点是创建用户线程时需要相应的内核线程。 OS / 2,Windows NT和Windows 2000使用一对一的关系模型。