进程&线程

进程

在了解进程之前,我们需要先了解什么是程序。
程序 : 我们平时所说的程序,指的就是 存在硬盘中的可执行程序(.exe文件)。简单理解为就是一些存储在硬盘中的代码段。
进程 : 又称任务 , 指的是 正在运行中的程序或者是程序的一次执行过程 。 很抽象,听不懂,那我们举个例子:
当我们双击电脑中的QQ.exe文件时,此时我们的程序就被放在了内存中执行,执行我们就将这个正在执行中的程序叫做进程。

右键打开电脑的任务管理器,在任务管理器里面,我们就可以看到很多个进程。同时,我们会注意到,有些进程它们好像长的一模一样,这是因为,有些程序的代码逻辑是通过多进程实现的。举个例子:

我小时候家里没电脑,所以经常会让同学帮忙挂QQ,那么当我那个同学登录他自己的QQ时,操作系统就会创建一个进程,而当同学再登录我的QQ时,此时操作系统就会再创建一个进程。

同样,浏览器的网页也是这样子的,当我们打开一个网页的时候,就会创建一个新的进程

让我们再回到任务管理器上,不知道大家有没有发现一个很奇怪的事情,那就是我们的进程数目竟然有很多个,八十多个,但是我们电脑却只有一个CPU,那么这么多的进程,他们是怎么被管理的呢?又是怎么同时运行在我们的电脑上的呢?

进程管理

对进程的管理分为两步: 首先是描述我们的进程 接着是将进程们用一个数据结构组织起来

进程描述

每个进程在被创建出来的时候,操作系统就会给进程分配一个唯一的PCB(进程控制块),这个进程控制块上记录了该进程的属性和各种信息,通过PCB,操作系统就能很好的组织这些进程了。下面我们浅浅说一下进程的PCB的一些比较常见的属性

1.pid : 进程控制块的唯一id,类似于人类社会的身份证号码
2.内存指针 : 描述当前 进程所使用的内存的地址
3.文件描述符表 : 我们的进程在执行过程中, 打开一个文件后就会产生对应的文件描述符(标识被打开的文件),而进程在执行过程中,可能打开多个文件,所以将这些文件描述符放到一个类似于顺序表的结构里,构成文件描述符表
4.进程状态 : 描述当前 进程所处的状态
5.进程的优先级 : 进程的执行并非是公平的,有的进程是需要被优先执行的。
6.进程的上下文 : 进程的上下文 描述了当前进程执行到的位置以及进程的数据 , 当下次执行该进程后,就可以读取之前的数据,从上次结束的位置接着往下执行,和游戏的存档读档功能很像。
7.进程的记账信息 : 统计进程在CPU上的执行时间,可以作为进程调度的依据。执行的时间少了,接下来就优先执行该进程。这个有点抽象,举个例子

霸道总裁龙傲天有三个情人,分别是情人A,情人B,情人C,在这三个情人当中,C因为家族势力最弱,所以最不得霸道总裁欢心,所以,总裁每个月都只会抽出一个小时来陪C,就这样过了几个月之后,C就黑化了,对总裁爱答不理,于是,总裁就排查时间表,发现,自己陪C的时间太少了,于是接下来就多安排时间陪C,所以,我们的进程记账信息是

A 时间表 B 情人C C 总裁 D 我不知道(叉出去)

答案 : A

由PCB的各种属性,我们不难看出, 进程是操作系统进程资源分配的基本单位,也是调度的基本单位(没有多线程的情况下)

进程组织

操作系统往往采用 双向链表这样的结构来组织pcb

进程调度

在回答这个问题之前,我们同样还是打开我们的任务管理器,选择性能栏目,然后我们就可以看到我们的CPU的情况了,此处我们可以看到CPU的内核数目是4,逻辑处理器的数目是8,这两个的意思是当前我们CPU表面上是有四个可以干活的(内核),实际上却是有八个人在干活(逻辑处理器)

