1、协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。子例程的生命期遵循后进先出(最后一个被调用的子例程最先返回);相反,协程的生命期完全由他们的使用的需要决定。因为相对于子例程协程可以有多个入口和出口点,可以用协程来实现任何的子例程。事实上,正如 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 t
2、o consumer#协程切换消费者协程(consumer)loop while q is not emptyremove some items from q use the items yield to producer#协程切换,每个协程在用yield命令向另一个协程交出控制时都尽可能做了更多的工作。放弃控制使得另一个例程从这个例程停止的地方开始,但因为现在队列被修改了所以他可以做更多事情。尽管这个例子常用来介绍多线程,实际没有必要用多线程实现这种动态:yield语句可以通过由一个协程向另一个协程直接分支的方式实现。,协程,切换自由除了第一入口点,外还有很多其它入口点,缺点,特点,切换自由
3、除了第一入口点,外还有很多其它入口点协成调度必须自主控制,增加开发难度,各种子例程切换开销对比,协程使用的常见场景,生产器,角色模型,状态机,在一个子例程里实现状态机,这里状态由该过程当前的出口入口点确定;这可以产生可读性更高的代码。,并行的角色模型,例如计算机游戏。每个角色有自己的过程(这又在逻辑上分离了代码),但他们自愿地向顺序执行各角色过程的中央调度器交出控制(这是合作式多任务的一种形式),它有助于输入输出和对数据结构的通用遍历。,协程,实现的开发语言SimulaModula-2C#Stackless PythonLuaLoC语言的实现http:/www.chiark.greenend.
4、org.uk/sgtatham/coroutines.html http:/xmailserver.org/libpcl.htmlhttp:/software.schmorp.de/pkg/libcoro.html,内容概要,1.协程概念2.C10K提出的问题与对策3.调度4.网络框架的设计原则5.简单实现6.FAQ,C10K,问题描述主要表现,网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为C10K问题设计不够良好的程序,其性能和连接数及机器性能的关系往往是非线性的。,参考:/,C10K,系统改进参考:/=异步APIlinux 2.6 增加 AIOwindows
5、提供 IOCPselect=poll/epoll/kqueue,C10K,高性能网络服务参考:/pl.atyp.us/content/tech/servers.html性能低下的四要害Data copyContext switchesMemory allocationLock contention,内容概要,1.协程概念2.C10K提出的问题与对策3.调度4.网络框架的设计原则5.简单实现6.FAQ,调度,哲学家就餐问题是用来演示并行计算和多线程同步时产生的问题,参考:/zh.wikipedia.org/zh-cn/哲学家就餐问题,调度,哲学家就餐问题的常见解法:服务生解法一个简单的解法是引入
6、一个餐厅服务生,哲学家必须经过他的允许才能拿起餐叉。因为服务生知道哪只餐叉正在使用,所以他能够作出判断避免死锁。,调度,把问题简化:哲学家现在只负责吃饭,不再思考。不思考的哲学家也就不是哲学家了。1)哲学家调度状况:所有哲学家不停的向服务生请求许可,许可获得后吃饭。服务生被频繁的请求,导致lock contention问题 2)服务生调度状况:那我们就把其当成不思考的普通人看待,还是服务生解法,服务生喂这些哲学家吃。但是一个服务生的情况下,只能同时喂一个哲学家吃饭,还有3个餐叉被闲置,如果是俩个服务生的话,就能很好的利用现有的资源,不停的给所有哲学家进餐。,调度,协程线程,使用协程来模拟只会吃
7、饭的哲学家使用线程来模拟服务员,具体分配几个服务员按照现有资源进行分配。,调度,参考:/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
8、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,网络开发框架的设计,目前流行的网络开发框架:ACELibevent&libevBoost asio开源软件
9、ApatchHttpdNginxMemcachedMongoDB,网络开发框架的设计,个人原则,没有最好的开发框架,只有更适合的不要去重新发明轮子组装适合自己的组件,搭建自己的开发框架使用简单,避免误用,简单实现,网络组件,文件系统,内存管理,协程管理,调度控制,协程通信,线程管理,简单实现,网络组件 文件系统组件 基于协程的网络开发框架一定是异步开发框架,所以需要对底层系统级调用 进行异步封装防止框架的误用 内存管理 提供高效快捷的内存分配器 协程管理 负责协程的创建、切换、销毁,以及协程资源管理 协程通信 解决协程间通信问题 线程管理 提供线程的创建、销毁以及资源管理 调度控制 负责协程的调度以及协程对象的管理,一个执行绪只有一个调度器。,FAQ,问答&感谢,谢谢大家!,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1