存档

‘操作系统’ 分类的存档

修改libtask支持epoll处理大量并发连接

2014年10月10日 没有评论 13780次阅读    

原生的libtask库不支持epoll, 这样无法处理大量并发协程的情况,所以小改了下,让它支持epoll,允许大量并发协程运行。代码在这里libtask_epoll

修改方法比较简单,就是把epoll_create, epoll_ctl, epoll_wait 几个函数的使用替换掉原来poll相关的函数,diff在这里阅读全文...

Share
分类: C/C++, TCP/IP, UNIX/LINUX, 协程 标签:

libtask协程库实现源码学习-异步I/O

2014年6月30日 1 条评论 14265次阅读    

上篇文章写了libtask协程库实现的基本原理,最后说道协程编程一个很大的关键点是,程序员需要知道什么时候应该进行协程切换,什么地方需要异步I/O,什么地方的代码是顺序运行的等。

这里回顾一下具体哪些地方需要做协程切换,异步I/O: 所有可能会造成阻塞的操作,都必须进行异步IO处理,及时切换协程,绝对不能在协程里面做阻塞操作,因为阻塞了大家都阻塞了,就黄了。

顺藤摸瓜,上次的http压力测试小程序里面,协程执行函数fetchtask就是协程运行的主要函数,看下其实现: 阅读全文...

Share

libtask协程库实现源码学习

2014年6月29日 8 条评论 28585次阅读    

协程的概念不多说了,轻量级线程,其最大的优势就是协程之间的切换代价非常低,理论上是单线程运行,只是在应用层进行了上下文手动切换。

其最重要的实现函数是makecontext, getcontext, swapcontext 这一组函数,具体的协程上下文切换由他们完成。具体就不多说了,这些函数在glibc里面是已汇编的形式提供的,实际上做的工作就是讲各个寄存器,堆栈指针,指令指针等全部保存起来,或者进行切换,从而达到协程切换的目的。我们知道程序在CPU上运行的时候,注意依赖2个重要的东西: 阅读全文...

Share

poll 内核原理-注释

2012年9月20日 没有评论 6009次阅读    

之前整理的poll的实现原理,给内核代码做了个注释,linux 2.6.11代码貌似,后来偷懒没有写epool了,只是在代码里面分析了一下epoll,poll,select的区别。
下面是一张poll过程的草图,点击大图看清楚一些,太大了不太好显示:

poll原理流程图

阅读全文...

Share

inet_ntoa 是采用静态内存分配的 线程安全 函数

2012年8月12日 2 条评论 12469次阅读    

好吧,其实这是个很简单的问题

1.原因

好久没碰过C代码了,刚看到inet_ntoa(),突然想到这个应该是静态分配的内存,不用释放。但不知道是不是线程安全的,就是说一个线程一份buffer。 阅读全文...

Share
分类: C/C++, UNIX/LINUX 标签:

fork()父子进程运行先后顺序

2012年7月14日 1 条评论 19591次阅读    

本文意在解决如下2个问题:

fork函数创建子进程后,到底哪个先运行?linux系统为什么要这么设计?

阅读全文...

Share

sys_umount系统调用的实现注释。2.4版内核

2012年7月1日 没有评论 4231次阅读    
分类: LINUX内核 标签: ,

linux 内核处理缺页异常函数:do_page_fault ,2.4.0版

2012年7月1日 没有评论 9782次阅读    

关于内核地址空间如何和进程地址空间合在一起,下面函数能看出来。
阅读全文...

Share