Saturday, March 31, 2007

戴尔内部员工自曝内幕 坦言销售手段卑

戴尔内部员工自曝内幕 坦言销售手段卑

  其实这些手段销售人员不是发自本意的,但是没办法,大家肩膀上都扛着几百万到几千万的销售任务,而经理们从来不管你做的事情是不是正确的,他们 需要在每天的销售报告中看到数字的增长,这样大量的销售人员发现无法通过正常的途径完成销售任务,只能铤而走险,通过这些手段来?

看了DELL的各种抱怨和问题的曝光,作为DELL的一个销售人员,我只能笑笑而已,那些在外面感觉到的,只是小儿科。当你真正在这个企业,你才知道什么叫黑暗!

一、产品

DELL的产品线中有很多的特价产品,比如DIMENSION和一些外设产品。但是,在DELL公司内部严格限制销售人员销售这些产品,具体的操作方式通过以下几种途径:

1、订单自动审核:

在DELL的内部体系中,所有的销售工作都是由一个叫做SMARTS的ERP软件进行,DELL公司在SMARTS中限制每个DIMENSION订 单中的产品数量,每个DIMENSION产品针对某个客户每个星期只能销售5台,如果每张订单超过5台或者某个客户在一周内定购DIMENSION某一型 号的产品超过5台就需要通过一个叫做special price team的部门审核,因为这些特价产品的利润都很低,甚至某些售价在3199的台式机利润都是负数,虽然这些利润指数都不是DELL的真实利润,但是 DELL公司不希望这些产品影响公司的总体利润,因此DELL一方面通过内部的ERP软件限制销售人员销售这些产品,同时通过市场部人员不停地向销售人员 发送电子邮件,提醒他们卖这些东西利润多么多么的低,对他们今后的销售工作多么的不利,从而驱使销售人员在同客户沟通的过程中将客户的购买意向转化为利润 很高的商用机型,DELL将这种过程称之为UPSELL。

DELL在每张DIMENSION产品的报价单中都会加入这句话:每个订单限够5台,但是这不代表每个客户可以定购该产品的最高数量,因此某些客户 在某一周需要定购多台的时候就会被DELL拒绝,而且某些客户想定购某种特价产品多台的时候通常会被DELL的销售人员告知这种产品缺货,实际上这种产品 根本就没有缺货,只是DELL公司内部限制销售人员销售这种产品,不允许他们多卖。最终倒霉的是客户,他们无法购买DELL按照广告打出的特价产品,并且 DIMENSION这类产品的价格是每周更新,客户在和销售人员吵架的同时,这个产品已经开始涨价了!

2、内部调整业绩比例:

这是DELL最缺德的一招。由于DIMENSION产品的利润偏低,DELL公司想出了这么一个招数,将DIMENSOIN产品的销售业绩比例调整 到1:1以下,但是将商用机的产品业绩比例调整到1:1以上。在DELL内部,员工的薪资比例为7/3,即每个月总体薪水的70%为底薪,30%为销售奖 励,例:某个员工入职前与DELL谈定的总体薪水为10000元/月,那么这个员工每个月的底薪为7000元,如果该员工在考评季度内能100%完成销售 任务,那么这个员工能拿到1万元的全薪(税前),如果只完成了50%,那么只能拿到8500元的薪水(7000+3000*50%)。

DELL公司将DIMENSION产品的业绩比例调整到1以下,那么,销售人员销售1000万的DIMENSION产品只相当于过去销售了几百万的 普通产品,这样的调整大大影响的销售人员的收入,因此现在DELL内部的销售人员宁可废掉一个客户也不愿影响自己的收入,在上个季度中DELL内部就出现 过多次由于销售人员无法销售DIMENSION产品而遭到客户投诉的事情。

3、ONE ONE REVIEW:

如果某个销售人员的销售业绩中DIMENSION产品的比例过大(超过50%),那么DELL的市场部负责人会通知这个销售人员进行一个面谈,面谈 内容大致就是你这个销售能力很差,为什么向客户销售这种公司不挣钱的产品,同时给销售人员洗脑,要求他们销售公司利润很高的商用电脑,并且该员工今后在为 其他产品申请折扣时会遭到拒绝,理由很简单,你销售过特价产品,我们不支持你的销售工作。这样执行以后结果也很简单,销售人员逼着客户购买价格更高的商用 电脑,并且公司会对销售过多特价产品的销售人员进行批评,而且对这些销售人员的直接经理施加压力,逼着他们向客户推销商用电脑。

那么DIMENSION产品好不好呢?在DELL的官方网站上对于DIMENSION产品和OPTIPLEX产品有这样的区别,DIMENSION 产品适用于10台电脑以下的小型企业,OPTIPLEX产品使用于需要高稳定性及网络应用的客户,实际上精明一点的客户可以发现DIMENSION产品在 和OPTIPLEX产品同样配置时价格会比所谓的商用电脑便宜很多,而且可以享受同样的下一工作日上门服务,并且某些客户有多媒体应用需求的时候都会考虑 DIMENSION机型,因为这种机型配置比较灵活,尽管偷料和品质差,但同时也拥有最新的技术,比如945芯片组和PCI-E总线,但是DELL就是不 让客户多买,为什么?因为DIMENSION挣的钱不够多!

那么DELL所谓的商用产品性能又如何呢?DELL的商用机和服务器产品通常会号称采用最新的IT技术,并且遵照工业标准进行设计和生产,遵照工业标准是为了降低成本和提高兼容性,乍一看好像是为客户着想,其实这样做的目的是为了提高DELL的利润。

由于DELL没有自己的核心技术,所以他只能遵照工业标准。DELL不像IBM和HP,IBM和HP在服务器产品中拥有自己的核心技术,他们通常会 在产品中嵌入自己研发的软件和模块,这样可以提高产品性能和安全性,通常客户在实际使用中就可以通过这些厂家独有的技术来提高某些应用中的运算性能,但是 无形中会增加产品的成本,因为厂家会投入研发费用和生产费用。DELL却没有这些技术,DELL靠的就是降低成本后降低售价来赢得市场,我的客户拿HP的 产品和DELL的同配置和进行测试,当DELL的服务器CPU负载达到100%时,跑同样应用的HP产品CPU负载才70%,你应该明白为什么DELL同 配置产品比其他产品便宜了吧?因为他没有核心技术,他只有靠硬件配置来提高性能,因此DELL永远没有办法进入金融和电信行业的核心应用,因为在高端产品 市场大家都认为DELL的产品是XX,没有任何独有的技术为客户提高可用性和安全性,而DELL的销售人员拿到订单的最大本事就是降价,或者用和竞争对手 同样的价格提供更高的配置,可能你会发现你赚了,但是你错了,因为没有这些专有技术你即使买了最高的配置但是实际使用中的性能和普通配置的产品一样!而且 你选择DELL,失去的更多是稳定性和安全性!

DELL通常会在业界技术更新时的第一时间推出自己的最新产品,而且上市时间都会在其他厂商之前,然后销售人员会和你大吹特吹采用了新技术的产品多 么多么的好,如果你马上定购了,嘿嘿,你就是DELL的实验品了。DELL很多的新产品都只是在美国进行测试后全球同步上市,但是这不代表在某些特定地区 经过完整测试,比如中国。那么该产品在某一地区上市后DELL内部的所谓全球质量小组就会跟踪这些产品的报修信息,当某中产品的同样问题达到一定比例的时 候,(注意!是一定的比例,这个比例通常比较高!)那么这个质量小组会通知DELL的市场部门停止销售这种产品,并且要等解决完问题后重新销售,这种过程 在DELL内部叫做engineer hold,通常至少需要两周的时间。在这个期间内这种产品就不会出货了,然后就会有很多的客户来查询订单或者直接投诉,通常销售人员会编出无数个理由来骗 客户,比如物流公司动作太慢、卖得太火了导致缺货、产品召回等等等等。

早期的GX270就是个很好的例子,这个产品的主板设计存在缺陷,但是依然在中国上市,后来导致大量的客户在使用USB端口时南桥芯片烧毁,而且一 烧就是一批,我的一个客户出现过一天烧了40多台机器,这些事情DELL拒不承认是自己的问题,还认为是客户人为损坏,直到后来大量出现这种问题时才开始 同意为客户更换,大量的客户成了DELL的实验品,当你发现你买的所谓最新技术的电脑实际是存在安全隐患的产品,而你被DELL当“小白鼠”用了,你做何 感想?

二、服务

DELL为所有客户提供下一工作日上门的硬件质保服务,并且所有的报修过程都是通过电话来完成,你有试过通过电话去报修产品吗?如果你曾经报修过你 就应该知道DELL的服务电话多么难打,通常你能等半个小时接通一位TS就已经很幸运了,我的很多客户经常在电话中听音乐等一个下午还无法接通一个技术支 持。在DELL中有个考核指标就是电话接通率,这个数据会影响到DELL总体的客户满意度,后来DELL想出了一个提高接通率的办法,找几个临时工来接等 待时间过长的电话,然后在电话中告知客户技术支持都很忙,请客户留下联系方式,然后5点半下班以后再打给客户。那么,有多少客户会在下班后等待DELL打 过来的电话?大家都急着解决电脑故障,谁能等得起这个时间?

我经常会被客户问到一个问题,你们的报价单中所有的服务都是收钱的,为什么我们没办法享受?为什么给我们的电话都打不通?我们付给你们的服务费都用 到哪里去了?DELL公司每天都在卖出成千上万台的电脑,但是从DELL在中国成立一直到现在技术支持人员的增加速度远赶不上DELL的销售量的增加速 度。在DELL销售过程中所有的服务都是收费的,而且在DELL内部服务的利润很高,通常高达70%以上,既然DELL在服务上挣到了这么多的钱,为什么 不肯多雇一些技术支持呢?

