Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

基于协程的网络开发框架的设计与实现

5,452 views

Published on

基于协程的网络开发框架的设计与实现

Published in: Technology
  • Be the first to comment

基于协程的网络开发框架的设计与实现

  1. 1. <ul><li>分享者:刘建平 </li></ul><ul><li>MSN: liujianping.cn@hotmail.com </li></ul>基于协程的网络开发框架设计
  2. 2. 内容概要 <ul><li>1. 协程概念 </li></ul><ul><li>2. C10K 提出的问题与对策 </li></ul><ul><li>3. 调度 </li></ul><ul><li>4. 网络框架的设计原则 </li></ul><ul><li>5. 简单实现 </li></ul><ul><li>6. FAQ </li></ul>
  3. 3. 协程 <ul><li>协程概念 </li></ul><ul><li>和子例程一样,协程也是一种程序组件。 </li></ul><ul><li>协程比子例程更一般化。 </li></ul><ul><li>子例程的起始处是惟一的入口点; </li></ul><ul><li>协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。          </li></ul><ul><li>子例程的生命期遵循后进先出(最后一个被调用的子例程最先返回); </li></ul><ul><li>相反,协程的生命期完全由他们的使用的需要决定。                  </li></ul><ul><li>因为相对于子例程协程可以有多个入口和出口点,可以用协程来实现任何的子例程。 </li></ul><ul><li>事实上,正如 Knuth 所说:“子例程是协程的特例。” </li></ul>
  4. 4. 生产者消费者例子 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 语句可以通过 由一个协程向另一个 协程直接分支的方式 实现。
  5. 5. 协程 <ul><li>切换自由 </li></ul><ul><li>除了第一入口点,外还有很多其它入口点 </li></ul><ul><li>缺点 </li></ul><ul><li>特点 </li></ul><ul><li>切换自由 </li></ul><ul><li>除了第一入口点,外还有很多其它入口点 </li></ul><ul><li>协成调度必须自主控制,增加开发难度 </li></ul>
  6. 6. 各种子例程切换开销对比 子例程 地址空间 表项 私有数据 栈空间 执行点 进程 ✔ ✔ ✔ ✔ ✔ 线程 ✔ ✔ ✔ ✔ 协程 ✔ 【?】 ✔ 【?】 ✔ ✔
  7. 7. 协程使用的常见场景 <ul><li>生产器 </li></ul><ul><li>角色模型 </li></ul><ul><li>状态机 </li></ul>在一个子例程里实现状态机,这里状态由该过程当前的 出口/入口点确定;这可以产生可读性更高的代码。 并行的角色模型,例如计算机游戏。每个角色有自己的过程(这又在逻辑上分离了代码),但他们自愿地向顺序执行各角色过程的中央调度器交出控制(这是合作式多任务的一种形式) 它有助于输入/输出和对数据结构的通用遍历。
  8. 8. 协程 <ul><li>实现的开发语言 </li></ul><ul><ul><li>Simula </li></ul></ul><ul><ul><li>Modula-2 </li></ul></ul><ul><ul><li>C# </li></ul></ul><ul><ul><li>Stackless Python </li></ul></ul><ul><ul><li>Lua </li></ul></ul><ul><ul><li>Lo </li></ul></ul><ul><li>C 语言的实现 </li></ul><ul><ul><li>http :// www.chiark.greenend.org.uk/~ sgtatham/coroutines.html           </li></ul></ul><ul><ul><li>http ://xmailserver.org/ libpcl.html </li></ul></ul><ul><ul><li>http ://software.schmorp.de/pkg/libcoro.html    </li></ul></ul>
  9. 9. 内容概要 <ul><li>1. 协程概念 </li></ul><ul><li>2. C10K 提出的问题与对策 </li></ul><ul><li>3. 调度 </li></ul><ul><li>4. 网络框架的设计原则 </li></ul><ul><li>5. 简单实现 </li></ul><ul><li>6. FAQ </li></ul>
  10. 10. C10K <ul><li>问题描述 </li></ul><ul><li>主要表现 </li></ul><ul><li>网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为  C10K 问题 </li></ul><ul><li>设计不够良好的程序,其性能和连接数及机器性能的关系往往是非线性的。 </li></ul>参考 :  http://www.kegel.com/c10k.html 
  11. 11. C10K <ul><li>系统改进 </li></ul><ul><ul><li>参考 :  http://www.kegel.com/ c10k.html </li></ul></ul><ul><ul><li>同步 API = 》 异步 API </li></ul></ul><ul><ul><ul><li>linux 2.6 增加 AIO </li></ul></ul></ul><ul><ul><ul><li>windows 提供 IOCP </li></ul></ul></ul><ul><ul><li>select     = 》 poll/epoll/kqueue </li></ul></ul>
  12. 12. C10K <ul><li>高性能网络服务 </li></ul><ul><li>参考: http://pl.atyp.us/content/tech/ servers.html </li></ul><ul><li>性能低下的四要害 </li></ul><ul><ul><li>Data copy </li></ul></ul><ul><ul><li>Context switches </li></ul></ul><ul><ul><li>Memory allocation </li></ul></ul><ul><ul><li>Lock contention </li></ul></ul>
  13. 13. 内容概要 <ul><li>1. 协程概念 </li></ul><ul><li>2. C10K 提出的问题与对策 </li></ul><ul><li>3. 调度 </li></ul><ul><li>4. 网络框架的设计原则 </li></ul><ul><li>5. 简单实现 </li></ul><ul><li>6. FAQ </li></ul>
  14. 14. 调度 <ul><li>哲学家就餐问题 是 用来演示并行计算和多线程同步时产生的问题 </li></ul><ul><ul><li>  </li></ul></ul>参考 :  http://zh.wikipedia.org/zh-cn/ 哲学家就餐问题
  15. 15. 调度 哲学家就餐问题的常见解法: 服务生解法 一个简单的解法是引入一个餐厅服务生,哲学家必须经过他的允许才能拿起餐叉。因为服务生知道哪只餐叉正在使用,所以他能够作出判断避免死锁。
  16. 16. 调度 <ul><li>把问题简化: </li></ul><ul><li>哲学家现在只负责吃饭,不再思考。不思考的哲学家也就不是哲学家了 。 </li></ul><ul><li>1 )哲学家调度 </li></ul><ul><li>  状况 : 所有哲学家不停的向服务生请求许可,许可获得后吃饭。服务生被频繁的请求,导致 lock contention 问题               </li></ul><ul><li>2 )服务生调度 </li></ul><ul><li>状况: 不思考的哲学家也就不是哲学家了 。那我们就把其当成不思考的普通人看待,还是服务生解法,服务生喂这些哲学家吃。 </li></ul><ul><li>但是一个服务生的情况下,只能同时喂一个哲学家吃饭,还有 3 个餐叉被闲置,如果是俩个服务生的话,就能很好的利用现有的资源,不停的给所有哲学家进餐。 </li></ul>
  17. 17. 调度 <ul><li>协程 </li></ul><ul><li>线程 </li></ul><ul><li>使用协程来模拟只会吃饭的哲学家 </li></ul><ul><li>使用线程来模拟服务员,具体分配几个服务员按照现有资源进行分配。 </li></ul>
  18. 18. 调度 参考 :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);
  19. 19. 内容概要 <ul><li>1. 协程概念 </li></ul><ul><li>2. C10K 提出的问题与对策 </li></ul><ul><li>3. 调度 </li></ul><ul><li>4. 网络框架的设计原则 </li></ul><ul><li>5. 简单实现 </li></ul><ul><li>6. FAQ </li></ul>
  20. 20. 网络开发框架的设计 <ul><li>目前流行的网络开发框架: </li></ul><ul><li>ACE </li></ul><ul><li>Libevent & libev </li></ul><ul><li>Boost asio </li></ul><ul><li>… </li></ul><ul><li>开源软件 </li></ul><ul><li>Apatch </li></ul><ul><li>Httpd </li></ul><ul><li>Nginx </li></ul><ul><li>… </li></ul><ul><li>Memcached </li></ul><ul><li>MongoDB </li></ul><ul><li>… </li></ul>
  21. 21. 网络开发框架的设计 <ul><li>个人原则 </li></ul><ul><li>没有最好的开发框架,只有更适合的 </li></ul><ul><li>不要去重新发明轮子 </li></ul><ul><li>组装适合自己的组件,搭建自己的开发框架 </li></ul><ul><li>使用简单, 避免 误用 </li></ul>
  22. 22. 简单实现 网络组件 文件系统 内存管理 协程管理 调度控制 协程通信 线程管理
  23. 23. 简单实现 <ul><li>网络组件 文件系统组件 </li></ul><ul><li>基于协程的网络开发框架一定是异步开发框架,所以需要对底层系统级调用 </li></ul><ul><li>进行异步封装防止框架的误用 </li></ul><ul><li>内存管理 </li></ul><ul><li>提供高效快捷的内存分配器 </li></ul><ul><li>协程管理 </li></ul><ul><li>负责协程的创建、切换、销毁,以及协程资源管理 </li></ul><ul><li>协程通信 </li></ul><ul><li>解决协程间通信问题 </li></ul><ul><li>线程管理 </li></ul><ul><li>提供线程的创建、销毁以及资源管理 </li></ul><ul><li>调度控制 </li></ul><ul><li>负责协程的调度 以及协程对象的管理,一个执行绪只有一个调度器。 </li></ul>
  24. 24. FAQ 问答 & 感谢
  25. 25. 谢谢大家!

×