» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[数码手机] 我来科普一下:通知和轮询的区别

我还是单独开一贴吧,免得再哪贴里面光喷去了。。。
通知实现的方法,按我的理解和linux下很多程序实现的方法如下:
程序再起socket的时候,设定socket为柱塞的方式,也就是说socket监听端口的时候,如果没有数据,监听进程就是挂起休眠起来,实际上,这个时候程序已经休眠,不占用cpu资源,也就谈不上费电,当基带从空口获取到一个数据片的时候, 底层会触发一个中断给cpu,cpu判断这个中断类型,如果是ip包,cpu会吧数据传给tcp/ip协议栈,协议栈根据socket注册情况,唤醒相应的程序,这个时候就可以切换到真正处理的app里面去了,这样实现起来省电,高效,但是ios悲催的内存大小和进程调度方式,可能会导致休眠的程序丢失一部分进程资源,导致切换会app的时候,可能还需要重新登陆==一系列动作,这样造成用户体验不好,但是我觉得这个机制是非常适合手持设备的,希望将来ios能解决进程切换的问题。这就是为什么有个兄弟说一个ios设备给另外一个ios设备发消息,可能再1秒以内能收到的原因。因为全部都是主动触发的方式,相当于多米诺骨牌一样,自然速度会很快

所谓轮询的方式,
哪就是很多现在pc和android上实现的方法,注册socket为非柱塞的方式,也就是说socket监听端口的时候,如果没有数据,监听进程就会放过这次监听,使用timer/sleep 固定时间,然后到一个门限的时候,比如说1秒/30秒的时候,主动向server发送查询的数据包,server查询结果,然后返回给设备,设备就知道这个查询时间片内有没有本程序的数据,这样实现起来费电,复杂,但是由于android使用linux进程调度算法,最终结果看起来也是可以接受的。

以上2中方式差别,再linux和xp下面使用ping就可以看到差别,linux ping包的延时可能再1ms级别,xp就是10ms级别,延时差的很远。性能也差不少,至于android为什么不使用push通知+完善的后台调度,我只能说这是历史原因造成的,以前android就是个野孩子,没有通知服务器这种数据中心,直接蛮干就ok了。导致出现现在各种费电的程序跑再后台。


TOP

引用:
原帖由 jun4rui 于 2011-6-23 20:51 发表
posted by wap, platform: Chrome

具体这里有:http://mysuperbaby.iteye.com/blog/902054
这个只是消息流程图,不是具体实现机制上的讨论



TOP

引用:
原帖由 jun4rui 于 2011-6-23 20:49 发表
posted by wap, platform: Chrome

不用瞎猜了,我给出Google日历和联系人的同步时序图吧:

还有,我相信google自己的消息都是push机制的。而且应该实现的很好。


TOP

引用:
原帖由 burnfox 于 2011-6-23 20:33 发表
飞行模式、不开第三方后台的原生Android也很耗电是怎么回事?它在轮询什么?电量统计?
不至于吧,飞行不开第三放后台程序一个晚上能耗多少电?能超过10%么?

TOP

引用:
原帖由 zmqzmq2010 于 2011-6-23 21:15 发表
LZ我就请教1个问题:
IOS5敢于把维特+IM+云端大量数据同步集成到系统内核里,是否代表苹果自家PUSH服务器+系统推送部分的可靠性足够应付QQ之类信息及时准确传递?
这有什么可靠性的问题么?手持设备能有多少数据流量。手机端不会出现任何性能上的问题,关键看服务器上面消息队列和调度算法实现的怎么样。这个apple不推出服务,我们是的不到结果的。不过我猜想,没问题。
正常情况下,push机制绝对不管再性能上还是在节省系统资源上都比轮询好很多,当然这个前提条件是服务器端服务正常,要不android搞个屁的push机制啊。直接用以前的轮询不就ok了么
本帖最近评分记录
  • zmqzmq2010 激骚 +9 疯狂厨房 2011-6-23 21:29

TOP

引用:
原帖由 cc0128 于 2011-6-23 21:20 发表
posted by wap, platform: SAMSUNG (Nexus S)

阻塞和非阻塞不是程序代码可以控制的么。
对,如果柱塞的话,又没有服务器唤醒,哪你不就一直祖塞再那里收不到消息了嘛,说白了push就是吧一部分手机上需要实现的功能放到服务器上去了,节省手机cpu和网络资源

TOP

引用:
原帖由 jun4rui 于 2011-6-23 21:11 发表
posted by wap, platform: Chrome

你可以看时序图的发起方,显然有变动后,是服务器主动发起的。

而且里面说了:

Google Sync是通过Atom Feed协议进行的. 这样当Server端有changes后, 会通过C2DM框架发送"com ...
哪不就得了,主动发起方是服务器端,如果google不脑抽,必然是通过硬件中断间接唤醒手机上的进程去服务器同步数据,这就是push的方式啊

TOP

引用:
原帖由 cf3b5 于 2011-6-23 21:18 发表
实在受不了,这个破东西都能折腾这么久,而且都没有说到点子上~
其实轮询还是通知这东西根本就没啥差别,去到最底层肯定还是轮询机制,只不过底层轮询速度超快,去到应用层可以看成是无缝的事件触发机制的而已~
...
你看懂我说的东西了么?socket阻塞这种push的方式根本就不是底层轮询,而是由硬件驱动唤醒的。摆脱先看看操作系统实现的机制再出来喷

TOP

引用:
原帖由 masterfish 于 2011-6-23 21:35 发表
这个不知道android下的解决如何,反正阻塞模式在windows下很蛋疼,好多次都把程序搞死了。。。
这个是实现的问题,不是机制上的问题。呵呵

TOP

引用:
原帖由 masterfish 于 2011-6-23 21:36 发表
我觉得其实他说的没错,只不过轮询的不是app的socket,而是OS,再由OS来触发唤醒。。。
不一样,其实OS根本没有轮询数据包的动作。
数据包都是硬件收到后,主动通知cpu有个任务要做,然后再有os调度哪个app来完成这个任务。触发点不一样

TOP

ls和lss属于不看帖回帖的,懒得解释了。呵呵

TOP

发新话题
     
官方公众号及微博