码迷,mamicode.com
首页 > 编程语言 > 详细

轻量级协程库C语言实现

时间:2017-06-23 13:07:27      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:文件   版本   测试   包括   window   设计   bsp   min   clang   

仿制云风的协程库的接口设计,我花了一个下午加晚上的时间重构了之前写的协程库,提供的接口现在和云风大大的协程接口一模一样,都是仿制lua的非对称协程。我们依旧没有用ucontext.h组件(用ucontext.h组件实现协程的文章铺天盖地,可以自行寻找,用longjmp实现就少很多,用内联汇编实现的就更少了),我们的协程库可以运行在兼容X86平台的操作系统上,各种unix-like操作系统,windows操作系统都可以,不过得用gcc或者clang或者与之兼容的mingw编译工具编译出32位的程序运行。在多线程环境下运行协程时,不同线程不共享协程组,也就是说任意两个协程,若它们属于不同的线程,那么它们必定属于不同的协程组。如果要想不同线程间的协程通讯,得用操作系统各自的API,比如用共享内存方式来实现,我们没有实现类似goroutine的channel。协程库为共享栈模式,一个协程组可以容纳最多一百万个协程,每个协程共用128Kbytes栈空间,我用top命令监测了一下运行一百万个协程的测试程序,此时该测试程序内存占用峰值为280M左右,可以推算每个协程内存占用峰值为280bytes左右。可以推断,如果运行一千万个协程,我们至少需要10个协程组,每个协程组280M,一共2800M = 2.7G左右 = 4G总理论空间 - 1G内核空间,所以我们的协程库所能支持的最大协程数是1000万,这是理论上限。用gprof测试程序性能得知,2999997次协程切换共用0.39秒,每次切换时间在130ns左右。最重要的是,我们的协程库所有的源码加起来大概只有400行左右,这还包括了微量的注释和头文件。如果能够移植到X64版本,那么我们的协程库完全可以在实际开发中使用,不再是单单只有教学意义的小玩意了。

项目GitHub链接:https://github.com/Yuandong-Chen/coroutine

 

轻量级协程库C语言实现

标签:文件   版本   测试   包括   window   设计   bsp   min   clang   

原文地址:http://www.cnblogs.com/github-Yuandong-Chen/p/7068750.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!