如果客户想尽快接通电话,DELL的销售人员会给客户提供个解决方案,就是购买金牌电话支持,可以保证在一分钟内接通客户的报修电话,而且是二级工 程师与客户沟通,你知道买这个服务需要多少钱吗?300多块,你愿意出吗?既然DELL在每个产品中支付了服务的费用,那么DELL的技术支持热线就应该 随时保持通畅,就应该能够及时联系上技术支持人员,哪个客户愿意付了钱却无法报修呢。

DELL所有的服务都号称是专业服务,那么客户都会以为每次服务的工程师都是DELL的专业人员,你错了!DELL所有的服务都是委托第三方的公司 处理的,而且是全国各地不同的公司,并不是DELL自己的工程师!DELL在中国就没有自己的技术服务人员!DELL会用很低的价格和某个城市的一家公司 谈妥服务方式,并且会有一个很长的帐期,可是DELL却向客户收取了一个很高的服务费用,很多给DELL做服务的公司都很郁闷,钱给得少而且付款很慢,前 段时间某个省的第三方服务公司就因为不堪忍受DELL的 霸王条款而拒绝提供服务,导致那个省在一段时间内出现服务瘫痪的情况。

DELL所谓的硬件质保到底如何呢,我的一个同事向我讲过这样一个故事:有一个客户报修显示器坏了,第二天工程师上门后发现显示器侧面有一个不干胶 贴纸印,当时工程师就以这个贴纸印为由拒绝更换,他们认为这是人为物理损坏不属于质保范围。天那!客户买到电脑都是要做固定资产的,难道客户就不能在电脑 上贴一个固定资产标签吗?难道一个2平方厘米的不干胶贴纸就能搞坏一台显示器吗?你也许会感觉惊讶,但实际就是这样,你不能在电脑外壳上贴任何东西,即使 你拿下来了,但是只要有一点印子,DELL就会认为这是人为损坏,拒绝质保!

三、销售人员和业绩考核

你和DELL的销售人员联系过吗?你是否觉得他们在电话中的服务很好呢?你对他们的技术知识和工作水平满意吗?

DELL每个月都要招大量的新员工,而且很多都是销售部门,这些人的水平参差不齐,而且一批不如一批……在DELL目前的一批员工中,有的过去是卖保险的,有的是做文员的,有的是搞公司后勤和行政的……反正是什么人都有,甚至还有大学刚毕业的学生。

有的人到公司的时候连硬盘长什么样都没见过,DELL将这样一批人进行2周的培训后就让他们上岗了,看来DELL认为计算机这个东西只要学2周就可 以了,如果2周能进行系统的培训可能还能学点东西,但是这2周中有一周是安排公司内部流程的培训,剩下的一周是产品培训,关于计算机的基础知识培训只有一 个上午而已,大量的员工在上岗时依然分不清楚网卡和MODEM有什么区别,甚至连服务器时干吗的都不知道,你和这样的人沟通你觉得他提供的方案可靠吗?但 是就是这样一群人在支撑这DELL在中国几百个亿的销售额,你不觉得这是奇迹吗?

很多人来DELL都是同一个目标,为自己混一个外企工作经验,给自己的简历上增加一个亮点。大家都觉得奇怪,为什么没有来DELL挣钱这个理由呢? 其实你进入DELL以后就会发现在DELL你根本就挣不到钱!DELL其实过去的薪水还说得过去,底薪很多人都能拿到5000左右,如果你做得不错月收入 过万不是问题,甚至可以更高,但是现在却不行了,新进的员工很多人底薪不到3000元,而且奖励制度重新改革,新的奖励制度下一个销售人员每个月最多也只 能拿到8000元左右。当然,他的业绩必须非常的好,而且能达到所有的指标并且拿到所有的额外奖

特别是公司还变态的特价机型调整业绩比例,很多员工发现拼死拼活的做了一个季度业绩依然很差,业绩差就意味着你的收入低,并且当你两个季度都没有 100%达到销售业绩你就会被PIP(performance improvement plan),如果你一个月后没有改善业绩你就会被劝退了,中国的劳动法中规定不允许因为业绩问题将员工开除,DELL很聪明,他会逼着你自己辞职,让你自 己写辞职信,或者就是通过其他部门找出你的某些违规行为为理由直接将你扫地出门!

听说过完这个春节DELL的销售人员要辞职一半,和我同一批进来的同事经过3个季度以后现在只剩下我和另外两个同事了。由于DELL连续几个季度的 业绩滑坡,因此现在钱越来越难赚,而且公司的制度越来越变态,原来只要求我们能达到总体业绩的80%就算合格,现在提高到要达到100%,过去我们的奖金 可以拿到几万,现在每个季度最多几千块……

说到业绩滑坡,大家知道为什么现在DELL忙着降价了,其实成本降的更厉害!现在的产品品质比2个季度前都差了很多!

四、卑劣的销售手段

其实我不想用卑劣这个词,因为我也是一名DELL的销售人员,但是只有这个词能形容了。

1、伪造公章:

前期曝光过的邮件门事件和伪造客户公章的事情使我不得不想到这个词,其实这些只是公司中的一小部分卑劣手段,几乎每个销售人员都做过假的客户公章, 甚至伪造客户的合同和电子邮件,在DELL的员工中流传着个一个专门做公章的软件,大家都用这个软件制作假的客户公章,甚至更改客户发过来的传真件。

在DELL中一些大客户叫做OA客户,他们下单时只需要在报价单上加盖公章就能直接下单,因此很多销售人员为了完成销售任务就伪造客户的公章下单, 有些客户反映说我们还没有确定购买你们的机器怎么就已经送货过来了!销售人员就会解释说反正你们都是要买的东西,后面我怕会缺货就提前给你送来了,反正你 们付钱也要一个月以后,你们就先用着吧。但是这样却存在着很大的风险!

我身边多个同事就出现过客户临时更改定购计划想取消订单,但是销售人员已经用伪造的公章帮客户下单并且已经交货,这些事情发生以后通常会被DELL 自己给封锁消息,然后会在DELL内部发出邮件,说某个城市有一批未拆封的机器要做二次销售,然后其他的销售人员将这种机器折价卖给其他的客户。做假的公 章下单还算是比较轻的,我们还做过假的合同、假的客户邮件、假的客户传真,甚至有的销售做过假的银行电汇底单!这些东西你也许无法想象,但是这些事情真的 在DELL内部每天都在发生,而且是大量的销售人员用这种卑劣的手段处理订单。

2、我是流氓我怕谁:

当客户发现不满时通常第一个想法就是和当时的销售人员取得联系,在DELL的员工里很多人每天都在抱怨今天有多少个ISSUE要解决,但是如果你不 是一个年采购量几百万的客户那你就惨了,你的问题销售人员是懒得帮你解决的,他们通常是看到来电显示是你的号码就拒接这个电话,甚至直接在电话里和客户吵 架,说你这个客户烦不烦啊,这么点破事不能自己解决啊,我是销售,只负责帮你下单!

即使一些客户联系上了外部的销售代表他得到的答复也只是我们正在努力处理,请您等我们的消息。好吧,你就等吧,等着等着就到季度末了,然后就会有人 通知你,您现在的客户经理已经换人了,请找谁谁谁处理,然后你在重复之前的工作并且再一次的等待,其实有时候我也觉得对不起我的一些客户,但是我没办法, 这些客户太小了,他们的采购能力无法让我完成我的任务,所以我只有得罪他们去维护那些采购量更多的客户。

DELL的所谓以客为尊的格言我只有当他是放屁了,客户投诉我?那就让他去投诉吧,投诉一百遍这个季度他还是得着我买东西,想解决问题?下个季度找别人去吧,我是流氓我怕谁?!

3、坑蒙拐骗:

DELL都有一些小礼品或者是买某个产品会赠送一些其他产品,比如买服务器送个PDA,买台式机送个 打印机等等,但是有些客户不知道这些促销信息和赠送的东西,如果他们在这个时候下单就惨咯,这些礼品是不会送到客户手上的,去哪儿了?销售人员自己收下 了。有人会问说你们的东西不是会委托物流公司来送吗?对啊,我先用假的公章把你的地址改了,我先把货发到我家,把赠品扣下然后再找个物流公司给你送过去, 你会察觉吗?

我们经常还会拿客户的钱给自己解决ISSUE,比如客户打过来的钱多了,就会留在DELL的账上,或者有些OA客户的帐期比较长,如果我的另一个客 户急着要个什么东西但是无法及时付款,那么我们会用其他客户的钱先来下单,等客户钱打回来了我们再自己调剂,当然了,也不是每次都顺利,我有一个同事急着 完成任务把一个客户帐上的10万块给用了,没想到客户第二天就要用这笔钱来买东西,结果没钱给客户下单,但是客户又急着要货,最后半个月后才把单给客户下 了,客户差点冲到厦门来找我的同事算帐。在网络上的一些说过一个多月两个月不到货什么的,大多就是这样的情况。我们这里有个同事更狠,居然离职前用几个客 户的余款给自己买了台 笔记本电脑!

4、我们是“直销”:

