天天看点

进程和线程的区别---从操作系统的前世今生进行分析

面试的时候,我们经常会被问到进程和线程的区别是什么?这个问题也曾困扰过我,在之前,都是百度搜索一下,记一下答案,就糊弄过去了,一直不曾深入的去研究,今天通过这篇博客,以操作系统的发展作为脉络,从操作系统的出现和发展来和大家一起学习进程和线程,并分析进程和线程间的区别。

1.举个栗子

​ 在正式开始本文之前,我们通过一个例子给大家简答的说下进程和线程。QQ聊天大家应该都用过吧,在我们小时候,为了QQ等级的提升,我们一台电脑会挂好几个账号,此时,每登录的一个账号,就是一个进程;那我们在聊天的过程中,打开和某个好友的聊天窗口时,这个对应的就是线程。通过这个小例子,大家也能简单的了解进程和线程的形式,下面正式开始我们的内容。

2.进程

​ 在学习进程前,大家思考几个问题,进程是什么?进程被引入的原因是什么?

​ 1945年第一台计算机出现的时候,那个时候还不存在操作系统,计算机的运行是需要人工的方式通过纸带将程序和数据输入到内存中,然后计算机才可以执行程序;后面为了解决人机矛盾及CPU和I/O设备之间速度不匹配的矛盾,出现了脱机输入/输出方式,通过外围机来控制程序和数据的输入和运算结果的输出;为了实现对作业的连续处理,发展到单道批处理系统,他可以将一批作业以脱机方式输入到外存中,并且配上监督程序(Monitor),来控制作业的连续执行;然后就是我们的重点了,为了进一步提高资源利用率和系统吞吐量,多道批处理系统同一时刻将多个作业调入到内存当中,使他们共享CPU和系统中的各种资源,在一定程度上也只有多道批处理系统才算的上的真正的操作系统,从下图我们可以看到,多道批处理可以在同一时段里同时运行多个程序,在某个程序发生I/O请求或者其他等待事件事,将处理机释放,让其他的程序可以获得处理机并执行,这里引出了并发的概念。

进程和线程的区别---从操作系统的前世今生进行分析

并发:指两个或多个事件在同一时间间隔内发生。程序的并发执行有以下的特征:

​​ 1.间断性:程序执行过程可能会发生中断,是并发程序具有“执行–暂停–执行”这种间断性规律;

​ 2.失去封闭性:程序执行过程中,为其分配的资源的状态不会仅仅被该程序使用,别的并发程序也可访问;

​ 3.不可再现性:因为失去了封闭性,也将导致并发的执行结果失去了可再现性。

​ 对于程序的并发执行,因为失去了封闭性,并具有间断性,以及其运行结果的不可再现性,这些也导致了通常的程序是不能参与并发执行的,否则程序不能按照我们的设计运行,无法得到我们的预期结果,也就失去了并发执行的意义。为了能使程序并发的执行,并且可以对并发执行的程序加以描述和控制,OS的设计人员引入了进程的概念。

​ 讲到这里,我们对进程被引入的目的这个问题做了解答,进程被引入的目的就是为了增加操作系统的并发性,也就是可以是为了保证程序可以并发的执行,下面我们就一起来探讨一下进程是什么?

​ 在传统操作系统中对于进程的定义,比较典型的定义有:

​ 1)进程是程序的一次执行;

​ 2)进程是一个程序及其数据在处理机上顺序执行时所发生的的活动;

​ 3)进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

​ 可能大家更熟悉的定义是如下:进程是进程实体(程序段、相关的数据段、进程控制块PCB)的运行过程,是系统进行资源分配和调度的一个独立单位。

不过这里给出的定义和大家熟悉的是一样的么?一般博客里给出的进程的定义一般如下:进程是系统进行分配和管理资源的基本单位。这里和我们的给出的定义是不是有些区别,首先,进程不在是系统进行调度(运行)的独立单位了,大家想一想,这两个定义究竟哪一个才是对的呢?

​ 细心的读者可能已经看到了在前面加粗的文字-----传统操作系统,这里可能大家就有些疑惑了,操作系统怎么还区分传统和非传统呢?操作系统按照其发展,将操作系统分为传统操作系统和现代操作系统,其主要的区别就是管理的硬件资源,传统的操作系统一般是单核CPU,其他的配置也都较低,现代的操作系统处理器基本上都是多核的,显卡、内存也都有极大的进步。

​ 所以说,上面的两个定义都是对的,我在上面给出的线程的定义是在传统操作系统中的,是进程被引入时开发人员对进程的定义,而大家熟悉的定义,是在现代操作系统中的。现在使用的较多的定义都是现代操作系统中的定义,但是如果你能了解进程的演进,对你面试或者知识的理解还是非常有帮助的。

3.线程

​ 现在,讲到线程了,大家同样思考几个问题,线程又是什么?线程被引入的原因是什么?

​ 上面我们讲到在传统操作系统中,进程是可拥有资源的独立单位,同时又是一个可独立调度和分派的基本单位。那在这种情况下,我们来看,程序并发执行需要付出的时空开销:

​ 1.创建进程,此时需要为进程分配除处理机以外的所有资源,如内存、I/O设备,以及建立对应的PCB;

​ 2.撤销进程,此时又需要将创建时分配的资源执行回收操作,然后撤销PCB;

​ 3.进程切换,对进程上下文切换时,需要保留当前进程的CPU环境,设置新被调度程序选中进程的CPU环境。

