GO语言教案和ppt内容 go语言第一课

【golang详解】go语言GMP(GPM)原理和调度

Goroutine调度是一个很复杂的机制,下面尝试用简单的语言描述一下Goroutine调度机制,想要对其有更深入的了解可以去研读一下源码。

在皮山等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站建设、成都网站制作 网站设计制作按需网站策划,公司网站建设,企业网站建设,品牌网站建设,成都营销网站建设,外贸网站建设,皮山网站建设费用合理。

首先介绍一下GMP什么意思:

G ----------- goroutine: 即Go协程,每个go关键字都会创建一个协程。

M ---------- thread内核级线程,所有的G都要放在M上才能运行。

P ----------- processor处理器,调度G到M上,其维护了一个队列,存储了所有需要它来调度的G。

Goroutine 调度器P和 OS 调度器是通过 M 结合起来的,每个 M 都代表了 1 个内核线程,OS 调度器负责把内核线程分配到 CPU 的核上执行

模型图:

避免频繁的创建、销毁线程,而是对线程的复用。

1)work stealing机制

当本线程无可运行的G时,尝试从其他线程绑定的P偷取G,而不是销毁线程。

2)hand off机制

当本线程M0因为G0进行系统调用阻塞时,线程释放绑定的P,把P转移给其他空闲的线程执行。进而某个空闲的M1获取P,继续执行P队列中剩下的G。而M0由于陷入系统调用而进被阻塞,M1接替M0的工作,只要P不空闲,就可以保证充分利用CPU。M1的来源有可能是M的缓存池,也可能是新建的。当G0系统调用结束后,根据M0是否能获取到P,将会将G0做不同的处理:

如果有空闲的P,则获取一个P,继续执行G0。

如果没有空闲的P,则将G0放入全局队列,等待被其他的P调度。然后M0将进入缓存池睡眠。

如下图

GOMAXPROCS设置P的数量,最多有GOMAXPROCS个线程分布在多个CPU上同时运行

在Go中一个goroutine最多占用CPU 10ms,防止其他goroutine被饿死。

具体可以去看另一篇文章

【Golang详解】go语言调度机制 抢占式调度

当创建一个新的G之后优先加入本地队列,如果本地队列满了,会将本地队列的G移动到全局队列里面,当M执行work stealing从其他P偷不到G时,它可以从全局G队列获取G。

协程经历过程

我们创建一个协程 go func()经历过程如下图:

说明:

这里有两个存储G的队列,一个是局部调度器P的本地队列、一个是全局G队列。新创建的G会先保存在P的本地队列中,如果P的本地队列已经满了就会保存在全局的队列中;处理器本地队列是一个使用数组构成的环形链表,它最多可以存储 256 个待执行任务。

G只能运行在M中,一个M必须持有一个P,M与P是1:1的关系。M会从P的本地队列弹出一个可执行状态的G来执行,如果P的本地队列为空,就会想其他的MP组合偷取一个可执行的G来执行;

一个M调度G执行的过程是一个循环机制;会一直从本地队列或全局队列中获取G

上面说到P的个数默认等于CPU核数,每个M必须持有一个P才可以执行G,一般情况下M的个数会略大于P的个数,这多出来的M将会在G产生系统调用时发挥作用。类似线程池,Go也提供一个M的池子,需要时从池子中获取,用完放回池子,不够用时就再创建一个。

work-stealing调度算法:当M执行完了当前P的本地队列队列里的所有G后,P也不会就这么在那躺尸啥都不干,它会先尝试从全局队列队列寻找G来执行,如果全局队列为空,它会随机挑选另外一个P,从它的队列里中拿走一半的G到自己的队列中执行。

如果一切正常,调度器会以上述的那种方式顺畅地运行,但这个世界没这么美好,总有意外发生,以下分析goroutine在两种例外情况下的行为。

Go runtime会在下面的goroutine被阻塞的情况下运行另外一个goroutine:

用户态阻塞/唤醒

当goroutine因为channel操作或者network I/O而阻塞时(实际上golang已经用netpoller实现了goroutine网络I/O阻塞不会导致M被阻塞,仅阻塞G,这里仅仅是举个栗子),对应的G会被放置到某个wait队列(如channel的waitq),该G的状态由_Gruning变为_Gwaitting,而M会跳过该G尝试获取并执行下一个G,如果此时没有可运行的G供M运行,那么M将解绑P,并进入sleep状态;当阻塞的G被另一端的G2唤醒时(比如channel的可读/写通知),G被标记为,尝试加入G2所在P的runnext(runnext是线程下一个需要执行的 Goroutine。), 然后再是P的本地队列和全局队列。

