通知和轮询的区别

from:http://club.tgfcer.com/thread-6345441-1-1.html


相关:

Java基础:三步学会Java Socket编程
http://tech.163.com/06/0410/09/2EBABUD20009159T.html


Linux Socket编程(不限Linux)
http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

一步一步android(15):关于socket编程【以聊天为例】
http://hi.baidu.com/yaoyuanhuajx/item/9b93d7565f315ba9acc857d7


Android推送通知指南
http://wenku.baidu.com/view/c354a6b569dc5022aaea00b6.html



我还是单独开一贴吧,免得再哪贴里面光喷去了。。。
通知实现的方法,按我的理解和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了。导致出现现在各种费电的程序跑再后台。

你可能感兴趣的:(通知和轮询的区别)