进程和线程
什么叫进程和线程?你如果去Google上搜索可能会出现这样的话:线程是资源分配的最小单位,线程是CPU调度的最小单位。进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
很懵,简直就是看不懂啊!
但是到底进程和线程是什么?
进程在计算机中的发展
在早期的操作系统中,我们的内存是很小的,磁盘也很小,cpu的运算能力也不咋地。所以我们当时并没有进程和线程的概念。我们编写的程序只是一个文件,真正的运行起来,需要操作系统从磁盘里面把我们编写的程序进行解析,转为它认识的语言,然后它会根据我们程序里面需要的资源给与分配(包括内存啊,一些硬件设备的访问),然后CPU去执行程序里面代码,我们就得到了一些运算的结果了。这里当然也不支持多进程了。但是随着时间的发展,我们的CPU和硬件发展很快,cpu的运算能力太快了,内存空间变大了,我们可以一次性加载多个程序进入系统里面了,这里才出现了进程的概念!通常这里的进程指得就是一个程序。当一个加载进系统中程序得到CPU的时候,它的其他条件肯定都得准备好 (比如打印机啊,磁盘啊),但是CPU必然不会停下来不工作,就为了等你准备好!所以CPU采用了轮流的方式,每一个程序都得轮流分配给你,如果你没准备好,就不分配给你!但是由于采用了轮流的操作,CPU就会出现这个进程要做的工作并没有做完,你就要去做其他程序的工作了!这时候怎么办?难道下一次CPU论流到我的时候从头开始做?所以这里必须要保存状态!
保存我当前执行到那里了,我是处在什么环境下。 这里的环境就是我们通常说的上下文,所以进程的切换是很耗费资源的,我们必须要记录进程切换时候的状态。
线程的出现
进程这样的处理太粗糙了,而且随着硬件的发展,我们软件的功能越来越强大,就拿最简单的播放视频来说,我们开启一个进程去读取文件,申请了显示器和音频资源。准备好之后开始播放,这时候我们的画面和声音是一起出现的,肯定是同步进行的。如果还按照之前的模式,一个进程只处理一项工作,已经不能满足需求了。这时候线程就登场了,我们可以使用两个不同的“任务”A,B去输出画面和播放声音,它们都是在这个进程环境下进行操作的,共享了这个进程里面的资源!当这个进程分配到CPU时间的时候,它会先给A做一小会,再给B做一小会,由于CPU运行的时间非常快!我们看起来画面和声音是同步的,其实它们也是轮流使用CPU时间的。这里去切换A和B的上下文环境,肯定比切换整个进程的上下文环境开销来的小!也就是说线程是共享了进程的上下文环境,分配更为细小的CPU时间段。
结论
我们这里可以得出结论了,线程是“现代”操作系统中申请资源的容器,而线程是CPU切换的最小单位。带着时间呢,在之前没有线程这个东西,最小调度单位还是一个个进程。