进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
通俗的来讲,进程就是一个程序的运行实例,例如打开一个软件其实就是启动了一个进程,每个进程都拥有相对独立的进程上下文、文件资源、数据资源、运行代码、内存空间。
线程
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。线程拥有自己的栈空间。
对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。
无论进程还是线程,都是由操作系统所管理的。
有了进程为什么操作系统还要引入线程?
进程、线程所需要的资源直接或间接都依赖于操作系统,进程申请资源必须向操作系统申请,要通过很多手续,进程切换时也需要通过很多道程序,这些步骤、手续都是操作系统为了保障系统中所有进程正常执行所必需的,而线程的创建、申请资源、切换绝大部分都可以在进程内部(即用户空间)完成,不需要经过操作系统,不需要经过那么多道工序,自由度很高。
例如:一个村子是一个操作系统,外面有人(进程的创建)想要搬进村子,盖一所房子,那么必须去村委会让村长、村委数据、队长…等等一票人同意才可以。搬进来以后,有了一个小院子,你想在院子里种一颗果树(创建一个线程),这种事不会影响整个村子的治安,所以就不用无村委会申请了,直接种就可以,你的院子你做主。
所以引入线程可以有效的减少程序在并发执行时所付出的时空开销。
串行
串行是指A和B两个任务运行在一个CPU线程上,在A任务执行完之前不可以执行B。
举个例子:现在厨房要做一道香煎鲫鱼,那么在做鱼香煎鲫鱼前必须先要把鲫鱼解剖好去掉内脏,不然就没法把鱼下锅。
并行(同一时间动手做(doing)多件事情的能力。)
并行是指两者同时执行。
举个例子:做香煎鲫鱼的时候两个厨师一起解剖鲫鱼,这样就是并行。
并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在同时执行,这就要求必须有多个处理器。
并发(同一时间应对(dealing with)多件事情的能力。)
并发是指资源有限的情况下,两者交替轮流使用资源。
举个例子:做香煎鲫鱼的时候一个厨师一边热油锅一边解剖鲫鱼。
交替使用,目的是提高效率; 并发是从宏观上,在一个时间段上可以看出是同时执行的。
协程
协程,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。在了解协程之前,我们必须先了解为什么要引入协程,协程又解决了哪些问题?
首先我们需要了解一下在引入协程之前多线程之间是怎么协作的。
举个栗子:一个工厂,现在有四条产线(四个线程),现在要生产iphone11。但是每次物料提供部门运输过来的零件都只够两条产线上生产使用(互斥锁,资源竞争),那么抢到零件的产线就开始了生产,组装,包装,打包,另两个产线上的工人和机器都在原地等待下一次物料部门运过来的零件,那么没有开始生产的产线上的资源被闲置浪费了。
这个时候协程就闪亮登场了~
接着上个栗子:现在我们将每个产线(线程)分成多个工作组(协程):包装组、组装组、打包出库组。那么在没有抢到生产零件的时候,我们可以先让包装组和打包组先把包装用的箱子和打包出库用的大箱子先按规格准备好放到指定位置,然后只要iphone一组装好就可以开始进行包装和打包出库了,这样就提高了产线的生产效率(线程执行效率)。
最重要的是,工作组(协程)不是被工厂直接(操作系统内核)所管理,而完全是由产线(程序线程)所控制(也就是在用户态执行)。
这样带来的好处就是工作效率(性能)得到了很大的提升,不会像产线之间的切换和调度那样消耗资源(时间、空间),因为在大型工厂内产线之间的调度和切换是需要走很多部门的审批和流程的而工作组之间的调度和切换完全是产线自己所管理,则要轻便的多。