DELL长期以来一直对外宣称是通过直销模式进行销售的,但是实际呢?每个销售人员都希望自己的客户名单里有多一些的经销商,为什么?做起来省事 呗,经销商只需要给销售人员发个邮件,里面写清楚产品配置,数量已经期望的采购价格,销售人员不需要打大量的电话和真正的客户沟通也不用做方案,多省事, 唯一麻烦一点的就是帮这些经销商编一个很美丽的故事,告诉公司这个公司不是电脑经销商,明明客户的名字是电脑科技有限公司,但是销售在申请折扣的时候会硬 说这家公司是做软件开发的,公司有多少多少员工,这个客户原来都是用联想的,我们很艰难地和客户谈妥让客户选用我们的产品,但是我们需要用多么多么低的价 格去打这张订单,这样一个十足的炒货电脑公司摇身一变成为一家实力雄厚的软件开发公司,并且销售人员会向公司保证今后我们会提高售价提高利润等等等等……

这样的事情我也干过不少,我的经理明明知道这个单子是拿出去做二次销售的,但是还是要做,因为没有经销商就没有数字,甚至很多销售人员平时一张订单 都没有,都期望着到季度末靠一两张经销商的大订单完成整个季度的销售任务。长时间以来我们都与大量的经销商保持着一种非常好的合作模式,甚至有些同事会透 露一些公司的大订单信息,让和自己关系好的经销商去抢别的同事的订单,然后让经销商在自己手上下单以完成销售任务。

还有更狠一点的,自己在负责区域里注册一家公司,自己给自己的公司批价格,然后把这些低价格的产品卖给自己的客户,甚至有些销售就靠给经销商批价格 来挣外快。比如某个经销商要求一台电脑的进货价格是5000元,那么如果这个销售批到的价格是4500元,那么经销商会每台机器返给销售500元,100 台可就是5万块啊,这就是为什么外面市场上的价格比DELL公司卖出来的还要便宜,有了利益的驱使甚至很多销售抱着做一票走人的态度拼命为一些很大的经销 商去批价格。你们知道经销商的销售额占DELL总体销售额的比例是多少吗?我可以负责任地告诉你,绝对在50%以上,而真正是卖给最终用户的产品不到实际 出货量的一半。

经常在DELL里你会听说某某某提交了一个折扣申请,里面有多少台笔记本多少台服务器,只要一听说笔记本是一年质保的,大家都清楚这张订单一定是假 的,因为只有经销商才会屯这种机型。长期以来DELL一直在打击经销商,并且发现一个就马上将这个客户的名称和发货地址列入黑名单,立刻拒绝和这个客户交 易,但是有些大型的经销商根本不担心,他们会换很多个看起来很象最终用户的名字来购买,并且进货的成本一次比一次低,他们在DELL里有固定的联系人,甚 至有些大型经销商会安排自己的线人进入DELL工作,让这些线人随时提供DELL的内部资料和成本变动情况。

早些时候我们还听说有些经销商居然有我们的ERP软件用户名和密码,他们甚至能用VPN进入DELL的系统随时查看订单和产品成本,还能自己做报价单。

DELL在最近将整个中国区划分成两个大部门,一个叫直销部,一个叫行业解决方案部门,后者实际上就是个渠道部,在这个部门负责的订单基本上都是通过经销商的,而且现在大家都在明着做经销商,不用象过去那样偷鸡摸狗了,因为公司已经把经销商问题合法化了。

其实这些手段销售人员不是发自本意的,但是没办法,大家肩膀上都扛着几百万到几千万的销售任务,而经理们从来不管你做的事情是不是正确的,他们需要 在每天的销售报告中看到数字的增长,这样大量的销售人员发现无法通过正常的途径完成销售任务,只能铤而走险,通过这些手段来保住自己的饭碗。

Friday, March 30, 2007

Best Practices to Improve Page Load Time (Keep-Alive)

Best Practices to Improve Page Load Time (Keep-Alive)

Best Practice 1: TCP Keep-Alives should be kept on.

Keep-Alives are turned on by default for IIS. Unfortunately, they seem to be one of the first things some people turn off while troubleshooting problems such as memory leaks.

When keep-Alives are on, a TCP connection is opened and then used for several files, with only the one round-trip-delay used to open the port.

When Keep-Alives are off at the server, the browser will open a TCP port then Get a file. In the response packet will be an HTML header: connection = close. This tells the browser that Keep-Alives are off and the TCP connection will be closed at the end of the file transfer. So, the browser will be forced to open a new TCP port for every file GET. This costs an extra round-trip-delay for every file.

The following VRTA chart shows two variations of the HotMail Today page BBPLT2 (immediately before & after Dec 21, 2004) In the top chart Keep-Alives were off. Notice the Page-Load-Time across the fixed WAN delay of 300ms is 18.5 seconds. Also notice the vertical column showing 33 TCP ports being opened. The second charts the same page with Keep-Alives now turned on. Notice there are now only 16 ports and the PLT has dropped to 13 seconds

Known Issues:

Turning Keep-Alives on causes the number of concurrent TCP connections to increase. Here's an update from Jason Pratt in Japan.

"We rolled out a similar QFE for the Japanese sites earlier this month that allowed for more TCP connections for clients to retrieve images, etc. And we saw problems with the servers handling the increased connections, so we threw some servers temporarily in there to respond to the increased number of connections.

Today we conducted some testing on our MSN.Com Japan servers to try to get a better idea of TCP connection limits for IIS6.

Previously, we ran into problems when these servers hit between 8,000 and 9,000 current connections. When this happened, IIS would reset connections, reject connections, etc. We’ve had this limit on all of our servers in APJ – the limit appears to not really vary by Application, etc – all systems are similarly affected.

We made some registry changes for HTTP sys to the MaxConnections key - http://support.microsoft.com/default.aspx?scid=kb;en-us;820129. We set this equal to 30,000 connections on our servers (DL580 – 4x700MHz, 1G Ram).

By removing servers from the cluster, we were able to increase load and connections on the remaining servers. We were able run at 28,000 current connections successfully. The only reason we ran into problems above this point is that we were saturating the FE NIC – all other perf counters on the server seemed to indicate the server was healthy, etc, and Keynote was returning consistently good results. The increase in memory utilization associated with this was negligible. Based on what we saw, we believe that the only reason we weren’t able to go higher was the NIC utilization. "

网络名词 定义

1、Kb和KB的区别:计算机中的信息都是二进制的0和1来表示,其中每一个0或1被称作一个位,用小写b表示,即bit(位);大写B表示 byte,即字节,一个字节=八个位,即1B=8b;前面的大写K表示千的意思,即千个位(Kb)或千个字节(KB)。表示文件的大小单位,一般都使用字节(KB)来表示文件的大小。 2、Kb和Kbps的区别:首先要了解的是,ps指的是/s,即每秒。Kbps指的是网络速度,也就是每秒钟传送多少个千位的信息(K表示千位,Kb表示的是多少千个位),为了在直观上显得网络的传输速度较快,一般公司都使用kb(千位)来表示,如果是KBps,则表示每秒传送多少千字节。1KBps= 8Kbps。ADSL上网时的网速是512Kbps,如果转换成字节,就是512/8=64KBps(即64千字节每秒)。

