linux高性能服务器编程---第八章高性能服务器程序框架 (2)
程序分为计算密集型(CPU使用很多, IO资源使用很少)和IO密集型(反过来). 前者使用并发编程反而会降低效率, 后者则会提升效率 并发编程有多进程和多线程两种方式
并发模式 - IO单元和多个逻辑单元之间协调完成任务的方法. 服务器主要有两种并发模式
- 半同步/半异步模式
- 领导者/追随者模式
半同步/半异步模式 在IO模型中, 异步和同步的区分是内核向应用程序通知的是何种IO事件(就绪事件还是完成事件), 以及由谁来完成IO读写(应用程序还是内核)
而在这里(并发模式) 同步指的是完全按照代码序列的顺序执行 - 按照同步方式运行的线程称为同步线程 异步需要系统事件(中断, 信号)来驱动 - 按照异步方式运行的线程称为异步线程
服务器(需要较好的实时性且能同时处理多个客户请求) - 一般使用同步线程和异步线程来实现,即为半同步/半异步模式 同步线程 - 处理客户逻辑, 处理请求队列中的对象 异步线程 - 处理IO事件, 接收到客户请求后将其封装成请求对象并插入请求队列
异步线程 - 主线程 - 负责监听所有socket上的事件
领导者/追随者模式 略
高效编程方法 - 有限状态机
// 状态独立的有限状态机 STATE_MACHINE(Package _pack) { PackageType _type = _pack.GetType(); switch(_type) { case type_A: xxxx; break; case type_B: xxxx; break; } } // 带状态转移的有限状态机 STATE_MACHINE() { State cur_State = type_A; while(cur_State != type_C) { Package _pack = getNewPackage(); switch(cur_State) { case type_A: process_package_state_A(_pack); cur_State = type_B; break; case type_B: xxxx; cur_State = type_C; break; } } }
提高服务器性能的其他建议 池 数据复制 上下文切换和锁
池 - 用空间换取时间 进程池和线程池
数据复制 - 高性能的服务器应该尽量避免不必要的复制
上下文切换和锁 减少锁
的作用区域. 不应该创建太多的工作进程, 而是使用专门的业务逻辑线程