系统调用阻塞

当M执行某一个G时候如果发生了阻塞操作,M会阻塞,如果当前有一些G在执行,调度器会把这个线程M从P中摘除,然后再创建一个新的操作系统的线程(如果有空闲的线程可用就复用空闲线程)来服务于这个P。当M系统调用结束时候,这个G会尝试获取一个空闲的P执行,并放入到这个P的本地队列。如果获取不到P,那么这个线程M变成休眠状态, 加入到空闲线程中,然后这个G会被放入全局队列中。

队列轮转

可见每个P维护着一个包含G的队列,不考虑G进入系统调用或IO操作的情况下,P周期性的将G调度到M中执行,执行一小段时间,将上下文保存下来,然后将G放到队列尾部,然后从队列中重新取出一个G进行调度。

除了每个P维护的G队列以外,还有一个全局的队列,每个P会周期性地查看全局队列中是否有G待运行并将其调度到M中执行,全局队列中G的来源,主要有从系统调用中恢复的G。之所以P会周期性地查看全局队列,也是为了防止全局队列中的G被饿死。

除了每个P维护的G队列以外,还有一个全局的队列,每个P会周期性地查看全局队列中是否有G待运行并将其调度到M中执行,全局队列中G的来源,主要有从系统调用中恢复的G。之所以P会周期性地查看全局队列,也是为了防止全局队列中的G被饿死。

M0

M0是启动程序后的编号为0的主线程,这个M对应的实例会在全局变量rutime.m0中,不需要在heap上分配,M0负责执行初始化操作和启动第一个G,在之后M0就和其他的M一样了

G0

G0是每次启动一个M都会第一个创建的goroutine,G0仅用于负责调度G,G0不指向任何可执行的函数,每个M都会有一个自己的G0,在调度或系统调用时会使用G0的栈空间,全局变量的G0是M0的G0

一个G由于调度被中断,此后如何恢复?

中断的时候将寄存器里的栈信息,保存到自己的G对象里面。当再次轮到自己执行时,将自己保存的栈信息复制到寄存器里面,这样就接着上次之后运行了。

我这里只是根据自己的理解进行了简单的介绍,想要详细了解有关GMP的底层原理可以去看Go调度器 G-P-M 模型的设计者的文档或直接看源码

参考: ()

()

GO语言(十三):使用 Go 和 Gin 开发 RESTful API(下)

当客户端在 发出POST请求时/albums,您希望将请求正文中描述的专辑添加到现有专辑数据中。

为此,您将编写以下内容:

1、编写代码

a.添加代码以将专辑数据添加到专辑列表。

在此代码中:

1)用于Context.BindJSON 将请求正文绑定到newAlbum。

2) album将从 JSON 初始化的结构附加到albums 切片。

3)向响应添加201状态代码,以及表示您添加的专辑的 JSON。

b.更改您的main函数,使其包含该router.POST函数,如下所示。

在此代码中:

1)将路径中的POST方法与 /albumspostAlbums函数相关联。

使用 Gin,您可以将处理程序与 HTTP 方法和路径组合相关联。这样,您可以根据客户端使用的方法将发送到单个路径的请求单独路由。

a.如果服务器从上一节开始仍在运行,请停止它。

b.从包含 main.go 的目录中的命令行,运行代码。

c.从不同的命令行窗口,用于curl向正在运行的 Web 服务发出请求。

该命令应显示添加专辑的标题和 JSON。

d.与上一节一样,使用curl检索完整的专辑列表,您可以使用它来确认添加了新专辑。

该命令应显示专辑列表。

当客户端向 发出请求时GET /albums/[id],您希望返回 ID 与id路径参数匹配的专辑。

为此,您将:

a.在您在上一节中添加的函数下方postAlbums,粘贴以下代码以检索特定专辑。

此getAlbumByID函数将提取请求路径中的 ID,然后找到匹配的专辑。

在此代码中:

(1)Context.Param用于从 URL 中检索id路径参数。当您将此处理程序映射到路径时,您将在路径中包含参数的占位符。

(2)循环album切片中的结构,寻找其ID 字段值与id参数值匹配的结构。如果找到,则将该album结构序列化为 JSON,并将其作为带有200 OK HTTP 代码的响应返回。

