<ul><li>分享者:刘建平 </li></ul><ul><li>MSN: liujianping.cn@hotmail.com </li></ul>基于协程的网络开发框架设计
内容概要 <ul><li>1.  协程概念 </li></ul><ul><li>2. C10K 提出的问题与对策 </li></ul><ul><li>3.  调度 </li></ul><ul><li>4.  网络框架的设计原则 </li></u...
协程 <ul><li>协程概念 </li></ul><ul><li>和子例程一样,协程也是一种程序组件。 </li></ul><ul><li>协程比子例程更一般化。 </li></ul><ul><li>子例程的起始处是惟一的入口点; </li>...
生产者消费者例子 var q := new queue 生产者协程( producer ) loop while q is not full  create some new items  add the items to q  yield t...
协程 <ul><li>切换自由 </li></ul><ul><li>除了第一入口点,外还有很多其它入口点 </li></ul><ul><li>缺点 </li></ul><ul><li>特点 </li></ul><ul><li>切换自由 </li...
各种子例程切换开销对比 子例程 地址空间 表项 私有数据 栈空间 执行点 进程 ✔ ✔ ✔ ✔ ✔ 线程 ✔ ✔ ✔ ✔ 协程 ✔ 【?】 ✔ 【?】 ✔ ✔
协程使用的常见场景 <ul><li>生产器 </li></ul><ul><li>角色模型 </li></ul><ul><li>状态机 </li></ul>在一个子例程里实现状态机,这里状态由该过程当前的 出口/入口点确定;这可以产生可读性更高的...
协程 <ul><li>实现的开发语言 </li></ul><ul><ul><li>Simula </li></ul></ul><ul><ul><li>Modula-2 </li></ul></ul><ul><ul><li>C# </li></u...
内容概要 <ul><li>1.  协程概念 </li></ul><ul><li>2. C10K 提出的问题与对策 </li></ul><ul><li>3.  调度 </li></ul><ul><li>4.  网络框架的设计原则 </li></u...
C10K <ul><li>问题描述 </li></ul><ul><li>主要表现 </li></ul><ul><li>网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为  C10K 问题 </li></ul><ul><...
C10K  <ul><li>系统改进 </li></ul><ul><ul><li>参考 :  http://www.kegel.com/ c10k.html </li></ul></ul><ul><ul><li>同步 API = 》  异步 A...
C10K <ul><li>高性能网络服务 </li></ul><ul><li>参考: http://pl.atyp.us/content/tech/ servers.html </li></ul><ul><li>性能低下的四要害 </li></...
内容概要 <ul><li>1.  协程概念 </li></ul><ul><li>2. C10K 提出的问题与对策 </li></ul><ul><li>3.  调度 </li></ul><ul><li>4.  网络框架的设计原则 </li></u...
调度 <ul><li>哲学家就餐问题 是 用来演示并行计算和多线程同步时产生的问题 </li></ul><ul><ul><li>  </li></ul></ul>参考 :  http://zh.wikipedia.org/zh-cn/ 哲学家就...
调度 哲学家就餐问题的常见解法: 服务生解法 一个简单的解法是引入一个餐厅服务生,哲学家必须经过他的允许才能拿起餐叉。因为服务生知道哪只餐叉正在使用,所以他能够作出判断避免死锁。
调度 <ul><li>把问题简化: </li></ul><ul><li>哲学家现在只负责吃饭,不再思考。不思考的哲学家也就不是哲学家了 。 </li></ul><ul><li>1 )哲学家调度 </li></ul><ul><li>  状况 : ...
调度 <ul><li>协程 </li></ul><ul><li>线程 </li></ul><ul><li>使用协程来模拟只会吃饭的哲学家 </li></ul><ul><li>使用线程来模拟服务员,具体分配几个服务员按照现有资源进行分配。 </l...
调度 参考 :http://cvs.schmorp.de/libcoro/coro.h Libcoro 定义的协程操作 API 举例 : typedef void (*coro_func)(void *); typedef struct cor...
内容概要 <ul><li>1.  协程概念 </li></ul><ul><li>2. C10K 提出的问题与对策 </li></ul><ul><li>3.  调度 </li></ul><ul><li>4.  网络框架的设计原则 </li></u...
网络开发框架的设计 <ul><li>目前流行的网络开发框架: </li></ul><ul><li>ACE </li></ul><ul><li>Libevent & libev </li></ul><ul><li>Boost asio </li>...
网络开发框架的设计 <ul><li>个人原则 </li></ul><ul><li>没有最好的开发框架,只有更适合的 </li></ul><ul><li>不要去重新发明轮子 </li></ul><ul><li>组装适合自己的组件,搭建自己的开发框...
简单实现 网络组件 文件系统 内存管理 协程管理 调度控制 协程通信 线程管理
简单实现 <ul><li>网络组件 文件系统组件 </li></ul><ul><li>基于协程的网络开发框架一定是异步开发框架,所以需要对底层系统级调用 </li></ul><ul><li>进行异步封装防止框架的误用 </li></ul><ul...
FAQ 问答  &  感谢
谢谢大家!
Upcoming SlideShare
Loading in …5
×

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

5,313 views
5,106 views

Published on

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

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,313
On SlideShare
0
From Embeds
0
Number of Embeds
2,324
Actions
Shares
0
Downloads
0
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide
  • 假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。 哲学家从来不交谈,这就很危险,可能产生 死锁 , 每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)
  • 基于协程的网络开发框架的设计与实现

    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. 谢谢大家!

    ×