信号量和临界区go语言 信号量和临界区go语言区别
Go语言设计与实现(上)
基本设计思路:
创新互联建站是一家以网站建设公司、网页设计、品牌设计、软件运维、网站推广、小程序App开发等移动开发为一体互联网公司。已累计为自上料搅拌车等众行业中小客户提供优质的互联网建站和软件开发服务。
类型转换、类型断言、动态派发。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 映射存储组),每个组只进行一次访问,组内每个协程会获得对应结果的一个拷贝。
结构:
逻辑:
细节:
部件:
如有错误,请批评指正。
操作系统原理中,信号量这一节,代码如下。如果有两个进程,第一个A进程进入临界区之前把S减1,等于0
当A进程释放信号后,唤醒一个阻塞进程,此时,信号量不在减一,因为进程B的wait语句已经进入了,也是已经在上次阻塞时进入了,所以会在减一。
信号量,临界区,互斥,原子操作,消息,事件,哪种效率最高?
在Windows中,临界区的效率最高。原因是它不用陷入内核,在用户态执行信号量,互斥,事件都是系统内核对象,效率比临界区低,但是有更好的可操作性。上面的几个东西都是为了实现原子操作用的。以上是Windows核心编程里实际测试过的
分享文章:信号量和临界区go语言 信号量和临界区go语言区别
文章地址:http://azwzsj.com/article/hgjhih.html