宽带路由器性能评判常见误区

   宽带和窄带比起来,最主要就是个"快"字,所以大家在选购宽带路由器时,非常关心其性能怎么样,通俗来说就是"快不快"。于是很多人提出各种各样的证据 来,证明自己的宽带路由器性能很好,很快。但许多证据往往是片面的,等你买回去发现性能不足的时候已经悔之晚矣。本文就从专业角度出发,分析几个大家经常 引用又容易误导大家评判的"证据",告诉大家应该怎样客观地看待这些证据,以及怎样正确地评判一个宽带路由器的性能。

  证据一:处理器主频

  说法:"处理器主频100M,性能强劲。""处理器主频133M,性能比100M的要好得多。""采用通信专业RISC CPU。"

   误区:首先,处理器只是路由器的一个部件,特别之处只在于它是最核心的器件。处理器用得差路由器性能好不了,但反过来处理器好了路由器性能却不一定好。 就象做菜,没有肥瘦得宜的新鲜猪肉绝对做不出好的红烧肉,但有了肥瘦得宜的新鲜猪肉,没有好的酱油,没有好的厨师,照样做不出好的红烧肉。其次,处理器主 频只是处理器的一个性能指标,要知道处理器性能,还必须了解其总线宽度(16位还是32位)、Cache容量和结构、内部总线结构、是单CPU还是多 CPU分布式处理、运算模式等等,这些都会极大地影响处理器性能,一点也不比主频次要。所谓的"采用通信专业RISC CPU"相当于什么都没说,只是用专业术语扮高深,不敢量出底细,因为几乎所有路由器采用的都是通信专业RISC CPU,关键要看这颗CPU到底用的是什么内核,内部结构如何。

  用户进阶:一般来 说,100M或以下的属于较低主频,100M~200M中等,200M以上属于较高主频。另外要问问处理器是什么内核,是80186、ARM7、 ARM9、MIPS还是Intel Xscale?Cache容量有多大?是单CPU还是多CPU分布式处理?注意别问不讲实话的奸商哦。80186、ARM7内核处理器是第一代宽带路由器 的典型配置,性能低,主流厂商均已不使用。ARM9、MIPS内核处理器是目前主流。Intel Xscale架构是高级网络处理器,用于高端产品。Cache容量8K或以下属于少的,16K常见,32K或以上是属于大的。一般处理器都是单CPU,采 用多CPU分布式处理的是高级处理器,性能高。如果你是专业人士或喜欢追根究底,还可以深究一下ARM9是普通型的920T/922T/940T还是增强 型的926E/946E/966E,MIPS是2K、3K还是4K、5K,不同型号性能和结构都会有较大差异。可以把处理器型号输入到Google上搜一 把,然后到芯片厂家的网站上好好看个究竟 ,顺便也看看其他人对这个芯片的评价(评论者水平有高低,目的有不同,不可全信)。

  证据二:内存容量

  说法:"我这个内存16M,你看那个才8M,性能比它好多了。"

   误区:这句话存在一个问题,两个陷阱。一个问题是:内存同样只是路由器的一个部件,只不过是一个重要部件而已。和处理器一样,内存用得小路由器性能好不 了,但反过来内存用得大路由器性能却不一定好。内存是用来存放运算过程中的所有数据的,使用内存就象布置房间。精明的上海女人善于"螺蛳壳里做道场",没 用的东西绝对不会摆在房间里,每一件东西都摆得合情合理,房间的每一个角落,从地板到天花板,每一寸都得到充分利用,10几20几平米的一居室能摆下全家 所需的全部家具和电器,甚至还有空间放一两个盆栽点缀一下。但如果换做一个懒惰的单身汉,你给他一套两居室和同样多的家具和电器试试看,保证他摆不下,而 且没过几天房间里到处是垃圾,立足的地方都没有。所以根据使用内存的大小来绝对地评判路由器性能的高低是不合理的,科学地使用内存同样重要,水平高的软件 设计能很好地规划和使用内存,水平低的甚至自己没有设计能力,直接使用处理器芯片厂家提供的未经优化的参考软件的,内存就不能得到有效的规划和使用。两个 陷阱是:内存单位和内存总线。内存可以用Byte(字节)做单位,也可以用Bit(位)做单位,两者一音之差,容量差8倍(1 Byte = 8 Bit),一般用大写B表示Byte,小写b表示Bit,但有些别有用心的人会在这里做手脚,有象上面的说法例子中不标单位混淆视听的,也有故意把b标做 B瞒天过海的。内存总线有宽有窄,要在内存中存或取4Byte的数据,如果是16位内存,就要操作两次,32位内存则只需要操作一次,效率差一倍。所以即 使相同容量的内存如果总线宽度不一样其对路由器性能的影响也是重大的。

  用户进阶:一 般来说,1M~4M Byte属于较小,8M Byte属于中等,16M Byte或以上属于较大。另外如果别人只告诉你是多少M,一定要问清楚是Byte还是Bit,是16位还是32位。当然你要找信得过的对象问,千万别上当 受骗。如果你是专业人士或喜欢追根究底,把内存型号输入到Google上搜一把,然后到芯片厂家的网站上好好看个究竟就绝对不会错了,除非不法分子用打磨 芯片在芯片丝印上造假。所以选择诚实守信的厂家产品很重要。

  证据三:Flash容量

  说法:"我的Flash容量大,性能比它好。"

   误区:没有道理。Flash是用来存放操作系统和应用程序的,其大小主要取决于用何种操作系统、应用程序编写效率和用户界面的花哨程度。如果选用高效率 的实时操作系统(如VxWorks、Ecos、Nucleus等),设计者对操作系统理解又很深刻,能对其进行合理裁剪,设计者的应用程序编写效率也很 高,就可以使用小容量的Flash。如果选用低效率的操作系统(如Linux等),设计者对操作系统不了解,应用程序编写效率低,或根本就是照搬了芯片厂 家提供的未经优化的参考软件,就只能使用大容量的Flash了。从这个角度来说,反而是Flash用得越小软件水平越高,产品越值得信赖。当然,产品功能 多、用户界面花哨(如有很多高清晰图片)相对来说用的Flash会大一点。

  用户进 阶:普通用户根本不用去了解Flash到底是多大,只要看功能是不是满足需要,顶多再看看用户界面好不好看,合不合你口味(如果你有这方面偏好的话)就足 够了。如果你是专业人士或喜欢追根究底,可以尝试去问问厂家他们用的是什么操作系统,软件是自己写的还是抄来的,不过基本上你会碰一鼻子灰,这可是厂家机 密。

  证据四:Throughput

  说法:"性能强劲,Throughput高达97M。""64Byte小包Throughput达到线速。"

   误区:路由器的工作过程很象邮局包裹业务。邮局寄包裹的过程是大家把要寄走的物品和寄件人、收件人和物品信息交给邮局,邮局用不同尺寸的标准箱把物品包 好并在箱子上贴上格式化的包裹单,检查无误后投递到目的地,收包裹是相反过程。路由器基本一样,只不过收发的东西是数据而已。Throughput(吞吐 量)表示的是路由器每秒能处理的数据量,相当于邮局单位时间里的包 裹处理能力,是路由器性能的直观反映。大家一定要注意这个数据后面隐藏的名堂是最多的。

   首先应该说明所谓路由器Throughput,一定是LAN-to-WAN的Throughput,数据流出或流入局域网才需要路由器处理,才能这代表 了路由器性能。而不是LAN-to-LAN,这代表的是路由器内部小交换机性能,正常应该都是线速,一点意义都没有。这就象邮局单位时间里的包裹处理能 力,一定指的是运出和运进邮局的包裹量,而不是从邮局一个房间搬到另一个房间的包裹量。但还是有些人把LAN-to-LAN的数据当作路由器 Throughput在宣传,甚至标到产品包装上,当然他不会写上这是LAN-to-LAN,大家要小心。

   另外,路由器Throughput,一般应该是在NAT开启,防火墙关闭的情况下得出的测试数据。这是因为NAT是宽带路由器最基本、最核心的功能,不 开启NAT就不成其为宽带路由器了,而且虽然不同的产品设计其NAT功用是一样的,但软件设计的好坏直接影响到NAT效率、路由器性能,所以NAT开启的 Throughput才是有意义的。至于防火墙,应该算做宽带路由器的附带功能、高级功能,有的产品防火墙规则很多很复杂,能过滤很多东西,有的产品规则 就又少又简单。规则多、复杂的,CPU用来过滤数据的时间就长,规则少、简单的,CPU用来过滤数据的时间就短,这对Throughput测试数据影响还 是挺大的。为公平起见,在测试路由器Throughput时,特别是在不同产品性能比较时,把防火墙关闭是合理的。这就象美国发生炭疽邮件袭击以后,邮局 对邮包的检查严格了很多,这会对邮局单位时间里的邮包处理能力产生较大影响,但其他国家没有这么复杂的检查程序,如果我们据此就断言美国邮局的效率低下, 就有失公允了。至于防火墙的评判,一般放在功能比较里面而不是性能比较。当然,如果不是不同产品的横向比较,只考察特定产品本身的性能,如果能同时有防火 墙关闭和防火墙开启(需要注明启用了哪些过滤规则)两种情况下的Throughput数据,大家就能对这个产品了解得更透彻了。

  常见Throughput测试方法有两种,一是Smartbits测试,一是Chariot测试。Smartbits测试是使用全球最权威的网 络设备测试仪器Smartbits2000或6000,配以其附带的专业测试软件SmartApplication,用连续不断的UDP包来测出对不同大 小的数据包路由器每秒能处理的包数量。路由器在处理数据包时,主要的时间花在处理包头、包尾上,所以对于不同大小的数据包,路由器每秒能处理的包数量差别 不会太大。这就象邮局处理包裹,主要的时间是花在处理寄件人、收件人和物品信息以及检查上,包裹重一点轻一点对处理速度影响不会太大。如128Byte包 每秒能处理10000个,并不能做到64 Byte包每秒处理20000个,而是只比10000个略多一点点,比如10100个。这就给了一些不诚实的厂家以可乘之机。如他的路由器在处理最大的 1518Byte包时每秒8000个,根据理论计算处理1518Byte包100M线速的极限值是8127个,所以折算出来的Throughput就是 100M*8000/8127=98.44M,于是他就很自豪地宣布,我的路由器Throughput高达98.44M,殊不知,原来这个路由器在处理最 小的64Byte包时每秒是11000个,根据理论计算处理64Byte包100M线速的极限值是148810个,所以折算出来的Throughput只 有100M*11000/148810=7.39M,两者相差13倍多。这完全取决于我们怎么看待吞吐量,是每秒处理多少个数据包还是每秒处理多少兆数 据,就象邮局每天是处理多少个邮包还是多少公斤货物。从邮局能力角度来看,应该是从每天处理多少个邮包来评判更合理一点,因为这个数据相对来说是稳定的, 受邮包重量影响小。但每天多少公斤货物,受邮包重量的影响就是根本性的,如邮寄的全部是书籍,计算出来的每天处理货物公斤数就很大,如果全是棉花就很小。 实际情况中一定是既有书籍又有棉花还有其他五花八门的东西,但你评估的时候按什么比例来调配这些货物才合理呢?没人说得清,除非有人定一个标准规定各种东 西的比例,大家都按照这个标准来计算。既然没标准,有人就用书籍来计算,有人就用棉花来计算,规矩的人说明我是用什么来算的,不规矩的就乐得浑水摸鱼。另 外,以目前宽带路由器普遍所采用的硬件来看,即使是性能最好的,也不足以达到64Byte小包Throughput线速,但有的人宣称我的产品就有这么 好,而且拿出Smartbits测试数据来证明。这类产品采用的是所谓NAT硬件加速技术,Throughput是很好看,但代价是所有数据都不通过 CPU,无法做数据的过滤,门户大开,防火墙不起作用,路由器没有任何管理功能。

   Chariot测试则是用两台服务器,安装NETIQ公司的流行软件Chariot,一台接路由器WAN口,一台接LAN口,通过统计一个预定长度和格式 的脚本文件无差错地从一台服务器传送到另一台服务器的时间来计算出路由器的Throughput。这里面学问就大了。一是服务器性能,如果性能差,就会成 为测试的瓶颈,路由器性能得不到体现,所以不诚实的厂家在测试自家的产品时用高性能的服务器,生怕自家的产品性能表现不出来,而测试别人的产品时用低性能 的服务器,故意贬低数据。二是建立连接数,如果路由器软件写得差,在连接数增加时,其Throughput会直线下降,而好的路由器则很平稳,甚至会随连 接数的增加反而略有上扬。如果路由器性能不足,甚至会因无法同时建立这么多连接而测试失败。所以差的路由器只敢用一对连接来得出测试数据,而好的路由器不 怕多连接。三是Chariot测试不象Smartbits测试那样是测试UDP"包",而是数据"流",其数据封装成多大TCP包和服务器操作系统相关, 但一般都封装为1518Byte大包,所以其测试数据会比用Smartbits测试64 Byte小包的数据好看很多倍,这一点很能迷惑人。四是Chriot测试Throughput结果是有效数据负载,不包括TCP协议损耗、帧间隔、应答和 Chriot本身系统损耗,此部分典型损耗根据理论计算约6M,就是说即使你接的是一台能线速转发的交换机,不是路由器,测出来的Throughput也 只可能是94M左右,这是理论极限值,如果有人宣称我的产品Chriot测试Throughput 97M、98M,那毫无疑问是瞎吹。

   用户进阶:Throughput是LAN-to-WAN的Throughput,一般应该是在NAT开启,防火墙关闭的情况下得出的测试数据,而且有 Smartbits测试和Chariot测试两种方式,得出的结果可以很不相同。根据现在普遍的硬件能力,Smartbits大包测试数据大家都很容易达 到线速,就象你测试大学生的智力,题目是1+1=?,大家都能答上来,比不出高下。所以你要做客观的评估,题目应该出难一点,比较64Byte小包测试数 据,高下立判。当然你要小心是否有NAT硬件加速,有的话把它关掉再测试。至于Chariot测试,不同产品的性能应 该是在同样的测试环境和方法、同样的连接数下进行比较才公平,而且在实际网络应用中,总是多连接而几乎不可能是单连接的,为了发现差路由器, Chariot测试最好是在多连接下进行,一般可以选择100对连接基本上就可以看出大家的区别来了。总之,单独的一个Throughput数据是毫无意 义的,一定要说明这个数据是用什么方法测出来的才有用,相互性能的比较一定要在同样的测试环境和方法下进行比较才公平和有意义。最好的方法是看 Smartbits测试NAT开启64 Byte小包的LAN-to-WAN Throughput。

