为何IOCP能够同时处理成千上万个连接???(20分)

有没有大虾知道扩展名为PDG的文件怎么打开?
 
呵呵系統的了解,值得我輩學習啊
辯論總歸是好事
不過jingtao比較浮躁,沖動(不應該哈)
意見不同沒有必要諷刺,完全可以說服,這才是本事
 
关于在内核模式比应用层网络效率高,瑞典的一个著名的实验室已经给出了结论。

The measurements showed that kernel mode web servers has a substantial
performance gain over user mode web servers both on Linux and on Windows.
The factor that is improved most in kernel mode is the latency witch means
that a larger number of requests per second can be processed, this is most
visible for small files where the kernel mode web servers on Linux is 50% to
75% faster than user mode web servers while the prototype on Windows was
as much as 200% to 300% faster than user mode web servers on the same
platform, for bigger files decreases the difference to only 0% to 25%. The
reason for the big improvement in latency is probably that a kernel mode
web server avoids unnecessary process scheduling.

事实上,所谓完成端口效率高,说得就是内核网络实现比应用层实现效率高,仅此而已,大不必为那些概念所迷惑。
 
不同意 王府井的说法:“事实上,所谓完成端口效率高,说得就是内核网络实现比应用层实现效率高,仅此而已,大不必为那些概念所迷惑。”

完成端口效率高和其线程少有关。如果每个连接启动一个线程侍服,假如500个并发连接,抑或1000个并发链接呢。当线程巨多的时候,仅线程间切换所消耗的资源就会严重拖累服务器。
 
请楼上的兄弟仔细看了再回我的帖子,完成端口效率高和其线程少有关?socket有message机制,event机制,peek机制等,这些可不用每个连接都开一个线程,为什么效率一般情况下没有完成端口高呢?linux下没有完成端口,效率和windows相比呢?

win32开发用的都是底层接口,真正的实现是在kernel mode完成的,完成端口把windows内核的dpc发挥到了最好,文件系统也有完成端口,readfile和wrietfile就有完成端口,而且如果你理解windows内核的话,可以直接用readfile and writefile来对一个socket来进行读写。
 
完成端口用来处理简短的并发连接还是不错的,如果想用它来接收发送文件,那就要看如何分片处理了,而且还存在一个谁发送谁接收的情况:若两台电脑,C发给S或S发给C,这种传递对于耗时影响不大,当然处理数据的速度还要看你的多线程处理能力如何;若超过三台的电脑,C通过S向另外几个C传递文件,这对于S来讲已经是纯粹的数据转发了,这种情况下的逻辑传输速度为点对点的N倍(N=C的数量),显然以这种方式传递大数据是不可取的,这也正是P2P之所以流行的一个重要原因。
 
完成端口用来处理简短的并发连接还是不错的,如果想用它来接收发送文件,那就要看如何分片处理了,而且还存在一个谁发送谁接收的情况:若两台电脑,C发给S或S发给C,这种传递对于耗时影响不大,当然处理数据的速度还要看你的多线程处理能力如何;若超过三台的电脑,C通过S向另外几个C传递文件,这对于S来讲已经是纯粹的数据转发了,这种情况下的逻辑传输速度为点对点的N倍(N=C的数量),显然以这种方式传递大数据是不可取的,这也正是P2P之所以流行的一个重要原因。
 
其实这个争吵与技术无关,完全是因为以前和爱元元的哥哥的一些私人过节.如果你是老富翁,你自然会知道.如果你不是,也没必要知道.倒不觉得自己浮躁,早几年就百毒不侵,也开发了很多不为外人所知的软件,只是少了说教和炫耀的兴趣.不过的确有些冲动.

