• Save
基于协程的网络开发框架的设计与实现
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 4,813 views

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

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

Statistics

Views

Total Views
4,813
Slideshare-icon Views on SlideShare
2,493
Embed Views
2,320

Actions

Likes
5
Downloads
0
Comments
0

6 Embeds 2,320

http://www.mysqlops.com 2307
http://mysqlops.net 4
http://ww.mysqlops.com 3
http://www.bettersa.com 3
http://www.mysqlops.com. 2
http://www.mysqlops.net 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • 假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。 哲学家从来不交谈,这就很危险,可能产生 死锁 , 每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)

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

    • 分享者:刘建平
    • MSN: liujianping.cn@hotmail.com
    基于协程的网络开发框架设计
  • 内容概要
    • 1. 协程概念
    • 2. C10K 提出的问题与对策
    • 3. 调度
    • 4. 网络框架的设计原则
    • 5. 简单实现
    • 6. FAQ
  • 协程
    • 协程概念
    • 和子例程一样,协程也是一种程序组件。
    • 协程比子例程更一般化。
    • 子例程的起始处是惟一的入口点;
    • 协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。         
    • 子例程的生命期遵循后进先出(最后一个被调用的子例程最先返回);
    • 相反,协程的生命期完全由他们的使用的需要决定。                 
    • 因为相对于子例程协程可以有多个入口和出口点,可以用协程来实现任何的子例程。
    • 事实上,正如 Knuth 所说:“子例程是协程的特例。”
  • 生产者消费者例子 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 语言的实现
      • http :// www.chiark.greenend.org.uk/~ sgtatham/coroutines.html          
      • http ://xmailserver.org/ libpcl.html
      • http ://software.schmorp.de/pkg/libcoro.html   
  • 内容概要
    • 1. 协程概念
    • 2. C10K 提出的问题与对策
    • 3. 调度
    • 4. 网络框架的设计原则
    • 5. 简单实现
    • 6. FAQ
  • C10K
    • 问题描述
    • 主要表现
    • 网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为  C10K 问题
    • 设计不够良好的程序,其性能和连接数及机器性能的关系往往是非线性的。
    参考 :  http://www.kegel.com/c10k.html 
  • C10K
    • 系统改进
      • 参考 :  http://www.kegel.com/ 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
  • 调度
    • 哲学家就餐问题 是 用来演示并行计算和多线程同步时产生的问题
      •  
    参考 :  http://zh.wikipedia.org/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
  • 网络开发框架的设计
    • 个人原则
    • 没有最好的开发框架,只有更适合的
    • 不要去重新发明轮子
    • 组装适合自己的组件,搭建自己的开发框架
    • 使用简单, 避免 误用
  • 简单实现 网络组件 文件系统 内存管理 协程管理 调度控制 协程通信 线程管理
  • 简单实现
    • 网络组件 文件系统组件
    • 基于协程的网络开发框架一定是异步开发框架,所以需要对底层系统级调用
    • 进行异步封装防止框架的误用
    • 内存管理
    • 提供高效快捷的内存分配器
    • 协程管理
    • 负责协程的创建、切换、销毁,以及协程资源管理
    • 协程通信
    • 解决协程间通信问题
    • 线程管理
    • 提供线程的创建、销毁以及资源管理
    • 调度控制
    • 负责协程的调度 以及协程对象的管理,一个执行绪只有一个调度器。
  • FAQ 问答 & 感谢
  • 谢谢大家!