该是在同样的测试环境和方法、同样的连接数下进行比较才公平,而且在实际网络应用中,总是多连接而几乎不可能是单连接的,为了发现差路由器, Chariot测试最好是在多连接下进行,一般可以选择100对连接基本上就可以看出大家的区别来了。总之,单独的一个Throughput数据是毫无意 义的,一定要说明这个数据是用什么方法测出来的才有用,相互性能的比较一定要在同样的测试环境和方法下进行比较才公平和有意义。最好的方法是看 Smartbits测试NAT开启64 Byte小包的LAN-to-WAN Throughput。

听很重要,最好的方法之一是找有信誉专业媒体的横向测评数据,注意前提是有信誉和专业,既能做到客观公正又能测到点子上,如前不久《在线Online》杂 志(online.cniti.com)2004年第2期中的"18款宽带路由器全面测试",就是一个产品/品牌较全,测试较为专业、客观、全面的横向测 评,很有参考价值。相信按现在宽带路由器产品的市场地位及其发展速度,很多权威媒体在今年都会做类似的横向测评,大家可以关注。对于第一步中所讲的一、二 类品牌产品,大家还可以就不清楚的地方直接打电话或发E-mail问厂家,一般能得到较客观回答。

   4.试试看:经过以上三步,大家基本上已经可以作出判断和选择了。如果可能,再实际试试看就更保险了。非专业人士可以直接把路由器安装到网络中用用看, 注意要在网络最繁忙的时段试才能看出性能够不够,如网吧要在基本满座,最好大家都在玩"传奇"时测试。专业人士如果有设备和软件,可以做一下 Smartbits测试和Chariot测试,重点测以下几项:Smartbits测试NAT开启64Byte小包的LAN-to- WANThroughput,最严格、最客观的性能数据;最大并发连接数及连接建立速度,在很大程度上影响带机能力;多连接下Chariot测试 Throughput,也能较好地反映性能。

Tuesday, March 27, 2007

斯德哥尔摩综合症


斯德哥尔摩综合症(Stockholm syndrome),又称为人质情结或人质综合症,是指犯罪的被害者对于犯罪者产生情感,甚至反过来帮助犯罪者的一种情结。这个情感造成被害人对加害人产生好感、依赖心、甚至协助加害人。

1973年8月23日,两名有前科的罪犯Olsson与Olofsson,在意图抢劫瑞典首都斯德哥尔摩市内最大的一家银行失败后,挟持了四位银行职员,在警方与歹徒僵持了130个小时之后,因歹徒放弃而结束。然而这起事件发生后几个月,这四名遭受挟持的银行职员,仍然对绑架他们的人显露出怜悯的情感,他们拒绝在法院指控这些绑匪,甚至还为他们筹措法律辩护的资金,他们都表明并不痛恨歹徒,并表达他们对歹徒非但没有伤害他们却对他们照顾的感激,并对警察采取敌对态度,更甚者,人质中一名女职员Christian竟然还爱上劫匪Olsson,并与他在服刑期间订婚。

这两名抢匪劫持人质达六天之久,在这期间他们威胁受俘者的性命,但有时也表现出仁慈的一面。在出人意表的心理错综转变下,这四名人质抗拒政府最终营救他们 的努力。这件事激发了社会科学家,他们想要了解在掳人者与遭挟持者之间的这份感情结合,到底是发生在这起斯德哥尔摩银行抢案的一宗特例,还是这种情感结合 代表了一种普遍的心理反应。而后来的研究显示,这起研究学者称为「斯德哥尔摩症候群」的事件,令人惊讶的普遍。

研究者发现到这种症候群的例子见诸于各种不同的经验中,从集中营的囚犯、战俘、受虐妇女与乱伦的受害者,都可能发生斯德哥尔摩综合症经验。以人质为例,如 果符合下列条件,任何人都有可能遭受到斯德哥尔摩综合症。第一,受俘者必须真正感受到绑匪威胁到自己的存活。其次,在遭挟持的过程中,被绑的人必须辨认出 绑匪可能施与的一些小恩惠的举动。再者,除了绑匪的看法之外,受俘者必须与所有其他观点隔离。最后是,受俘者必须相信,逃离是不可能的事情。

先说一个比较长的案例:1977年5月19日,27岁的卡罗离开位于奥勒冈州尤金市的家乡,起程去探访一位住在北加利福尼亚州的朋友。北加利福尼亚州距离 奥勒冈州大约有644公里的路程,路上她搭了个便车,车上是一家三口,男主人卡门龙,妻子叫珍尼斯。半途中,她突然被勒令举起双手,蒙上眼睛,卡罗被带到 了一个屋子的地窖里。

卡罗清楚记得卡门龙把她身上的衣服脱去,一条鞭子抽打在她的身上。以后每天,卡罗先被毒打一顿,然后吊在门檐上,脚尖仅仅踮到一点点地面。卡罗刚开始还拼 命挣扎,卡罗最初的一段时间完全生活在黑暗之中,卡门龙特意用金属做了一个双层头罩和像棺材一样的箱子,她在里面不能吃、喝、听、看。

卡门龙是一个虐待狂,他崇拜古代的奴隶社会,长期沉迷于带有暴力倾向的色情文学,他把卡罗当成自己的俘虏,而自己就是奴隶主。从卡罗的身上,他得到了征服感和占有感的满足。

在这个小镇,卡门龙夫妇看起来是极为平凡和不起眼的邻居,他们和平常人一样,白天去上班、购物,晚上回家睡觉。卡门龙在当地的一家木材加工厂工作,他们的 邻居评价这是很爱安静的三口之家。但是从来没有人了解这一家子的背景。在邻居的眼里,卡门龙是一个沉默寡言的年轻人,他不善和人交友,只喜欢默默一个人干 活。卡门龙几年前毕业于当地的一所高中,然后在1973年遇上了当时只有15岁的珍尼斯。珍尼斯患有轻度癫痫病,卡门龙就是看上了她对自己百依百顺的优 点。卡门龙认为,只要有男人肯要珍尼斯,珍尼斯一定会为这个男人付出任何代价。

卡门龙疯起来的时候会把卡罗的头按在水里,直至几乎窒息,或者接通电线,或者用手扼她的脖子。而鞭打是每天的家常便饭,有时卡门龙还拍下卡罗的照片,然后在家里冲洗。每当卡门龙折磨卡罗的时候,他就会变得异常兴奋。

卡门龙还想出了千奇百怪的主意来实施自己的虐待欲,包括在地下杂志上剪下一份据称是出售灵魂的契约,强迫卡罗签下。他还在卡罗的阴唇上穿了一个洞,说这是他们的“结婚戒指”,并说希望有一天可以和她生孩子。

当确定卡罗不会试图逃跑时,卡门龙决定要和卡罗结婚。自此,卡罗有了更多的自由,她可以每天去洗澡、干家务活,甚至允许她出外慢跑,而卡罗每次总是会回来。一些邻居也开始看到了卡罗,他们都以为她是这家的保姆。

1980年,卡罗甚至可以到外面打工。实际上,已被绑架了三年的卡罗这时有许多机会可以逃跑,但是她并没有这样做。

