加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

实例:一个服务器程序的架构介绍

发布时间:2019-01-28 21:07:34 所属栏目:业界 来源:高性能服务器开发
导读:本文将先容我曾经做过的一个项目标处事器架构和处事器编程的一些重要细节。 一、措施运行情形 操纵体系:Centos 7.0 编译器:gcc/g++ 4.8.3、cmake 2.8.11 mysql数据库:5.5.47 项目代码打点器材:Visual Studio 2013 一、措施布局 该措施总共有 17 个线程

由于每个事变线程都存在一个 m_functors,此刻题目来了,怎样将发生的使命平衡地分派给每个事变线程。这个做法相同上文中怎样将新毗连的 socket 句柄挂载到事变线程的 epollfd 上,也是 round-robin 算法。上文已经描写,此处不再赘述。

尚有种环境,就是但愿使命发生时,事变线程可以或许立马执行这些使命,而不是等 epoll_wait 超时返回之后。这个时辰的做法,就是行使一些能力叫醒epoll_wait,Linux 体系可以行使socketpair 或 timerevent、eventfd 等能力。

题目 1 的谜底是:营业层发生使命也许会交给数据库使命行列A,这里的营业层代码也许就是事变线程中 do_other_things() 函数执行体中的挪用。至于交给这个 9 个数据库线程的哪一个的使命行列,同样回收了 round-robin 算法。以是就存在一个工具 CDbThreadManager来打点这九个数据库线程。下面的伪码是向数据库事变线程中插手使命:

  1. bool CDbThreadManager::AddTask(IMysqlTask* poTask )   
  2. {   
  3.     if (m_index >= m_dwThreadsCount)   
  4.     {   
  5.         m_index = 0;   
  6.     }   
  7.  
  8.     return m_aoMysqlThreads[m_index++].AddTask(poTask);   

同理题目 2 中的斲丧者也也许就是 do_other_things() 函数执行体中的挪用。

此刻来说题目 3,营业层的数据发生后,颠末 TcpSession 装包后,必要发送的话,发生使命丢给事变线程的 do_other_things(),然后在相干的 Channel 内里发送,由于没有监测该 socket 上的可写变乱,以是该数据也许挪用 send() 可能 write() 时会阻塞,不要紧,sleep() 一会儿,继承发送,一向实行,到数据发出去。伪码如下:

  1. bool Channel::Send()   
  2. {   
  3.     int offset = 0;   
  4.     while (true)   
  5.     {   
  6.         int n = ::send(socketfd, buf + offset, length - offset);   
  7.         if (n == -1)   
  8.         {   
  9.             if (errno == EWOULDBLOCK)   
  10.             {   
  11.                 ::sleep(100);   
  12.                 continue;   
  13.             }   
  14.         }   
  15.         //对方封锁了socket,这端提议也封锁   
  16.         else if (n == 0)   
  17.         {   
  18.             close(socketfd);   
  19.             return false;   
  20.         }   
  21.  
  22.         offset += n;   
  23.         if (offset >= length)   
  24.             break;   
  25.  
  26.     }   
  27.  
  28.     return true;       

最后,尚有一个模块日记线程没有先容,高机能的日记实现方案今朝并不常见。

【编辑保举】

  1. 服从比风冷高4000倍!技嘉搬出液冷处事器:16块显卡
  2. 基本标配Linux开拓处事器的搭建
  3. 聊聊高机能处事器Server之Reactor模子
  4. Shell 在手,全国我有--说明处事器日记不愁?
  5. 深入考查无处事器架构的安详威胁,敏感数据泄漏
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读