菜鸟之旅——学习线程(基础)
在现在的软件编程中,不可避免的会用到多线程或者其他方式来实现异步的目的,那么,线程是个什么东西,如何使用?这些都是需要去学习与摸索的东西。不过在学习线程之前,还是有一些知识需要掌握的,虽说都是书本上的东西,但是还是对线程的学习有一定的作用的。
进程
目的
现在的计算机存在很多的操作系统(OS),大部分操作系统都是实时操作系统,可以实时的响应用户的操作,它们往往都有共同的基本特征:并发、共享和虚拟,进程的产生于并发、共享有很大的联系。
操作系统可以“同时”运行着很多的程序,并且很多程序有可能会有通讯、共同使用某些I\\O设备,比如打印机之类的,这些都是操作系统为我们提供的诸多便利,但是实际上CPU在同一时刻只能处理一道程序,但是操作系统却实现了程序并发的特征,这是因为在微观上是因为多个程序交替使用CPU和其他资源;但是在多道程序环境下,程序之间将会失去封闭性,并具有间断性及不可再现性,为了能够更好的实现并发特征,引入了进程这一概念。每个进程通过一种时间片轮转调度算法来进行调度,分配运行时间片,在时间片内可以使用CPU或是其他资源,由于时间片非常短暂,用户感觉不到进程之间的切换。
注意:在多处理机上,每个处理机可以处理不同的程序,可以说是真正的并发。
定义
从不同的角度,进程可以有不同的定义,比较典型的定义有:
1、进程是程序的一次执行过程。
2、进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3、进程是具有独立功能的程序在一个数据集上运行的过程,是操作系统进行资源分配和调度的一个独立单位。
组成
PCB:进程控制块,为了使参与并发执行的程序(含数据)能够独立的运行,更好的并发且不会冲突,于必须给进程配置一个专门的数据结构,操作系统利用PCB来控制和管理进程,PCB是进程的唯一标识。
程序段:程序段就是能被进程调度程序调度到CPU执行的程序代码段,注意程序是固定的,可以被多个进程共享,就是说多个进程可以运行同一段程序。
数据段:一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。
由PCB、程序段和数据段三部分构成了进程映像,进程的创建就是创建进程映像中的PCB,进程的撤销就是撤销进程的PCB。在引入进程映像的概念后,可以把传统操作系统中的进程定义为:进程是进程映像的运行过程,是系统进行资源分配和调度的一个独立单位。进程是动态的,而进程映像是静态的。
状态
进程存在5种状态,分别是创建、就绪、运行、阻塞和终止,而进程大部分时间是在就绪、阻塞和终止三个状态下切换。
进程的切换:进程切换就是处理机(CPU)从一个进程的运行转到另一个进程上,进程的运行环境发生了实质性的变化:
1、保存CPU上下文,包括程序计数器和其他寄存器;
2、更新PCB信息;
3、把进程的PCB移入相应的队列,比如就绪或者等待队列;
4、选择另一个进程运行,更新其PCB;
5、更新内存管理的数据结构;
6、恢复CPU上下文信息。
线程
我们从上面简单的回顾了一下进程的基本知识,当然,进程还有很多知识点没有介绍到,因为本人能力有限,就不更多的介绍了。下面开始回顾线程的基本知识:
目的
进程的引入是为了解决操作系统实现多个程序并发执行,进程的出现使各个程序在并发执行具有良好的封闭性,在进程切换的时候总会消耗一些资源,有一定量的时空消耗,但是随着软件复杂度提升,进程所占用的资源也会变多,在进程切换时需要付出更多的时空开销!于是为了减小程序在并发执行时所付出的时空开销,提升操作系统的并发性能,便引入了线程的概念。
定义
对于线程的最直接理解就是:轻量级进程,它是一个基本的CPU执行单元,由线程ID、程序计数器、寄存器集合和堆栈组成;线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一些在运行中必不可少的资源,但是可以与同一进程下的线程共享进程的全部资源。
引入线程之后,进程的内涵发生了变化,进程只作为除CPU以外系统资源的分配单元,线程则作为CPU的分配单元,进程内线程切换时不会引起进程切换,减少时空开销。
与进程的比较
1、调度:在传统的操作系统中,拥有资源和独立调度的基本单位都是进程,在引入线程之后,线程则变为独立调用的基本单位,进程则是拥有资源 的基本单位;同一进程内线程切换不会引起进程的切换,但是不同进程间的线程切换则会引起进程的切换。
2、拥有资源:进程是拥有资源的基本单位,而线程不拥有系统资源(除一些必不可少的资源),但是线程可以使用其进程的资源。
3、系统开销:由于线程并不拥有系统资源,所以同一进程下线程在被调度到CPU执行时,只需保存和设置少量寄存器内容,而无需保存、更新进程在CPU运行的环境,所付出的时空开销相对变得更少。
4、并发性:在引入线程的操作系统中,由于线程不论在创建、撤销或者在调度切换时时空消耗更低,且进程间的线程切换也不会引起进程的切换,所以在整体的并发性能上,引入线程的操作系统吞吐量更高。
总结
进程:计算机的CPU在同一时刻只有一道程序运行,且CPU是高速的,若是CPU等待程序的其他资源就绪,就会造成CPU的性能浪费,若是并发执行程序,在等待当前程序的其他资源就绪时,先去运行别的程序,就可以尽量减少CPU性能的浪费;这时引入了进程的概念,且CPU是以时间片调度的方式运行进程,进程的出现使得多到程序并发执行具有良好的封闭性和可控,使得操作系统拥有可控、稳定的并发性能。
线程:进程作为系统资源和调度的基本单元本身是没什么问题,但是随着程序的日渐复杂,进程所拥有的资源变多,在进程被调度到CPU进行切换时,CPU需要保存当前进程的运行环境和设置要执行进程的运行环境,这里所付出的时空开销会越来越大;为了减少在调度时的开销,引入了更轻量的进程-线程,这时进程不再作为调度的基本单元,线程变为调度的基本单元,线程在进行切换要比进程的切换的开销小很多,这时操作系统的并发性能能够得到更良好的应用。
总结的知识点不是很多,深一层的运行机制、数据结构和调度算法等,因本人知识限制都没有涉及到,这里还需要后续的学习。