卡罗被囚禁了7年,直到卡门龙的妻子珍尼斯突然良心发现,加上嫉妒卡罗的“得宠”,帮助她逃离了这个地狱。

难以置信的是,卡罗在回到自己的家以后,还一直打电话给卡门龙,他哭着企求她回来,而卡罗向他保证决不起诉他。

直到卡门龙的妻子珍尼斯离开了卡门龙,找到了一个心理医生,他们聊了将近2个小时,珍尼斯把故事全部说了出来,心理医生报了警。

1984年11月,卡门龙被正式逮捕。

在法庭上,主控官描述了卡门龙最喜爱的一部电影,片中讲述了一个虐待狂绑架了一个年轻的姑娘,并把她变成一个顺从的性奴。这个女孩最终变得忠心耿耿,甚至 为她的“主人”牺牲了生命。主控官试图以这种戏剧化的形象,向陪审团证明卡门龙如何深受这部电影的影响,而卡罗也和片中的女孩一样,被卡门龙完完全全洗了 脑而丧失了个人的意志。此外,压在卡罗身上的是一种无形的恐惧和枷锁,因为害怕报复,所以她一直不敢逃走。

一项关于女性参与性虐待案件的研究中,他们通过访问了20多个女同谋犯(包括卡罗和珍尼斯)和分析她们的心理特征,指出男性患有幻想症和虐待症,通常很容 易影响他身边的女性,而使她们也逐渐参与其中。当女性参与作案后,她们对男人的依赖就会越来越强,而自我的独立性就越来越低。如果感到自己被疏远,她们就 会变得不可忍受。

这就是 “斯德哥尔摩综合症”,这种病常常发生在一些被绑架受害者、被虐待的妻子、被囚禁的犯人身上,他们会逐渐适应于被虐待和被囚禁。研究者把这种现象称为“精 神冬眠”,受害者以自我麻木和服从的方式保护自己免受更大伤害,这种麻木和服从久而久之变成了一种习惯,甚至愿意为主人卖命或掉进“爱河”。

平时很多人初次了解斯德哥尔摩综合症,应该是从港剧《谈判专家》,里面提到心理学上的“斯德哥尔摩现象”。剧中,被大智绑架的那些同事,他们都是出于公司领导盘剥及欺压员工的事实才会对绑架者大智产生同情和帮助的,而不是所谓的产生了“斯德哥尔摩现象”,难道人质和绑架者产生正面感情就是“斯德哥尔摩现象”?

因此,对于此现象的争议和研究还在继续。不过,当今很多人已经开始将这个词汇运用到对一些事物的比喻评论上,不论其使用恰当与否,这些已经表明了这个现象已经开始得到越来越多的人们的关注,例如一个股民在网上发表了如下评论:

这次股改伊始,股民都对所谓对价之低大大不满,用脚投票。管理层不为所动,仍然坚持,一面在一千点处动用资金护盘,对价没有根本变化,一天天过去了,股市 的“斯德哥尔摩现象”终于出现了!我倒不是佩服管理层的英明或本事,涉及利益之争,谁也不傻。我是感慨几十年来我们不断被强奸,不断从痛苦中自我解脱,不 断地企图从被强奸中寻找快活。我的可悲的股民朋友...

.NET值类型变量“活”在哪个堆栈中?

.NET值类型变量“活”在哪个堆栈中?
——MSIL学习笔记(一)
金旭亮
不管是什么语言编的.NET程序,最后都会被各自的编译器编译成MSIL。当程序运行时,.NET JIT编译器从程序集中读入IL指令并将其动态编译为可被本地CPU执行的机器指令再执行。
程 序集中的IL代码以二进制方式存在,人阅读起来相当不便,正如传统的Win32程序可以被反汇编成汇编程序,.NET程序集中的IL代码也可以被反汇编成 易于阅读的IL汇编程序。如果您愿意的话,可以用任意一个文本编辑器直接撰写IL汇编源代码,然后使用ilasm.exe程序将其编译为包含二进制形式的 IL指令。CLR只能执行二进制的IL指令。
.NET SDK的另一个工具ildasm.exe可以用于将一个程序集反汇编为IL程序,在学习.NET时,这个工具非常有用,可以展示出高级语言(如C#和VB.NET)编写的程序是如何被CLR执行的。
然 而,相比C#和VB.NET的资料满天飞,MSIL的技术资料少得可怜。我能够查阅的只有MSDN中有关IL指令的文档(还只是针对 Reflection.Emit名字空间中的类的),以及一本由Serge Lidin著的《inside Microsoft .NET IL assembler》, Serge Lidin是汇编器ilasm.exe工具的主要开发者,因此,他的书应具有相当的权威性,然而,这位技术牛人的写作水平实在不敢恭维,整本书象是一本参 考手册。此书国内引进了中文版,然而翻译得很不好。幸运的是其光盘中附上了英文原版,实乃国人之大幸。
IL可以看成是一个“面向对象的汇编语言”,它提供了许多指令直接对对象进行操作,比如newobj指令创建对象,box指令进行装箱等。
IL指令的一个最重要特性是它是基于堆栈的。几乎每一条指令都要与堆栈打交道:或者向堆栈中Push一些数据,或者从中Pop一些数据。
请看以下C#代码段:
class Program
{
static void Main(string[] args)
{
int i = 100;
int j = 200;
int reslut = i + j;
}
}
C#编译器将生成以下IL指令,其功能我在注释中有详细说明:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 15 (0xf)
.maxstack 2
.locals init ([0] int32 i,
[1] int32 j,
[2] int32 reslut)
IL_0000: nop
IL_0001: ldc.i4.s 100 //将100压入堆栈
IL_0003: stloc.0 //从堆栈中弹出先前压入的100,传给局部变量i
IL_0004: ldc.i4 0xc8 //将200压入堆栈
IL_0009: stloc.1 //从堆栈中弹出先前压入的200,传给局部变量j
IL_000a: ldloc.0 //将局部变量i的值压入堆栈
IL_000b: ldloc.1 //将局部变量j的值压入堆栈
IL_000c: add //连继弹出两个整数,相加得300,又压入堆栈
IL_000d: stloc.2 //从堆栈中弹出结果,保存到局部变量reslut中
IL_000e: ret //返回指令
} // end of method Program::Main
可以看到,所有的指令都涉及到堆栈。
然而,我在研究IL汇编程序的时候,却被“堆栈”两个字弄糊涂了。
几乎所有的C#书,都说值类型变量是生存在堆栈中,当函数结束时会自动销毁。那么,这里的堆栈与上述IL代码中的堆栈是不是一回事?
请看上述IL程序中有一个MaxStack指令,查看资料,得知其含义是为evaluation stack保留两个槽(slot),注意,这里的堆栈英文原文是evaluation stack,MSDN中文版译为“计算堆栈”,slot可用于存放值对象,大小是可变的。换句话说,evaluation stack中的每一个slot可以存放一个值对象(对象引用也可看成是一种“特殊”的值变量,其值代表内存地址)或各种CLR直接支持的基本类型数据。
从上述IL程序中可以很明显地看到,局部变量i,j和result绝不会生存于evaluation stack,因为它只有2个slot,而我们有3个变量。那它们“活在”在哪儿?
IL程序中引人注目的一句是locals init指令,这提醒我们函数拥有另一块内存区域专用于存放局部变量,所以,声明为局部变量的值类型并不“活”在evaluation stack中。那么,为何所有的C#书(包括大名鼎鼎的Jeffrey Richter所著之《.NET框架程序设计》)都说值类型变量“活”在堆栈中?此堆栈在哪?至少有一点可以肯定,这个堆栈不会指的是evaluation stack。
用ildasm.exe查看程序集清单(manifest),发现其中有一句:
.stackreserve 0x00100000
上述语句让CLR在装入程序集时保存1M的堆栈空间,这个空间供托管进程的托管线程使用,称为线程堆栈(Thread Stack)。既是线程堆栈,自然与线程相关,由于.NET托管进程可以创建多个托管线程,因此,每个线程也应该有自己的堆栈(Jeffrey Richter说也是1M,查看也是这位老先生写的《Windows核心编程》,说在Win2000在创建线程时其堆栈大小是可调整的)。
.NET下每个托管线程都对应着一个线程函数,因此函数中定义的局部变量是在它拥有的线程堆栈中分配,而IL程序中的maxstack指令则从这一个1M的线程堆栈中再划出一块空间来作为evaluation stack。
考虑一下函数调用的问题。
IL使用call和callvirt两条指令调用特定类型所提供的方法。这就有一个函数参数传送的问题。以call指令为例,MSDN说在调用call指 令之前,要将所有的实参压入evaluation stack,然后call指令再将其弹出,之后控制才会转到被调用的函数,而当被调用的函数执行完毕时,ret指令负责“将函数的返回值”从“被调用者的 堆栈”(callee’s evaluation stack)复制到“调用者堆栈”(caller evaluation stack)中。您看MSDN文档中居然又出现了两个堆栈,是否有点晕了吗?
查看Serge Lidin的书,他给出了这样一个图:
如上图所示:CLR会给每一个被调用的方法分配三块内存,除了上面讲到的两块(Evaluation stack和局部变量表Local Variable table),还有一块是参数表(Argument table)。
问题终于明晰了,call指令完成的工作应该是这样的:
调用者按要调用函数的参数准备好实参,将它们压入“自己的”evaluation stack中,然后,call指令执行,它从调用者的evaluation stack弹出这些参数,放入被调用函数的Argument Table中。一切准备工作就绪,这时才开始执行被调用函数的第一条IL指令。
当被调用函数执行完毕,如果有返回值,这个值应该被放在被调用函数自己的evaluation stack中(因为IL指令总是与堆栈打交道),然后,ret指令(每个函数最后一定是这条指令)将其弹出,再压入调用者的evaluation stack中,完成这一工作之后,执行流程转回到调用者。
因此,线程每调用一个函数,将导致图中所示的三块区域在1M的线程堆栈中分配给调用函数,对于递归调用的情况,后调用的函数占用的内存区域将“压”在其调 用者内存区域之上,每执行完一个函数,对应的栈顶指针移动一个位移(大小刚好等于此函数先前所占用的内存),从而导致这些内存被释放,其中的局部变量不再 有效。
分析.NET程序的IL指令还会得到一些有趣的结果,后面我会有更多的文章与网友们进行技术交流。
注:由于手头的资料不足,此文所述内容仅是本人对CLR内部运行机理的一个推测,如有错误,敬请指正。by the way,望有网友能提供更多的MSIL技术资料信息,在此谢谢了。:-)
转载请注明作者及出处。

