新闻资讯

新闻资讯 媒体报道

带着问题学,协程到底是什么?

编辑:013     时间:2021-06-30
前言

随着kotlin在Android开发领域越来越火,协程在各个项目中的应用也逐渐变得广泛

但是协程到底是什么呢?

协程其实是个古老的概念,已经非常成熟了,但大家对它的概念一直存在各种疑问,众说纷纷
有人说协程是轻量级的线程,也有人说kotlin协程其实本质是一套线程切换方案

显然这对初学者不太友好,当不清楚一个东西是什么的时候,就很难进入为什么和怎么办的阶段了
本文主要就是回答这个问题,主要包括以下内容
1.关于协程的一些前置知识
2.协程到底是什么?
3.kotlin协程的一些基本概念,挂起函数,CPS转换,状态机等
以上问题总结为思维导图如下:

1. 关于协程的一些前置知识

为了了解协程,我们可以从以下几个切入点出发
1.什么是进程?为什么要有进程?
2.什么是线程?为什么要有线程?进程和线程有什么区别?
3.什么是协作式,什么是抢占式?
4.为什么要引入协程?是为了解决什么问题?
1.1 什么是进程?

我们在背进程的定义的时候,可能会经常看到一句话

    进程是资源分配的最小单位

这个资源分配怎么理解呢?

在单核CPU中,同一时刻只有一个程序在内存中被CPU调用运行

    假设有A、B两个程序,A正在运行,此时需要读取大量输入数据(IO操作),那么CPU只能干等,直到A数据读取完毕,再继续往下执行,A执行完,再去执行程序B,白白浪费CPU资源。

这种方式会浪费CPU资源,我们可能更想要下面这种方式

    当程序A读取数据的时,切换 到程序B去执行,当A读取完数据,让程序B暂停,切换 回程序A执行?

在计算机里 切换 这个名词被细分为两种状态:

    挂起:保存程序的当前状态,暂停当前程序; 激活:恢复程序状态,继续执行程序;

这种切换,涉及到了 程序状态的保存和恢复,而且程序A和B所需的系统资源(内存、硬盘等)是不一样的,那还需要一个东西来记录程序A和B各自需要什么资源,还有系统控制程序A和B切换,要一个标志来识别等等,所以就有了一个叫 进程的抽象。
1.1.1 进程的定义

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体主要由以下三部分组成:

1.程序:描述进程要完成的功能及如何完成;
2.数据集:程序在执行过程中所需的资源;
3.进程控制块:记录进程的外部特征,描述执行变化过程,系统利用它来控制、管理进程,系统感知进程存在的唯一标志。
1.1.2 为什么要有进程

其实上文我们已经分析过了,操作系统之所以要支持多进程,是为了提高CPU的利用率
而为了切换进程,需要进程支持挂起与恢复,不同进程间需要的资源不同,所以这也是为什么进程间资源需要隔离,这也是进程是资源分配的最小单位的原因
1.2 什么是线程?
1.2.1 线程的定义

轻量级的进程,基本的CPU执行单元,亦是 程序执行过程中的最小单元,由 线程ID、程序计数器、寄存器组合和堆栈 共同组成。
线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。
1.2.2 为什么要有线程?

这个问题也很好理解,进程的出现使得多个程序得以 并发 执行,提高了系统效率及资源利用率,但存在下述问题:

        单个进程只能干一件事,进程中的代码依旧是串行执行。
        执行过程如果堵塞,整个进程就会挂起,即使进程中某些工作不依赖于正在等待的资源,也不会执行。
        多个进程间的内存无法共享,进程间通讯比较麻烦。

线程的出现是为了降低上下文切换消耗,提高系统的并发性,并突破一个进程只能干一件事的缺陷,使得进程内并发成为可能。
1.2.3 进程与线程的区别

    1.一个程序至少有一个进程,一个进程至少有一个线程,可以把进程理解做 线程的容器;
    2.进程在执行过程中拥有 独立的内存单元,该进程里的多个线程 共享内存;
    3.进程可以拓展到 多机,线程最多适合 多核;
    4.每个独立线程有一个程序运行的入口、顺序执行列和程序出口,但不能独立运行,需依存于应用程序中,由应用程序提供多个线程执行控制;
    5.「进程」是「资源分配」的最小单位,「线程」是 「CPU调度」的最小单位
    6.进程和线程都是一个时间段的描述,是 CPU工作时间段的描述,只是颗粒大小不同。

1.3 协作式 & 抢占式

单核CPU,同一时刻只有一个进程在执行,这么多进程,CPU的时间片该如何分配呢?
1.3.1 协作式多任务

早期的操作系统采用的就是协作时多任务,即:由进程主动让出执行权,如当前进程需等待IO操作,主动让出CPU,由系统调度下一个进程。
每个进程都循规蹈矩,该让出CPU就让出CPU,是挺和谐的,但也存在一个隐患:单个进程可以完全霸占CPU

计算机中的进程良莠不齐,先不说那种居心叵测的进程了,如果是健壮性比较差的进程,运行中途发生了死循环、死锁等,会导致整个系统陷入瘫痪!
在这种鱼龙混杂的大环境下,把执行权托付给进程自身,肯定是不科学的,于是由操作系统控制的抢占式多任务横空出世
1.3.2 抢占式多任务

由操作系统决定执行权,操作系统具有从任何一个进程取走控制权和使另一个进程获得控制权的能力。
系统公平合理地为每个进程分配时间片,进程用完就休眠,甚至时间片没用完,但有更紧急的事件要优先执行,也会强制让进程休眠。
这就是所谓的时间片轮转调度

    时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
    如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
————————————————
版权声明:本文为CSDN博主「码农 小生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_58350991/article/details/117933297
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