acereactor proactorr 有几个工作线程

请教一个ACE Proactor服务器(IOCP)的架构设计问题
[问题点数:200分,结帖人baojian88888]
请教一个ACE Proactor服务器(IOCP)的架构设计问题
[问题点数:200分,结帖人baojian88888]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2006年10月 总版技术专家分月排行榜第二2006年9月 总版技术专家分月排行榜第二
2006年5月 总版技术专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。用ACE Proactor 框架做的服务端程序,为什么CPU占用率100_百度知道
用ACE Proactor 框架做的服务端程序,为什么CPU占用率100
提问者采纳
1、软件面导致CPU使用率高面主要涉及系统问题比系统于臃肿启程序及电脑病毒、木马等等都产CPU使用率高导致电脑速度慢解决办主要围绕系统优化优化机启项、尽量避免启太程序等等2、硬件面导致CPU使用率高其实硬件面决定着比较关系比电脑爷机采用初单核赛扬级处理器电脑启几网页情况容易导致CPU使用率高管优化系统问题始终解决主要硬件本身低造
英特尔公司是全球最大的个人计...
主营:半导体芯片
其他类似问题
为您推荐:
其他1条回答
能物理内存缘故能物理内存缘故
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁异步I/O与ACE Proactor框架
当 OS 平台支持异步操作时,一种高效而方便的实现高性能 Web 服务器的方法是使用前摄式事件分派。使用前摄式事件分派模型设计的 Web 服务器通过一或多个线程控制来处理异步操作的完成。这样,通过集成完成事件多路分离(completion event demultiplexing)和事件处理器分派,前摄器模式简化了异步的 Web 服务器。
异步的 Web 服务器将这样来利用前摄器模式:首先让 Web 服务器向 OS 发出异步操作,并将回调方法登记到 Completion Dispatcher(完成分派器),后者将在操作完成时通知 Web 服务器。于是 OS 代表 Web 服务器执行操作,并随即在一个周知的地方将结果排队。Completion Dispatcher 负责使完成通知出队,并执行适当的、含有应用特有的 Web 服务器代码的回调。
使用前摄器模式的主要优点是可以启动多个并发操作,并可并行运行,而不要求应用必须拥有多个线程。操作被应用异步地启动,它们在 OS 的 I/O 子系统中运行直到完成。发起操作的线程现在可以服务 另外的请求了。
在ACE中,可以通过ACE_Proactor实现前摄器模式。实现方式如下。
1。创建服务处理器:
Proactor框架中服务处理器均派生自ACE_Service_Handler,它和Reactor框架的事件处理器非常类似。当发生IO操作完成事件时,会触发相应的事件完成会调函数。
&&&&&&&&&&&&&&&&&&& Proactor框架中的类
。实现服务处理器IO操作
Proactor框架中所有的IO操作都由相应的异步操作类来完成,这些异步操作类都继承自ACE_Asynch_Operation。常用的有以下几种。
ACE_Asynch_Read_Stream, 提供从TCP/IP socket连接中进行异步读操作I/O工厂类.
ACE_Asynch_Write_Stream, 提供从TCP/IP socket连接中进行异步写操作I/O工厂类..
Result,每个I/O工厂类都把Result定义为嵌在自己内部的类,用以保存该工厂发起的每个操作的结果,所有的Result类都从ACE_Asynch_Result派生,并且增加了专用于他们所针对的I/O类型的数据和方法。因为每个异步I/O操作的发起和完成都是分离的,不同的事件,我们需要有一种机制来“记住”操作的参数,并连同结果一起吧这些参数转交给完成处理器。
使用这些操作类的一般方式如下:
将相关的操作注册到服务处理器中,一般可通过调用其open方法实现。
发出IO操作
发出异步IO操作请求,该操作不会阻塞,具体的IO操作过程由操作系统异步完成。
IO操作完成回调处理
异步IO操作完成后,OS会触发服务处理器中的相应回调函数,可通过该函数的ACE_Asynch_Result参数获取相应的返回值。
3。使用连接器或接受器和远端进行连接
ACE为Proactor框架提供了两个工厂类来建立TCP/IP连接。
ACE_Asynch_Acceptor, 用于被动地建立连接
ACE_Asynch_Connector 用于主动地建立连接
当远端连接建立时,连接器或接受器便会创建相应的服务处理器,从而可以实现服务处理。
4。启动Proactor事件分发处理
启动事件分发处理只需如下调用:
&&& while(true)
&&&&&&& ACE_Proactor::instance ()-&handle_events ();
5。程序示例
服务器端:
服务器端简单的实现了一个EchoServer,流程如下:
当客户端建立连接时,首先发出一个异步读的异步请求,当读完成时,将所读的数据打印出来,并发出一个新的异步请求。
#include&&iostream&
#include&"ace/Message_Queue.h"
#include&"ace/Asynch_IO.h"
#include&"ace/OS.h"
#include&"ace/Proactor.h"
#include&"ace/Asynch_Acceptor.h"
using&namespace&
class&HA_Proactive_Service&:&public&ACE_Service_Handler
&&&&~HA_Proactive_Service&()
&&&&&&&&if&(this-&handle&()&!=&ACE_INVALID_HANDLE)
&&&&&&&&&&&&ACE_OS::closesocket&(this-&handle&());
&&&&virtual&void&open&(ACE_HANDLE&h,&ACE_Message_Block&)
&&&&&&&&this-&handle&(h);
&&&&&&&&this-&handle(h);
&&&&&&&&if(this-&reader_.open(*this)!=0||this-&writer_.open(*this)!=0)
&&&&&&&&&&&&ACE_ERROR((LM_ERROR,ACE_TEXT("%p/n"),ACE_TEXT("HA_Proactive_Service&open")));
&&&&&&&&&&&&delete&this;
&&&&&&&&&&&&return;
&&&&&&&&ACE_Message_Block&*
&&&&&&&&ACE_NEW_NORETURN(mb,ACE_Message_Block(1024));
&&&&&&&&if(this-&reader_.read(*mb,mb-&space())!=0)
&&&&&&&&&&&&ACE_ERROR((LM_ERROR,ACE_TEXT("%p/n"),ACE_TEXT("HA_Proactive_Service&begin&read")));
&&&&&&&&&&&&mb-&release();
&&&&&&&&&&&&delete&this;
&&&&&&&&&&&&return&;
&&&&&&&&return;
&&&&virtual&void&handle_read_stream(const&ACE_Asynch_Read_Stream::Result&&result)
&&&&&&&&ACE_Message_Block&&mb=result.message_block();
&&&&&&&&if(!result.success()||result.bytes_transferred()==0)
&&&&&&&&&&&&mb.release();
&&&&&&&&&&&&delete&this;
&&&&&&&&else
&&&&&&&&&&&&if((this-&writer_.write(mb,mb.length()))!=0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&ACE_ERROR((LM_ERROR,ACE_TEXT("%p/n"),ACE_TEXT("starting&write")));
&&&&&&&&&&&&&&&&mb.release();
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&ACE_Message_Block&*new_
&&&&&&&&&&&&&&&&ACE_NEW_NORETURN(new_mb,ACE_Message_Block(1024));
&&&&&&&&&&&&&&&&this-&reader_.read(*new_mb,new_mb-&space());
&&&&&&&&&&&&}
&&&&&&&&return&;
&&&&virtual&void&handle_write_stream(const&ACE_Asynch_Write_Stream::Result&&result)
&&&&&&&&result.message_block().release();
&&&&&&&&return&;
&&&&ACE_Asynch_Read_Stream&reader_;
&&&&ACE_Asynch_Write_Stream&writer_;
int&main(int&argc,&char&*argv[])&
&&&&int&port=3000;
&&&&ACE_Asynch_Acceptor&HA_Proactive_Service&&
&&&&if&(acceptor.open&(ACE_INET_Addr&(port))&==&-1)
&&&&&&&&return&-1;
&&&&while(true)
&&&&&&&&ACE_Proactor::instance&()-&handle_events&();
&&&&return&0;&
客户端代码比较简单,就是每隔1秒钟将当前的系统时间转换为字符串形式通过异步形式发送给服务器,发送完成后,释放时间字符的内存空间。
#include&"ace/Message_Queue.h"
#include&"ace/Asynch_IO.h"
#include&"ace/OS.h"
#include&"ace/Proactor.h"
#include&"ace/Asynch_Connector.h"
#include&&iostream&
using&namespace&
class&HA_Proactive_Service&:&public&ACE_Service_Handler
&&&&~HA_Proactive_Service&()
&&&&&&&&if&(this-&handle&()&!=&ACE_INVALID_HANDLE)
&&&&&&&&&&&&ACE_OS::closesocket&(this-&handle&());
&&&&virtual&void&open&(ACE_HANDLE&h,&ACE_Message_Block&)
&&&&&&&&this-&handle&(h);
&&&&&&&&if&(this-&writer_.open&(*this)&!=&0&)
&&&&&&&&&&&&ACE_ERROR&((LM_ERROR,&ACE_TEXT&("%p/n"),
&&&&&&&&&&&&&&&&ACE_TEXT&("HA_Proactive_Service&open")));
&&&&&&&&&&&&delete&this;
&&&&&&&&&&&&return;
&&&&&&&&ACE_OS::printf("connceted");
&&&&&&&&for(int&i=0;i&10;i++)&&&&
&&&&&&&&&&&&ACE_OS::sleep(1);
&&&&&&&&&&&&time_t&now&=&ACE_OS::gettimeofday().sec();
&&&&&&&&&&&&char&*time&=&ctime(&now);&&&&&&&&
&&&&&&&&&&&&ACE_Message_Block&*mb&=&new&ACE_Message_Block(100);
&&&&&&&&&&&&mb-&copy(time);
&&&&&&&&&&&&if&(this-&writer_.write(*mb,mb-&length())&!=0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&ACE_OS::printf("Begin&read&fail/n");
&&&&&&&&&&&&&&&&delete&this;
&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&}
&&&&&&&&return;
&&&&virtual&void&handle_write_dgram(const&ACE_Asynch_Write_Stream::Result&&result)
&&&&&&&&ACE_Message_Block&&mb&=&result.message_block&();
&&&&&&&&mb.release();
&&&&&&&&return;
&&&&ACE_Asynch_Write_Stream&writer_;
int&main(int&argc,&char&*argv[])&
&&&&ACE_INET_Addr&addr(3000,"192.168.142.181");&
&&&&HA_Proactive_Service&*client&=&new&HA_Proactive_Service();
&&&&ACE_Asynch_Connector&HA_Proactive_Service&&
&&&&connector.open();
&&&&if&(connector.connect(addr)&==&-1)
&&&&&&&&return&-1;
&&&&while(true)
&&&&&&&&ACE_Proactor::instance&()-&handle_events&();
&&&&return&0;&
更多相关文章
ACE Proactor简介 前摄式I/O模型可以在多个I/O句柄上并行地发起一个货多个异步I/O操作,而无需等待它们完成.在每个操作完成时,OS会通知应用定义的完成处理器,由它随后对已完成的I/O操作的结果进行处理.
相关框架类 /
先让我们看一个最简单的使用ACE Proactor框架的E ...
基于ACE Proactor框架下高并发.大容量吞吐程序设计既最近的一个产品开发总结 1人收藏此文章,我要收藏 发表于8个月前( 22:01) , 已有1020次阅读 ,共0个评论 Reactor与 Proactor 基本概念 在高性能的I/O设计中,有两个比较著名的模式Reac ...
这部分代码主要是基于ACE_wrappers/examples/Reactor/Proactor/test_udp_proactor.cpp
简化后,改部分代码在windows下的运行效果是:
工作在2000端口,监听udp报文并对udp报文进行处理,利用另外一台服务器向这台 ...
1.WIN32下面用proactor可以达到几乎RAW IOCP的效率,由于封装关系,应该是差那么一点. 客户端处理类的常规写法://处理客户端连接消息class ClientHandler : public ACE_Service_Handler{public: /构造函数
最近接触力ACE,发现了很多好文章,在此转载一下,也当作一个笔记吧. Reactor与 Proactor 基本概念 在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作.
在比较这 ...
Proactor机制下的异步SOCKET开发 Proactor机制和reactor机制的不同 1.在reactor机制下,所有I/O请求是同步的,即接到信号请求后,立即执行信号处理, 执行完后才开始继续监听信号请求,其接收信号请求的机制是被动的 而在Proactor机制下,I/O请求是异步的,即接 ...
当 OS 平台支持异步操作时,一种高效而方便的实现高性能 Web 服务器的方法是使用前摄式事件分派.使用前摄式事件分派模型设计的 Web 服务器通过一或多个线程控制来处理异步操作的完成.这样,通过集成完成事件多路分离(completion event demultiplexing)和事件处理器分派 ...
ACE设计框架和基础模块的关联 *一.案例描述 视频电警开发,是基于ACE框架上的一次重复开发,本文档拟对ACE框架做一个梳理,以期对他人进行基于ace的开发有所帮助. *二.系统安装 ACE的安装是一件比较麻烦的事情,这里简单的记录了我在VS2005下安装ACE的过程,希望能给大家一个参考. 安装 ...
1. 安装snmp yum install net-snmp* -y 2. 修改/etc/snmpd.conf(可直接清空内容) ① 增加 rocommunity public ②
找到disk修改(df
在13年未,刚刚过去的淘宝停止微信入口后,14年2月13日开始,支付宝又开始单方面停止 ...
1.检测桌面端浏览器的特性.$.checkDetect = function() {
var Detect = {
ie: /msie\s*\d+\.\d/gi,
/tag/single-page http://themeforest.net/ /themes http://ww ...
有网友抱怨: 哪个大牛能帮帮我,讲解一下信号槽机制的底层实现? 不要那种源码的解析,只要清楚的讲讲是怎么发送信号,怎么去选择相应的槽,再做出反应.也就是类似于一个信号槽的相应流程...求解啊!!! 看了源码,真的是一 ...
题目:/problem/3223/ 分析: 可以算出来最大质因子最大不超过50,因为如果超过50,那么平方就超过maxlongint了.所以可以筛出50内的素数,然后把[L,R]内的筛 ...
谈到x86服务器的创新,也许会让不少厂商的市场部门头痛,不过IBM显然并不在其列.IBM系 ...
/ * 中文字符串转化为拼音 * alert(convertToPinyinLower(&你好啊&)); */ function hash(_key,_value) { this.key = _k ...
通过JAVA调用ORACLE的存储过程,在ORACLE的存储过程内部做了一个查询在JAVA中获取该查询结果,这个和SYBASE.SQLSERVER的获取不一样,等我的下一篇文章我会介绍如何获取SYBASE.SQLSE ...
弱电工程施工流程和规范 (一).施工流程 施工过程可分为四个阶段:即施工准备.施工阶段.调试开通和竣工验收阶段.结合本公司的实际情况,制定本流程. 一.施工准备 1.学习掌握相关的规范和标准 严格遵守建筑弱电安装工程 ...二次元同好交流新大陆
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1848)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_080',
blogTitle:'ACE proactor',
blogAbstract:'下面的代码引自
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 ace线程池 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信