00:00
好,我们接着上午的内容呢,继续往下边讲啊,继续往下边讲。那上午呢,我们已经讲了一个歌的一个呃快速入门案例,我们也把它的一个主线程和它和携程执行的一个流程做了一个说明,那下面呢,我们来继续看他的一些呃,需要给他点出来的。这些个重要的知识点。那从上一个快速入门案例里边呢,我们可以得出这样一些结论啊,第一个结论我们来看一下。主线程呢,它是一个物理线程,就主线程它是直接作用在一个CPU上面的,是重量级的,非常的耗费CPU资源,就主先生是一个物理级的,就操作系统来控制的。那么携程呢?它是从主携程开启的,是轻量级的线程逻辑态,相对来说资源消耗相对较小。啊,这是第二点,第三点呢,勾浪的协程机制是重要的一个特点。
01:01
可以轻松的开启上万个携程,其他编程语言呢的并发机制一般是基于线程,那开启过多线程呢,资源耗费大,这里就凸显出勾浪在并发上的优势,所以这块呢,我们个人感觉哈,就是勾浪在携程在并发这上面呢,确实是它的一个特色,一个特色好,那么这个快速入门的一个小节,我们先把它板出到笔里边去,然后接着往下看。啊,我的笔记上午好像关掉了。关掉吧,再打开一下,打开笔记。A打开笔。对。好,然后呢,我们把这个放到笔记里面去,二级往下拉。好,有点闷啊。往这儿走。这是快速入,把它关了。
02:04
好,快速入门的一个总结,给他来一个标题三。好把这个内容呢放到这儿诶。快速入门,然后了,我们重点就是做了这么三个啊,点的一个说明。第一点对吧,要明白主线程它是比较耗耗资源的。然后呢,Go浪呢,它可以很轻松的开启上万个携程。而且呢,你的系统也不会崩崩溃。接着往下看,那下面呢,我们就来看一下GR的它的一个调度模型是一个什么样的机制,我我说一下啊,这个MPG是它的一个调度模模型,这个模型呢,我们也不需要说把它了解的多么多么的这个透彻,但是呢,基本的这个原理大家还是要知道的,一般呢,就是面试的时候。如果问到go的核心,这个开发呢,多少会提一下MPG是什么东西,那么来看看MPG是什么?首先我们来分别对MP和G做一个介绍,第一个呢,M呢,它代表的是操作系统的一个主线程。
03:14
它代表是一个主线程,就M相当于是我们的这个主线程,你可以这么去理解啊,就好像我们线程是从这开始执行的,那么它是一个物理级的线程,所以说它比较耗费资源,那么P是什么东西呢?P你可以认为它是一个我们在整个这个执行过程中的一个上下文环境。什么叫上下文环境呢?啊,这个上下文环境,你们在很多编程语言里面都会有提到一个东西,所以上下文环境你可以简单理解成说,我这个运行的时候所需要的一些资源啊,啊资源,或者他的一个当时的操作系统的一个状态。那么你可以这样理解,就好像说我们这儿有一个M主线程。
04:00
对,那么在我们运行的过程中,比如说在这个位置啊,我们需要开启一个携程,那么在携程起来的时候呢,它需要有一个上下文的环境。就好像一个人一样,我们这个人生活在什么地方啊,一个人要生活,他得有空气,他得有水,对吧,那这个我们说人的生上下文环境,就是你生活的这个环境,你不能把一个人扔在这个火星上去,你把扔在月球上game over了,就好像我们一个,我们这个一个go浪起来时候,它要依赖于当前操作系统的环境,你有没有,你还有没有这个内存可分配啊,你还有没有CPU可分配啊,这些都可以称之为上下网环境,它是一个,它是一个很,就是相对来说,相对来说是相对来说比较抽象的一个概念,就是它需要的资源和它运行的一个当时的一个状态。啊,就这么理解啊,像人一样,对吧,你得有空气有水才能生活,那么这个记呢,就是个邪程,携程是指的什么意思呢?就说在我的这个创建这个过程中,比如说我在这个创建过,呃,运行过程中,突然我在这个这个地方,我需要去开启一个携程,那么这个携程可以往这走。
05:11
哎,我这边可以有我的携程,甚至这个携程呢,还可以形成一个什么呀队列。它可以形成一个对立,那么比如说我运行到这个位置,哎,我运到这个地方,我又需要开发一个创建一个携程了么?我这地方又算是一个节点,或者是上下文的一个环节,那么从这呢,我又可以继续开启我的另外的其他的携程啊,同样也可以形成一个形,形成一个队列啊,形成一个队列,简单的这么理解啊,简单这么理解,那下面呢,我们再来看一下具体的说明。来看一下啊啊,我这儿呢,举了一个例子,同学们,我这举了一个例子,这有这也给大分给他找了两篇相对来说比较经典的文章,待会待会呢,我们也带大家简单看一下,那么我们看一下这个东西啊,这块我就描述一下就行了,大家看MPG模式运行的状态,一就说第一种情况,我们来分析一下。
06:06
嗯,大家听我说就行了,说当前程序有三个M啊,三个M就三个这个M,如果三个M呢,都运行在一个CPU,我们就称之为并发。啊,并发就是这样来的,那如果说它运行在不同的CPU呢,我们认为就是并行啊就是并行就是我们可以认为什么呢?诶这有这个,这有一个M,一个主线程,这有一个M,这有一个M,那就看这个M它是作用在一个CPU还是作用在多个CPU的。作用在一个CPU呢,我们就认为是并发,作用在多个CPU呢,我们就认为是并行啊,这是第一个概念,第二点呢,就M1M2M3。正在执行一个G,大家看到从这里可以看出来,对于这个这个M1,这我们把它叫M1吧,我们把这个叫叫M2,把这个叫M3。
07:05
那么从这里可以看出来,在这个M1呢,他现在正在执行的是这个G。这是个携程,它正在实行。同样M同样呢,这个这边也在执行一个G。啊,这边也在执行一个G。当然它这个主线程也也在执行一个G,嗯,那么从这里看出来,这还有个队列M1,它这个斜程呢,还形成了一个队列,说明他这个这边还还有好多携程等着他去执行,这边也有,这边呢只有一个携程在等待啊,从这个从这个状态来说,我们可以看到这样一个情况。那么从这个地方,这就是一种,这就是他的一种运行的一种模式啊,运行的一种模式就是说我们可以看到在P这个地方呢,它可以开启GG这方多了的情况下,它可以进行一个队列。啊,这是它的一个模式,从这里还要看到啊,同学们,像这种G就是携程呢,呃,可以轻松的起上万个这样的携程,每个携程呢,可以去完成他的一个任务。
08:12
那么其他程序呢,比如像C和C加加的这个呢,是多线程,那它起的是线程,线程呢往往是内核态的比较重量级,几千个线程就有可能耗光你的CPU。啊,曝光你的CPU,这是他的第一种状态,那这个有些同学说老师这个文章有没有更好一点的,大家看一下,我这找了一篇文章。啊,大家看一下关于MPG的这个呢,说的还是比较啊,也是大致的,就是把这个说的更应该更清楚一点啊,更清楚一点。啊,这个同学们呢,这个下了课过后去把它再看一看啊,把它再看一看,有有兴趣的同学就去看一看啊,大致跟我说的也是,呃,核心的内容差不了太多,比如说你看这他上来过后呢,先对MPG做了一个简单的一个介绍。
09:04
然后呢,他就举了一个案例,比如这个案例就是刚才老师画的一个很像很像,比如说这这有个M对吧,这挂了三个G,这边呢,有一个P挂了三个G,形成一个队列啊形成一个队列。好,这边它有相应的一个说明,还有一篇文章呢,还有一篇文章也给大家分享一下。还有一篇文章,把它打开MPG2,诶MPG2打开它看这篇文章,这篇文章呢,呃,说的就相对来说,他找了一点源代码在里边啊,就说地立面是大致是怎么样子的,但是呢,他这儿也是写一个大概的一个介绍。啊,大概就是说他是怎么形成这个,形成这种MPG模式的啊,你比如说他说要了解这个事儿,首先得了解操作系统是怎么玩线程的,那这样一说的话就麻烦了,他得一起去讲这个操作系统啊,所以说这块呢,我们也没有,也没有必要去说太多,你有兴趣的同学你就看看看这他说的很清楚,看到没有,这个跟我的观点很像。
10:08
啊,他说县城又老贵了,我觉得就说白了就是比较耗资源嘛,所以说他够就搞了一个这个gro,那他这边就剪了一下县程和我们这个的一个什么呀,区别啊,区别它是从从这个编译器的这个角度呢,做了一些分析啊,做了一分做了一些分析,也讲一些简单的源代码啊,讲一些源代码,有兴趣的同学呢,可以去简单看一看啊,分析的还算还算可以,代码也比较简单。这这帮代码它也是按照这个GOGO的这种这这种语法来做的这个介绍啊,这这些绍有兴趣的同学晚上把一啊把它lawyer好的,呃,这是他讲的MPG的一些东西,那接着我们再来看了,接着我们再来往下看,那除了这种模式呢,我这还有一个动态的一个状态,这个呢比较有意思,我们来分析一下来看。
11:02
我们来举一个。一个动态的MPG运行的一个状态二,那么大家听一下,比如说。比如说现在有这么一个情况,分成两部分来看啊,分成两部分来看,这边是一部分,这边又是一部分,原来的情况是M0。I0这个就说这个呢,主线程正在执行勾零这个携程。他正在执行一个勾零,这个携程,另外有三个携程呢,在这里等待。在这里等待。等待时如果遇到了一个构灵携程被阻塞,他阻塞阻塞了,比如什么情况下会阻塞这个一个携程呢,比如说读文件或者数据库,因为你读文件呢,这个时候他不知道要花多少时间,操作系统呢,它就会就说我们这个。这个携程呢,它它这个底层就会想,诶,你这个地方读一个文件,到底要读多久,我不知道。
12:00
那说有些同学老师读文件也不是挺快的吗?读一读一秒钟,读两秒钟不是挺快的吗?对,读一秒读两秒,对我们这个计算机来说已经很长了,他认为你在读文件的时候,我的CPU呢有点浪费,所以这个时候呢,他有可能会做这样一件事情,因为你七零要去做别的事,CPU在他们处于一个空闲状态,他会怎么办呢?这个时候。就会创建一个叫M1的,大家看它会创建一个叫M1的这么一个主线程,那也有可能这个是已经从有的一个线程时取出M0,这个根据当时的情况,比如说以M0在运行了,那么它有可能维护了一个线程时。啊,它有可能维持维在它的底层维护了一个线程时。啊,线程池,那么线程池比如说里面也有可能预留了一个M1,但也可能没有,不知道,这个就跟操作系统底层相关了,如果有呢,我就把这个M1MM1这个拿过来唤醒它,让它工作,如果没有呢,诶我就创建,那这个情况就跟操作系统底层有关系了,跟你的上下文环境有关系。
13:15
啊,那么不管怎么样,他有个M1,他有M1干什么事呢?诶,他M1的作用就是说你原先不是这挂了三个既在等待吗?诶现在我就可以来为你工作了,怎么办呢?并且将等待的三个携程挂到M1下面去执行,有些同学可能对这个单词不好理解,挂到。这个是一个比较通俗易懂的讲法,其实说到我们程序底层呢,说白了可能就是一个链表,也可能是一个队列,说数据结构完全可以做挂到,你可以简单的认为让这个M1指向。一个队列,那么指向这个队列很简单,因为队列这些东西呢,一般我们呃,我们可以创建,然后把这个队列纸指向给他就行了,就相当于挂到上面去了,挂到这个M1过后呢,这个M1呢,就干什么事呢?哦,它就这样子的挂到下面过后,它就开始执行,那么M0这个主线程呢,加值共零仍然执行这个,呃,它原先这个G0的这个读写。
14:19
好注意啊,它读写的时候它就已经相当于阻塞了啊,主写的时候阻塞了,那么这样的MPG模式有什么好处?它有什么好处呢?总结一下,既可以让G0去读它的文件啊,既可以正常的读文件去组织,呃读文件,同时也不会让队列中的其他携程一直阻塞,没有机会执行。就说就好像这个有点有点意思啊,就好像打个比方说。所以现在呢,有一个餐馆,有个餐馆呢,我们去。我们我们去吃饭,前面有一家有一堆家伙呢,是这样子的,就说我们排队,我们排队有一个厨子正在这炒菜啊,厨子呢,就就相当于这个主线程,这叫炒菜,炒着炒着呢,它本身是给一个客户在炒菜,这个炒菜的时候,诶突然。
15:12
有件事情来了,他给那家炒菜的时候呢,要给要给客户A。假设这是客户A,这是客户D,客户C,客户D,那么K客户A要的菜特别的多,他一下子他们这个客户呢,一共点了有100个菜。啊,BB和C呢,是我们同学,我们同学呢,中午要吃饭呢,我们只点一个盖饭完蛋,这个麻烦很大很大了,如果我们只为这个客客户一服务的话,那么B和C可能等到一两点半了,那我我今天吃不了饭了,麻烦对吧,那他有什么机制呢?他有这样一个机制,因为客户A要死100个菜呢,其中有一道菜是干什么呢?叫叫叫这个红烧熊猫肉啊,红烧熊猫肉这个时候他得他得去去搞一些,比如我们不是红烧熊吃吃熊猫肉是犯法的啊,比如他吃那个海鲜,那海鲜在做的时候呢,他有个有道工序。
16:12
是要让他的,那有一个事情,他要先把这个海鲜,比如说临时的去那个洗一下呀,那个去泡呀发呀,要需要点时间,那这个时候应该他在这这个去做这个海鲜的时候呢,诶他有点空闲时间了。因为海鲜可能是需要洗的时候,他去让他的另外一个助手对吧,去洗一洗,或者是要泡一泡,需要点时间,比如说这个海鲜要泡,要泡五分钟才能够干什么呢,才能够去煮,哎,那这个时候呢,他把这个海鲜一泡,相当于煮塞在这了。主材在这儿,但是呢,他有时间了,这个时候他就找把这个这个正在排队的B客户说,诶你要什么,我要一个。鱼香肉丝盖饭,诶,我临时就给你炒一份,炒完了过后呢,诶如果炒完了过后,你这个B就服完了,然后这边的海鲜呢,也泡好了,我再回头回来再执行机灵。
17:08
就有点儿类似于这种感觉啊,我说的这种感觉,所以说他这种机制呢,既可以让G0进行一个执行,同时也不会让队列的其他程序一直阻塞,仍然可以并发和并行执行。当然了,有些同学说老师,那这个你给你给B去做一个鱼香肉丝,不就五分钟,不就五分钟吗?那有可能。有可能这个这个五分钟没有把鱼香酥炒好怎么办呢?难道炒半截就跑了吗?是这样子的啊同学们,我们说的五分钟也好,这边这边泡海鲜五分钟,这边炒五分钟,这是我们我们这个我们这个人的一种时间的,这个这个这个单位在计算机里面,它其实片段很多,明白我意思吧,它片段很多,他来回一切可能0.01毫秒一下就切过去,因为他这样一切可能是瞬间就完成,比诶这边马上又又有个事情,他马上起过又去干,然后又又就来回这个东西呢,他就有效的把CPU利用起来了,就你不能理解成。
18:10
就跑海鲜,他还还还干很多其他事儿,这样来回的一切换呢,才可以既保证我们主线程的一种执行,又能够保证这个携程的一种执行,对不对,好,这样的就并发和并发和并行都能执行,那么这是M,那另外一个M呢,作用在另外一个CPU上,那就更好了,那就说并行也可以这样做啊,这是它的一种机制。好,等到G0不阻塞了,不阻塞的时候就说,诶假设呃,他的文件读读取完毕了,M0呢又会被放到空闲的主先生继续执行,哎,等等等等,也是这样子一种感觉啊,这种感觉啊,我我呢就举了这么一个例子来讲解这个MPG,大家看看能不能理解。呃,我再说一遍啊,MPG这种模式,咱咱们要了解的就是几点呢?第一点你要给别人,别人问到这个MPG,你能够大概知道MPG是什么东西,这个你能给他答上来,这是第一点,第二点呢,你要明白在工作的时候,它的模式是。
19:14
M代表一个主线程往下执行的时候,它这个P可以去根据实际情况开启一个斜程去工作。啊,这个M呢,这M可能有很多,这些M既可能是执行在1111个CPU上。它可能是这几个都挂在同一个CPU的,它也有可能是每一个M挂一个CPU,那那个就要并行,这一点要要明白,第三点呢,就是同学们要清楚的知道,当有一个携程被阻塞的时候,它有一种来回怎么样切换的这么一种机制,这种机制呢,既能够保证我们M的一种这个主线程的执行,同时呢,也能够让排队的这种G。
20:00
啊,这种携程得到一种执行的机会,因为这个时间呢,来回切换比较快,所以说你感觉效率很高,有效的利用了我们的CPU的这种资源。还有晚上同学们要有兴趣的同学呢,把这两篇文章再看一看,可能会理解的更透彻一点,OK,把这个理解了就可以了,也不需要同学们研究的特别的透彻,因为我们更要理解的是待会儿最重要的是什么呢?要理解go,携程和channel的一种通讯,这个是我们的重点,OK,好了,因为这个东西你理解不理解都是谁来谁来做的呢?是操作系统加编译器。他们来完成的,好了,那现在我们就简单的把这一个啊MPG的,诶这么这么一个东西呢,给大家介绍到这里啊,都是文字文文字性的东西,好同学们来,我把它进行一个板书,我们这里讲了一下,就是gro的一个调度模式,我们进行一个板书,OK,第一点我们讲了一下什么呢。
21:03
讲了MPG模式的基本介绍,就是它是什么?解决了一个问题,它是什么?OK,我把它放在这里。我解决了一个它是什么的问题。它是什么呢?诶,它是这么一个东西。对,他是这么一个东西。好。这是是什么,第二个呢,我们举了两个MPG的模式,它的运行的一个模式,第一个就是有多个M之间的,他们是怎么玩的,这是一种。这个呢,相对来说是一种呃,分析的一种静态的一种模式。给他来一个标题三对奖励一个这样的模式。啊,OK。我放到这里了。这是讲了一个这个东西,然后这有两篇文章,两篇文章有兴趣的同学晚上去看一看好,没有兴趣你也也无所谓好,然后呢,我又讲了MPG的运行的模式,一个相对动态的一个模式。
22:05
就是当阻塞的时候会怎么去处理,对它的底层会怎么去处理。好,给他来一个标题三,然后呢,这里我们再板述一下。好,可以啊,下面我们就来开始。来讲它的一个应用了。OK,好,这个是MPG介绍,我先截取一段视频。
我来说两句