Go语言爱好者周刊笔记-Half-Sync/Half-Async

2020-04-26  本文已影响0人  路人爱早茶

半同步/半异步(half-sync/half-async)

此模式集成同步io和异步io模式,即简化并发系统开发又兼顾效率。高级任务使用同步模型,底层使用异步io,提高效率简化逻辑,此设计模式广泛用在操作系统实现,如unix,windows等

模式介绍

模式动机是从异步io操作中解耦出同步io操作

如下图是BSD UNIX是网络系统架构图,内核协调异步通信设备(网络适配器和终端)和操作系统上运行程序之间i/o。到达通讯设备包通过硬件中断异步化的中断处理器传送操作系统内核handler接受来自设备包后嫁给更高一层协议判断(ip,tcp)合法数据存在网络成队列等待处理


image.png

操作系统dispatch用户进程消费数据,用户进程调用read系统
同步从网络层读数据,如果无可用数据进程sleep知道有新数据来。

bsd架构,设备中断信号,内核异步执行io操作,用户进程同步执行


image.png

出现如下场景需要考虑使用模式

系统需要异步处理外部事件
为每个外部事件制定单独控制线程执行io是低效的
同步io可以简化系统中高级任务

实际案例

go中消息库就是这个模式来实现
为了高效处理地底层网络io,go采用多路复用(linux epoll/windows iocp/freebsd,darwin kqueue/solaris Event Port)处理网络iO事件,并提供一致ent.conn对象实现同步调用.
如何在go中实现epoll方式处理网络io,本身go将这些异步事件分装在底层,代码无法调用,一般情况如此已经很高效
runtime/netpoll.go中定义了一个通用poll接口,针对不同操作系统有不同文件实现
runtime/proc.go是go调度器核心,他会调度使用netpoll的goroutine
net/fd_unix,中定义netfd是go网络库核心,基本类似于active object模式的proxy,对调用者来说提供同步方法,内部使用统一poll模型实现多路复用.

// TODO有些云里雾里,待深化.

上一篇下一篇

猜你喜欢

热点阅读