面试题:进程 线程 协程

Source

 

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位

通俗的讲:进程可以理解为我们在电脑上正在运行的一个个应用,例如:QQ,微信,LOL

 

打开一个浏览器就是一个进程,打开两个浏览器就是两个进程,进程和进程之间具有独立性,它们具有各自的虚拟地址空间和文件描述符

线程 thread

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。同一个进程的多个线程之间是共享同一份虚拟空间地址和文件描述符的。在一个进程中的多线程,可以并发的执行(后面有并发的介绍)。就拿百度网盘来说,如果有下载任何和上传任务的话,那么百度网盘这个进程里面至少有两个线程来完成工作,一个是上传 一个是下载

 

  • 我们使用htop来看一下,百度网盘开了几个线程

  • 进程和线程我们都讲过了,那么现在来问一个问题,如何实现多任务?其实如果你看完了进程和线程应该也能明白,多任务嘛,可以 多进程 也可以多线程,还可以采用多进程+多线程的方式

协程coroutine

在详细讲解协程之前,我们先看一下这个场景,比如一个饭店有两个厨师,一个小工,小工负责摘菜 洗菜 啥的,那么饭店运转的时候,其实就有三个线程,这没有问题,但是忽然有一天小工请假了,就剩下两个厨师了?怎么办?老板这时候说,你看你俩也不是很忙,有人点菜的时候就炒菜,没人点菜的时候就洗洗菜啥的,别闲着(周扒皮已上线),明白了吧,就是为了更高效率的利用线程,而不是频繁的创建线程 销毁线程 以及CPU频繁的切换上下文,不能让线程闲着

  • 协程,英文Coroutines,是一种基于线程之上,但又比线程更加轻量级的存在,因为是自主开辟的异步任务,所以很多人也更喜欢叫它们纤程(Fiber),或者绿色线程(GreenThread)。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。具有对内核来说不可见的特性。(其实这里有一个问题,就是协程是无序的,那么我们怎么保证数据的事务性呢?有好的想法可以和我交流哦)

进程的状态

三种基本状态

三种基本状态:就绪态、执行态、阻塞态。这三种基本状态每个OS 中都会有的,因些称为基本态,下而是给出三种基本状态的定义:

  • 就绪(Ready)状态 通过Ready 我们可以看到,处于此状态的进程已经处于准备好要运行了。此时进程已经分配好除CPU 外的所有必要资源,只需要获得CPU,便可立即执行。处于就绪态的进程都是在就绪队列中,等待着调度程序的调度(分配CPU)。

  • 执行(Running)状态 处于此状态的进程是已经获得CPU 且正在执行中。对于这一状态,在单CPU OS 中,同一时刻只能有一个进程处于此状态,而在多CPU OS,则可以有多个(不超过CPU 的数量)进程同时处于执行状态。

  • 阻塞(Block)状态 处于此状态的进程是因为在执行的过程中由于发生某种需要等待的事件(I/O 请求,申请缓存失败,等待接收数据等),而暂时无法继续运行。在多道批处理系统中,此时需要进程把处理机释放,并选取新的就绪进程执行。与就绪队列相对应的,处于阻塞状态的进程都在阻塞队列中,某些OS 中,出于提高效率的目的,根据阻塞的原因,会有多个阻塞队列。

 

在这里插入图片描述

上图是进程的三种基本状态的转换图,进程在运行的过程中会经常的发生状态的转换。从图中我们可以看到,就绪态和执行态是可以相互转换的,但是执行态到阻塞态是单向的,这是因为就算阻塞的进程“通畅” 了,因为处理机已经分配给别的进程了,因此进程的状态只能切换到就绪态,并且也是单项的,因为等待的事件也只可以在执行中才能发生。

创建状态和终止状态

我们知道,进程创建时,需要对其分配除CPU处的所有的必要资源, 但是,如果此时OS 因为资源不足无法给进程分配资源,那么进程应该处于什么状态呢?

为了满足上述问题,满足进程状态的完整性以及增强管理的灵活性, 通常会在OS中为进程新增两种常见的状态:创建状态和终止状态。

下面给出两种状态的定义:

创建状态 进程创建的过程中,所需的资源尚不能得到满足,此时创建工作尚未完成,进程无法被调度执度,进程此时就处于创建状态。终止状态 进程正常运行结束或都出现导致进程终止的错误,或是被 os 所终结,或是被父过程终结,则进入终止状态。进入终止状太的进程将不能再执行,但是OS 依然保持一个记录,其中保存着状态码和计时器统计数据,等待别的进程收集,一旦资源被收集完成,OS 会立即删除该进程。

认识并发和并行

  • 如果我们第一次理解并发,很容易理解错误,认为并发 就是同时发生的意思,而慢慢的,你会了解到并行,那么我们就先看看并发和并行。
  • 并发 并发是指一个cpu交替执行多个任务,而不是同时执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序对于时间片资源的争夺。通俗点理解,并发就像一个厨师架了两口锅,一个炒西红柿鸡蛋,一个炒尖椒肉丝,猛一想,好像是一个厨师同时在炒两个菜,但其实,同一个时刻,厨师只能颠一个勺,颠完西红柿鸡蛋颠尖椒肉丝。来回切换。这里面的厨师 就是CPU 。西红柿鸡蛋和尖椒肉丝就是要处理的线程。
  • 并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。我想起来小时候家里养的一头母猪,可以同时奶12个猪仔(一般母猪有6对乳头,即12个乳头,养殖必备知识点,记一下),对应起来,这头母猪其实就是一个12核的计算机,同时奶12个猪仔这件事情,就是并行(尴尬的笑😁)