不过虽然里面夹杂了一些私人因素,但是我仍然觉得能在上层做的事情就尽量不要放底层.
(1)底层不是万能的(底层也不神秘).
(2)一般来说你实在无法做的比操作系统开发商更加有效率.
(3)底层的东西,因为与底层结合太紧密.所以升级不会太方便.
(4)稳定性问题.微软有机会请千万人测试,虽然微软里面的基本是牛人,虽然经过严格测试,但是BUG还是一样在所难免.所以在效率和稳定之间选择,一般开发商会选择稳定.你的软件再有效率,如果不稳定,就是垃圾一个.而且现今的网络环境,底层实在也高不了多少的.我觉得同样1M的带宽下,你不可能传输会快几秒钟,更加不可能会达到2M的带宽.
关于底层提升效率,的确有人在研究这种东西,去年一个朋友温锦山出差经过我所在的城市.喝茶的时候.他有几个同校的师兄也一起出来.聊天中说起,原来他们就在研究这个,据说还是和中科院合作的.据说用了那驱动,一台普通服务器能当10台用.我当时刚好有研究WINPCAP和大型服务器编程(参考书籍是老外的几本关于大型游戏服务器程序设计),所以很感兴趣.但是听说1台顶10台,觉得是不可信的.所以后来婉言谢绝了加入一起开发的好意.不过直到今天,也没有见这种东西出现,他们当初的目标是让腾讯的服务器全部用他们那软件.我想,如果一个软件真的有这么神奇,那么市场肯定是非常大的,估计我们也会听说了.不过很可惜一直没有见到相关报道,也不曾听说哪个服务商使用了该技术.

就这个问题而言.其实ball_cao说到了本质.完成端口的就是为了减少线程(当然这不是完成端口效率高的唯一原因).是回答的比较对题的一个答案.
 
[:D]楼上的动不动拿微软来说事[:D],现在我们在国外做研究能够申请阅读微软向政府和学校公开的代码,没有什么神秘的,商业作的好,并不是技术作的棒,而且一流的公司在做概念,二流的公司作标准,三流的公司才作技术,说完成端口的优点就是为了减少线程,呵呵,全世界的pig都笑了。
 
完成端口处理大量并非链接效率高,线程使用少这肯定有关系,否则干吗要强调一个cpu开多少线程云云.但也不是说效率高完全是由线程少做出来的,其他的设计优化也有贡献.
另外迷信内核模式也不对,难道在内核模式执行会比在用户模式执行时cpu运行更快吗?
只能说,减少了在内核与用户模式下的频繁切换引起的时间开销,间接提高了执行效率.
 
没有人说微软神秘:)
"申请阅读公开的代码",能公开的代码,就不会是真正核心的东西.本身WINNT和WIN2000的代码就泄露过,这些代码比能公开的代码当然要好的多、系统的多(这个代码泄露初期程序员杂志开个专题研究,有很多所谓高手都一致评价的确是代码简洁高效).所以如果从这个角度来说,国内高中生都可以阅读到比申请的更好的代码.
无可否认,微软在商业上是极其成功的.他们非常注重品牌(如果你研究微软的历史就知道,当初Windows并不叫Windows.后来找了两个做化妆品推销的高手,最经典的一段话是为什么强生婴儿爽身粉比街头的贵20倍,但其实效果有时侯反而没有街头的好,这就是品牌的重要.从那个时候起,微软才注意品牌策略).但这些是另外一个话题,估计你和我都没有太多发言权,也与本贴没什么关系.
但是如果你说微软因为商业作的好,技术就不棒,把微软的成功看作是纯商业上的成功,那就真是井底之蛙,幼稚而可笑.世界顶尖操作系统高手,10个有8个在微软(这些当然可以查的.例如那个大学其间就经常写编译器贱卖的家伙,还有那个可以在编译器里面做后门的家伙),写编译器的也多(Delphi创始人就在其中).
"一流的公司在做概念,二流的公司作标准,三流的公司才作技术"这句话从语文的角度来说,的确很有诱惑力.也很工整.朗朗上口.但如果一个公司没有庞大的技术实力作为后盾,说这种话,要么是啊Q,自欺欺人,要么就是不脚踏实地,只懂嘴皮工夫,实际上没有一个产品.最后如果不是靠骗政府订单养着.结果只有倒闭.一个IT公司,肯定是先有技术,技术到霸道的地步,才能作标准.最后升华成概念.跟现在中国软件现状差不多.中国为什么在国际上没有大的软件?不是没有好软件.小作坊有好东西,但是作不大;大公司有实力,却整天想着蒙政府的订单,不去真正做软件.如果一个公司实力没有强大到做标准的地步(就目前来说,国内还没有强大到这种地步的公司,所以国际上还没什么标准是中国公司确立的),那么还是老老实实做技术吧.东软就是因为没有自己的核心技术倒闭的(他们老总当年靠技术起家,后面却说"东软不需要核心技术".业内人士和东软自己的管理层技术层认为就是这样垮掉的,详见程序员的专题分析).当然,搞技术会被只懂嘴皮工夫,比会"只作概念,不去实作"累的多.
 
