一种在C语言中用 System V ucontext 实现的协程切换
此文在看了 python 中基于 yield
和 yield from
(同步基于 yield 的子生成器/协程)机制的生成器/协程后,就想在C语言中实现类似机制。
在阅读 System V ucontext
手册后,便选择基于他来实现(要是此文自己实现“上下文切换描述”的话,该部分功能所花时间应该会比已有C代码所花时间要多)。所实现功能包括:
- yield
- yield from
- 基于 yield 和 yield from 机制协程的调度器 loop
这些功能皆在 ln_cs.c 中实现,experiences目录下为体验以上功能机制的例子(运行体验可参见 doc 目录下的文档)。
. ├── doc │ ├── A coroutine switching implement ... in C-language.md │ └── An optimization for ... in C-language.md ├── experiences │ ├── make_e │ ├── loop_e │ │ ├── loop_e.c │ │ ├── Makefile │ ├── yield_e │ │ ├── Makefile │ │ └── yield_e.c │ └── yield_from_e │ ├── Makefile │ └── yield_from_e.c ├── include │ ├── ln_comm.h │ └── ln_cs.h ├── readme.md └── src └── ln_cs.c
核心代码 ln_cs.c 经过此文的一些技巧性修剪后不到 500 行,所以还是很想分享的——便补写了文档
与源码一起上传到了 github 和 gitee之上。
- github地址:https://github.com/misskissC/ucoroutine_switching
- gitee 地址:https://gitee.com/misskissC/ucoroutine_switching
用过 System V ucontext
或对CPU执行程序原理有所理解的同学应该都能胜任对该程序的阅读理解,有兴趣或与此文具相同程序理念(从源码或文档中可以看出一些吧)的同学一起出出新招继续提升下该程序吧。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何提升springboot服务吞吐量
背景 生产环境偶尔会有一些慢请求导致系统性能下降,吞吐量下降,下面介绍几种优化建议。 方案 1、undertow替换tomcat 电子商务类型网站大多都是短请求,一般响应时间都在100ms,这时可以将web容器从tomcat替换为undertow,下面介绍下步骤: 1、增加pom配置 <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> <exclusions> <exclusion> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-tomcat</artifactid> </exclusion> </exclusions> </dependency> <d...
- 下一篇
普通索引和唯一索引的执行过程
普通索引和唯一索引 我们已经介绍过索引的结构和索引的几种优化,我们再来看一下相同语句在不同索引类型的执行过程 这里普通索引和唯一索引的情况有所不同 查询过程 对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录, 直到碰到第一个不满足条件的记录。 对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索 这个不同带来的性能差距会有多少呢? 基本上差不多 InnoDB 的数据是按数据页为单位来读写的。也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。在 InnoDB 中,每个数据页的大小默认是 16KB。 因为引擎是按页读写的,所以说,当找到记录的时候,它所在的数据页就都在内存里了。那么,对于普通索引来说,要多做的那一次“查找和判断下一条记录”的操作 更新过程 当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Mario游戏-低调大师作品
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装