如上所述,实际使用中的服务可能会使用数据库查询来执行此查找。

(3)如果找不到专辑,则返回 HTTP 404错误。

b.最后,更改您的main,使其包含对router.GET的新调用,路径现在为/albums/:id ,如以下示例所示。

在此代码中:

(1)将/albums/:id路径与getAlbumByID功能相关联。在 Gin 中,路径中项目前面的冒号表示该项目是路径参数。

a.如果服务器从上一节开始仍在运行,请停止它。

b.在包含 main.go 的目录中的命令行中,运行代码以启动服务器。

c.从不同的命令行窗口,用于curl向正在运行的 Web 服务发出请求。

该命令应显示您使用其 ID 的专辑的 JSON。如果找不到专辑,您将收到带有错误消息的 JSON。

恭喜!您刚刚使用 Go 和 Gin 编写了一个简单的 RESTful Web 服务。

本节包含您使用本教程构建的应用程序的代码。

《How do you go to school》英语教案及反思例子

做好小学 二年级英语 教案是英语老师备课的关键,下面我为大家带来小学二年级英语上册《How do you go to school》教案及 反思 ,供各位教师参考!

《How do you go to school》教案:课前准备

教学目标:

1.Knowledge and Ability Aim

(1)Learn and try to understand and read the words: by bus, walk to school, by car, by bike

(2)Learn the target sentences: How do you go to school?

(3)Try to talk about the ways of going to school in real-life situation. At the same time, raise the students’ language abilities.

2.Process and Methods Aim

Use Task-based Learning and Situation Learning .

3. Emotion Aim :Cooperate well and help with each other.

重点难点:

1.Key points

Talk about the ways of going to school in real-life situation by using the phrases: by bus, walk to school, by car, by bike and drill: How do you go to school?

2.Difficulties

How to use the new words and the drills to Talk about the ways of going to school freely and fluently in our daily life.

教学准备:

Tape-recorder, Cards, CAI

《How do you go to school》教案:教学过程

一、Warming up

1.Greetings: Class begins. Stand up! Good morning, boys and girls.

How are you?

Let’s chant: play----I play, you play, he plays, she plays, it plays.

go----I go, you go, he goes, she goes, it goes.

2.Free talk

①What time do you go to school?

②How do you go to school?

二、Task-presenting and preparing

1.Today I bring three friends to you, now look!(Show three head ornaments)

This is Amy. This is Lingling. And this is Tom. He is Amy’s little brother. Let’s listen, how do they go to school?

Open your books, turn to page 30, listen and point.

2.Let’s listen again, I will ask:

① If you were Amy, how do you go to school?

② If you were Lingling, how do you go to school?

③ Does Tom go to school by car?

3. After listening, answer the questions:

①If you were Amy, how do you go to school?

I go to school by bus./ She goes to school by bus.(Show CAI:

picture of bus and “by bus”, do action, read the phrase two by two, then boys and girls.)

②If you were Lingling, how do you go to school?

I walk to school./ She walks to school. (Show CAI: picture of walk and “walk to school”, do action, read the phrase two by two, then group by group.)

③Does Tom go to school by car? (Show CAI: picture of car and “by car”, do action, read the phrase two by two, then row by row.)

No, he doesn’t. He goes to school by bus.

4.Guess: How does Daming go to school?

He goes to school by bus. (Show CAI: picture of bike and “by bike”, do action, read the phrase two by two, then boys and girls)

5.Read the four phrases and do actions: by bus, walk, by car, by bike

Practise in groups.

6.Play a game between four groups:

Teacher does actions, students say.

Student does actions, students say.

7.Teacher asks, students answer: How do you go to school?

Then try to say: How do you go to school?

三、Practising and counseling

1. Look! A photo of me.(Show CAI) I go to work by bus. What’s meaning of “go to work”? Guess!

Read the phrase row by row, then together.

2.(Show head ornament)Look, a new friend. He is Lingling’s father.

I go to work by bus. Let’s listen! How does he go to work?

3. After listening, answer the question: How does he go to work?

4. Ask and answer: How does your father go to work?

5. Do you know : How does my father go to work? Guess!

He works in Shanghai.

He goes to work by ship. Read and do action.

6. The Olympic Game will be held in Beijing in 2008.

My sister wants to go to Beijing. How does she go to Beijing?

She goes to Beijing by plane. Read and do action.

She goes to Beijing by train. Read and do action.