既然撇开了原来的话题,我也来谈谈自己的看法,不然全世界的pig真的要笑了。

楼上的仔细用脑子想想我的话再回答,计算机的发展就是从概念走向标准,从标准走向技术,从技术走向产品,最终产业化,改变人类的习惯和进程。

大家可以翻翻看每年的CES展会上那些巨头从80年代就开始抛出的概念,包括盖茨这20年来在大会上对未来IT行业所提出的发展趋势预测,多少曾经还是概念的东西指导着IT产业的发展,并一一成为现实。每年有那么人花钱去聆听CES大会上这些巨人的思考,从而寻找自己的机会和前景,这就是巨人和精英的差别。

例如:NC,3G,IPV6,Home media center,wireless network,巨头们超前多少年就已经提出了这样战略制高点,并成立战略联盟。同时多少二流的公司在努力争夺概念之后的标准?多少三流的公司在努力实现标准之后的具体设计?中国人目前在3G上的TD-WCDMA,在wireless network上的WAPI,已经是创纪录的进步了,因为在这方面终于步入二流了。CNNIC提交的中文上网的RFC标准刚刚被批准,大家数数看,除此之外成千上万的指导技术实现的RFC标准,有哪些跟我们中国所谓的高手有半点的关系?[:D]
 
再来看看windows源码所展示的XP的IPv4网络调用构架。

application
|
winsock 2.0 (ws2_32.dll)
|
winsock service provider (msafd.dll)
|
以上为user mode,以下进入kernel mode
|
ancillary function driver for winsock(afd.sys)
|
transport for windows tcp/ip (tcpip.sys)
|
ndis library(ndis.lib)
|
hal(hal.dll)
|
netcard.

举例:我们的sendto函数到了tdi驱动内核后变成了这样。
NTSTATUS tdi_send_dgram(PFILE_OBJECT addressFileObject, ULONG addr, USHORT port, const char *buf, int len)

我们的socket实际上就是一个文件句柄指针,函数的实现白话解释如下。

1.用IoGetRelatedDeviceObject获得文件句柄所指的对象。
2.用KeInitializeEvent初始化一个event。
3.用ExAllocatePool申请一个结构体,来存储addr和port信息。
4.用TdiBuildInternalDeviceControlIrp构造一个网络包IRP
5.用IoAllocateMdl申请一个mdl(内存描述表),来存储buf和len。
6.用TdiBuildSendDatagram来创建一个网络包,附着在刚才创建的IRP上。
7.调用IoCallDriver向第一步获得文件对象发送网络包IRP.
8.这是异步调用,根据IoCallDriver的返回值来进行判断下面的工作。
9.如果返回值是STATUS_PENDING,那么调用KeWaitForSingleObject来等待enent.

细心的会发现其实是多么的眼熟啊,呵呵,tomorrow我会用几个帖子来讨论得更具体点,不能让那些所谓专家头衔来继续蒙骗群众了。奉劝一句:性格决定命运,这么点情商还是歇歇吧。
 
严重跑题了.:)

"为何IOCP能够同时处理成千上万个连接???"===>
"用驱动比上层处理好"===>
"自己涉及的IO开销是否能比微软的开销小,效率高"===>
"微软是否有技术人才"===>
"中国是否有所谓的高手"===>???驱动程序设计?或如何调用微软提供的接口?

