资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,分享者:刘建平,MSN: ,基于协程的网络开发框架设计,内容概要,1.,协程概念,2. C10K,提出的问题与对策,3.,调度,4.,网络框架的设计原则,5.,简单实现,6. FAQ,协程,协程概念,和子例程一样,协程也是一种程序组件。,协,程比子例程更一般化。,子例,程的起始处是惟一的入口点;,协,程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。,子例,程的生命期遵循后进先出(最后一个被调用的子例程最先返回);,相,反,协程的生命期完全由他们的使用的需要决定。,因为相对于子例程协程可以有多个入,口和出口点,可以用协程来实现任何的子例程。,事实上,,正如,Knuth,所说:“子例程是协程的特例。”,参考:,http:/zh.wikipedia.org/wiki/协程,生产者消费者例子,var q:= new,queue,生产者协程(,producer,),loop,while q is not full,create,some new items,add,the items to q,yield,to consumer #,协程切换,消,费者协程 (,consumer,),loop while q is not,empty,remove,some items from q,use,the items,yield,to producer #,协程切换,每个协程在用,yield,命令,向另一个协程交出控制,时都尽可能做,了更,多的,工作。,放弃控制使得另一个,例程从这个例,程,停止,的地方开,始,,但因为,现在队列被修改了,所以他可以做,更,多,事情。,尽管这个例子,常用,来,介绍多线,程,实际没,有,必要用多线程实现,这种动态:,yield,语句可以通过,由一个协程向另一个,协,程直接分支的,方式,实现,。,协程,切换自由,除了第一入口点,外还有很多其它入口点,缺点,特点,切换自由,除了第一入口点,外还有很多其它入口点,协成调度必须自主控制,增加开发难度,各种子例程切换开销对比,子例程,地址空间,表项,私有数据,栈空间,执行点,进程,线程,协程,【,?,】,【,?,】,协程使用的常见场景,生产器,角色模型,状态机,在一个子例程里实现状态机,这里状态由该过程,当前的,出口,入口点确定;这可以产生可读性更高的代码。,并行的角色模型,例如计算机游戏。每个角色有自己的过程(这又在逻辑上分离了代码),但他们自愿地向顺序执行各角色过程的中央调度器交出控制(这是合作式多任务的一种形式),它有助于输入输出和对数据结构的通用遍历。,协程,实现的开发语言,Simula,Modula-2,C#,Stackless Python,Lua,Lo,C,语言的实现,http,:/,www.chiark.greenend.org.uk/,sgtatham/coroutines.html,http,:/xmailserver.org/,libpcl.html,http,:/software.schmorp.de/pkg/libcoro.html,内容概要,1.,协程概念,2. C10K,提出的问题与对策,3.,调度,4.,网络框架的设计原则,5.,简单实现,6. FAQ,C10K,问题描述,主要表现,网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为,C10K,问题,设计不够良好的程序,其性能和连接数及机器性能的关系往往是非线性的。,参考,:, =,异,步,API,linux 2.6,增加,AIO,windows,提供,IOCP,select = poll/epoll/kqueue,C10K,高性能网络服务,参考:,http:/pl.atyp.us/content/tech/,servers.html,性能低下的四要害,Data copy,Context switches,Memory allocation,Lock contention,内容概要,1.,协程概念,2. C10K,提出的问题与对策,3.,调度,4.,网络框架的设计原则,5.,简单实现,6. FAQ,调度,哲学家就餐问题,是,用来演示并行计算和多线程同步时产生的问题,参考,:,http:/zh.wikipedia.org/zh-cn/,哲学家就餐问题,调度,哲学家就餐问题的常见解法:,服务生,解法,一个简单,的解法是引入一个餐厅服务生,哲学家必须经过他的允许才能拿起餐叉。因为服务生知道哪只餐叉正在使用,所以他能够作出判断避免死锁,。,调度,把问题简化:,哲学家现在只负责吃饭,不再思考,。不思考的哲学家也就,不是哲学家,了,。,1,)哲学家调度,状况,:,所有哲学家不停的向服务生请求许可,许可获得后吃饭。服务生被频繁的请求,导致,lock contention,问题,2,)服务生调度,状况:,不思考的哲学家也就不是哲学家了,。那我们就把其当成不思考的普通人看待,还是服务生解法,服务生喂这些哲学家吃。,但是一个服务生的情况下,只能同时喂一个哲学家吃饭,还有,3,个餐叉被闲置,如果是俩个服务生的话,就能很好的利用现有的资源,不停的给所有哲学家进餐。,调度,协程,线程,使用协程来模拟只会吃饭的哲学家,使用线程来模拟服务员,具体分配几个服务员按照现有资源进行分配。,调度,参考,:http:/cvs.schmorp.de/libcoro/coro.h,Libcoro,定义的协程操作,API,举例,:,typedef void (*coro_func)(void *),;,typedef struct coro_context coro_context,;,void coro_create (coro_context *ctx, /* an uninitialised coro_context */,coro_func coro, /* the coroutine code to be executed */,void *arg, /* a single pointer passed to the coro */,void *sptr, /* start of stack area */,long ssize); /* size of stack area *,/,void coro_transfer (coro_context *prev, coro_context *next),;,void coro_destroy (coro_context *ctx);,内容概要,1.,协程概念,2. C10K,提出的问题与对策,3.,调度,4.,网络框架,的设计原则,5.,简单实现,6.,FAQ,网络开发框架的设计,目前流行的网络开发框架:,ACE,Libevent & libev,Boost asio,开源软件,Apatch,Httpd,Nginx,Memcached,MongoDB,网络开发框架的设计,个人原则,没有最好的开发框架,只有更适合的,不要去重新发明轮子,组装适合自己的组件,搭建自己的开发框架,使用简单,,避免,误用,简单实现,网络组件,文件系统,内存管理,协程管理,调度控制,协程通信,线程管理,简单实现,网络组件,文件系统组件,基于协程的网络开发框架一定是异步开发框架,所以需要对底层系统级调用,进行异步封装防止框架的误用,内存管理,提供高效快捷的内存分配器,协程管理,负责协程的创建、切换、销毁,以及协程资源管理,协程通信,解决协程间通信问题,线程管理,提供线程的创建、销毁以及资源管理,调度控制,负责协程的调度,以及协程对象的管理,一个执行绪只有一个调度器。,FAQ,问答,&,感谢,谢谢大家!,
展开阅读全文