基于协程的网络开发框架的设计与实现.ppt
- 文档编号:1421310
- 上传时间:2022-10-22
- 格式:PPT
- 页数:25
- 大小:1.19MB
基于协程的网络开发框架的设计与实现.ppt
《基于协程的网络开发框架的设计与实现.ppt》由会员分享,可在线阅读,更多相关《基于协程的网络开发框架的设计与实现.ppt(25页珍藏版)》请在冰豆网上搜索。
分享者:
刘建平MSN:
基于协程的网络开发框架设计,内容概要,1.协程概念2.C10K提出的问题与对策3.调度4.网络框架的设计原则5.简单实现6.FAQ,协程,协程概念,和子例程一样,协程也是一种程序组件。
协程比子例程更一般化。
子例程的起始处是惟一的入口点;协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。
子例程的生命期遵循后进先出(最后一个被调用的子例程最先返回);相反,协程的生命期完全由他们的使用的需要决定。
因为相对于子例程协程可以有多个入口和出口点,可以用协程来实现任何的子例程。
事实上,正如Knuth所说:
“子例程是协程的特例。
”,参考:
http:
/zh.wikipedia.org/wiki/协程,生产者消费者例子,varq:
=newqueue生产者协程(producer)loopwhileqisnotfullcreatesomenewitemsaddtheitemstoqyieldtoconsumer#协程切换消费者协程(consumer)loopwhileqisnotemptyremovesomeitemsfromqusetheitemsyieldtoproducer#协程切换,每个协程在用yield命令向另一个协程交出控制时都尽可能做了更多的工作。
放弃控制使得另一个例程从这个例程停止的地方开始,但因为现在队列被修改了所以他可以做更多事情。
尽管这个例子常用来介绍多线程,实际没有必要用多线程实现这种动态:
yield语句可以通过由一个协程向另一个协程直接分支的方式实现。
协程,切换自由除了第一入口点,外还有很多其它入口点,缺点,特点,切换自由除了第一入口点,外还有很多其它入口点协成调度必须自主控制,增加开发难度,各种子例程切换开销对比,协程使用的常见场景,生产器,角色模型,状态机,在一个子例程里实现状态机,这里状态由该过程当前的出口入口点确定;这可以产生可读性更高的代码。
并行的角色模型,例如计算机游戏。
每个角色有自己的过程(这又在逻辑上分离了代码),但他们自愿地向顺序执行各角色过程的中央调度器交出控制(这是合作式多任务的一种形式),它有助于输入输出和对数据结构的通用遍历。
协程,实现的开发语言SimulaModula-2C#StacklessPythonLuaLoC语言的实现http:
/www.chiark.greenend.org.uk/sgtatham/coroutines.htmlhttp:
/xmailserver.org/libpcl.htmlhttp:
/software.schmorp.de/pkg/libcoro.html,内容概要,1.协程概念2.C10K提出的问题与对策3.调度4.网络框架的设计原则5.简单实现6.FAQ,C10K,问题描述主要表现,网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为C10K问题设计不够良好的程序,其性能和连接数及机器性能的关系往往是非线性的。
参考:
http:
/,C10K,系统改进参考:
http:
/=异步APIlinux2.6增加AIOwindows提供IOCPselect=poll/epoll/kqueue,C10K,高性能网络服务参考:
http:
/pl.atyp.us/content/tech/servers.html性能低下的四要害DatacopyContextswitchesMemoryallocationLockcontention,内容概要,1.协程概念2.C10K提出的问题与对策3.调度4.网络框架的设计原则5.简单实现6.FAQ,调度,哲学家就餐问题是用来演示并行计算和多线程同步时产生的问题,参考:
http:
/zh.wikipedia.org/zh-cn/哲学家就餐问题,调度,哲学家就餐问题的常见解法:
服务生解法一个简单的解法是引入一个餐厅服务生,哲学家必须经过他的允许才能拿起餐叉。
因为服务生知道哪只餐叉正在使用,所以他能够作出判断避免死锁。
调度,把问题简化:
哲学家现在只负责吃饭,不再思考。
不思考的哲学家也就不是哲学家了。
1)哲学家调度状况:
所有哲学家不停的向服务生请求许可,许可获得后吃饭。
服务生被频繁的请求,导致lockcontention问题2)服务生调度状况:
不思考的哲学家也就不是哲学家了。
那我们就把其当成不思考的普通人看待,还是服务生解法,服务生喂这些哲学家吃。
但是一个服务生的情况下,只能同时喂一个哲学家吃饭,还有3个餐叉被闲置,如果是俩个服务生的话,就能很好的利用现有的资源,不停的给所有哲学家进餐。
调度,协程线程,使用协程来模拟只会吃饭的哲学家使用线程来模拟服务员,具体分配几个服务员按照现有资源进行分配。
调度,参考:
http:
/cvs.schmorp.de/libcoro/coro.h,Libcoro定义的协程操作API举例:
typedefvoid(*coro_func)(void*);typedefstructcoro_contextcoro_context;voidcoro_create(coro_context*ctx,/*anuninitialisedcoro_context*/coro_funccoro,/*thecoroutinecodetobeexecuted*/void*arg,/*asinglepointerpassedtothecoro*/void*sptr,/*startofstackarea*/longssize);/*sizeofstackarea*/voidcoro_transfer(coro_context*prev,coro_context*next);voidcoro_destroy(coro_context*ctx);,内容概要,1.协程概念2.C10K提出的问题与对策3.调度4.网络框架的设计原则5.简单实现6.FAQ,网络开发框架的设计,目前流行的网络开发框架:
ACELibevent&libevBoostasio开源软件ApatchHttpdNginxMemcachedMongoDB,网络开发框架的设计,个人原则,没有最好的开发框架,只有更适合的不要去重新发明轮子组装适合自己的组件,搭建自己的开发框架使用简单,避免误用,简单实现,网络组件,文件系统,内存管理,协程管理,调度控制,协程通信,线程管理,简单实现,网络组件文件系统组件基于协程的网络开发框架一定是异步开发框架,所以需要对底层系统级调用进行异步封装防止框架的误用内存管理提供高效快捷的内存分配器协程管理负责协程的创建、切换、销毁,以及协程资源管理协程通信解决协程间通信问题线程管理提供线程的创建、销毁以及资源管理调度控制负责协程的调度以及协程对象的管理,一个执行绪只有一个调度器。
FAQ,问答&感谢,谢谢大家!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 网络 开发 框架 设计 实现