我觉得你思考方式有问题:
"大家可以翻翻看每年的CES展会上那些巨头从80年代就开始抛出的概念,包括盖茨这20年来在大会上对未来IT行业所提出的发展趋势预测,多少曾经还是概念的东西指导着IT产业的发展,并一一成为现实。每年有那么人花钱去聆听CES大会上这些巨人的思考,从而寻找自己的机会和前景,这就是巨人和精英的差别。"
这说明了什么?
1:大公司有强大技术后盾,或者说在该领域曾经做过非常好的技术产品或方案,作的预测才有人信.如果你的公司从来没有什么网络产品,却去预测未来网络发展,不是很可笑的事情?或者你可以去试试预测一下,看看有谁会听你的.本身很多预测就是在技术开发中偶尔发现的灵感,并且有一定的可行性.
2:预测是凭什么作预测的?是在当前技术的前提下预测的.就是已有技术的进一步发展."发展趋势预测",你如果语文稍微好一些,也知道发展趋势的意思是现有的发展.而不是凭空发展.
"例如:NC,3G,IPV6,Home media center,wireless network,巨头们超前多少年就已经提出了这样战略制高点,并成立战略联盟。"如果TCP协议都没有,连IPV4都没有,你去预测什么IPV6,是多么可笑!
所以说,你是本末倒置.当然是先技术,再有标准,再有概念和预测.就象高楼大厦一样,不是从现有基础发展升华的概念,只能是空中楼阁.
顺便说一句,"大家数数看,除此之外成千上万的指导技术实现的RFC标准,有哪些跟我们中国所谓的高手有半点的关系?[:D]"你这观点跟我前面的意思("如果一个公司实力没有强大到做标准的地步(就目前来说,国内还没有强大到这种地步的公司,所以国际上还没什么标准是中国公司确立的),")其实是一样的.
最后说一句,我反复观看了这个贴子几次,也没发现谁说自己是高手之类的话.只是单纯技术讨论,实在不懂为什么要扯上"所谓专家头衔来继续蒙骗群众".更加不懂所谓的"奉劝一句:性格决定命运,这么点情商还是歇歇吧。" 还请明示:)
 
[:D]请楼上要冷静下来看我的话,中国大多数程序员的浮躁在这里表现的太清楚了,唯大企业论,唯技术论,唯应用论,唯钱论。

真正推动IT进步的是中小企业,他们是创意的源泉——google从两人做起,也不是98年开始的事情,现在直逼微软,activex改变了互联网,只是一个人的创意(跟微软打官司要求巨额赔偿我想大家都听说过了),p2p改变了互联网,也是一个人创意。

这些改变互联网进程的革新几乎我们都经历了,当时的技术水平真的我们做不到吗,那些东西需要很高的技术吗,很多第一代推出的新生产品,我们的高手看上去都会笑了,但是我们为什么就想不到呢?

在IT行业这些案例我想不用我一一例举了。中国要抓住IT的机会,老老实实做技术已经被过去的20年所证明了——越来越落后,不是这些工资低的程序员撑着廉价这个优势,基本上就没落了。西方的程序员技术真的有印度的技术强?有俄罗斯的强?编程大赛连中国的程序员都能比美国拿的名次高,这些又能改变什么呢?创新在他们那里,标准在他们那里,专利在他们那里,明天外包给你,该拿1000美金不到的月薪还是照样拿,打工仔而已。

linux公开代码了这么多年,中国还没有什么建议被采纳到内核里面,真的技术很高吗?

jingtao这些年做了什么不得了的创意了吗?让全世界的pig都不笑的创新你做了?微软那么多漏洞,你看了代码的话,报告几个吧,如果只会叹服其简洁,全世界的pig都要晕倒了。

收敛一点吧,心有多稳,舞台就有多大,浮躁没有什么好处,心胸开阔点,从头到尾你都在灌水,让我这个20岁的学生看高你,请你的技术上观点说话,不要学那个黎名,用老子的学说来证明四色定理,最后还跟方舟子拼刺刀,都成笑柄了。修养高点,即使高不了,也要装的高点。[:D]
 
