码迷,mamicode.com
首页 > 其他好文 > 详细

IOKING真正无锁服务器引擎之消息引擎模块Demo(no-lock)

时间:2015-08-28 00:57:12      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:



关键词:

no-lock interlocked lock-free tcp/ip socket server engine epoll iocp server out-of-orderexecution无锁 原子锁 原子操作 原子指令 锁无关 开放锁 通讯服务器 引擎 高并发 大数据 搜索引擎 完成端口服务器 cpu乱序并行执行 内存栅栏


IOKING 真正无锁服务器引擎之消息引擎模块Demo(no-lock)

 

这是继无锁iocp通讯模块以后,又一个无锁模块。下一步有时间将会把两个整合在一起。

先给本文无锁下个定义吧,无锁:在非内核态、非CPU原子操作指令(包括不使用内存栅栏)的情况下实现的线程间消息通讯的机制。

 

无锁关键问题:CPU乱序并行处理、MEM和CPU Cache不一致性

 

 

2015-8.27 更新版本:

下载链接(包含内核头文件和Demo的源码):http://download.csdn.net/detail/guestcode/9055835

实现了 linux和window跨平台

ubuntu64:

技术分享

win32:

技术分享

win64:

技术分享


应用举例:

//创建引擎对象

CIokEngineTest *pIokEngine = new CIokEngineTest;

//创建生产者对象,nPTNum:生产者的线程数量

//CIokProducer *pProducer = new CIokProducer(pIokEngine, (char*)"Producer", nPTNum, 0);

//创建消费者对象,nCTNum:消费者的线程数量

CIokConsumer *pConsumer = new CIokConsumer(pIokEngine, (char*)"Consumer", nCTNum, 0);

//设置生产消费关系,默认队列容量10000000

pProducer->SetConsumer<CIokConsumer>(pConsumer, 10000000, 0);

//启动引擎
pIokEngine->Start(pProducer, pConsumer);

通过创建生产消费对象和设置生产消费关系,可实现如下或更复杂的软件内部架构:

技术分享

技术分享

//生产线程制造消息:

inline void CIokPThread::OnMsg(CIokMessage *pMessage)
{
  DWORD dwTickCount = GetTickCount();
  MadeMsg(dwTickCount, (void*)dwTickCount, dwTickCount, dwTickCount, (void*)dwTickCount, (void*)dwTickCount);
}

//消费线程消费消息:

inline void CIokCThread::OnMsg(CIokMessage *pMessage)
{

        //计算消息传递时间
        m_dwLong = GetTickCount() - (DWORD)pMessage->nMsg;

        //判断收到的消息是否正确
        m_nError += (pMessage->nMsg != (LONG_PTR)pMessage->nParam1)
                              || (pMessage->nMsg != (LONG_PTR)pMessage->nParam2)
                              || (pMessage->nMsg != (LONG_PTR)pMessage->pParam1)
                              || (pMessage->nMsg != (LONG_PTR)pMessage->pParam2);
}

 

 

2015-8.27之前的:

Demo下载链接:

http://download.csdn.net/detail/guestcode/8579089


这是继无锁iocp通讯模块以后,又一个无锁模块。本来已经早已成型,一直没有理会太多。下一步有时间将会把两个整合在一起。

先给无锁定义吧,无锁:在非内核态、非CPU原子操作指令(包括不使用内存栅栏)的情况下实现的线程间消息通讯的机制(个人定义,并仅在本文有效)。


无锁关键是避免CPU乱序并行运行导致的数据错误,避免脏读情况。


这是无锁测试截图:

技术分享

每秒1400万次消息传递,两个小时1000亿,内核使用率明显很低


这是iocp(实际是有锁的)消息通讯的截图:

技术分享

每秒230万,也是相当不错了,不过内核高了。


以上是理想状态下的单纯消息通讯测试,不代表实际使用环境,难免有出入。至于安全性还有待以后有时间进一步测试。

欢迎共同探讨。


补充:

以下是经过API封装后的demo,多做了些事情,比如验证API参数的合法性、判断一个生产链上最上一个的队列是否空闲来决定是否休眠等待等。只需创建生产者、消费者线程及队列,设置队列的生产消费关系,即可组建成下列这样的程序架构(当然也可以形成一个闭环),而你要做的,仅仅需要在线程的OnMsg函数里面处理消息即可,这个过程不要关心多线的同步问题即可完成无锁消息传递,这是一个简易而又高效的基于消息传递机制的服务器程序架构引擎,保证了消息有序而又高效的被处理:


最终消费者<------队列<------消费者&生产者<------队列<------消费者&生产者<------队列<------起初生产者


技术分享

技术分享








版权声明:本文为博主原创文章,未经博主允许不得转载。

IOKING真正无锁服务器引擎之消息引擎模块Demo(no-lock)

标签:

原文地址:http://blog.csdn.net/guestcode/article/details/48037829

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!