基于协程的网络开发框架的设计与实现.ppt_第1页
基于协程的网络开发框架的设计与实现.ppt_第2页
免费预览已结束,剩余23页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

分享者:刘建平 msn: ,基于协程的网络开发框架设计,内容概要,1. 协程概念 2. c10k提出的问题与对策 3. 调度 4. 网络框架的设计原则 5. 简单实现 6. faq,协程,协程概念,和子例程一样,协程也是一种程序组件。 协程比子例程更一般化。 子例程的起始处是惟一的入口点; 协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。 子例程的生命期遵循后进先出(最后一个被调用的子例程最先返回); 相反,协程的生命期完全由他们的使用的需要决定。 因为相对于子例程协程可以有多个入口和出口点,可以用协程来实现任何的子例程。 事实上,正如 knuth 所说:“子例程是协程的特例。”,参考:/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语言的实现 .uk/sgtatham/coroutines.html /libpcl.html http:/software.schmorp.de/pkg/libcoro.html,内容概要,1. 协程概念 2. c10k提出的问题与对策 3. 调度 4. 网络框架的设计原则 5. 简单实现 6. faq,c10k,问题描述 主要表现,网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为 c10k问题 设计不够良好的程序,其性能和连接数及机器性能的关系往往是非线性的。,参考: /c10k.html,c10k,系统改进 参考: /c10k.html 同步api = 异步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,调度,哲学家就餐问题是用来演示并行计算和多线程同步时产生的问题,参考: /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 ,网络开发框架的设计,个人原则,没有最好的开发框架,只有更适合的 不要去重新发明轮子 组装适合自己的组件,搭建自己的开发框架 使用简单,避免误用,简单实现,网络组件,文件系统,内存管理,协程管理,调度控制,协程通信,线程管理,简单实现,网络组件 文件系统组件 基于协程的网络开发框架一定是异步开发框架,所以需要对底

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论