呵呵,道理说不赢,就开始人身攻击了.你也就这么点情商:)
我看了半天,即使我如何跑题.却也是针对这个贴的问题所展开讨论的.但是阁下却离题万里.从销售说到创意,最后还玩起人身攻击来.一个满口PIG的人,居然还叫别人的修养高一些.真是贼喊捉賊,婊子叫扫黄.

富翁称号:王府井 注册时间:2006-8-13.这些也不能证明你是所谓20岁的学生--我怕你污蔑了学生的名称,因为如果你真的读过书,这种素质实在令人怀疑.另外,我也不需要你看高,而且自始至终,也没看出你那里把俺看高了:)
我也没有说过自己有什么不得了的创意吧.就事论事,只是说没有微软的实力,是做不出比人家更加有切换效率的底层.
你举个GOOGLE的例子,也只能更加证明我的观点而已(国内没有能作标准和创新的公司).看你几次回贴,其实引用的例子都是证明我的观点而已.实在可笑.
"微软那么多漏洞,你看了代码的话,报告几个吧,"这个你倒是说对题了,我本身的职业就是研究漏洞的,Word溢出,ACCESS溢出等等,这些漏洞在微软公开补丁之前,我们早就在使用了,只是我不曾向你老人家报告而已.而且也没有必要.不过这些都不是看WINDOWS代码看出来的.我以前有个作品叫"游戏木马检测大师"(可以从google搜索到),里面检测HOOK部分才是看了WINDOWS代码得知结构的.另外,IEXPLORER本身有几个漏洞其实现在一直有效果,只是微软不清楚而已,这些我想也没有必要向你报告.如果我真的浮燥,早就到处公开了.我可以很负责任的告诉你,对于系统底层漏洞,我对你熟悉的多的多,也非常高产.只是没有在社会公开而已.
"如果只会叹服其简洁,全世界的pig都要晕倒了。"或许我和你做人的观点不一样,比我水平高的,代码写的比我简洁的,无论他是天赋,还是积累而来,我都不想找借口,人家的确是写的比我好,我彬彬有礼承认.因为自古以来,文人相轻.现在国内搞IT的也如此.我不想成为其中的一员.如果人家技术的确比我们好,承认又有什么可耻的?你只有先承认,然后才能想办法去超越.否则你只会花时间去诋毁.相反我觉得你反而浮燥不已.
"收敛一点吧,心有多稳,舞台就有多大,浮躁没有什么好处,心胸开阔点,从头到尾你都在灌水,"真正就事论事的人,看了上面的贴子,自然心中有数是你还是我更加应该对号入座.至于最后那句"不要学那个黎名,用老子的学说来证明四色定理,最后还跟方舟子拼刺刀,都成笑柄了。",我研究了很久也没研究出是什么意思,跟仁兄说的其它话一样,我始终无法在我的发言里面找到能对的上号的语句.虽然我高中读的是文科,高考全省第七名:)估计应该是吵架的一个策略,意思是乱说一通,再胡乱弄些不切题的例子堆一下.
 
中国为何出不了创新?为何中国的程序员浮躁?
这些都不能简单的说中国的程序员怎么怎么不好,这个有政府的不良机制在里面,中国的官本位思想,孔子的学而优则仕的思想等等根深蒂固。说个简单的,在国内医疗,教育,住房,哪个不贵,在发达国家看病是不用自己掏腰包的,义务教育免费,高等教育也不是国内这么高的离谱的。在这样的环境下国内程序员要为生计而奔波,能否不向钱看,能否静下心来做技术?
 
windows泄漏的源码好像有ip数据的处理代码吧,不过我觉得iocp实现上应该是采用了线程池,建立一定数量的线程分别处理不同的tcp连接,这样完成任务的线程继续处理新的连接,没完成的继续做自己的工作。去年自己写了一个邮件接收的程序我就用类似的线程池做,处理效率很高的。
 
iocp只是查询用到你所说的CPU*2个线程,和内部实现接收数据是两回事。
 
jingtao:2362095群应该有你不少老朋友,有兴趣进来聊聊吧!
 
顶部