​ 从上面我们可以看到,由于进程是一个资源的拥有者,因此在创建、撤销和切换中,系统必须为之付出较大的时空开销,这也就限制了操作系统中所设置的进程的数目,而进程的切换也不宜过于频繁,从而限制了并发程度的进一步提高。

​ 讲到这里,线程被引入的原因是不是呼之欲出了,目的就是为了减少程序在并发执行时所付出的时空开销,使操作系统具有更好的并发性。

​ 引出了线程的概念后,传统的操作系统就演变成了现代操作系统。在现代操作系统中我们来看下线程的定义:作为调度和分派的基本单位。和在传统操作系统中进程的定义相比,这里将进程的功能给拆分了,进程作为资源分配的单位,而将独立调度和分派的功能分给了线程,因此线程也被称为轻型进程。这样操作系统就可以分开的处理(资源和调度分派),对于拥有资源的基本单位(进程),不对之施以频繁的切换,对于只拥有少量必要资源的线程来实施调度和分派。

​ 讲到这里线程部分就结束了么,NONONO,大家在前面有没有注意到提到的现代操作系统的重要特点是多核CPU,前面也讲到,进程的创建、撤销和切换所需付出的时空开销限制了OS中进程的数量,并且对于进程来说,一个进程只能运行在一个处理机上,就算进程在运行的过程中,其他的处理机处于空闲状态,是不是对进程的执行也没有任何的帮助?但是,有了线程之后,一切就变得不同了,虽然一个线程也只能运行在一个处理机上,但是线程由于其体量小的特点,OS中线程的数量远远大于进程的数量,这样一个进程中的多个线程就可以并发的执行在多个处理机上了,这样才能充分地的利用技术革新带来的便利----多核处理机,又进一步的提高了操作系统的并发性。

​ 同时也正因为多处理机的迅速发展,OS的发展也得到了大大的促进。

4.栗子讲解

​ 下面通过对本文开始时的QQ聊天的例子的讲解,来说明进程和线程执行的特点。

​ 1.在上面的例子中,每个账号登录后,OS会创建一个对应的进程,会为之分配资源,我们登录的账号越多,创建的进程也就越多,最直观的感受就是,我们的电脑会变得有些卡顿(在当时,电脑的性能并不高,所以比较明显),这是因为创建进程、进程的调度时空开销较大,也就导致OS中的内存、CPU等资源的紧张。

​ 2.另一个情况,只登陆一个QQ,你打开了多个聊天窗口,是不是对你的电脑流畅度没有可以感知到的影响,这是因为线程的创建和调度所付出的时空开销很低,没有对OS形成较大的负担;

​ 3.还有一种情况,可能大家没有注意到,就是只登陆一个账号,对应着OS中创建了一个进程,打开多个聊天窗口,OS中创建多个进程,这里进程和线程的关系是不是一对多的关系,一个进程可以创建多个线程。

4.进程和线程的区别

​ 讲到这里,我们也把进程是什么,线程是什么讲明白了,进程和线程出现的目的,为了解决什么问题也弄清楚了,下面我们来总结下上面我们讲的内容,同时也对进程和线程之间的区别进行一个总结。

​ 首先是两者的定义:进程是OS分配资源的基本单位;线程作为OS调度和分派的基本单位;

​ 下面我们从调度行、并发性、系统开销和拥有资源等方面对线程和进程做一个比较。

1.调度的基本单位

​ 这里也主要是定义上的区别,在传统的OS中,进程是作为独立调度和分派的基本单位,因而进程是可以独立运行的基本单位。但是因为每次调度时,都需要进程上下文的切换,开销较大。而在引入了线程的OS中(现代OS),已把线程作为调度和分派的基本单位,因而线程是能独立运行的基本单位。因为线程只拥有较少的资源,所以线程切换的代价远小于进程。在同一个进程中,线程的切换不会引起进程的切换,但是从一个进程中的线程切换到另一个进程中的线程,必然会引起进程的切换。

2.并发性

​ 在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,甚至允许一个进程中的所有线程都能并发的执行。同样,不同进程中的线程也能并发的执行,使OS具有了更好的并发性,从而能更加有效的提高系统的资源利用与和系统的吞吐量。

3.拥有资源

​ 进程可以拥有资源,并作为系统中拥有资源的一个基本单位。然而,线程本身是不拥有系统资源的,而是仅拥有一点必不可少、能保证独立运行的资源,包括线程控制块TCB、程序计数器、一组寄存器和堆栈。

​ 但是线程除了拥有自己的少量资源外,多个线程之间还可共享该进程(线程所属的进程)所拥有的资源。

4.独立性

​ 同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多。这是因为进程拥有自己的独立地址空间和其他资源,并且为了防止不同进程之间彼此干扰和破坏,除了一些共享的全局变量外,不允许其他进程访问,因此不同进程之间的独立性高;另一方面,同一进程中的不同线程往往是为了提高并发性以及进行相互之间的合作而创建的,他们之间共享进程中的地址空间和资源,因此独立性低。

5.系统开销

​ OS为创建、撤销、调度进程耗费的资源明显的大于线程创建、撤销和调度所付出的开销。举个例子,线程的创建要比进程的创建快约30倍,线层的上下文切换要比进程的上下文切换快5倍。此外,由于一个进程中的多个线程具有相同的地址空间(共用进程的),线程之间的同步与通信也比进程的简单。

6.支持多处理机系统

​ 在多处理机系统中,对于传统的进程,即单线程进程,不管有多少个处理机,该进程只能运行在一个处理机上。但是对于多线程进程,就可以将一个进程中的多个线程分配到多个处理机上,使他们并发执行,这无疑会加快进程的完成。

继续阅读