那么就很奇怪,八个干活的人,但是却有八十多个进程要处理,这就要求我们的干活的人必须都是时间管理大师了,那下面我们来看一下他们的时间管理大师们是怎么安排时间的吧

并行和并发

首先我们需要先了解两个概念:并发和并行

并行:在同一时间内, 多个处理器同时执行多个任务
并发:同一个时间间隔内, 一个处理器同时处理多个任务。(处理器先处理任务1,过一会再切换任务2处理,再切换任务3处理,只要切换的速度足够快,看起来就像是同时在处理三个任务一样)

举个例子:并行就是三个人同时吃三个馒头,那么三个馒头就是同时被吃掉;并发就是一个人同时吃多个馒头(先吃馒头1一口,再吃馒头2一口,再吃馒头3一口,一直切换吃的馒头,那么只要吃馒头的速度足够快,看起来就像是每个馒头都在同一时刻内被吃完,“虚假的被同时吃掉”)

不管是并发还是并行,其实都是 同时处理多个任务的手段,而且他们看起来都是“同时发生的”,但是实际上,只要并行是同时发生,而我们的并发,是“虚假的同时发生”。除此之外,我们 平时说的并发其实是并行+并发

进程在CPU上的执行就是并发的。如果,假设每个CPU核心都能处理两个进程,且每个进程能够上CPU执行的时间是有限的,我们将进程在CPU上执行的时间叫做时间片

并行:CPU上有多个处理器,可以同时处理多个进程。
并发:进程在CPU上执行的时间片到,进程就会离开CPU,接着其他进程就会被调到CPU核心上执行,同样,当时间片结束,那么,就会切换另一个进程,那么,只要切换的时间足够快(也就是时间片足够短),那么进程在CPU上的执行就可以看成是连续的,

举个例子:不知道大家有没有看过那种胶卷电影,如下图,在我们眼中,画面是运动的,但是实际上,我们看到的都是一帧一帧的图片,只不过是快速播放动作连续的图像,人眼就会自动形成一种运动的感觉。所以在我们看来画面是连续的,而我们进程的运行和这个原理类似,只要间隔的时间足够短,那么运行就可以看成是连续的。

线程

在前面我们讲过,多个进程之所以能够同时执行是因为进程之间的并发。但是,这里有一个问题,那就是切换进程的时候,带来的系统开销太大了,我们需要申请资源,释放资源 …… 所以,引入线程的概念。可以将线程理解为“轻量级的进程”,那也就是说,进程有的,线程都有,进程也有属于自己的TCB(线程控制块)

举个例子:当我们打开微信和女朋友进行视频聊天的时候,此时,我们突然想起要给班长发一个文件,于是,我们就把文件发给班长,同时,发微信给班长说自己已经交了。

在这个例子中,我们在微信上做了三件事 和女朋友视频 给班长发文件 和班长聊天

如果是多进程编程,那么就三件事就会对应三个进程,分别是视频进程,发文件进程,聊天进程,这三个进程之间是相互独立的,资源也是独立的。但是如果是多线程编程的话,我们只需要创建微信这个进程,然后在这个微信进程内创建三个线程,分别是视频,发文件和聊天,这三个线程都属于微信这个进程,那么此时,就三个进程就可以共享微信进程的资源了。
上面的图,我们可以看出,如果是 多进程编程,那么我们CPU在调度进程的时候,就需要不断的进行资源申请和分配,但是如果是多线程编程,此时就不需要了,我们只需要切换执行的线程,而不需要重新进行资源申请和分配,所以说,多线程带来的系统开销更小,提高了CPU的效率。
  • 上面说过,在没有多线程的时候,进程是调度的基本单位,那么,引入多线程之后,系统调度的基本单位就是线程了,但是资源分配的基本单位依旧是进程。

进程和线程的区别

  • 进程是资源分配的基本单位,线程是系统调用的基本单位

  • 不同进程之间资源是独立的,同一个进程的不同线程共享资源

  • 当一个进程出现bug的时候,不会对其他进程造成影响;当同个进程的线程出bug的时候,可能导致其他线程出bug,甚至于带走整个进程

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值