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;
        }
    }
}

提高服务器性能的其他建议 池 数据复制 上下文切换和锁

池 - 用空间换取时间 进程池和线程池

数据复制 - 高性能的服务器应该尽量避免不必要的复制

上下文切换和锁 减少的作用区域. 不应该创建太多的工作进程, 而是使用专门的业务逻辑线程

posted @ 2022-05-06 16:03  马梦佳  阅读(39)  评论(0编辑  收藏  举报