7.Read the phrases and do actions:

By bus, walk to school, by car, by bike, by ship, by plane, by train

8.Play games: ① Teacher does actions, students say.

② Teacher shows CAI, students guess.

四、Task-fulfilling

1.Listen and point.

2.Listen and repeat.

3.Listen and circle some phrases and words.

4.Check the words and phrases.

5.Practise by the students.

6.Show students’ photos and say the ways of going to school.

五、Sum up and homework.

《How do you go to school》教学反思:

在开始新课之前,把这个单元前面所学的三课进行了复习,复习中发现孩子们对课文的对话内容比较熟悉,能回答出来,但落实到笔头上有些欠缺。然后开始新课的学习。本课主要围绕---How do you go to school ?---I go to school by… 这一主要句型展开,首先通过播放视频,使学生对本课所学内容有了一个整体印象。在PPT上列出日常的交通工具复习原来学过的单词,让学生通过观察和思考自己 总结 出:乘坐…交通工具是 短语 by +交通工具,并让学生把笔记记在书上的相应位置,这样学生的印象更深刻。同桌之间练习句型---How do you go to school ?---I go to school by..., 既锻炼了学生的口语表达,也加强了对这一句型的记忆。离家近的同学是走路上学的,在PPT上出示走路的图片:walk复习旧知,引出新短语on foot 。从而引出 句子 I walk to school/ I go to school on foot. 让学生记笔记,在PPT上出示图片练习句型--How do they / you go to school ? ---They go to school by .../on foot. 比较直观。

然后做练习册上的题让孩子们作为巩固,孩子们讲题的时候时间有点长,以后要注意。这节课下来学生单独思考的时间比较少,纠正发音不及时,课堂从趣味型向知识型转换,学生有点不适应,以后得多磨练。在课堂上多给孩子们朗读的时间和机会,及时纠正发音,既能锻炼孩子们的口语能力,又能锻炼孩子们的听力能力,在这方面要加强。

猜你喜欢:

1. 《My school》教案及反思

2. 《Do you have any glue》教案及反思

3. 《Hello》教案及反思

4. 三年级上《Do You Have a Dog》教案及反思

5. 五年级《What did you do, Gogo?》教案及反思

6. 三年级上册《Our school》教案及反思

Go语言设计与实现(上)

基本设计思路:

类型转换、类型断言、动态派发。iface,eface。

反射对象具有的方法:

编译优化:

内部实现:

实现 Context 接口有以下几个类型(空实现就忽略了):

互斥锁的控制逻辑:

设计思路:

(以上为写被读阻塞,下面是读被写阻塞)

总结,读写锁的设计还是非常巧妙的:

设计思路:

WaitGroup 有三个暴露的函数:

部件:

设计思路:

结构:

Once 只暴露了一个方法:

实现:

三个关键点:

细节:

让多协程任务的开始执行时间可控(按顺序或归一)。(Context 是控制结束时间)

设计思路: 通过一个锁和内置的 notifyList 队列实现,Wait() 会生成票据,并将等待协程信息加入链表中,等待控制协程中发送信号通知一个(Signal())或所有(Boardcast())等待者(内部实现是通过票据通知的)来控制协程解除阻塞。

暴露四个函数:

实现细节:

部件:

包: golang.org/x/sync/errgroup

作用:开启 func() error 函数签名的协程,在同 Group 下协程并发执行过程并收集首次 err 错误。通过 Context 的传入,还可以控制在首次 err 出现时就终止组内各协程。

设计思路:

结构:

暴露的方法:

实现细节:

注意问题:

包: "golang.org/x/sync/semaphore"

作用:排队借资源(如钱,有借有还)的一种场景。此包相当于对底层信号量的一种暴露。

设计思路:有一定数量的资源 Weight,每一个 waiter 携带一个 channel 和要借的数量 n。通过队列排队执行借贷。

结构:

暴露方法:

细节:

部件:

细节:

包: "golang.org/x/sync/singleflight"

作用:防击穿。瞬时的相同请求只调用一次,response 被所有相同请求共享。

设计思路:按请求的 key 分组(一个 *call 是一个组,用 map 映射存储组),每个组只进行一次访问,组内每个协程会获得对应结果的一个拷贝。

结构:

逻辑:

细节:

部件:

如有错误,请批评指正。


本文标题:GO语言教案和ppt内容 go语言第一课
网站URL:http://scyanting.com/article/ddojeje.html