微软与OpenID

微软与OpenID:开放式用户中心身份标识层技术与业界联手

[原文地址: http://netmesh.info/jernst/Digital_Identity/openid-cardspace-open-identity-layer-becomes-real.html]

原文作者:Johannes Ernst. 2007年02月06日


摘要:作为一种简单有效的身份标识系统,OpenID越来越受到关注。简单地说就是用户可以使用一个自己拥有的域名来登录网络服务。最近,微软加入了支持OpenID的行列,本文对这一事件进行了评述。本文不涉及技术细节。


今天,比尔·盖茨在主题演讲中宣布微软将会支持OpenID,将其与CardSpace以及其他的一些微软产品进行整合。可以毫不夸张地说,到目前为止,以用户为中心的数字身份标识方案已经到达了一个最重要的里程碑。

很长一段时间以来,开放的互联网需要一个更好的数字身份识别管理方法,这已经成为一个无可争辩的事实。多种网络攻击(例如“钓鱼”)在飞速增长;垃圾电子 邮件以及伪造的回信地址已经威胁了电子邮件的正常使用;此外,一个典型的互联网用户需要记住的用户名和密码正在从几十个向上百的数量级增加。许多很有前途 的新产品,例如访问控制数据的糅合(mash-ups of access-controled data),只有在这个问题解决之后才能够得以应用。而一个能广泛部署的可行方案迟迟没有到来。

到目前为止,有三个主要的数字身份识别推进项目

  • 1. 自由联盟(iberty Alliance),最早是为了抗衡微软的Passport而创建的。现在它正在集中精力于企业之间的身份标识的可互操作性的工作。
  • 2. 信息卡项目(information card effort),由微软的CardSpace和开源社区的Higgins项目牵头进行。
  • 3. 基于URL的身份标识(OpenID),由很多小公司和开源项目支持和实现。

由于历史的原因,这些项目是相互独立进行的。不过,现在他们彼此之间的竞争已经完全消除,此外,显然对于所有人来说(除了那些厮守“纯正血统”的人),公 共互联网上的数字身份标识要想有一个实实在在的未来应用,那么它必须让底层的细节对用户是透明的,这是因为它包含了太多的复杂协议。

因此也诞生了许多关注互操作性的项目:Higgins项目开发出了开源的工具,可以从同一个应用程序接口向任何的身份标识协议进行会话,并且是使用同一张卡的用户接口。OSIS,这是一个将许多工作融合在一个的项目,它把大部分相关软件厂商和开源项目汇集在了一起。OpenID自己也是将多个其它推进项目集中到了一起。Identity Commons是所有诸如此类组织的一个大成。

微软今天的声明是第一个真正有重大意义的产品支持。这意味着身份标识层技术不仅会包含WS-Trust(微软当前首选的身份标识协议),还会包含 OpenID。OpenID有可能是开放互联网上发展最快的身份标识技术了。此外,还有其他的一些声明,值得关注的又IBM和Novell正在支持多协议 Higgins。不过,由于微软所拥有的强大市场地位以及发布渠道,他们被今天的这个声明所掩盖了。

我们已经有了今天的这个里程碑,下面将何去何从?我觉得可以作如下的一些预测:

  • 1. 我们可能会看到一些厂商会宣称他们也同时支持用户中心的身份标识层技术,并同时使用卡基和URL。
  • 2. 我们已经看到的在用户中心身份标识技术上的创新会更加快速发展,并带来许多新的商机。
  • 3. 业界关于拥护中心身份标识技术的讨论将从“让我们的工程师来搞定这个技术”转向“我们需要一个决策来避免业务的中断并想方设法从中获利”。

没错,对于在线业务相关的几乎所有人,用户中心的身份标识具有相当的颠覆性。用户可能会开始拒绝在你的网站上使用用户名和密码,并要求你接受他们自己喜欢的认证方式。用户中心的身份标识将会使控制权从厂商向用户转移的大众运动加速。诸如各种形式的厂商关系管理(endor Relationship Management)在今天看上去很古怪的,在将来也许就不会了。

一些公司也许会选择先忽视用户中心的身份标识,那他们就只有自食其果了。其他人如果没有眼光加入用户中心的身份标识技术,那他们的用户就只能沿用传统的方 式访问而别无选择。(省省吧!“能抓住老鼠就是好猫”的时代已经一去不复返了。)那些同一市场中的卓越公司会用这些技术占得先机,他们会获得技术提供商的 支持,例如NetMesh,它的目标就是提供在新天地中用以制胜的工具。现在是一个前所未有的好机会可以为用户提供更优的服务,用户可以采用喜欢的方式,同时,不光商家自身的资产也可以得到平衡,用户的整个社会网络以及由用户中心身份标识生态系统带来的新体验也在得到日新月异的进步。

我们正在经历一次有意义的旅行……微软,为这次旅行插上翅膀。

本文由译言网的kunwu翻译。作者的其他文章有:

Sunday, March 25, 2007

.net 内存

在.NET程序中正确使用String类型

在实际程序中,String类型用得非常广泛,然而,由于.NET对String类型变量的独特管理方式,使用不当,会严重影响程序的性能。我们分几个方面来谈这个问题:


1 了解String数据的内存分配方式


编写一个控制台应用程序,输入以下测试代码:

class Program
{
static void Main(string[] args)
{
String s = "a";
s = "abcd";
}
}

使用.NET Framework 2.0 SDK提供的ildasm.exe工具查看生成的MSIL指令:

01 .method private hidebysig static void Main(string[] args) cil managed
02 {
03 .entrypoint
04 // 代码大小 14 (0xe)
05 .maxstack 1
06 .locals init ([0] string s)
07 IL_0000: nop
08 IL_0001: ldstr "a"
09 IL_0006: stloc.0
10 IL_0007: ldstr "abcd"
11 IL_000c: stloc.0
12 IL_000d: ret
13 } // end of method Program::Main

简要解释一下上述MSIL指令代码:
第06句给局部变量s分配一个索引号(索引号从0开始,如函数中有多个局部变量,其索引号按在函数中出现的顺序加一)。
在编译时编译器会将代码中的两个字串"a"和"abcd"写入到程序集的元数据(metadata)中,此时,这两个字串被称为"字串字面量(string literal)"。
第08句使用ldstr指令为字串对象"a"分配内存,并将此对象引用压入到线程堆栈中。
第09句使用stloc指令从线程堆栈顶弹出先前压入的对象引用,将其传给局部变量s(其索引号为0)。
同样的过程对"abcd"重复进行一次,所以这两句简单的代码

String s = "a";
s = "abcd";

将会导致CLR使用ldstr指令分配两次内存。
根据上述分析,读者一定明白了String变量的内容是只读的,给其赋不同的值将会导致内存的重新分配。因此,为提高程序性能,编程时应尽量减少内存的分配操作。
下面对代码中常见的字串用法进行分析,从中读者可以知道如何避免严重影响程序性能的字串操作。

2 尽量少使用字串加法运算符

请看以下两段代码:

(1) String s1 = "ab";
s1+="cd";
(2) String s1="ab"+"cd";

这两段代码运行结果一样,但速度一样快吗?
请看第(1)段代码生成的MSIL指令:

.locals init ([0] string s1)
IL_0000: nop
IL_0001: ldstr "ab"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldstr "cd"
IL_000d: call string [mscorlib]System.String::Concat(string,
string)
IL_0012: stloc.0
IL_0013: ret

再看第(2)段代码生成的指令:

.locals init ([0] string s1)
IL_0000: nop
IL_0001: ldstr "abcd"
IL_0006: stloc.0
IL_0007: ret

可以很清楚地看到,第(1)段代码将导致String类的Concat()方法被调用(实现字串加法运算)。对于第(2)段代码,由于C#编译器聪明地在编译时直接将两个字串合并为一个字串字面量,所以程序运行时CLR只调用一次ldstr指令就完成了所有工作,其执行速度谁快就不言而喻了!


3 避免使用加法运算符连接不同类型的数据

请看以下代码:

String str = "100+100=" + 200;
Console.Writeline(str);

生成的MSIL指令为:

.maxstack 2
.locals init ([0] string str)
IL_0000: nop
IL_0001: ldstr "100+100="
IL_0006: ldc.i4 0xc8
IL_000b: box [mscorlib]System.Int32
IL_0010: call string [mscorlib]System.String::Concat(object,
object)
IL_0015: stloc.0
IL_0016: ldloc.0
IL_0017: call void [mscorlib]System.Console::WriteLine(string)
IL_001c: nop
IL_001d: ret

可以清晰地看到,这两句C#代码不仅导致了String类的Concat()方法被调用(IL_0010),而且还引发了装箱操作(IL_000b)!
Concat()方法会导致CLR为新字串分配内存空间,而装箱操作不仅要分配内存,还需要创建一个匿名对象,对象创建之后还必须有一个数据复制的过程,代价不菲!
改为以下代码:

String str = "100+100=";
Console.Write(str);
Console.WriteLine(200);

生成的MSIL指令为:

.maxstack 1
.locals init ([0] string str)
IL_0000: nop
IL_0001: ldstr "100+100="
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: call void [mscorlib]System.Console::Write(string)
IL_000d: nop
IL_000e: ldc.i4 0xc8
IL_0013: call void [mscorlib]System.Console::WriteLine(int32)
IL_0018: nop
IL_0019: ret

可以看到,虽然多了一次方法调用(Console.Write)方法,但却避免了复杂的装箱操作,也避免了调用String.Concat()方法对内存的频繁分配操作,性能更好。


4.在循环中使用StringBuilder代替String实现字串连接


在某些场合需要动态地将多个子串连接成一个大字串,比如许多复杂的SQL命令都是通过循环语句生成的。这时,应避免使用String类的加法运算符,举个简单的实例:

String str ="";
for (int i = 1; i <= 10; i++)
{
str += i;
if(i<10)
str += "+";
}

上述代码将生成一个字串:1+2+…+10。
有了前面的知识,读者一定知道这将导致进行10次装箱操作,19次字串内存分配操作(由String.Concat()方法引发),由于生成的MSIL指令太长,此处不再列出,请读者自行用ildasm.exe工具查看上述代码生成的MSIL指令。
改为以下代码,程序性能会好很多:

//预先分配1K的内存空间
StringBuilder sb = new StringBuilder(1024);
for (int i = 1; i <= 10; i++)
{
sb.Append(i);
if(i<10)
sb.Append("+");
}
String result = sb.ToString();

通过使用ildasm.exe工具查看生成的MSIL代码,发现虽然上述代码生成的MSIL指令比前面多了7条,但却避免了耗时的装箱操作,而且内存分配的次数也少了很多。当循环的次数很大时,两段代码的运行性能差异很大。




评论(0) |
20:47:34 | 固定链接 | 23 |
正在加载...

2007年1月1日星期一
.NET值类型变量"活"在哪个堆栈中?

不管是什么语言编的.NET程序,最后都会被各自的编译器编译成MSIL。当程序运行时,.NET JIT编译器从程序集中读入IL指令并将其动态编译为可被本地CP
U执行的机器指令再执行。
程序集中的IL代码以二进制方式存在,人阅读起来相当不便,正如传统的Win32程序可以被反汇编成汇编程序,.NET程序集中的IL代码也可以被反汇编成易于阅读的IL汇编程序。如果您愿意的话,可以用任意一个文本编辑器直接撰写IL汇编源代码,然后使用ilasm.exe程序将其编译为包含二进制形式的IL指令。CLR只能执行二进制的IL指令。
.NET SDK的另一个工具ildasm.exe可以用于将一个程序集反汇编为IL程序,在学习.NET时,这个工具非常有用,可以展示出高级语言(如C#和VB.NET)编写的程序是如何被CLR执行的。
然而,相比C#和VB.NET的资料满天飞,MSIL的技术资料少得可怜。我能够查阅的只有MSDN中有关IL指令的文档(还只是针对Reflection.Emit名字空间中的类的),以及一本由Serge Lidin著的《inside Microsoft .NET IL assembler》, Serge Lidin是汇编器ilasm.exe工具的主要开发者,因此,他的书应具有相当的权威性,然而,这位技术牛人的写作水平实在不敢恭维,整本书象是一本参考手册。此书国内引进了中文版,然而翻译得很不好。幸运的是其光盘中附上了英文原版,实乃国人之大幸。
IL可以看成是一个"面向对象的汇编语言",它提供了许多指令直接对对象进行操作,比如newobj指令创建对象,box指令进行装箱等
IL指令的一个最重要特性是它是基于堆栈的。几乎每一条指令都要与堆栈打交道:或者向堆栈中Push一些数据,或者从中Pop一些数据。
请看以下C#代码段:
class Program
{
static void Main(string[] args)
{
int i = 100;
int j = 200;
int reslut = i + j;
}
}
C#编译器将生成以下IL指令,其功能我在注释中有详细说明:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 15 (0xf)
.maxstack 2
.locals init ([0] int32 i,
[1] int32 j,
[2] int32 reslut)
IL_0000: nop
IL_0001: ldc.i4.s 100 //将100压入堆栈
IL_0003: stloc.0 //从堆栈中弹出先前压入的100,传给局部变量i
IL_0004: ldc.i4 0xc8 //将200压入堆栈
IL_0009: stloc.1 //从堆栈中弹出先前压入的200,传给局部变量j
IL_000a: ldloc.0 //将局部变量i的值压入堆栈
IL_000b: ldloc.1 //将局部变量j的值压入堆栈
IL_000c: add //连继弹出两个整数,相加得300,又压入堆栈
IL_000d: stloc.2 //从堆栈中弹出结果,保存到局部变量reslut中
IL_000e: ret //返回指令
} // end of method Program::Main
可以看到,所有的指令都涉及到堆栈。
然而,我在研究IL汇编程序的时候,却被"堆栈"两个字弄糊涂了。
几乎所有的C#书,都说值类型变量是生存在堆栈中,当函数结束时会自动销毁。那么,这里的堆栈与上述IL代码中的堆栈是不是一回事?
请看上述IL程序中有一个MaxStack指令,查看资料,得知其含义是为evaluation stack保留两个槽(slot),注意,这里的堆栈英文原文是evaluation stack,MSDN中文版译为"计算堆栈",slot可用于存放值对象,大小是可变的。换句话说,evaluation stack中的每一个slot可以存放一个值对象(对象引用也可看成是一种"特殊"的值变量,其值代表内存地址)或各种CLR直接支持的基本类型数据。
从上述IL程序中可以很明显地看到,局部变量i,j和result绝不会生存于evaluation stack,因为它只有2个slot,而我们有3个变量。那它们"活在"在哪儿?
IL程序中引人注目的一句是locals init指令,这提醒我们函数拥有另一块内存区域专用于存放局部变量,所以,声明为局部变量的值类型并不"活"在evaluation stack中。那么,为何所有的C#书(包括大名鼎鼎的Jeffrey Richter所著之《.NET框架程序设计》)都说值类型变量"活"在堆栈中?此堆栈在哪?至少有一点可以肯定,这个堆栈不会指的是evaluation stack。
用ildasm.exe查看程序集清单(manifest),发现其中有一句:
.stackreserve 0x00100000
上述语句让CLR在装入程序集时保存1M的堆栈空间,这个空间供托管进程的托管线程使用,称为线程堆栈(Thread Stack)。既是线程堆栈,自然与线程相关,由于.NET托管进程可以创建多个托管线程,因此,每个线程也应该有自己的堆栈(Jeffrey Richter说也是1M,查看也是这位老先生写的《Windows核心编程》,说在Win2000在创建线程时其堆栈大小是可调整的)。
.NET下每个托管线程都对应着一个线程函数,因此函数中定义的局部变量是在它拥有的线程堆栈中分配,而IL程序中的maxstack指令则从这一个1M的线程堆栈中再划出一块空间来作为evaluation stack。
考虑一下函数调用的问题。
IL使用call和callvirt两条指令调用特定类型所提供的方法。这就有一个函数参数传送的问题。以call指令为例,MSDN说在调用call指令之前,要将所有的实参压入evaluation stack,然后call指令再将其弹出,之后控制才会转到被调用的函数,而当被调用的函数执行完毕时,ret指令负责"将函数的返回值"从"被调用者的堆栈"(callee's evaluation stack)复制到"调用者堆栈"(caller evaluation stack)中。您看MSDN文档中居然又出现了两个堆栈,是否有点晕了吗?
查看Serge Lidin的书,他给出了这样一个图:
如上图所示:CLR会给每一个被调用的方法分配三块内存,除了上面讲到的两块(Evaluation stack和局部变量表Local Variable table),还有一块是参数表(Argument table)。
问题终于明晰了,call指令完成的工作应该是这样的:
调用者按要调用函数的参数准备好实参,将它们压入"自己的"evaluation stack中,然后,call指令执行,它从调用者的evaluation stack弹出这些参数,放入被调用函数的Argument Table中。一切准备工作就绪,这时才开始执行被调用函数的第一条IL指令。
当被调用函数执行完毕,如果有返回值,这个值应该被放在被调用函数自己的evaluation stack中(因为IL指令总是与堆栈打交道),然后,ret指令(每个函数最后一定是这条指令)将其弹出,再压入调用者的evaluation stack中,完成这一工作之后,执行流程转回到调用者。
因此,线程每调用一个函数,将导致图中所示的三块区域在1M的线程堆栈中分配给调用函数,对于递归调用的情况,后调用的函数占用的内存区域将"压"在其调用者内存区域之上,每执行完一个函数,对应的栈顶指针移动一个位移(大小刚好等于此函数先前所占用的内存),从而导致这些内存被释放,其中的局部变量不再有效。
分析.NET程序的IL指令还会得到一些有趣的结果,后面我会有更多的文章与网友们进行技术交流。
注:由于手头的资料不足,此文所述内容仅是本人对CLR内部运行机理的一个推测,如有错误,敬请指正。by the way,望有网友能提供更多的MSIL技术资料信息,在此谢谢了。:-)
转载请注明作者及出处。