协程这个概念很久了,好多程序员是实现过这个组件的,网上关于协程的文章,博客,论坛都是汗牛充栋,在知乎,github上面也有很多大牛写了关于协程的心得体会。突发奇想,我也来实现一个这样的组件,并测试了一下性能。借鉴了很多大牛的思想,阅读了很多大牛的代码。于是把整个思考过程写下来。实现代码 https://github.com/wangbojing/NtyCo
代码简单易读,如果在你的项目中,NtyCo能够为你解决些许工程问题,那就荣幸之至。
下面将部分的NtyCo的代码贴出来。
NtyCo 支持多核多进程。
int process_bind(void) {
int num = sysconf(_SC_NPROCESSORS_CONF);
pid_t self_id = syscall(__NR_gettid);
printf("selfid --> %d\n", self_id);
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(self_id % num, &mask);
sched_setaffinity(0, sizeof(mask), &mask);
mulcore_entry(9096 + (self_id % num) * 10);
}
NtyCo 上下文切换
首先来回顾一下x86_64寄存器的相关知识。x86_64 的寄存器有16个64位寄存器,分别是:%rax, %rbx, %rcx, %esi, %edi, %rbp, %rsp, %r8, %r9, %r10