2009年5月31日星期日

若干刘益谦语录

  1,我做小生意的时候就见过很多牛人,但是他们很多人都已经在这个市场倒下;人生不在于哪个阶段做得好,也不在于上什么排行榜,对于一场马拉松赛跑而言,前20公里跑第一又有什么意义呢?
  
  2,全世界股票没有流通和不流通的区别,中国的法人股最终是要流通,早晚都要解决。我看到它的差价,看到它的风险边际。很多人都认为法人股要放三年五年,心态浮躁不肯买。现在有人说'哎哟,你获利太多了',其实投资机会是永远公平的,关键看你有没有耐心。
  
  3,关于认购证的常识判断:我经过调研和简单的计算,大约算出这个中签率是10.3%,这也就表示理论上100张认购证至少有10张会中签,而每1000张理论上都会多出3个中签机会。当时每100张认购证成本价3000元,最高炒到了19000元,明天就要摇号,今天我以每百张20000多元的高价大量收购,但是我并不交付现金,而是与卖家约好,明天摇号结果出来后,再交款。实际情况是,每一张中签的认购证已经炒到了3万元。那么,我花20万元买的1000张认购证,理论上至少中100张,价值300万。"
  
  4,牛市只是个过程,熊市才是结果,如果人人都赚钱,赚的是谁的钱?真正大的获利,都是在熊市中兑现的。
  
  5,我从来不看K线图,K线图有什么用?所有的K线图都是对过去的呈现总结,它无法代表将来。
  
  6,人最难战胜的是自己的欲望。
  
  7,我以前是没做过实业,但是现在照样可以管理一个公司,当上市公司的董事长有什么难?还有比资本投资更难的事情吗?
  
  8,我确实从股市挣了不少钱,但是在我所有投资中,要讲回报率最高的当属艺术品。我其实弄不清楚这个行业,我是从什么心态去买的?占有,就是从人的欲望去买。我就买贵的、好的。有朋友跟我说,这幅画好在哪里,我根本搞不清楚,我知道大家都说它好,'为什么好'不是我研究的地方。

笨人善下-----方泉

以公开资料中持股市值计算,刘益谦可能是资本市场中"最有钱的人"。大伙儿也知道,他的盈利模式是战略性套利:最早套国库券至少30%的利,后来是一级半市场,再后来是B股;而从同代"老证券"中脱颖成名的,是他2000年持有的大笔转配股"幸运"上市,再往后便是2005年"股权分置改革"后他持有的2.5亿股法人股市值陡升几十倍……方泉混迹资本江湖18年,结识过几轮牛市高潮中的风云人物,刘益谦或许是区区可数的"剩(胜)者"了。

张大中出让大中电器股权获36.5亿元现金,2008年交纳个人所得税5.6亿元,被誉为2008年中国商界"最幸福的人"。而他拼杀商界30年的传奇故事,亦是一代布衣富豪的经典。在周游教授的反复撮合下,我协三、五资本圈高手随大中兄驾车游历江南。

暮春四月,黄花遍野,茐绿满山。一路上,大中总是让我等交替坐他的车,不断地"请教"一个个资本交易的问题。他年过花甲,我等皆值壮年。他与我们交谈时那种发自内心的谦虚,令人起敬。"三十年前,我不过是一个供销社卖肉的,做成这样,主要是运气好",这是他反复强调的话。我们也知道,去年他将巨额资金投入股市,也一度亏过百分之二、三十。"学习新东西,总得交学费嘛",坦然释然之态,让我想起古人所谓"善下"。善于屈己尊人——却不是位高而故作虚怀,而是在新领域、新知识上重新从ABC开始,把已有的成功搁置一边。

到上海拜会刘益谦。酒过两巡,刘益谦开口就讲:"我能做到今天,就是一直觉得自己比别人笨,自己斗不过那么多聪明绝顶的交易对手,我抓的机会都是很多聪明人不屑一顾的,也是随便什么人都看得到的。我不过是坚持下来了"。谈到当下市场,他举例封闭式基金的套利机会。"那些四、五年后到期的封闭式基金,平均净值折价率30%,有些还有一半现金。现在是2400点,四、五年后赎回期到,即使指数下跌30%,这些封闭式基金也能包你不赔;而四、五年后指数要是远远超过2400点呢?还不说中间可能有的大幅波动空间……"

把自己当"笨人",便是时刻敬畏市场风险,尽可能追求确定性收益。从而比别人少犯错误——而资本市场最终成大器者一定是犯错误最少的人。这种简单道理,其实在介绍巴菲特、彼得·林奇的书中随处可见。简单,却很少有人做到并恪守。

"善下"与"笨人"之见其实讲的都是一种道、一种修行、一种由里及表的方法。"水惟善下能成海,山不争高自极天"。

论嵌入式Linux下窗口系统的性能

在当前嵌入式Linux环境下,其体系架构以ARM为主,这里的分析也将以ARM芯片为主。
在ARM体系架构中,GPU自身是没有显存的,其是将系统的内存一块预留出来分给GPU,这样CPU、GPU、LCD通过AHB总线与内存相连。
这样LCD周期性的从显存中获取数据,占据了总线的带宽。其对性能的影响,另外一篇文章有讲述。
为了无闪烁的显示一幅图,我们往往是先在内存中画好这幅图,然后将其拷贝到拷贝显存中,这就涉及到一屏内存的写,一屏内存的读,一屏内存的写,对系统的内存占用极大。
当设备的分辨率增大时,每屏的数据量也急剧增大,总线必将成为性能的瓶颈。

下面将嵌入式设备与PC的架构进行对比
1、当前嵌入式设备中,其总线的宽度为32位,而在PC设备中,其总线的宽度为64位。
2、嵌入式设备中,一般选用SDRAM,目前也有使用DDR的,总线频率一般较低133Mhz,而在PC中,DDR、DDR2内存已经得到广泛的使用,其内存总线的频率更是高许多。
3、嵌入式设备中,CPU上的cache一般较小,而PC中的cache要大许多。
4、LCD周期性刷新要占用内存总线,而在PC中,如果采用内置显卡,则LCD刷新占用内存总线,如果采用独立显卡,则LCD刷新不占用内存总线。
5、嵌入式设备屏幕分辨率一般较小,这是其有利的地方。PC的分辨率一般较大。

从这方面考虑,当前ARM芯片的cortex-a8已经达到了1Ghz,应该说主频不是问题,其架构决定在支持高分辨率的设备时,其总线将成为瓶颈。
可以在软件上采取一定的方法,减少内存总线的占用。
1、在图形系统使用双buffer机制,这样我们在生成一屏的时候不必写到内存,然后再拷贝到显存。直接写到显存就可以了。
2、降低LCD的刷新频率。
3、使用thumb指令,提高代码密度,减少代码占用总线的时间。
4、在写内存时,最好一次写满32位,充分利用总线的宽度。
5、尽可能的使用寄存器,少用内存。用计算密集型取代大内存。

Linux的桌面系统个人感觉一直很低效。尤其是针对嵌入式的窗口系统,QT/E有些大,但成熟一些,不过商用要花钱。DirectFB在支持多进程时会有问题,GTK+Xwindow虽然免费,但其效率低下。
在Window下,其窗口系统都内置到操作系统中,这样进程显示位图,或者取得窗口位置等只是系统调用就可以了。而在Xwindow下,则属于进程间通讯,频繁的画图操作必然导致频繁的进程间切换,而导致系统的低效。
Linux一直引以为自豪的是,如果图形系统瘫掉,kernel依然正常,它也是一直拿这点嘲笑windows。可是对于嵌入式Linux设备,对于用户来讲如果图形系统瘫掉,kernel正常是无任何意义的。因此将Linux下一些窗口系统以模块的形式加载到kernel中是可行的。

现在还有一个问题,严重制约系统性能。
比如说画线来讲,如果我想利用GPU的硬加速功能,其必要要求所画的区域必须在显存中,GPU是不认识虚拟内存的,这样图形系统就在CPU和GPU之间割裂开来。
如果我们在使用窗口系统时,直接在显存中申请内存,则可以利用GPU的硬加速功能,但那嵌入式设备必然要为图形系统预留很多的内存,这部分内存就不能为应用程序所使用,必然会造成资源的浪费。
结果目前虽然GPU空有很多本领,但在大部分窗口系统中并没有得到应用。

导致这种现象的根本原因在于GPU不认识虚存,CPU中是有专门的内存管理,而GPU没有。但目前嵌入式设备中,CPU越来越多的集成了GPU的功能,那么让GPU认识虚存也不见得是不可能的事情。那时窗口系统利用GPU的硬件加速功能将更为容易,当GPU并行的对显存处理时,内存总线将会成为瓶颈。

张可兴 让优秀企业为你赚钱

做优秀企业的股东是财富增值的最大利器。
大家通常会认为股票市场风险很大,但实际的情况如何呢?历史告诉了我们什么呢?
1896年5月26日第一次发布的美国道琼斯指数,由12只大股票组成,最初12家成分股的历史演变至今已113年,但破产清算的只有1家,
1家被兼并,其它10家到现在仍然算成功的企业:7家主业一直不变(包括GE,其中5家改了名字),1家改了主业,2家被私有化。这说明什么呢?虽然经历了113年的岁月,但真正的优秀企业经受住了时间的考验。试想如果在1896年时,一个家族投资12万美元平均在这些企业中,持有到现在,那才是真正的富可敌国。股市真正风险是体现在那些投资差企业和不停的追涨杀跌的操作当中,那些如王冠上明珠一般的优秀企业,是很难破产倒闭的。投资最难的是你能否找到那些即便经历了诸如1次世界大战与2次世界大战等等重大历史事件的冲击而屹立不倒的企业。从专业的角度,找到他们某种意义上并不难,但更难的是珍藏它!

像菲利浦摩瑞斯公司这样的企业在美国也并不是特例,比如我们熟知的可口可乐1919年到1996年,77年上涨了87500倍,沃尔玛超市20多年上涨了几千倍,美国百思买电器连锁,89年到99年10年翻了100倍。

我们再看一下我们国内的企业。

企业名称 上市时间 开盘股价 复权股价 时间 上涨

贵州茅台 2001-8 34.5元 531元 8年 15.4倍

苏宁电器 2004-7 29.8元 814元 5年 27.3倍

滕讯(QQ) 2004-7 3.75港币 69港币 5年 18.4倍

蒙牛乳业 2004-6 4.4港币 14港币 5年 3.2倍

伊利股份 1996-3 9元 154元 13年 17.1倍

张裕A 2000-10 25元 321元 9年 12.8倍

万科A 1991-1 14.5元 601元 18年 41.4倍

招商银行 2002-4 10.5元 38元 7年 3.6倍

国电电力 1997-3 22元 576元 12年 26.2倍

以上统计的截止时间是2009-4-30日。列举这些数据,只想说明一个问题,做优秀企业的股东获得的收益是非常惊人的。

股市的波动性和自由交易使我们比企业大股东更具优势。股市的一条永恒的定律,就是股票的价格始终围绕公司的价值作上下波动,这样也就给了股票投资者能够比企业实际价值低的多价格买入企业,正如巴菲特投资华盛顿邮报时,邮报股票的价格只是公司真实价值的1/4。如07年汇源果汁在香港上市,国际饮料巨头达能集团以6元每股的发行价参加认购成为汇源的第二大股东,但股民却能以3.5元多的价格成为汇源的股东,同样的还有soho中国,07年上市,很多机构和战略投资者是以8.3元的发行价成为soho中国的股东的,而就在去年普通股民却可以每股1.83元的价格同样成为soho中国的股东。举上面的例子并不说明以上公司具备投资价值,只是证明由于股票价格的波动性使普通投资者有时比机构或企业大股东更具有投资优势。

同样,当一个企业增长放缓、竞争力下降或严重高估时,大股东不太可能卖空股票,不再经营企业,而股民往往可以提前选择不再做这些企业的股东。事实上,当投资者发现更优秀的企业,可以随时把资金投给更优秀的企业。股市在给了我们享受企业增长带来的复利收益的同时,还给了我们折价买入,溢价卖出的机会。

最后,还要提醒投资者的就是投资股票本质上虽然风险很低,收益惊人。但如果投资方法是错误的,一味追求短期价格变动,把股票投资变成赌涨跌的赌博工具,风险也是相当高的,而对于大多数普通投资者是很少有人能够做到从股票的本质出发坚持长期价值投资,这也是本文最初提到的,在中国19年的股票史中大多数股票都是上涨的,反而大多数股民又都在赔钱的根本原因。不是股票投资本身风险高,而是错误的投资方法增加了股票的风险。因此,在我们眼里股票投资是低风险、高收益的最好投资品种,是有前提条件的,就是从股票的本质和股市的自身特点(牛熊交替)出发坚持价值投资。但对于普通投资者,由于缺乏正确的投资理念,加上人类固有的贪婪与恐惧的人性特点,做到价值投资本身已相当困难,再加上研究企业是非常复杂和专业的,给企业估值更是近似苛刻。所以股票投资要慎之又慎,切勿轻率。其实即使是我们的亲戚或朋友来和我们投资合伙做生意,我们都会非常慎重的考查再三,而买入股票是把钱投资给一个和我们没有任何关系的企业,我们怎么能轻率决定呢!只有确信一家企业会给我们赚来比我们投入的资金更多的钱,我们才可以放心的把资金投给它(即使只有1000元),那么我们必须深刻了解这家企业的竞争力,企业所在的行业状况,企业管理团队的优秀和诚信等等,同时在持有股票过程中必须长期关注这些情况的变化。而对于不能坚持价值投资或没有足够精力和能力研究企业的普通投资者,寻找坚持价值投资的专业人士来打理股票投资,可能会是最好的选择。

张可兴
北京诺亚方舟证券投资基金

《冷眼:三十年股票投资心得》 冯时能(马来西亚)

本来阅读股票书籍,如果按照投机或技术分析一路,应该将利弗摩尔的《股票作手回忆录》、道氏的《股市晴雨表》、约翰.迈吉的《股市趋势技术分析》、《股市心理博弈》、约翰.墨菲的《期货市场技术分析》、史蒂夫.尼森的《日本蜡烛图技术》、埃尔德的《以交易为生》等作为经典阅读著作。不过技术分析已经很多年没有再关注了,可能还有很多曾经关注过的,例如江恩的《时空隧道》以及《华尔街四十五年》,还有艾略特的《波浪理论》等。不过按照我目前的观点,后两者都谈不上经典著作,江恩和艾略特可能从版权收入中获得的利润比在股市上更多些。特别是前者,江恩在晚年写得《华尔街四十五年》中已经没有太多早期的玄学预测理论了,回归到比较传统的跟随趋势理论。但他仍然是个经不起推敲的"预测者",例如在该书最后又忍不住预测未来,认为1953年-1954年美国股市将遭遇灾难性的经济危机和股灾。甚至连1950年的每一个月的股市最高和最低点都一一预测,还包括1951年美国总统的变更等等。当然,结果不可避免的失误:美股1950年短暂调整后继续在1951年上行,并在1956年首次突破1929年的道指历史最高点。历史已经反复证明了,没有一个所谓的预测者,可以长期屹立不倒,越是精密的预测,越是趋向失败。
埃尔德在《以交易为生》中辛辣讽刺过这样的"大师现象",他说:"每一次美国股市多头市场或空头市场中,总会出现一些市场大师。他们的预测和市场走势达到一致,只要市场走势继续配合他的理论,大师的声誉就可以维持不坠。但总有一个时期市场会发生变化,大师继续沿用的预测将不再有效,此时大众的赞叹将会变为憎恶,一位过时的市场循环大师,绝对不可能再成为明星。"例如1970年初期的郭德(Edson
Gould),他依靠某些原则预测联邦准备银行的政策变动来预测市场,另外还有一套所谓速度线的趋势跟踪工具。他几乎完美预测到了1973年-1974年的空头市场,并且准确预测到了1974年12月底道指走势,使他名声如日中天。但过后不久,美国进入流动性过剩时期,股市反复震荡,这套工具完全失去了效果,这位大师也从此消失在股票业界。又如后来的葛兰碧,在1970年初据说出于对厕所瓷砖花纹的灵感,提出了量价指标,这套指标在70年早期没有太大效果,但在1978年后市场突然开始"配合"这套指标了,量价的理论开始得到市场的认同。葛兰碧声名大振,甚至当他宣称看空市场时,道指也会一天暴跌40点。不过在1982年后,他继续指引信徒做空美股,结果市场不断攀升,最终,葛兰碧失去了名声和追随的信徒。还有诸如史代梅尔,提出了市场轮廓理论,据说可以透露市场供需的天机。他和另一个合伙人开了很多讲习班,颇受大众喜爱。但时间一长,这个理论似乎也没有在预测市场上有何优异之处,后来此人也混迹于经纪商中,偶尔还能举办讲习班。
言归正传,本书作者冯时能是马来西亚南洋商报总编,和香港信报编辑曹仁超类似,都有差不多30多年的投资经验,且几乎完全依靠个人力量在投资上获得了财务自由。尽管没有确切信息表明冯先生的实际投资回报,但考虑到在马来西亚股市我们一个不熟悉的市场上也能实践投资理念,此书仍是值得阅读的一道小菜。
此书由于是冯先生过往30年在南洋商报上的文章汇编,所以显得比较零散,下面摘录一些精华片段。


1、旁门左道和人间正道
冷眼认为,财富的创造,必须建立在价值的创造上,作为经济的一环,商业的一环,股票价值不可能无中生有,无中生有如果存在,也只能是昙花一现。正道,就是从商业的角度,依据基本面进行投资。股票投资者如果一开始就对股市存在错误的观念,以为可以在股市上快捷致富,那么他的下场几乎肯定是悲惨的。
2、买股票就是买股份
冷眼认为,买股票就是买公司的股份,股票代表公司的资产和业务,就像地契代表土地一样。这个观点的建立是非常重要的,可以说,也是股票投资的关键所在。没有确立这个观念,你很难在股市上投资成功。每次在买进之前,都必须提醒自己:我是在买进这家公司的股份,不是买进赌桌上的筹码。在认识清楚买股票就是买股份之后,整个投资景观就都完全改变了。所以,在参股之前,和合伙做生意一样,必须对公司有深入了解,并且和你有信心的朋友合伙一样,谨慎对待投资公司的管理层。
3、股票风险有多高?
很多人都认为股票风险很高,但冷眼认为,股票风险不会超过直接做生意的风险。只要你不是跟随市场情绪,高价买入公司股票,那么你的股份代表公司的业务,公司经营成功,你的股份价值也会随之上升,如果经营失败,甚至破产,你的亏损极限是0,但如果是做生意,有资产担保的话,可能还会累及个人。所以,股票投资的风险,源自于企业的失败,这是企业风险。如果买价过高,还有市场跌价风险。所以,投资者应该避免高价买股,因为高价买好股,尚且难赚钱,何况可能买到劣股。所以,治本之道,就是反向+成长+时间=价值。这是冷眼三十年所坚持的方程式。只要长期旬正道而行,投资者就能取得合理的回报。
4、长期投资不应刻舟求剑
冷眼曾推荐,如果投资者20多岁就持有马来西亚银行、大众银行、丰隆贷款、OYL和东方实业五只股票,30年后1万令吉(马来西亚币)就会变成1百万。但投资者总是会产生一个错觉:就是买入一些股票后,锁在保险箱不理不睬,30年后打开就发现自己成为百万富翁。但这种想法无疑于刻舟求剑。30年的漫长岁月中,马来西亚股市900多家公司中,只有极少数能成为这样的极品,更多的公司是不断沉沦,甚至消失。因此,买入股票后,投资者必须紧密跟踪公司动态和变化,切记置之不理。一旦发现公司环境变化而业务萎缩,走下坡路,就不能再坚守下去,甚至亏本也要斩仓出来。所以,长期投资多长时间合适,是否继续投资下去,不应由时间,而应由公司表现决定。另外,如果股市极端疯狂,给出高的离谱的价格,你还坚守长期投资不出售,冷眼认为你就不是做股票投资的料子。
5、为什么不能等三年?
如果你买荒地开辟种植油棕园,从伐木、烧芭、开路挖沟,育苗,种植,除草,施肥,整整忙了三年,才看到棕果出现,收成仍不足以维持开支,再等两年,棕果渐丰,油棕园的收支才达到平衡,仍没钱赚。这已是第五个年头了。忙了五年,只有付出,没有收入,你不以为苦,因为你知道那是赚钱无可避免的途径。如果你是一名中小型企业家,你有制造某种产品的经验,过去你是为别人管理公司的,现在决定自己创业,你决定建一间工厂,你从调查市场,向银行接洽借款,寻找厂地,设计厂房,招聘员工,装置机器,试验生产,到产品推入市场,从策划到产品出现在百货公司的货架上,前后三年,再苦撑两年,才开始有盈利,那已是第五个年头了。你认为这是创业的正常过程,你心甘情愿与你的事业同行五年,毫无怨言。以上的例子—开辟油棕园,从事工业,开零售店,从筹备到赚钱,快则一年半,慢则五年,业者从无怨言,因为他们了解,做任何事业,都需要时间,绝对没有一蹴即成这回事。以上例子有一个共同点,那就是投入资金,希望赚取合理的利润,这叫"投资",业者除了知道投资需要时间外,他们也接受一个事实,即凡是投资,都有风险,没有任何投资是没有风险的,风险是他们赚取比银行定存更高的利润所面付出的代价。投资者接受两项事实:①投资需要时间才能赚到利润,没有捷径可操。②凡投资都有风险,风险的高低常与利润成正比。股票投资,是许许多多投资管道之一,为什么投资者不能接受以上的两项事实。做事业,你可以等三、五年,股票投资为什么不能等三、五年?在做任何事情失败后,多数人只怨别人,把责任推在别人或环境身上,能自我反省的人少之又少。股票投资也一样,亏了本不是怨股市,就是怨别人使奸用诈,从来不检讨自己失败的原因。再问一次:买屋子可以等三年,为什么买股票不能等三年?
6、股票投资要有"三识"
冷眼认为,投资要成功,必须有"三识",就是:知识、常识、胆识。知识就是对投资对象有深入的认识。例如买银行股必须选择管理严格的银行,因为银行是薄利多销的行业,赚率(净利润率)约为,管理稍微松懈,坏帐增加2%,银行就会亏大本。其次就是银行的业务,所涉及的范围很广阔,分行的分布遍及国内外,没有可能以"亲力亲为"的方式监管,所以"制度"很重要,银行要成功,制度必须完善和严密,职员必须严格遵行,处理业务不可有"创造性",更不可感情用事,否则的话,坏账必然增加。而坏账的高低,是银行的成败关键。所以你在买进银行股时,要知道有关银行在放贷时是"松"还是"紧",负责批准贷款的人接受不接受"礼物"。如果借款人不符合条件也可以取得贷款,而批准人接受"礼物",或是高层人员受政治人物影响而发出大批贷款的话,千万不要购买此类银行的股票。
7、怎样减少亏损?
冷眼先生说,我曾问学医的大儿子:"学医最重要的是学什么?"他说:"学习怎样不把人医死。"这个回答很奇特,事隔十多年仍记忆犹新。所以,做股票的人首先不是学怎么赚钱,而是学会不要亏掉大钱。作为散户,总会有看走眼和买错股蒙受亏损的时候,但只要赚多亏少,长期就可以赚钱。如何减少亏损呢?经验就是采取反向策略,尽量买低,一个简单看法就是一年中的股价最低和最高价之间的平均价,位于最低点和平均价之间就属于低买入区间。而要想在低买入区间购入股票,就要养成反向的习惯,在股市低潮时进场。大多数货物,都是价格越便宜越多人买,唯独股票是越低越没有人买。价格越高,买的人反而越多。这就是大多数人最终赔钱的原因。买入如果股价升够50%,则基本已经脱离危险区,可以放任股价奔跑。如果公司业绩继续改善,就不应该急于脱手,而是继续追随公司成长。但如果公司经营有恶化趋势,则无论赚或赔,都应果断卖掉。
8、散户三部曲
冷眼先生认为,美国次级房屋贷款,在全球股市掀起滔天巨浪。在过山车般的股市中,散户惊惶失措,都成了惊弓之鸟。在惊涛骇浪中,散户们的情绪商数(EQ)压倒了智慧商数(IQ)。当情绪控制理智时,他们所作的决定,是情绪的决定,不是理智的决定。情绪的决定,不讲理由。因为情绪与理智,水火不相容。当情绪主宰一切时,理智只好退避三舍。在此次的股灾中,许多散户,被突如其来的巨浪,冲到晕头转向,情绪失控,惊慌抛售,犯下大错,在股市最糟的时刻,贱价把股票卖掉。贱价抛售犯下大错还不到一个月,他们就后悔了,因为他们几乎是以最低的价格卖出。为什么会犯这个错误?因为他们的眼睛只看到股价,没有看到股票背后的资产。如果他们了解股票所代表的资产,了解这些资产的价值,他们就不会那么心慌,就不会不计成本地抛售,而造成无谓的损失。根据情绪进行投资的散户,他们的行动可分为三个阶段,叫"散户三部曲"。买股三部曲:第一部:熊市——股价低沉,市场淡静,散户绝迹股市,股市死气沉沉。其实,这个时候,大部分股票的价值都被低估,但散户不感兴趣,他们感兴趣的是股价,不是股票的价值。所以他们不买。第二部:牛皮靠稳——股市上升了一截,散户还是不要买。因为他们在低价时没有买进,现在股价已上升了二、三十巴仙,他们心有不甘,买不下手。第三部:牛市形成——综指破五关斩六将,冲上一千四百点,散户们见猎心喜,见亲朋戚友捞得风生水起,信心大增,乃大肆进场。就在兴高采烈时,次房事件演成股灾,引出了卖出的三部曲:卖出三部曲:第一部:利润不多,而牛气逼人,他当然不会卖。第二部:综合指数跌至1300点,他认为这是暂时性的,不久就会回升,所以决定不卖。况且高价时有得赚,现在反而亏本,他们不甘愿卖。第三部:综合指数直线下跌,跌破1200点,他有大祸临头之感,信心崩溃了,不计成本抛出。结果发现他是以最低价卖出。买进三部曲的特点是:高买。卖出三部曲的特点是:低卖。高买低卖,刚好跟股市金言——低买高卖适得其反。你想在股市赚钱吗?如果想的话,很简单,只要将买的和卖的三部曲,颠倒来做就行了。这叫倒行逆施。这就是"反向"。
9、"烂"比"跌"更可怕
如果公司的生意越做越萎缩,年年亏蚀,而且亏蚀额越来越大,最后可能面临破产的噩运,则股份的价值,必然一跌再跌,最后可能使你血本无归。在短期内,股票的价格会受到股市走势或人为操纵的影响,波动激烈。但长期来说,股价必然与公司的业绩同步,也就是说,股价必然会反映公司的业绩,只不过时间上有迟早之分而已。、举一个大马的例子说明:大众银行(PbBank,1295,主板金融股)在1996年金融风暴前的股价最高为令吉,最低为令吉。假如你在1996年时以令吉的最高价买进一千股(面值50仙)收藏至今,在收取五次红股及认购一次附加股之后,目前拥有一千九百五十股(面值一令吉),以今天令吉的价格计算,价值一万八千余令吉,等于十年前投资额的四倍,假如把历年收到的丰厚股息也计算在内的话,赚了超过五百巴仙。请注意,你在1996年时是以当年的最高价买进,仍能取得五百巴仙的盈利。如果是以当年最低价令吉买进,就赚得更多。大众银行在1998年金融风暴时曾一度跌至令吉,如果你以此价买进的话,你将赚十倍以上。如果你继续拿下去的话,将来肯定能赚得更多。大众银行的盈利,年年上升,是使你即使高价买进,仍能反败为胜的主要原因。在十多年前,当第二板的股票,都被炒到十令吉以上时,我的朋友以十令吉的价格,买进一千股开屏(KaiPeng,8796,二板贸服股),坚守至今,由于该公司连年亏蚀,股价一跌再跌,今天只剩二分。切勿低价买坏股同样是高价买进,持股期限同样超过十年,买好股和买坏股,结果有天壤之别。所以,散户宁可高价买好股,切勿低价买坏股。当然,如果坚持反向策略,低价买好股,就可以赚得更多。"烂"比"跌"更可怕。可怕十倍。
10、猜股市如抓黄鳝
"股市还会起吗?"这是我最常被问到的问题。我的回答一律是"不知道"。
我知道询问者会感到失望,甚至心里还会抱怨。他们认为我自私,明明是知道的,却不肯跟他们分享预测股市动向的心得。实际上,"不知道"是我最诚实、最诚恳的答复。我确实不知道明天,下个月或明年股市会怎样,我也不认为有谁有这样的本领。如果我真的知道的话,我一定乐于跟大家分享,就好像我乐于跟大家分享我的基本面投资心得一样。无数的人,殚精竭虑,"发明"预测市场新的方法,都没有一样经得起时间的考验。我从此不再浪费时间去猜测股市的动向了。第一、是因为股市根本是不可预测的。第二、是股票投资赚钱根本不需要靠预测股市。股市有如黄鳝,浑身滑溜溜,你根本无法抓住它。一个曾经做过鱼贩的老同学告诉我抓黄鳝的"秘诀"。他说:"黄鳝吃软不吃硬,所以只能'托',不能用力'抓'。"不能用力捏,否则,它感到不舒服,就会挣扎,你无论多么用力,都会从你手中溜走。抓黄鳝,紧不如松,快不如慢,刚不如柔,巧不如拙。股市也一样,你盯得太紧,企图预测它的动向,它偏偏跟你作对。许多股友,千方百计,企图"捕捉"股市的起落,结果都徒劳无功,就好像用力抓黄鳝,始终抓不住一样。最好的方法,是远离股市,不太在意它的波动,把焦点集中在公司的业绩表现上,反而更易"驯服"股市。就好像轻轻托起,反而更能将黄鳝"制服"一样。股市的波动,就好像黄鳝的不断蠕动一样,是正常的,不必去理会它。采取反向策略,低价买进好股,就不动如山。只要公司业绩不断上升,就不卖。不要理会股市短期的波动,不必担心你的股票不会起,因为当公司赚钱越来越多时,股价必然会同步上升。
股市于我何有哉?此之谓投资正道。
11、锁定五星级股票
有一位股友,将一笔不小的资金,投入股市,最近计算手头股票的价值,竟然只得个不盈不亏。他不但浪费了宝贵的资源,而且浪费了20多年宝贵的岁月。原来他最爱听小道消息,喜欢跟风,高价抢进,而所购之股票,十之八、九是垃圾股。高价买劣股是致命伤高价买进劣股,是他的致命伤。幸亏在他的组合中,尚有一、二十巴仙是优质股,在二十年中,这些优质股增值一、二十倍,所得盈利,刚好抵消了劣股的亏损,使他仍能不盈不亏。他最近向我检讨20年战绩时,喟然叹曰:"假如我当初摒绝投机,脚踏实地投资,只买五星级股票,收藏至今,身家何止增加十倍",言下懊悔不已。"更重要的是",他说:"20年来精神受尽股市风波的折磨,常常提心吊胆,真是一场噩梦。"
股市抢杀收获往往越少,在别的行业,你越勤劳,收获就越多。股票投资则刚好相反,你越勤劳,做得越多,不断在股市中抢进杀出,收获往往越少。收获最多的,反而是在买进好股后,就不动如山的长期投资者。这就是郭鹤年、丹斯里郑鸿标、丹斯里李深静挤身大马富豪榜的秘诀。
股票投资,只要不犯上严重的错误,长期投资基本上都可以取得超越定期存款的回酬。要减少错误,最好的办法,是为自己设定一个投资准则:只买五星级股票。所谓"五星级股票"就是:第一,有卓越的管理,切忌买入管理有瑕疵的公司;第二,有成长的业务;第三,有稳定的盈利历史;第四,财务稳健;第五,生产永远有需求的产品,并以世界为市场的企业。五星级股票如同根深巨树,即便干旱,亦不会枯死,春天来时,就似繁花似锦,果实累累。
12、不了解,就不买
冷眼认为,导致散户饮恨沙场的原因很多,其中之一,就是"无知"。"无知"就是不了解,就是误解。大部份股票投资者只是股市的过客。对他们来说,股市是旅店,住上几天就离开。因为他们缺乏了正确的投资理念,自然难以在股市找到立足之地,因为他们站不稳脚跟,就好像无根之树经不起暴风雨的吹袭一样。股票投资须做功课,对股票有了正确的认识,只是一个开始,接下来,你必须做很多很多功课,去了解投资环境及投资对象。了解越深,赚得越多。为什么会这样呢?因为股票投资的成败,跟你对所买股票的信心有关。有信心,你才有胆识大量买进一间公司的股票。放长线钓大鱼,有信心,你才会放长线,钓大鱼——进行长期投资。长期投资才有可能赚大钱。丹斯里李深静从来不卖IOI的股票。
丹斯里李莱生的家族不但不卖,而且不断增持都加湾、吉隆甲洞的股票。丹斯里郑鸿标从来不卖大众银行的股权。丹斯里林梧桐长期紧握云顶不放。他们拥有这些公司的股票数十年,数十年如一日。经过了数十年的复杂增长,当初所投资的一万令吉,现在值得五百万,一千万令吉。
要长期持有一只股票,就必须对有关公司,有绝对的信心。信心必须建立在了解上。了解越深,信心越强。信心越强,越不会轻易脱售所持之好股。长期持有,才能享受到复利增长所带来之庞大利润。巴菲特说"认识越深,赚得越多",就是这个道理。如果知道一点皮毛,就买进作长期投资,如果所买非好股,则长期投资,是白费心机,徒劳无功。长期投资,必须先了解。
不了解,就不买!
13、好股何以没人炒?
冷眼认为,一般散户最常犯的毛病,是草率从事。一听到"消息",就不暇思索,马上出击。由於担心错过千载难逢的赚钱机会,他迫不及待地,把资本一股脑儿倾注在一只股票上,希望一击中的,赚个满堂红。散户从来没有去想过,被炒家相中的,都是劣股。炒家对蓝筹股没兴趣,对蓝筹股,炒家是没有兴趣的。炒家在炒作之前,多数会得到大股东的合作。蓝筹股的大股东通常不愿意跟他们合作。蓝筹股的大股东,也从来不去炒作自己的股票。因为蓝筹股的大股东,都是正派商人,不会去炒高他们的股票。无论股价涨得多高,他们都不会脱售他们的股票,以免失去控制权。这是他们的事业,怎会轻易脱售呢?既然不会脱售,何必去炒高股价?况且只要业绩继续上升,股价必然随之,何必去炒?
每一个人做一件事,都有一个动机,既然炒高股价,也不会脱售股权,对他没有什么好处,他为什么要这样做?又为什么要跟炒家合作?
所以,好股没人炒,因为没有这个必要。被炒起的多数是劣股。劣股的大股东,没有把握靠改善业绩来使他们的股份(票)增值,只好靠"炒"来谋利。被炒高的股票,在回跌至原来的低水平后,往往从此一蹶不振,再也无法回升至其巅峰价。炒家不会去炒第二轮。如果重施故技,再炒一轮的话,所有在第一轮中被套牢的散户,都会乘机脱身,届时被套牢的可能是炒家。炒家不会为散户制造脱身的机会。没有价值的股票被炒高,好比是用肥皂水吹出来的泡泡儿。泡泡儿在阳光中,色彩鲜艳,但是,正如"心经"中所说的"色即是空,空即是色",彩色的后面,空无一物。
14、月移花影动
皓月升至中天时,花影跟树根,拥抱在一起,难分难解。这就是"月移花影动"。影子会被黑暗吞没。然而,只要代表公司业绩的月亮存在,代表股价的花影是不会消失的。不但不会消失,而且一定会跟着月亮移动。月亮与花影,是形影相随,股价与业绩如影随形。任何外在的、人为的力道,都无法使股价与盈利脱节。即使短期背道而驰,最终必然合而为一,以同一步伐进退。"云破月来花弄影",风和云,都可能弄乱花影,使花影变了形,实际上,却无法改变花影随月移动的轨道。散户与其耗费精神去猜测股价动向,倒不如把精神花在公司的研究上。只要能找出盈利持续不断上升的公司,以合理的价格买进其股票,长期持有,你的"身家"自然与日俱增。这种投资法,使你身心舒泰,有助於延年益寿。你又何必到处找"贴士",
听信谣言,
在股市中抢进杀出?弄到自己焦头烂额,家里鸡犬不宁,说不定还会折损寿命,何苦来?
15、大家一起富起来 ——出席大众银行股东大会有感
大众银行的成功,是通过企业,使大家一起富起来的典型例子;大众银行所创造的,不只是双赢,而是所有的人都是赢家的"通赢"。丹斯里郑鸿标以40年的心血,打造大马最优秀的银行。他为股东,包括他本人,创造惊人的财富。根据该银行年报,一名股东,假如在1967年该银行上市时,以1千令吉买进该银行1千股的股票,无论股价起得多高,他都不受引诱脱售,在领取了一次又一次的红股,认购了一次又一次的附加股,40年后的今天,他一共拥有12万9千730股。以2008年2月26日股东大会举行这一天的闭市价11令吉50仙计算,总值149万1千895令吉。在40年中,他一共收到48万7千902令吉的股息。股票增值加股息,回酬高达200万令吉。40年前投资1令吉,现在变2千令吉。一名为股东带来如此惊人财富的企业家,受股东爱戴,不是挺自然的吗?另一方面,大众银行自2002年以来,缴交了24亿5千万令吉的税款,政府用这些税收,建设基本设施,受惠的人就难以计算了。一千家上市公司的领导人,应从郑鸿标和大众银行的成功,领略到惟有创造"通赢"的企业家,才会受到股东与社会的尊敬。借上市地位以自肥的企业蛀虫,一定会被股东与社会唾弃。
16、"慢稳忍"高明的拙招
股票投资要成功,"快"不如"慢","狠"不如"稳","准"不如"忍"。与其快狠准,不如慢、稳、忍。在你最冲动的时候,稍为停一停,放慢一步,可以使你恢复理智,减少错误。"忙"中有错,"慢"中少错。许多人恐怕动作慢,会失去投资机会。实际上刚好相反,因为股市跌到谷底时,一定会在低价区徘徊一段相当长的时间,你有足够的时间,择肥而噬,根本不必担心买不到。要赚钱,首先要学不亏钱。稳扎稳打,步步为营是防亏的先决条件。轻率行事,鲁莽冒进,轻则招损,重则至亡。智者不为也。"忍"者,心上插着一把刀。若无非凡之定力,难以承受。股票投资,"忍"功不够,鲜有能成大器者。
耐心乃成功之母。
买进之前,能忍人之所不能忍,才能在低价区买进。
卖出之前,能忍人之所不能忍,才能在高价区脱手。
买进之后,能忍有耐心,才能长期持有获大利。若不能忍,稍有盈利就迫不及待地抛出,所得有限。如何能"富"?公司要时间去发展,业务要时间去推行,油棕要时间来成长,计划要时间来完成,故"耐心"乃成功之母。能忍、能耐,谓之"忍耐"。不能忍,好比果子未熟就采摘,青涩难咽。甜美的果实,惟有忍者才能尝到。
故快不如慢,狠不如稳,准不如忍。"慢、稳、忍"看似笨拙,实属高明。
17、融汇贯通
股票投资,既不纯是科学,也不纯是艺术,乃是科学与艺术的混合体,也可以说是介乎科学与艺术之间。股票研究涵盖两个部份:第一个部份:理论的探讨。第二个部份:上市公司研究,以时间为经,需研究个别公司的发展史,以业务为纬,需研究公司的结构、行业特征、财政演变、企管领导人的背景与作风、企业的经营理念等,错综复杂,绝不是以玩票性质视之,以业余的态度对待,可以登堂入室的。股票投资非常个人化的,适合于甲的理论,未必适用于乙。如果有一种理论,可以应用于所有人的话,那么,大家只要照搬巴菲特的投资理念去做,人人都可以成为巴菲特第二了。事实是:研究巴菲特的书,少说也有一百几十种,然而世界上并没有出现第二个巴菲特。如果你研究西方最成功投资家的历史的话,你会发现每一个人的作风都不同,投资手法各异,然而他们殊途同归,都有卓越的成就。故成功投资人,可以借镜,但要投资成功,还是要发展自己的一套策略。如同教育一样,中小学是基础教育,无所不读,不管实用不实用都要读。以求其博。不博则无以扩大视野,成为井底之蛙。大学专攻一个领域,范围缩小了,如文科生不必读数学。但还是属於较为深入的普通教育,旨在求其精。不精则流於肤浅。到了硕士、博士,才有资格说"通",对某个科目,上下纵横皆如意,从心所欲,不逾矩,是为"通"。不通则滞。股票研究由博到精,由精到通,非长期浸淫,无以为功。博、精、通,需循序渐进,不能速成。
融汇贯通,必须经过博和精的"融会"阶段,才会"贯通",就是这个道理。
18、"快、狠、准"破产有你份
快、狠、准"是武林高手追求的最高境界。出手快如闪电,是为"快",一招夺命,是为"狠",一击中的,是为"准"。把这三招应用到股票投资上,胜算有多高?
"快"者,买和卖都比别人快一步。别人未买你先买,买价比别人低,是为"低买"。别人未卖你先卖,卖价比别人高,是为"高卖"。要低买高卖,必须养成反向思维的习惯,股市中人,99%是跟在群众后面的"顺"民,"顺民"多数是别人买了以后才敢买,别人卖了以后才甘愿卖,不是"低买高卖",而是"高买低卖",如何能赚钱?参与股市者,少说也有百万人,个个都想比别人快一步,你有胜过别人的条件吗?故要靠"快"赚钱,知易行难。狠"者,是机会一出现,就全力以赴,一掷百万,绝不手软,不成功,便成仁,是"狠"得够酷。然而股市是不按牌理出牌的地方,你认为股市会起,它偏偏大跌,你认为一家公司前途亮丽,偏偏冒出一盘假账。如果你信心爆棚,孤注一掷的话,破产在等着你。"准"者,臆测屡中也。问题是地球上任何一个角落所发生的事,都可能影响股市,你永远不知道在地球的另一边什么时候会发生什么事,预测怎能"准"?上市公司内幕重重,身为局外人的散户,都是后知后觉者,如何能准确预测公司的业绩?
既然对股市和对公司的预测变数多如牛毛,如何能"准"?在看不准的情况下,行动快如闪电,买卖胆大包天,等于自杀。
剑客难免剑下亡。欲以"快、狠、准"纵横股市,不怕一万,只怕万一。一次失准,永无翻身之日。慎之,慎之!

水晶苍蝇拍:再回首,大熊底及大牛顶的奥秘(深度总结)

第一部分,特征和迹象总结












































鉴别点 大顶特征 大底特征
估值面 2次大牛市顶部都发生在市场平均PE60之上,一次在50PE上,因此60PE是绝对的高危区 2次大底部都在市场平均PE15左右,大量的股票破发行价、增发价,破净资产。企业开始陆续出现回购,增持股票等行为。因此PE15左右是低估区。
技术面 大顶的日线基本是双头;月线特别注意第一不可跌破5月线(特别是下月依然无法收回),从此指数被5月线一路压制;第二是配合第一的指标同时,月MACD高位死叉迹象+KDJ高位死叉迹象;日线上30日线成为强压,历次反弹都难以连续站稳几天。市场演绎的是经典的盘久必跌轮回。 以月K线突破5月线为标志,且KDJ低位20左右金叉成功,此后一路依托5月线上行不得跌破确认;同时配合周线5金叉10,依托5上行,周KDJ20金叉;日线突破长期下沉趋势线压制,市场持续放量,底部盘整没有再次盘久必跌,反而是越盘越缩量并几根大阳线突破,之后每次盘整低点逐步抬高;放量突破30日线,特别是30日线开始有上拐倾向时
政策面 从对市场的支持到模糊,再到不断的提示风险,再到实质上的频频出手干预政策(如印花税提高),打压股市的态度越来越强烈和露骨 从对下跌的默许,到言论开始明确挺市,到开始局限于市场本身的干预(调印花税红利税等),到频频呼唤信心并动用资金手段(降息,发基金,停IPO等),最后到实质性的产业政策刺激(投资或者对多行业的长期利好或者股票市场的大改革等)
资金面 连续的加息、基金窗口指导、暂停新基金发行、大盘股不断上市或者大额度融资 连续的降息,加大基金发行力度,力压IPO冻结,否决所有大额的融资计划
心理面 市场不断的找寻泡沫支持的理由,几乎没有机构看熊市场,一致性的看好市场的持续走好,基金和股票开户数连创新高,特别是周围从不关心股市的人开始纷纷入市 市场一开始绝不会相信牛市已经结束,其中的几次反弹都会带来新的憧憬,到开始绝望不顾一切的抛售,再到对任何利好都漠不关心且不看好,对经济前景极度绝望和恐惧
其它

配合技术面,出现前景不明的重大隐患事件,比如金融危机、严重的通胀迹象、某热点经济泡沫崩溃迹象等


另一个值得注意的,则是强周期类股票的全面溃败。


配合技术面,出现大热点板块,开始有讲故事的基础。同样,强周期类股票特别是有色等股票的反弹猛烈,也往往是市场底部形成的迹象。
上述趋势指标中,估值与技术为最关键,当估值和技术同时符合,其它指标大部分符合时,则击中的概率是相当高的。但历史是相似而非一致的,因此上述指标只能参考定性,而不能生搬硬套的定量决策。

在技术指标发生不同周期矛盾的时候,一切以月线为准。另外,PE的规律随着时间而慢慢趋于不准确,因为10年20年后的市场整体估值和GDP水平也许早就不支持60PE的存在,15PE也很可能不再是历史的低点。

05年的大熊市与07-08年的市况对上述的指标有高度的契合。但另一方面,1996到2001年的曲折上升型牛市则多次出现跌破5月线几个月后又再次站上的情况。因此判断大顶不能僵化以技术轮,必须多个指标共同高度契合,特别是估值因素的考虑。而轻易不要止盈,宁愿更换安全的品种也是重要的策略。

第二部分,现象和对策总结

在面临重大趋势扭转迹象的时候,首先考虑的应该是资产的重新分配计划。比如大顶特征大面积出现后,撤离股市必须成为一个坚定的战略。依照投资种理论的指导,此时最佳的避难增值场所是:货币基金、债券基金或企业债,固定收益类信托产品,现金。

  • 疑似顶部的策略:

虽然对于大顶和大底的特征有了基本的概要,但我相信未来实操过程中敢于果断清仓的依然是极少数,依然是极其困难的决定。但是否有比较折中的办法呢?比如,在高度疑似大顶即将出现的时刻(特别是估值+技术指标已经符合确认条件),可以:

1,至少撤出7成仓位,3成仓位继续观望。这个时候的果断是整个大牛市利润能保留多少的关键中的关键!因为,如果是熊市,双头后跌破5月线并确认只表明下跌刚刚开始,主跌其实还未出现。

2,剩下的3成仓位,一定不能留在强周期品种中,一定要转移到周期最弱(以及经济周期靠后的品种,比如消费股)、市场最公然的价值大白马身上--比如07年末-08年初的茅台,市场已经在07年11月开始实质性下跌破5月线,而茅台的实质性下跌却始于08年1月,足有2个多月的时间好好观察。要找这样的品种去守最后一棒!

这个策略甚至可以运用在顶部疑似阶段,比如估值已经接近60,但技术上依然乐观的时候,就应该执行此操作!这可以减少迷茫期内的损失,也可以避免完全的踏空后面可能的行情。

但有一点必须明确,高位撤出的资金绝不轻易再入场,除非技术面月线再次踏上5月线并配合基本面因素的推敲。也因此,不要轻易地止盈!只要估值+技术面没有发生共振的双重确认,不宜凭主观感觉重仓撤出。

所以,不轻易撤出以及撤出后不轻易入场,是获利最大化的关键。

  • 疑似底部的策略:

首先明确一点,放弃重仓强反弹!无数的尸体不是堆在大顶,而是堆在下山的路上。我们永远不知道事情有多糟糕,牛市末期的乐观惯性会一次次的憧憬前途还是美好的,所有的专家高手都会说只不过是个中期调整而已。如果遇到类似花旗、AIG那种从上百元跌破1元的状况,或者是中国石油、万科、宝钛那样跌去8成以上的市值时,再多钱也会落得粉身碎骨!

熊市最重要的是休息。

在市场主跌过程中,没有英雄板块和个股。08年巴菲特的公司都跌去一半儿的市值,茅台都从230跌破百元的金身,因此不要赌哪个可以不跌安然过冬。估值感觉合理的时候,千万别大举买入。合理只是熊市进程的1半,要相信涨一定过头,跌也一定过头的规律。

最大最终的机会只会来自于真正的底部,但静静守望底部的出现比以身试法的抄底来的安全和高效的多。一个妥协或者难度相对低的策略是:

瞄准几个特别想长期持有的股票,以弱周期为主,当他们跌到历史估值的最底部区间时,可以考虑以2-3成仓位介入。因为只有这个时候介入才会保障长期不会亏,也能保障跌过头时不受重伤,同时保持对市场的接触。

大B浪反弹与大底往往很相像,目前来看是否跌破5月线是一个重要的指标。跌破5月线则很可能是再次探真正大底的迹象,比如2003年11月政策利好刺激从1300反弹到1800,再跌破5月线后砸出了真正的998一样。所以如果参与疑似大底时仓位过重,又出现了跌破5月线状况,则再次恢复到半仓以下是明智的选择。

无论是大B浪反弹还是大底部的反转,强周期股的强力上涨都是其中的一个标志。以有色金属等为主的品种一改历次反弹的无力和缺乏持续性,其持续性的强力上涨往往预示着市场对经济实体最坏情况已经表达充分的预期。与之伴随的,则是大量的概念股、垃圾股等前期跌幅最大股价最低的板块的一轮疯狂炒作,而与之相反,上轮牛市中的大白马股以及经济周期靠后的消费类绩优股则将明显落后于大盘的这轮报复性上涨。

所以,一个确认的熊市中,躲过主跌段,并在个股估值处于历史最低位时以3成左右的仓位试探性入场,并在确认的大B反弹或者疑似大底时以半仓作为长线优质股建长线仓,另半仓以最强劲领涨板的强周期极度超跌低价概念股博取反弹收益的波段操作,是一个务实的选择。

避免sprintf目标缓冲区溢出

问:我怎样才知道对于任意的sprintf调用需要多大的目标缓冲区?怎样才能避免sprintf目标缓冲区溢出?

答:对这两个极好的问题(暂时还)没有什么好答案。而这也可能正是传统stdio库最大的弱点。

当用于sprintf的格式串已知且相对简单时,有时可以预测出缓冲区的大小。如果格式串中包含一个或两个%s,你可以数出固定字符的个数(或用sizeof计算)再加上对插入的字符串的strlen调用的返回值。对于整型,%d输出的字符数不会超过

((sizeof(int) * CHAR_BIT + 2) / 3 + 1) /* +1 for '-' */

CHAR_BIT在<limits.h>中定义,但是这个计算可能有些过于保守了。它计算的是数字以八进制存储需要的字节数,十进制的存储可以保证使用同样或更少的字节数。

当格式串更复杂或者在运行前未知的时候,预测缓冲区大小会变得跟重新实现sprintf一样困难,而且会很容易出错。有一种最后防线的技术,就是用fprintf向一块内存区或临时文件输出同样的内容,然后检查fprintf的返回值或临时文件的大小,但请参见问题19.13,并提防写文件错误。

如果不能确保缓冲区足够大,就不能调用sprintf,以防缓冲区溢出后改写其他的内存区。如果格式串已知,可以用%.Ns控制%s扩展的长度,或者使用%.*s。参见问题12.11。

要避免溢出问题,可以使用限制长度的sprintf版本,即snprintf。这样使用:

snprintf(buf, bufsize, "You typed \"%s\"", answer);

snprintf在几个stdio库中已经提供好几年了,包括GNU和4.4bsd。在C99中已经被标准化了。

还有一个好处是,C99的snprintf提供了预测任意sprintf调用所需的缓冲区大小的方法。C99的snprintf返回它可能放到缓冲区的字符数,而它又可以用空指针和缓冲区大小0进行调用。因此,

nch = snprintf(NULL, 0, fmtstring, /*other arguments*/);

这样的调用就可以预测出格式串扩展后所需要的字符数。

另一个(非标准的)选择是asprintf函数,在BSD和GNU的C库中都有提供,它调用malloc为格式串分配空间,并返回分配内存区的指针。这样使用:

char *buf;

asprintf(&buf, "%d=%s", 42, "forty-two");

/*now buf points to malloc'ed space containing formatted string*/

From: <<你必须知道的495个C语言问题>>

sort命令用法

sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始!

1 sort的工作原理


sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

[rocrocket@rocrocket programming]$ cat seq.txt
banana
apple
pear
orange
[rocrocket@rocrocket programming]$ sort seq.txt
apple
banana
orange
pear

2 sort的-u选项

它的作用很简单,就是在输出行中去除重复行。

[rocrocket@rocrocket programming]$ cat seq.txt
banana
apple
pear
orange
pear
[rocrocket@rocrocket programming]$ sort seq.txt
apple
banana
orange
pear
pear
[rocrocket@rocrocket programming]$ sort -u seq.txt
apple
banana
orange
pear

pear由于重复被-u选项无情的删除了。

3 sort的-r选项

sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。

[rocrocket@rocrocket programming]$ cat number.txt
1
3
5
2
4
[rocrocket@rocrocket programming]$ sort number.txt
1
2
3
4
5
[rocrocket@rocrocket programming]$ sort -r number.txt
5
4
3
2
1

4 sort的-o选项

由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort
filename > newfile。

但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。

[rocrocket@rocrocket programming]$ sort -r number.txt > number.txt
[rocrocket@rocrocket programming]$ cat number.txt
[rocrocket@rocrocket programming]$
看,竟然将number清空了。

就在这个时候,-o选项出现了,它成功的解决了这个问题,让你放心的将结果写入原文件。这或许也是-o比重定向的唯一优势所在。

[rocrocket@rocrocket programming]$ cat number.txt
1
3
5
2
4
[rocrocket@rocrocket programming]$ sort -r number.txt -o number.txt
[rocrocket@rocrocket programming]$ cat number.txt
5
4
3
2
1

5 sort的-n选项

你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。

我们如果想改变这种现状,就要使用-n选项,来告诉sort,"要以数值来排序"!

[rocrocket@rocrocket programming]$ cat number.txt
1
10
19
11
2
5
[rocrocket@rocrocket programming]$ sort number.txt
1
10
11
19
2
5
[rocrocket@rocrocket programming]$ sort -n number.txt
1
2
5
10
11
19

6 sort的-t选项和-k选项

如果有一个文件的内容是这样:

[rocrocket@rocrocket programming]$ cat facebook.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。

那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实现?

幸好,sort提供了-t选项,后面可以设定间隔符。(是不是想起了cut和paste的-d选项,共鸣~~)

指定了间隔符之后,就可以用-k来指定列数了。

[rocrocket@rocrocket programming]$ sort -n -k 2 -t : facebook.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3

我们使用冒号作为间隔符,并针对第二列来进行数值升序排序,结果很令人满意。

7 其他的sort常用选项

-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

-M会以月份来排序,比如JAN小于FEB等等

-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。

有时候学习脚本,你会发现sort命令后面跟了一堆类似-k1,2,或者-k1.2 -k3.4的东东,有些匪夷所思。今天,我们就来搞定它—-k选项!

1 准备素材

$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500


第一个域是公司名称,第二个域是公司人数,第三个域是员工平均工资。(除了公司名称,其他的别信,都瞎写的^_^)

2 我想让这个文件按公司的字母顺序排序,也就是按第一个域进行排序:(这个facebook.txt文件有三个域)

$ sort -t ‘ ‘ -k 1 facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

看到了吧,就直接用-k 1设定就可以了。(其实此处并不严格,稍后你就会知道)

3 我想让facebook.txt按照公司人数排序

$ sort -n -t ‘ ‘ -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

不用解释,我相信你能懂。

但是,此处出现了问题,那就是baidu和sohu的公司人数相同,都是100人,这个时候怎么办呢?按照默认规矩,是从第一个域开始进行升序排序,因此baidu排在了sohu前面。

4 我想让facebook.txt按照公司人数排序 ,人数相同的按照员工平均工资升序排序:

$ sort -n -t ‘ ‘ -k 2 -k 3 facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

看,我们加了一个-k2 -k3就解决了问题。对滴,sort支持这种设定,就是说设定域排序的优先级,先以第2个域进行排序,如果相同,再以第3个域进行排序。(如果你愿意,可以一直这么写下去,设定很多个排序优先级)

5 我想让facebook.txt按照员工工资降序排序,如果员工人数相同的,则按照公司人数升序排序:(这个有点难度喽)

$ sort -n -t ‘ ‘ -k 3r -k 2 facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

此处有使用了一些小技巧,你仔细看看,在-k 3后面偷偷加上了一个小写字母r。你想想,再结合我们上一篇文章,能得到答案么?揭晓:r和-r选项的作用是一样的,就是表示逆序。因为sort默认是按照升序排序的,所以此处需要加上r表示第三个域(员工平均工资)是按照降序排序。此处你还可以加上n,就表示对这个域进行排序时,要按照数值大小进行排序,举个例子吧:

$ sort -t ‘ ‘ -k 3nr -k 2n facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

看,我们去掉了最前面的-n选项,而是将它加入到了每一个-k选项中了。

6 -k选项的具体语法格式

要继续往下深入的话,就不得不来点理论知识。你需要了解-k选项的语法格式,如下:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分。

先给你灌输一个思想,那就是“如果不设定End部分,那么就认为End被设定为行尾”。这个概念很重要的,但往往你不会重视它。

Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。

C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 2和-k 3就是省略了C.Start的例子喽。

FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。

同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。

7 突发奇想,从公司英文名称的第二个字母开始进行排序:

$ sort -t ‘ ‘ -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000

看,我们使用了-k 1.2,这就表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。guge只能屈居第四了。

8 又突发奇想,,只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:

$ sort -t ‘ ‘ -k 1.2,1.2 -k 3,3nr facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

由于只对第二个字母进行排序,所以我们使用了-k 1.2,1.2的表示方式,表示我们“只”对第二个字母进行排序。(如果你问“我使用-k 1.2怎么不行?”,当然不行,因为你省略了End部分,这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序)。对于员工工资进行排序,我们也使用了-k 3,3,这是最准确的表述,表示我们“只”对本域进行排序,因为如果你省略了后面的3,就变成了我们“对第3个域开始到最后一个域位置的内容进行排序”了。

9 在modifier部分还可以用到哪些选项?

可以用到b、d、f、i、n 或 r。

其中n和r你肯定已经很熟悉了。

b表示忽略本域的签到空白符号。

d表示对本域按照字典顺序排序(即,只考虑空白和字母)。

f表示对本域忽略大小写进行排序。

i表示忽略“不可打印字符”,只针对可打印字符进行排序。(有些ASCII就是不可打印字符,比如\a是报警,\b是退格,\n是换行,\r是回车等等)

10 思考思考关于-k和-u联合使用的例子:

$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

这是最原始的facebook.txt文件。

$ sort -n -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

$ sort -n -k 2 -u facebook.txt
guge 50 3000
baidu 100 5000
google 110 5000

当设定以公司员工域进行数值排序,然后加-u后,sohu一行就被删除了!原来-u只识别用-k设定的域,发现相同,就将后续相同的行都删除。

$ sort -k 1 -u facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

$ sort -k 1.1,1.1 -u facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500

这个例子也同理,开头字符是g的guge就没有幸免于难。

$ sort -n -k 2 -k 3 -u facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

咦!这里设置了两层排序优先级的情况下,使用-u就没有删除任何行。原来-u是会权衡所有-k选项,将都相同的才会删除,只要其中有一级不同都不会轻易删除的:)(不信,你可以自己加一行sina 100 4500试试看)

11 最诡异的排序:

$ sort -n -k 2.2,3.1 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

以第二个域的第二个字符开始到第三个域的第一个字符结束的部分进行排序。

第一行,会提取0 3,第二行提取00 5,第三行提取00 4,第四行提取10 5。

又因为sort认为0小于00小于000小于0000….

因此0 3肯定是在第一个。10 5肯定是在最后一个。但为什么00 5却在00 4前面呢?(你可以自己做实验思考一下。)

答案揭晓:原来“跨域的设定是个假象”,sort只会比较第二个域的第二个字符到第二个域的最后一个字符的部分,而不会把第三个域的开头字符纳入比较范围。当发现00和00相同时,sort就会自动比较第一个域去了。当然baidu在sohu前面了。用一个范例即可证实:

$ sort -n -k 2.2,3.1 -k 1,1r facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

12 有时候在sort命令后会看到+1 -2这些符号,这是什么东东?

关于这种语法,最新的sort是这么进行解释的:

On older systems, `sort’ supports an obsolete origin-zero syntax `+POS1 [-POS2]‘ for specifying sort keys. POSIX 1003.1-2001 (*note Standards conformance::) does not allow this; use `-k’ instead.

原来,这种古老的表示方式已经被淘汰了,以后可以理直气壮的鄙视使用这种表示方法的脚本喽!

(为了防止古老脚本的存在,在这再说一下这种表示方法,加号表示Start部分,减号表示End部分。最最重要的一点是,这种方式方法是从0开始计数的,以前所说的第一个域,在此被表示为第0个域。以前的第2个字符,在此表示为第1个字符。明白?)

From: http://roclinux.cn/?p=1472

2009年5月30日星期六

理解Linux的性能

项目中常遇到需要对目前运行的系统进行效率分析,或碰到客户咨询如何优化系统的效率问题。更多的情况是,在系统出现问题的时候,需要分析原因,定位系统故障或瓶颈,当然,最好是可以一并解决故障。但实际上,操作系统优化是一个非常复杂的问题,况且linux有自己一套有别于其他操作系统管理的机制,由此会引起很多不必要的误解和麻烦。自问我是写不错条理性的文章了,只能转一份高人写的文档供参考。(文章根据实际进行了一定的裁减,并对容易碰到的问题做了标识)
一、前提
我们可以在文章的开始就列出一个列表,列出可能影响Linux操作系统性能的一些调优参数,但这样做其实并没有什么价值。因为性能调优是一个非常困难的任务,它要求对硬件、操作系统、和应用都有着相当深入的了解。如果性能调优非常简单的话,那些我们要列出的调优参数早就写入硬件的微码或者操作系统中了,我们就没有必要再继续读这篇文章了。正如下图所示,服务器的性能受到很多因素的影响。

当面对一个使用单独IDE硬盘的,有20000用户的数据库服务器时,即使我们使用数周时间去调整I/O子系统也是徒劳无功的,通常一个新的驱动或者应用程序的一个更新(如SQL优化)却可以使这个服务器的性能得到明显的提升。正如我们前面提到的,不要忘记系统的性能是受多方面因素影响的。理解操作系统管理系统资源的方法将帮助我们在面对问题时更好的判断应该对哪个子系统进行调整。
二、Linux的CPU调度
任何计算机的基本功能都十分简单,那就是计算。为了实现计算的功能就必须有一个方法去管理计算资源、处理器和计算任务(也被叫做线程或者进程)。非常感谢Ingo Molnar,他为Linux内核带来了O(1)CPU调度器,区别于旧有的O(n)调度器,新的调度器是动态的,可以支持负载均衡,并以恒定的速度进行操作。
新调度器的可扩展性非常好,无论进程数量或者处理器数量,并且调度器本身的系统开销更少。新调取器的算法使用两个优先级队列。
引用
·活动运行队列
·过期运行队列

调度器的一个重要目标是根据优先级权限有效地为进程分配CPU 时间片,当分配完成后它被列在CPU的运行队列中,除了 CPU 的运行队列之外,还有一个过期运行队列。当活动运行队列中的一个任务用光自己的时间片之后,它就被移动到过期运行队列中。在移动过程中,会对其时间片重新进行计算。如果活动运行队列中已经没有某个给定优先级的任务了,那么指向活动运行队列和过期运行队列的指针就会交换,这样就可以让过期优先级列表变成活动优先级的列表。通常交互式进程(相对与实时进程而言)都有一个较高的优先级,它占有更长的时间片,比低优先级的进程获得更多的计算时间,但通过调度器自身的调整并不会使低优先级的进程完全被饿死。新调度器的优势是显著的改变Linux内核的可扩展性,使新内核可以更好的处理一些有大量进程、大量处理器组成的企业级应用。新的O(1)调度器包含仔2.6内核中,但是也向下兼容2.4内核。

新调度器另外一个重要的优势是体现在对NUMA(non-uniform memory architecture)和SMP(symmetric multithreading processors)的支持上,例如INTEL@的超线程技术。
改进的NUMA支持保证了负载均衡不会发生在CECs或者NUMA节点之间,除非发生一个节点的超出负载限度。
三、Linux的内存架构
今天我们面对选择32位操作系统还是64位操作系统的情况。对企业级用户它们之间最大的区别是64位操作系统可以支持大于4GB的内存寻址。从性能角度来讲,我们需要了解32位和64位操作系统都是如何进行物理内存和虚拟内存的映射的。

在上面图示中我们可以看到64位和32位Linux内核在寻址上有着显著的不同。
在32位架构中,比如IA-32,Linux内核可以直接寻址的范围只有物理内存的第一个GB(如果去掉保留部分还剩下896MB),访问内存必须被映射到这小于1GB的所谓ZONE_NORMAL空间中,这个操作是由应用程序完成的。但是分配在ZONE_HIGHMEM中的内存页将导致性能的降低。
在另一方面,64位架构比如x86-64(也称作EM64T或者AMD64)。ZONE_NORMAL空间将扩展到64GB或者128GB(实际上可以更多,但是这个数值受到操作系统本身支持内存容量的限制)。正如我们看到的,使用64位操作系统我们排除了因ZONE_HIGHMEM部分内存对性能的影响的情况。
实际中,在32位架构下,由于上面所描述的内存寻址问题,对于大内存,高负载应用,会导致死机或严重缓慢等问题。虽然使用hugemen核心可缓解,但采取x86_64架构是最佳的解决办法。
四、虚拟内存管理
因为操作系统将内存都映射为虚拟内存,所以操作系统的物理内存结构对用户和应用来说通常都是不可见的。如果想要理解Linux系统内存的调优,我们必须了解Linux的虚拟内存机制。应用程序并不分配物理内存,而是向Linux内核请求一部分映射为虚拟内存的内存空间。如下图所示虚拟内存并不一定是映射物理内存中的空间,如果应用程序有一个大容量的请求,也可能会被映射到在磁盘子系统中的swap空间中。

另外要提到的是,通常应用程序不直接将数据写到磁盘子系统中,而是写入缓存和缓冲区中。Bdflush守护进程将定时将缓存或者缓冲区中的数据写到硬盘上。
Linux内核处理数据写入磁盘子系统和管理磁盘缓存是紧密联系在一起的。相对于其他的操作系统都是在内存中分配指定的一部分作为磁盘缓存,Linux处理内存更加有效,默认情况下虚拟内存管理器分配所有可用内存空间作为磁盘缓存,这就是为什么有时我们观察一个配置有数G内存的Linux系统可用内存只有20MB的原因。
同时Linux使用swap空间的机制也是相当高效率的,如上图所示虚拟内存空间是由物理内存和磁盘子系统中的swap空间共同组成的。如果虚拟内存管理器发现一个已经分配完成的内存分页已经长时间没有被调用,它将把这部分内存分页移到swap空间中。经常我们会发现一些守护进程,比如getty,会随系统启动但是却很少会被应用到。这时为了释放昂贵的主内存资源,系统会将这部分内存分页移动到swap空间中。上述就是Linux使用swap空间的机制,当swap分区使用超过50%时,并不意味着物理内存的使用已经达到瓶颈了,swap空间只是Linux内核更好的使用系统资源的一种方法。
简单理解:Swap usage只表示了Linux管理内存的有效性。对识别内存瓶颈来说,Swap In/Out才是一个比较又意义的依据,如果Swap In/Out的值长期保持在每秒200到300个页面通常就表示系统可能存在内存的瓶颈。下面的事例是好的状态:
引用
# vmstat
procs -----------memory------------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 5696 6904 28192 50496 0 0 88 117 61 29 11 8 80 1

五、模块化的I/O调度器
就象我们知道的Linux2.6内核为我们带来了很多新的特性,这其中就包括了新的I/O调度机制。旧的2.4内核使用一个单一的I/O调度器,2.6内核为我们提供了四个可选择的I/O调度器。因为Linux系统应用在很广阔的范围里,不同的应用对I/O设备和负载的要求都不相同,例如一个笔记本电脑和一个10000用户的数据库服务器对I/O的要求肯定有着很大的区别。
引用
(1).Anticipatory
anticipatory I/O调度器创建假设一个块设备只有一个物理的查找磁头(例如一个单独的SATA硬盘),正如anticipatory调度器名字一样,anticipatory调度器使用“anticipatory”的算法写入硬盘一个比较大的数据流代替写入多个随机的小的数据流,这样有可能导致写I/O操作的一些延时。这个调度器适用于通常的一些应用,比如大部分的个人电脑。
(2).Complete Fair Queuing (CFQ)
Complete Fair Queuing(CFQ)调度器是Red Flag DC Server 5使用的标准算法。CFQ调度器使用QoS策略为系统内的所有任务分配相同的带宽。CFQ调度器适用于有大量计算进程的多用户系统。它试图避免进程被饿死和实现了比较低的延迟。
(3).Deadline
deadline调度器是使用deadline算法的轮询的调度器,提供对I/O子系统接近实时的操作,deadline调度器提供了很小的延迟和维持一个很好的磁盘吞吐量。如果使用deadline算法请确保进程资源分配不会出现问题。
(4).NOOP
NOOP调度器是一个简化的调度程序它只作最基本的合并与排序。与桌面系统的关系不是很大,主要用在一些特殊的软件与硬件环境下,这些软件与硬件一般都拥有自己的调度机制对内核支持的要求很小,这很适合一些嵌入式系统环境。作为桌面用户我们一般不会选择它。

六、网络子系统
新的网络中断缓和(NAPI)对网络子系统带来了改变,提高了大流量网络的性能。Linux内核在处理网络堆栈时,相比降低系统占用率和高吞吐量更关注可靠性和低延迟。所以在某些情况下,Linux建立一个防火墙或者文件、打印、数据库等企业级应用的性能可能会低于相同配置的Windows服务器。
在传统的处理网络封包的方式中,如下图蓝色箭头所描述的,一个以太网封包到达网卡接口后,如果MAC地址相符合会被送到网卡的缓冲区中。网卡然后将封包移到操作系统内核的网络缓冲区中并且对CPU发出一个硬中断,CPU会处理这个封包到相应的网络堆栈中,可能是一个TCP端口或者Apache应用中。

这是一个处理网络封包的简单的流程,但从中我们可以看到这个处理方式的缺点。正如我们看到的,每次适合网络封包到达网络接口都将对CPU发出一个硬中断信号,中断CPU正在处理的其他任务,导致切换动作和对CPU缓存的操作。你可能认为当只有少量的网络封包到达网卡的情况下这并不是个问题,但是千兆网络和现代的应用将带来每秒钟成千上万的网络数据,这就有可能对性能造成不良的影响。
正是因为这个情况,NAPI在处理网络通讯的时候引入了计数机制。对第一个封包,NAPI以传统的方式进行处理,但是对后面的封包,网卡引入了POLL的轮询机制:如果一个封包在网卡DMA环的缓存中,就不再为这个封包申请新的中断,直到最后一个封包被处理或者缓冲区被耗尽。这样就有效的减少了因为过多的中断CPU对系统性能的影响。同时,NAPI通过创建可以被多处理器执行的软中断改善了系统的可扩展性。NAPI将为大量的企业级多处理器平台带来帮助,它要求一个启用NAPI的驱动程序。在今天很多驱动程序默认没有启用NAPI,这就为我们调优网络子系统的性能提供了更广阔的空间。
七、理解Linux调优参数
因为Linux是一个开源操作系统,所以又大量可用的性能监测工具。对这些工具的选择取决于你的个人喜好和对数据细节的要求。所有的性能监测工具都是按照同样的规则来工作的,所以无论你使用哪种监测工具都需要理解这些参数。下面列出了一些重要的参数,有效的理解它们是很有用处的。
(1)处理器参数
引用
·CPU utilization
这是一个很简单的参数,它直观的描述了每个CPU的利用率。在xSeries架构中,如果CPU的利用率长时间的超过80%,就可能是出现了处理器的瓶颈。
·Runable processes
这个值描述了正在准备被执行的进程,在一个持续时间里这个值不应该超过物理CPU数量的10倍,否则CPU方面就可能存在瓶颈。
·Blocked
描述了那些因为等待I/O操作结束而不能被执行的进程,Blocked可能指出你正面临I/O瓶颈。
·User time
描述了处理用户进程的百分比,包括nice time。如果User time的值很高,说明系统性能用在处理实际的工作。
·System time
描述了CPU花费在处理内核操作包括IRQ和软件中断上面的百分比。如果system time很高说明系统可能存在网络或者驱动堆栈方面的瓶颈。一个系统通常只花费很少的时间去处理内核的操作。
·Idle time
描述了CPU空闲的百分比。
·Nice time
描述了CPU花费在处理re-nicing进程的百分比。
·Context switch
系统中线程之间进行交换的数量。
·Waiting
CPU花费在等待I/O操作上的总时间,与blocked相似,一个系统不应该花费太多的时间在等待I/O操作上,否则你应该进一步检测I/O子系统是否存在瓶颈。
·Interrupts
Interrupts值包括硬Interrupts和软Interrupts,硬Interrupts会对系统性能带来更多的不利影响。高的Interrupts值指出系统可能存在一个软件的瓶颈,可能是内核或者驱动程序。注意Interrupts值中包括CPU时钟导致的中断(现代的xServer系统每秒1000个Interrupts值)。

(2)内存参数
引用
·Free memory
相比其他操作系统,Linux空闲内存的值不应该做为一个性能参考的重要指标,因为就像我们之前提到过的,Linux内核会分配大量没有被使用的内存作为文件系统的缓存,所以这个值通常都比较小。
·Swap usage
这个值描述了已经被使用的swap空间。Swap usage只表示了Linux管理内存的有效性。对识别内存瓶颈来说,Swap In/Out才是一个比较又意义的依据,如果Swap In/Out的值长期保持在每秒200到300个页面通常就表示系统可能存在内存的瓶颈。
·Buffer and cache
这个值描述了为文件系统和块设备分配的缓存。在Red Flag DC Server 5版本中,你可以通过修改/proc/sys/vm中的page_cache_tuning来调整空闲内存中作为缓存的数量。
·Slabs
描述了内核使用的内存空间,注意内核的页面是不能被交换到磁盘上的。
·Active versus inactive memory
提供了关于系统内存的active内存信息,Inactive内存是被kswapd守护进程交换到磁盘上的空间。

(3)网络参数
引用
·Packets received and sent
这个参数表示了一个指定网卡接收和发送的数据包的数量。
·Bytes received and sent
这个参数表示了一个指定网卡接收和发送的数据包的字节数。
·Collisions per second
这个值提供了发生在指定网卡上的网络冲突的数量。持续的出现这个值代表在网络架构上出现了瓶颈,而不是在服务器端出现的问题。在正常配置的网络中冲突是非常少见的,除非用户的网络环境都是由hub组成。
·Packets dropped
这个值表示了被内核丢掉的数据包数量,可能是因为防火墙或者是网络缓存的缺乏。
·Overruns
Overruns表达了超出网络接口缓存的次数,这个参数应该和packets dropped值联系到一起来判断是否存在在网络缓存或者网络队列过长方面的瓶颈。
·Errors
这个值记录了标志为失败的帧的数量。这个可能由错误的网络配置或者部分网线损坏导致,在铜口千兆以太网环境中部分网线的损害是影响性能的一个重要因素。

(4)块设备参数
引用
·Iowait
CPU等待I/O操作所花费的时间。这个值持续很高通常可能是I/O瓶颈所导致的。
·Average queue length
I/O请求的数量,通常一个磁盘队列值为2到3为最佳情况,更高的值说明系统可能存在I/O瓶颈。
·Average wait
响应一个I/O操作的平均时间。Average wait包括实际I/O操作的时间和在I/O队列里等待的时间。
·Transfers per second
描述每秒执行多少次I/O操作(包括读和写)。Transfers per second的值与kBytes per second结合起来可以帮助你估计系统的平均传输块大小,这个传输块大小通常和磁盘子系统的条带化大小相符合可以获得最好的性能。
·Blocks read/write per second
这个值表达了每秒读写的blocks数量,在2.6内核中blocks是1024bytes,在早些的内核版本中blocks可以是不同的大小,从512bytes到4kb。
·Kilobytes per second read/write
按照kb为单位表示读写块设备的实际数据的数量。

八、附录
本文截取和修改自IBM的红皮书Tuning Red Hat Enterprise Linux on IBM eServer xSeries Servers。

工作面试时最难的25个问题

简介:工作面试时最难的25个问题,很好的准备是成功的一半。如果你是一个对目前的职位不满意,正着手去在新的一年里找到一个新的职位,这篇文章就是你的一个帮手。工作面试是你去面对未来的老板的征途中最重要的一个过程。你必须像进行一个击剑锦标赛或着一个国际象棋比赛那样的坚韧和敏捷来对待面试。
准备是成功的一半如果你是一个对目前的职位不满意,正着手去在新的一年里找到一个新的职位,这篇文章就是你的一个帮手。工作面试是你去面对未来的老板的征途中最重要的一个过程。你必须像进行一个击剑锦标赛或着一个国际象棋比赛那样的坚韧和敏捷来对待面试。
本文是从 Wiiam J. Min和James . abea
的"在失业的时候如何生存并成功的找到另一个工作"一文中摘选出来的。版权所有:Dake
Beam Min, in;出版:Haut Bae Jvanvih。
Min是纽约的Dake Beam
Min公司的董事长,abea是该公司的主席。该公司是国家主要的新职介绍公司,办公所在地在费城。
1.介绍你自己
这个问题通常是一个面试的开始的第一个问题,要额外的小心不要滔滔不绝。尽可能的让你的回答在一分钟,最多2分钟的时间内结束。你的回答应该包含以下4个主题:早期生活,教育背景,工作背景以及最近的工作经验。要着重强调最后的那个主题。要牢记这个问题通常是一个热身的问题,不要把你的最重要的观点浪费在这个问题上。
2.你对我们公司有什么样的了解
你必须能够谈论关于这个公司的产品,服务,收入,业界声望,形象,目标,存在的问题,管理风格,职工,历史和企业文化等问题。但是不要表现出你对这个公司的一切都了如指掌。让你的回答能够体现出你对该公司做了一些研究,但是不要让面试官被你打败(vewhem),并表现出你希望能够了解关于公司更多的情况。
你可以用这样的态度来开始回答问题:"在我的寻找工作的过程中,我调查研究了很多公司,出于如下的理由,贵公司是我感兴趣的公司之一:"。
用一个积极的态度来回答这个问题,不要这样说:"每个人都告诉我这个公司处于困境中,有各种样的麻烦,这就是我来这儿的原因",即是那的确是你在这儿的理由。
3.为什么你希望来我们公司工作?
最糟糕的答案就是"因为我喜欢人"。要是你喜欢的是动物,那你去哪工作呢?在这个问题的回答上,并且贯穿整个面试的过程中,一个优秀的答案总是来自于你所作的调查研究,这样的话你可以从公司的需要那个方面来回答。你可能说你的研究表明这个公司所做的工作正是你说希望参与的,并且他们做这个工作的方式极大的吸引了你。例如,如果这个公司由于强大的管理而著称,纳闷你的答案可以提到这个事实,并表示你希望成为这个小组的一员。如果这个公司着重强调研发,那么就强调你希望创造你的事物,而你知道这个公司非常鼓励这样的行为。如果这个公司强调经济控制,你的答案就应该包含对数字的热爱。
如果你觉得你必须捏造一个答案,例如如果这个公司强调研发,但是你觉得你必须提到这一点而实际上你对这根本不感兴趣,那么你可能根本不应该参加这个面试,因为你可能根本不会考虑在这个公司工作。
你的之前的准备必须包括对这个公司做详尽的了解,来避免到一个你无法发挥才干或者根本不想去的公司面试。大多数人都不擅长说谎,所以在面试中欺瞒面试官是一件很困难的事情。即使你成功的做到了这一点,你所获得的也只是一个你不想参加的工作
4.你可以为我们完成哪些其他人做不到的事情?
这个问题上,你有权利或者是义务来自吹自擂。谈论一些你完成工作的记录,提到你简历中的独特之处,或者列出你职业生涯中的成就。告诉别人,你的技能和兴趣在获取这些结果的过程中发挥了很大的作用,并使得你很有价值。提到你能够合理的安排工作优先顺序,找出问题,并利用你的经验和精力来解决问题。
5.你觉得这个职位最吸引你的地方是什么?最不吸引你的地方又是什么?
列出3到4个这个工作吸引人的方面,然后提出一个简单的不重要的不吸引人的问题。
6.为什么我们应该雇佣你?
参见问题4, 考虑你的能力,你的工作经历和你的干劲。
7.你希望在工作中能够获得什么?
让你的答案来源与这个公式提供的机会。谈论你希望能够大展身手并获取认可的要求。让你的答案基于工作机会而不是个人的要求
8.谈论一下你对你应聘的这个职位的定义
你的答案应该简短并且是基于工作要求的。考虑这个工作的责任和义务。在你回答问题之前确定你真正的了解这个职位所涉及的方方面面。如果你不确定,就去问面试官,他可能会帮你回答这个问题。
9.你需要多久能够对公司做出显著的贡献?
答案要实际一点。可以这样回答,尽管你希望从第一天开始就能够满足公司紧迫的要求,并开始发挥作用,但是你可能需要6个月到1年的时间来足够了解这个公司及其需要来做出很大的贡献。
10.你会在公司工作多久?
可以这样回答,你对在这个公司的职业生涯很感兴趣,可是也得承认你必须能够不断感觉到有挑战才能够继续在任何公司呆着。可以考虑这样的语句"只要我们双方都感觉有收获"。
11.你的简历显示你的能力超出了这个工作的要求,你是如何认为的?
强调你对在这个公司开始一个长期的合作的兴趣,你可以说你认为如果你在这个职位上表现的很好,公司还会为你提供新的机会。也要提到一个好公司需要好的职员。有检验的职员总会有很好的奖励;既然你是如此的很是这个职位,雇主将会很快从他的投资中获得回报。一个发展中的,充满活力的工资永远不会嫌天才多的。
12.你的管理方式是什么样的?
你必须对这个公司的风格有足够的了解,这样才能让你的管理风格对其进行补充。可能的风格包括:基于任务的(我喜爱问题-研究那些是错误的,选择一个解决方案并完成),基于结构的(我做出的任何一个管理的决定是基于它是如何影响问题的底线的),或者是家长式作风的(我致力与管理好我的每一个下属,并给他们指引正确的方向)。
民主参与式的风格是目前比较流行的一种:一个开放的管理方式,通过激励手下并根据所负责的事情分派任务来完成每一件事情。
当你考虑这个问题的时候,要思考你的风格是否会让你在这个公司里高兴并有效率的工作。
13.你是一个合格的经理吗?你可以举一些例子吗?你是否觉得你有顶级管理人员的潜力?
保证你的答案是基于成果和任务的。通过你职业生涯中的一些例子来加固你的论点。强调你的经验和精力
14.当你招聘人手的时候你需要什么类型的?
考虑一些技能方面的问题。主动性,以及能够舒服和有效的与其他人一起工作的适应性。提到你希望雇佣一些看起来能够在公司中获得提升的人。
15.你是否曾经不得不解雇一些员工?是什么理由?你是如何解决这个情况的?
要承认这个情况不是容易解决的,但是你还是很好的解决了,不管是从公司角度还是从个人角度。让他们知道,和其他人一样,你不喜欢这种让人不乐意的工作,但是你可以有效的富有人情味的解决问题,尤其是在要解雇某个人的时候。
16.你认为作为一个经理或者高级行政人员最困难的事情是什么?
要提到指定计划,指定和成本控制。最困难的任务是要去激发并管理雇员来完成一些计划中的事情,并且按时的在预算范围内完成任务。
17.在我们这个行业中你觉得什么是最重要的趋势?
一样要准备两到三个趋势来阐明你对所在行业的是多么的了解。你可以需要考虑技术上的挑战或者机会,金融环境甚至管理的需求作为你所应该考虑收集的关于你的行业说面对的状况。
18.你为什么离开你现在的工作(上一个工作)?
在不伤害你自己的情况下要简明扼要并诚实的回答这个问题。回溯到你寻找工作的计划阶段,那时你正在把这个话题当作你的工作经历。如果你是在一次公司裁员中被裁掉的,直接说出来好了;否则的话,要指明这次离职是你自己的决定,你自己行动的结构,不要特到任何关于性格冲突等。
19.你觉得放弃原来所有的福利待遇等来寻找一个新的工作是什么感觉?
要提到你很自然的担心这一点,但是并不很恐慌。你愿意为寻找到合适的工作而冒一点风险。不要说,你对安全感比成功的完成工作更感兴趣。
20.在你上一份工作中,你最喜欢那个方面的特点?最不喜欢哪个?
要小心而计息的回答这个问题。要多说你喜欢的特性,而少说你不喜欢的。不要引用个人的问题。如果你使得你的上一份工作听起来很糟糕,面试官会疑问你为什么还能在上一份职位上一直待到现在。
21.你如何看待你的老板?
要尽可能积极的回答这个问题。你潜在的未来的老板很希望能够了解你未来在相似的场合会如何谈论他。
22.你在现在的年龄中为什么不能赚到更多?
要告诉他这是你寻找新的工作的理由之一,不要处于守势。
23.你希望这个职位的薪水是多少?
讨论薪水是一个很微妙的问题。[b]我们建议你在条件允许的情况下尽可能的拖延用一个精[/b]你可以说,"我知道这个工作的薪水的大概范围是¥---到¥---。这个对于我来说是合适的价位。"你也可以用一个问题来回答这个问题:
"你可能在这个问题上可以帮助我。你能否告诉我在公司中对相似职位的工作的大概薪水是多少?"。
如果你是在一个最初的面试中遇到这个问题,你可以说你觉得你需要更多的了解这个职位的职能才能够对这个问题有个有意思的回答。在这个问题上通过询问面试官或者人事高级主管或者自己去寻找结果,你可以尝试去获得这份工作是由有一个工资等级。如果有,并且你能够接受,那么直接回答你满意这个薪水范围好了。
如果面试官继续纠缠这个问题的话,你可以说"我现在的薪水是¥--。和其他人一样,我希望能够提升这个数字,但是我主要的兴趣还是在工作本身。"要记住,获取一个新的工作这件事本身不会使得你能够赚到更多的钱。
如果一个猎头公司也参与了此事的话,你的联系人可能可以帮助你解决这个薪水的问题。他甚至可以帮你介入此事。例如,如果他告诉你这个职位的待遇,然后你告诉他你现在已经赚那么多的,并且希望待遇能够适当的提升,他可能会去雇主那然后提议给你增加10%的待遇。
如果没有获得关于这个职位的合适的信息,而面试官还继续这个话题的话,你可以用一个具体的数字来回答这个问题。你不能给别人留下待遇完全没有影响你将会接受任何待遇的印象。如果你年薪8W的话,你不可能没有变现出放弃自己的时候,说3.5W一年也是可以接受的。(如果你是在做工作的一个彻底的变化的话,这种情况可能也是有道理,可以理解的)。
不要很快就把你自己卖掉:),但是要继续的强调这个工作本身才是你最看重的东西。面试官可能会去判断你希望从这个工作的待遇是多少哦。不要给面试官留下金钱对你来说是唯一重要的事情的感觉。把薪水的问题和工作本身挂钩。
但是无论合适可能的话,在你到面试过程的最后一个阶段之前,少谈论薪水的问题。到那个阶段的时候,你就应该知道,这个公司对你有很大的兴趣,这个时候在谈论薪水待遇的话就会有很大的余地了。
24.你长期的目标是什么?
回到你寻找工作的计划阶段。不要这样回答"我希望能够得到你广告中的工作"。把你的目标与你面试的公司关系起来,"在你们这样一个公司,我希望能够..."
25.你目前位置在工作中是多么的成功?
你要回答,总的来说你对你目前为止的职业生涯是很高兴很满意的。列举一些生活中普通的琐事,你觉得你完成的很好,没有怨言。

手工释放linux内存——/proc/sys/vm/drop_caches

总有很多朋友对于Linux的内存管理有疑问。而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下。最后,还附上我对这方法的意见,欢迎各位一同讨论。

当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法。那么我来谈谈这个问题。

一、通常情况
先来说说free命令:
引用
[root@server ~]# free -m
total used free shared buffers cached
Mem: 249 163 86 0 10 94
-/+ buffers/cache: 58 191
Swap: 511 0 511

其中:
引用
total 内存总数
used 已经使用的内存数
free 空闲的内存数
shared 多个进程共享的内存总额
buffers Buffer Cache和cached Page Cache 磁盘缓存的大小
-buffers/cache 的内存数:used - buffers - cached
+buffers/cache 的内存数:free + buffers + cached

可用的memory=free memory+buffers+cached。

有了这个基础后,可以得知,我现在used为163MB,free为86MB,buffer和cached分别为10MB,94MB。
那么我们来看看,如果我执行复制文件,内存会发生什么变化.
引用
[root@server ~]# cp -r /etc ~/test/
[root@server ~]# free -m
total used free shared buffers cached
Mem: 249 244 4 0 8 174
-/+ buffers/cache: 62 187
Swap: 511 0 511

在我命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐,都被cached吃掉了。别紧张,这是为了提高文件读取效率的做法。

为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer
Cache和Page
Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了
I/O系统调用(比如read,write,getdents)的时间。

那么有人说过段时间,linux会自动释放掉所用的内存。等待一段时间后,我们使用free再来试试,看看是否有释放?
引用
[root@server test]# free -m
total used free shared buffers cached
Mem: 249 244 5 0 8 174
-/+ buffers/cache: 61 188
Swap: 511 0 511

似乎没有任何变化。(实际情况下,内存的管理还与Swap有关)

那么我能否手动释放掉这些内存呢?回答是可以的!

二、手动释放缓存
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。操作如下:
引用
[root@server test]# cat /proc/sys/vm/drop_caches
0

首先,/proc/sys/vm/drop_caches的值,默认为0。
引用
[root@server test]# sync

手动执行sync命令(描述:sync 命令运行 sync
子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync
命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O
和读写映射文件)
引用
[root@server test]# echo 3 > /proc/sys/vm/drop_caches
[root@server test]# cat /proc/sys/vm/drop_caches
3

将/proc/sys/vm/drop_caches值设为3
引用
[root@server test]# free -m
total used free shared buffers cached
Mem: 249 66 182 0 0 11
-/+ buffers/cache: 55 194
Swap: 511 0 511

再来运行free命令,会发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB。那么有效的释放了buffer和cache。

◎ 有关/proc/sys/vm/drop_caches的用法在下面进行了说明
引用
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches,
dentries and inodes from memory, causing that memory to become
free.

To free pagecache, use echo 1 > /proc/sys/vm/drop_caches; to
free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 >
/proc/sys/vm/drop_caches.

Because this is a non-destructive operation and dirty objects
are not freeable, the user should run sync first.

三、我的意见
上述文章就长期以来很多用户对Linux内存管理方面的疑问,给出了一个比较"直观"的回复,我更觉得有点像是核心开发小组的妥协。
对于是否需要使用这个值,或向用户提及这个值,我是有保留意见的:
引用
1、从man可以看到,这值从2.6.16以后的核心版本才提供,也就是老版的操作系统,如红旗DC
5.0、RHEL 4.x之前的版本都没有;
2、若对于系统内存是否够用的观察,我还是原意去看swap的使用率和si/so两个值的大小;

用户常见的疑问是,为什么free这么小,是否关闭应用后内存没有释放?
但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值:
引用
-/+ buffers/cache: 58 191

这才是系统可用的内存大小。
实际项目中告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。
相反,如果在这个时候,我们告诉用户,修改系统的一个值,"可以"释放内存,free就大了。用户会怎么想?不会觉得操作系统"有问题"吗?
所以说,我觉得既然核心是可以快速清空buffer或cache,也不难做到(这从上面的操作中可以明显看到),但核心并没有这样做(默认值是0),我们就不应该随便去改变它。
一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。
当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。

我觉得,排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。(可惜,这样的应用通常都是运行在老的操作系统版本上,上面的操作也解决不了)。O(∩_∩)O哈哈~
visitor
2009/02/25 11:28
完全没必要这样做,即使内存全被cache满了,运行一个大程序试试,绝不会有什么"内存不足"的情况,需要多少内存就从cache释放多少内存。

cache的好处可以减少很多硬盘访问,我的一块老硬盘,用windows的时候每打开一个程序硬盘都要狂响一阵,和拖拉机有一比,但用linux的时候硬盘非常安静!
linuxing 回复于 2009/02/26 00:06
O(∩_∩)O哈哈~,可惜并不是每个人都明白linux这个问题,正如我最后说的:"我更觉得有点像是核心开发小组的妥协"。
但转这个帖子出来,也不是没有实际意义的。

Linux 图形现状

在淡出 Xgl 方面的工作之后,我仍收到大量 email
并阅读许多帖子。我的结论是大多数人并没有真正理解 linux
图形方面正在发生的事情。人们无法看清整体的图景,这是可以理解的。图形是一个庞杂的领域,包含着众多软件组件和相互竞争的开发小组。作为一种尝试,
我写了这篇文章,来解释所有这些部分是如何组织到一起的。
俱往矣

今年是 X server 的二十一岁生日。脱胎于 Athena 项目,自 1984
年发端以来,过去的那些年中,它很好地满足了 Unix 社团的需要。 X
已经被广泛应用,推动着今天的大多数 Linux 桌面。这篇 Wikipedia
文章2提供了更多详细资料,除了两项开源的主要 X
创新,它们允许提供跨平台支持和网络通透性。

然而,自 X 着手设计,20
年时光匆匆流逝,视频硬件今非昔比了。如果瞥一下一块现代视频芯片的架构图,你会注意到一个小小的标记着
2D 的区块。那是由于芯片的 90% 专注于 3D 管线。你正好为那些 3D
硬件付了费,因此如果桌面能利用它那不是很棒吗。很多人并未意识到 3D
硬件也可用于绘制 2D 桌面。看看你的屏幕,它是一块平平的 2D
平面,对不对?任何由 3D 硬件生成的图画最终都要显示在平的 2D
屏幕上。此一事实应能让你认识到,通过适当地编程,3D 硬件可以绘制 2D 桌面。
图形供应商

多年以前图形芯片供应商乐于为他们的硬件公开数据表和编程信息。但是随着专利库的增大,对专利侵权的恐惧也增大了。现在图形芯片供应商将关于芯片的全部信息秘而不宣,作为使专利持有人更难搜寻侵权行为的一种手段。至少这是供应商给出的隐藏编程规范的理由。并且他们也宣称隐藏编程规范可使竞争对手更难对他们的芯片做反相工程,但我对此同样持怀疑态度。所有这些隐藏规范使为这些芯片编写开源设备驱动异常困难。作为替代方案,我们被迫依赖供应商来为最新的硬件提供驱动程序。如果你尚未留意,请注意图形供应商的确仅仅关心
MS Windows 因此他们只为 Linux 提供最低程度的驱动支持。也有例外。Intel
为他们的部分芯片提供开源驱动。Nvidia/ATI 提供专有驱动,但是落后于 Windows
版本。总的后果是一批非常参差不齐的驱动,品质从良好到完全空白。
桌面选择

其它的桌面选择, Windows 与 Mac,都拥有 GPU
加速的桌面。它们明显地、眼见地比他们的前辈要好。某些情况下这些新的带加速的桌面的绘制速度能够比旧的模型快过一百倍。在未来的某个时候,图形芯片供应商会移除标记为
2D 的那个小点,仅给我们留下 3D 硬件。Microsoft 和 Apple
看起来已经得到信儿说 3D 是未来的方向并开始进行转换。另一方面。几个 X
开发者曾告诉我停止谈论竞争的图景。他们说他们想做的是让 X 更好。尽管 X
开发者可能无动于衷,我确信当由于缺乏竞争力的 GUI
而开始丧失份额的时候,Redhat 和 Novell 的经理们不会赞同此一观点。

在桌面上使用 3D 并不只是为了制造更华丽的视觉效果3。有大量利用 3D
能力生成的效果只是虚饰,但仍有些真正的理由运用 3D。简单来说 3D 快过
2D,没有人动手使他们的 2D 功能更快,所有的硅工程师都转向了 3D
。你能够完成快速、任意的图像处理,例如色彩空间转换,拉伸/卷曲,等等。我曾见过某些消耗主
CPU 几秒钟才完成一帧的超级复杂的过滤操作在 shader
硬件上以实时达成。支持任意色彩映射的不同的 Windows 色深(同时支持 8、16、24
位窗口)。为项目管理者提供极快的屏幕翻转/旋转,为视力不良者提供全屏缩放,等等。分辨率无关性允许对象以任意分辨率/尺寸渲染,当显示到屏幕上的时候再降低/提高取样精度。更多有意思的应用在后面讨论窗口化的小节里阐述。
当前的 X.org 服务器

X.org 即将发布 X11R74。这个发布的主要特性是 X
源代码库的模块化。尽管对大多数用户并无意义,模块化将使在 X
源代码上工作容易得多。模块化之前 X 源代码树包含约 16M
行代码,全部作为一个单独的项目构建。模块化之后,代码树将分解为一打左右的独立部分,使项目的构建和理解容易得多。
X,作为操作系统

X
究竟是一个应用程序还是一个操作系统?在这里有一份优秀的参考文献帮助我们理解一个
X server 是如何组织到一起的。尽管写成已有 8
年之久,大多数内容仍然切题。如果你不知道何谓 DIX、mi、DDX、CFB
什么的,最好先读读它。大概在 X11R6.3 那会儿 Xfree86 分裂了,X
服务器的设计变得极度跨平台。X
面向的众多操作系统对硬件侦测这类事情提供不同程度的支持。为了解决此类问题,X
添加了代码侦测 PCI 总线来搜寻硬件,代码搜寻视频 ROM
并运行它们来重置硬件,搜寻鼠标和键盘并提供驱动,管理多个 VGA
设备的问题,最后甚至提供它自己的模块加载器。这一步让 X
开始模糊了它是应用程序还是操作系统的界线。虽然某些操作环境的确需要这种类
OS 支持,实现这些特性来提供同样服务的操作系统,比如 Linux, 终于落到 X 和
OS
之间互相冲突的境地。当然操作系统是一个移动的标靶,十年前恰当的决策今天看来可能已经不合时宜了。

Linux 内核提供在 BSD 和某些其它平台上并不存在的子系统,比如 PCI 和
framebuffer。出于对跨平台支持的兴趣,X
服务器内建了和这些子系统平行的实现。在过去对此确有需求但在当前 Linux
系统上这导致两块不同的软件都试图控制同一个硬件。Linux 具有多个非 X
的视频硬件使用者,它们与 X
交互的唯一位置就是内核。内核提供了很多机制来协调这些使用者;反正就是 PCI
子系统,输入驱动,热拔插检测,设备驱动这档子事。为了和 Linux
一致,最佳方案是使用内核提供的特性,仅仅在其它平台上运行这些重复的库。Fbdev
和 XAA 驱动是冗余驱动的主要例子。

Linux
有一个优秀的热拔插系统,图形系统真的有必要开始利用它。显示屏可以从多个来源上热拔插。有一个传统的热拔插来源;有些人将新的显示卡插入热拔插背板。然而存在其它非传统的途径来获得一次热拔插。另一位用户可能正在使用你要加到你的屏幕组的显示屏,当他注销的时候你就会获得一次热拔插。你可以将一台外部监视器连接到笔记本电脑上,从而生成一次热拔插。你可以以无线方式通过
DMX 或 Chromium 这类东西连接到显示墙。USB
也是很多热拔插的来源。用户能够热拔插鼠标、手写板、键盘、音频设备、甚至图形适配器。既然不和内核的热拔插系统通信,当前
X 服务器不能处理这些情形中的任何一种。

标准的 Linux 桌面使用 rooted X。Rooted X 指的是 X
控制最上级桌面的绘制,窗口则处于它之上。 Cygwin/X,Directfb 和 Apple
Darwin 都是用 rootless
X。这些环境拥有另一套窗口系统负责显示。这些宿主窗口系统绘制主桌面并实现它们自己的窗口
API。通过运行在 rootless 模式,X 能够象这样被整合到一个宿主窗口系统中。在
rootless 模式下应用程序窗口绘制到系统内存中的缓冲区。在适当的时候 X
窗口和宿主窗口系统同步,于是它们的内容被显示出来了。Rootless X
也提供协议在两个环境当中传递鼠标和键盘事件。
X Render

现在讲到 X Render 扩展。Keith P 于公元 2000 年宣称现存的 X
服务器无法有效地绘制清晰的、反锯齿的文本,起而提出 X Render
扩展来解决此问题。X Render 是核心 X 特性,允许漂亮的字体和 Cairo
这类事情在 X 服务器上实现。X Render 给 X 服务器添加了 Porter-Duff
操作5。这些操作允许图面以不同的方式合并。它们与 OpenGL
纹理和纹理操作的概念非常相似,但仅仅是相似而非完全一致。
XAA

XAA,既 X 加速体系结构,是在 XFree86 4.0
中引入的。为达成跨平台可迁移性,XAA
没有利用内核设备驱动,而在用户空间实现了 2D
视频驱动。用户空间驱动的确可行,然而既然不存在基于内核的驱动,Linux
内核就无法追踪 X 对硬件作了些什么。直到你的系统引导完毕,X
都未开始运行。你应该希望启动过程中在启动 X
出麻烦的情况下仍有显示,不是吗?Linux
下的启动显示通过文本模式(控制台)驱动实现,最常见的是 VGAcon。由此 Linux
下你困于两套设备驱动, X
和控制台的,都在试图控制同一块硬件。XAA、控制台和虚拟终端(Virtual
Terminal)这类 Linux 内核功能的组合会导致大量的冲突,不过容后细谈。
EXA

EXA 对现存 2D XAA
驱动的替代允许当前的服务器模型能工作更长一点。它通过提供远为高级的驱动和内存管理
API 来加速 X Redner 扩展。起初 EXA
定位为针对包括旧硬件在内的所有硬件的方案。但这并未成为现实。如果老旧的硬件缺少加速渲染核心所需的
alpha 混合硬件,你基本上就无能为力了,虽然EXA
有可能通过较好地管理显存帮助增强这些芯片的性能。所以归根结底硬件 EXA
相当程度上工作于现存OpenGL 驱动同样的硬件。Nv 和 i128
这样的例外也是有的,这些硬件具有 3D 能力却不存在 OpenGL 驱动。可以确定的是
EXA 会不断扩张来探求更多芯片中的 3D 能力。EXA
牌创可贴能顶一阵子,但非长远之计。必须牢记的是 EXA/render 仍然仅是庞大的
Mesa OpenGL API 的子集,而随着时间的推移我们总会寻求越来越多的特性。
Cairo6

Cairo 的目标是成为一套高品质的、同时适用于打印输出和屏幕显示的 2D 绘制
API。它被特别着意设计得同 X Render 扩展协同工作,实现了 PDF 1.4
图像模型。有趣的操作包括笔划和三次 Bézier
样条曲线,转换与合成半透明图像,反锯齿文本渲染。Cairo
的设计是可移植的,且允许可挂接的绘制后端例如图像、glitz、png、ps、PDF、svg、quartz、GDI
和 xlib。目前 Cairo 已经过大约两年的开发,在 GDK 和 Mozilla
即将到来的版本中应该能看到部署。Cairo 的主要目标是使处理屏幕上的高端 2D
图形更容易,然后轻松打印它们。可挂接后端允许应用程序使用相同的代码绘制和打印。

Cairo 后端之一,名为 glitz,基于 OpenGL 实现了
Cairo。这里有一篇上佳的论文说明了glitz 的细节。既然 Cairo 同时实现了 xlib
和 OpenGL
后端,我们可以在两者间做一直接性能比较。在已发表的基准测试中,OpenGL
的速度在所有地方都以 10 到 100 比 1 的比率击溃了
XAA。这样巨大的性能差异正是由于 glitz/OpenGL
对图形芯片上3D硬件的运用。比较 glitz 和 xlib 上的 Cairo
是一个展现3D硬件具有在 2D 屏幕上绘制之完美能力的好方法。
DRI 与 OpenGL

DRI,直接渲染机构7,实现了与 X 服务器协作的 OpenGL。DRI
有四个主要组件。首先,libGL 提供 OpenGL
API,并作为在多个驱动间的切换器。其次,存在一套用于编程图形芯片的硬件相关的
DRI 库。对于DRI 驱动未能提供的 OpenGL
特性你需要一套软件后备实现。这个后备实现由 Mesa 提供。注意 Mesa
是一套完全的 OpenGL
软件实现。一块没有提供任何加速的卡仍然能够通过将每一个函数都交给 Mesa
来实现 OpenGL8。最后,就是 DRM,直接渲染管理器。DRM
驱动运行于内核,管理着硬件并提供必要的安全保护。

DRI 有意思的方面在于名字当中的 direct 代表的那部分。每个使用 DRI
的应用程序直接(directly)对视频硬件编程。这和 X
大异其趣,在那里你发送绘制命令给服务器,由服务器代表你对硬件编程。 DRM
内核驱动协调多个用户防止冲突。此模型的优点在于 OpenGL
绘制能够在无须进程切换及传输数据至主控服务器开销的情况下发生。一个缺点是图形卡必须处理大量图形上下文切换。工作站级卡一般能应对裕如,但部分消费级卡不行。Microsoft
已经撞上这个问题,并要求 DirectX 10 硬件提供高级硬件上下文切换支持。

DRM
还实现了比普通用户拥有更多能力的主控用户的概念。这些额外能力允许图形设备被初始化以及GPU
资源的消耗受到控制。当前的 X 服务器,以根权限运行着,作为 DRM
主控用户工作。实际上并无 DRM
主控用户运行在根权限下的真实要求,而且存在一个初步的补丁移除此要求。

一旦硬件缺少某种特性,Mesa
就以软件实现它。这称为软件后备。人们有时被这个绕住了。他们说他们的 OpenGL
没有被完全加速而X服务器一切正常。再想想看。两款驱动都运行在相同的硬件上。
OpenGL 未能完全加速,因为它提供了很多需要加速能力的特性,而 X
仅提供少量此类特性。如果你利用了同时存在于两款驱动 API
中的特性,他们可能都会被加速。如果没有,那就开始动手编程来修复对应的驱动。
安全性与根权限

Linux 内核包含了约 1000 万行以根权限运行的代码。X 服务器包含了 1600
万行代码,其中大多数运行在根权限下。如果搜寻安全漏洞,你认为最好下注在哪一处呢?其实并无技术理由要求
X 服务器以根权限运行。打着跨平台兼容性的旗号,当前的 X
服务器以根权限运行,以便从用户空间直接对视频硬件编程。 Linux
有个方案针对这种情况。你可以把特权代码放到设备驱动里,无须特权即可运行用户空间应用。一款一般的显示卡的特权设备驱动在
100KB 左右。那可是比 1600 万行少得多的代码需要审核。
怀旧版硬件

任何视频硬件,低档至 VGA 适配器,都可以运行 X 服务器,而且 Mesa
会非常乐意以软件实现整个 OpenGL
API。问题是有多快。并没有很多编程活动投注于将一块 VGA 卡变成 ATI
X850。这些旧硬件能被当前的 X
服务器很好地支持。但是新系统的设计正围绕新的硬件展开,并且它们很可能在旧硬件上表现差劲。你也许应该考虑一下升级你的视频硬件;具有适当
OpenGL 性能的全新图形卡能在 40$
的价位买到,二手价格甚至更低。作为替代,你也可选择不要升级,继续运行那些旧的对你已经够用的软件。
内核级图形支持

当内核开始引导,你面对的就是引导控制台。在 x86
平台上,最常见的引导控制台为 VGAcon。 VGAcon 使用你图形卡上的遗留硬件 VGA
支持。既然几乎所有 x86 图形卡都支持 VGA, VGAcon
为此平台提供了一个通用控制台。在非 x86 平台上你也许无法获得 VGA
硬件支持。在这类平台上你通常加载针对特定芯片的帧缓冲驱动。内核提供为数众多的
fbdev 驱动,由此范围相当广泛的硬件都被支持了。
VGA之余孽犹存

IBM PC 的原始设计定义了少数位于固定的、预知的地址的外部设备,例如 COM1 在
0x3F8。很不幸,大多数图形卡的 VGA
支持是这些位于固定地址的遗留设备之一。只要你的系统中仅存在一块图形卡,VGA
并不成问题。插入第二块,现在你有了两片都试图独占相同总线地址的硬件。

目前的 X 服务器包含处理多块 VGA 适配卡的代码。但是这些 X
服务器代码并不会感知到这些设备上的其他用户,而是会让他们乱作一团。搞乱这些程序并不好玩,所以我们需要某种方法来协调
VGA 设备的多个用户。Linux 上最佳方案就是向内核添加一套 VGA 仲裁机制。BenH
已经动手在搞一种 OLS 上讨论过的。

另一症结在于多块显卡的初始化。显卡具有 ROM,又称
VBIOS,在引导时执行以初始化硬件。出于历史原因,很多这类初始化用到了 VGA
支持。既然我们仅能有一块遗留 VGA 设备,系统 BIOS
转移了问题,仅初始化第一块显卡。在引导期间某个较迟的点初始化第二块卡也是可能的。这是通过以
vm86 模式运行第二个 VBIOS 并同等使用单个遗留 VGA
设备来达成。为了使问题更复杂,存在两种常见 ROM 格式即 x86 代码和 Open
Firmware。既然供应商对他们的 Open Firmware 型号收取高额费用,在非 x86
机器上使用 x86 视频硬件是很常见的。为了让这种做法可行,VBIOS 不得不使用
x86 仿真器来运行。BenH 也在为这个问题的一种方案工作。

Fbdev,又名帧缓冲。Linux
下,帧缓冲主要用途包括:初始化硬件,检测连接的显示设备,确定它们的有效模式,设定输出模式及配置,硬件光标,黑屏处理,色彩映射,取景和休眠/恢复。内核中存在大量帧缓冲驱动,它们实现了对这些特性程度不同的支持。请注意,尽管
fbdev 接口是基于内核的,并无障碍阻止存在实现于用户空间的辅助应用 fbdev
支持。辅助应用可用在缺少源代码的时候让 VBIOS 可用。

当你运行 VBIOS
时它建立一套非常低级的、用于控制显示的入口点。这事太细节化,我不准备解释
VGA、 Int10 和 VESA 之间的所有差异。作为概括, VGA 是 IBM
创立的基本硬件寄存器标准。 Int10
专注于用软件中断的方式处理显示输出。软件中断仅工作在 x86 实模式下,且除了
GRUB 之类很少被使用。支持 Int10 功能的代码来自 VBIOS,当 ROM
运行时被安装。仅允许存在一个被安装的 Int10 驱动。VESA 取代了 Int10
模式并扩展它到保护模式。配置内核时,有三个驱动: VGA 和 VESA fbdev,
fbconsole 也需要加载运行,VGAcon 则总是必要的。在非 x86 系统你通常需要
fbdev 和 fbconsole。
让多用户运转

Linux
乃多用户操作系统。且它一贯如此。但是连接多个用户的唯一途径就是通过串行线和网络。如果你安装多块显示卡并在本地跑多用户会怎样?此路不通。有一堆
Linux console project 这样的补丁和针对 X
的各种黑客行为试图让它运作起来。问题在于 Linux
控制台虚拟终端系统控制着本地显示卡且只能有效地支持单个用户。注意 fbdev
被多个用户使用的时候可胜任愉快,单用户的是 VT 系统。

多个本地用户在学校、监控系统、网吧甚至家里这样的地方都有应用。由于普通 PC
仅支持单 AGP 插槽,过去对多显卡支持的需求并不紧迫。多块 PCI
显卡可以工作,但性能不彰。也有带有多个 AGP 插槽的高端机器,但并不普及。PCI
Express 改变了这种状况。通过 PCI
Express,所有插槽从机理上是等同的。唯一不同的地方就是有多少通道连接到每个插槽。硬件上的变更让构建具有多个高性能显卡的系统变得轻而易举。计划中的
PCIe 支持芯片允许最多 16 块显卡共存于单一系统中。
分裂控制台

当分析控制台系统时,你会很快注意到有两种不同类型的控制台用法。系统控制台,提供引导显示并并勇于系统错误报告、恢复和维护。以及用户控制台,用户登录并处理命令行交互或编辑的普通显示。在目前
Linux 控制台系统中,两种用法都由同一套控制台代码处理。

按照用途分离控制台代码是可能的,能够修正很多 Linux
控制台当前存在的问题。一开始,系统控制台应当完全可靠且防篡改。它不必很快。它需要尽可能以最简代码实现而且它需要在系统中断和内核
panic 时保持运作。用处包括系统恢复及单用户模式。引导时显示和 kdbg
支持也是可能的。系统控制台会提供 SAK
和安全登录屏幕。为了支持无关用户登录到显示卡的每个头,它需要无关地在每个头上实现。一种访问新系统控制台的方式是通过
SysReq,控制台将覆盖你当前的显示并使用你当前的显示模式。Novell kernel
debugger 以这种方式工作。系统控制台不支持
VT,而且不存在控制台切换。既然它清楚你的显示模式,它能够在紧急情况下抢占你的显示,比如一次致命的
kernel OOPS9。

系统控制台的设计使用 fbdev
来追踪特定的模式及扫描缓冲位于何处。为了使它尽可能地可靠任何加速支持都被移除。
Fbconsole 则使用系统 CPU 直接处理帧缓冲。控制台通过利用 fbconsole
中现有位图字体支持直接绘制到输出缓冲来显示。

用户控制台是系统控制台的对立面,它需要是高性能和用户友好的。一个用户空间实现让它易于通过为每个用户创建一个进程来处理多用户。用户空间(实现)允许全速的通过
fbdev 和 DRM 的 GPU 加速。你还能轻易访问 Xft/FreeType 获得 Unicode
支持。借助适当的设计,控制台甚至允许分配不同的用户到不同的头上。通过适当编码的热键,它能够表现得和现存
VT 一样且支持控制台切换。

既然目前的控制台是合并在一起的,当你切换 VT
时你同时遇到这两种类型。新的模型中当前 VT
切换键会把用户空间控制台提供给你。 SysReq
则激活系统控制台。连接到系统控制台上的 shell
进程能运行于高优先级,让从一个失去控制的进程手里夺得控制权更轻易。
物以群分

本地多用户支持暗示着 Linux 会为用于 UI
的外设实现控制台组的概念。控制台组是发起 login console
所须硬件的集合。一个范例组包括显示器、鼠标、键盘和音频设备。登录时, PAM
将这些设备的所有权赋予登入的用户。对此概念的有趣附加是将 USB hub
或端口作为控制台组的一部分包括进来。一旦用户登入,任何接在 USB
端口上的设备也属于他们。登出时所有这些又返回到未分派设备池中。
候补的候补10

小把戏们: directfb、 svgalib、 fresco、 Y Windows、 FBUI,诸如此类。
Linux 吸引了一票想在显示代码方面一展身手的人们。在当前的 VT
模型下,这些另类显示系统在 VT 切换时导致了很多问题。切换 VT
之后,新近激活的显示系统被允许对硬件干任何它想干的事。那包括重新初始化它,重编程它以及清除它的
VRAM。当你切换回来,原始系统被指望能从更动后的硬件状态下恢复。不仅仅是这些小把戏们才在VT
切换中造成问题。你能在控制台和 X 甚至两套桌面比如 X 和 Xegl 中切换。对具有
14 个寄存器和32KB 显存的 VGA 适配卡这可能不错。但对拥有 300
个寄存器、512MB 显存和独立 GPU 协处理器的显示卡而言它不是一个良好的模型。
合作无间

我确信对此问题的最佳方案是由内核为每种显示硬件提供单独的、广泛的设备驱动。这意味着
fbdev 和 DRM
这类冲突的驱动必须并入一套可协作的系统。它还意味着一旦基于内核的设备驱动加载,从用户空间摆弄硬件的行为就应予禁止。我怀疑如果
Linux 为不同的显卡提供广泛的标准驱动,许多创建另一版本Radeon
驱动的冲动会冷却下来。

这并不表示 fresco
这样的项目不能开发他们自己的显示硬件设备驱动。只表示你不得不卸载标准驱动,然后在运行新程序之前加载你的定制驱动。这种卸载/加载行为和内核中的其它驱动并无不同。运用热键在针对同一块硬件的两个活动的显示设备驱动之间跳转(VT
切换)将不再被支持。如果基本的驱动缺乏需要的特性,较好的方案是向标准驱动提交补丁。通过在标准驱动中实现需要的扩展,所有程序能共享它们,通过用户空间控制台系统在使用它们的应用程序间切换也会很容易。

若我们继续保持提供热键在显示驱动间跳转的 VT
设计,我认为用热键在磁盘和网络驱动间跳转也被实现才是公平的。
OpenGL|ES

Khronos Group11 是一个由超过一百家成员企业发起成立的新进标准组织。Khronos
Group 最成功的标准是 OpenGL ES。OpenGL ES
针对内存紧张系统定义了一套非常有用的 OpenGL 子集。它还定义了
EGL,一套平台无关的 OpenGL GLX/agl/wgl API 等价物。"EGL
提供机制创建可供诸如 OpenGL ES 和 OpenVG 这样的客户端 API
在其上绘制的渲染图面,为客户端 API 创建图形上下文,并同步 Client API
的绘制行为,让它和原生平台渲染 API 一般无二。这允许无缝地同时运用 OpenGL
ES 和 OpenVG 做高性能的、加速的、混合 2D 和 3D 的渲染动作12。"

EGL 假设了由操作系统的其它部分提供的窗口系统的存在性。但是 EGL
的设计是平台无关的,不象 GLX/agl/wgl,EGL API
中没有什么是局限于某个窗口系统的。所有引用到本地窗口系统的地方都由屏蔽指针来处理。

Mesa 开发者已经合计出了一些提议来扩展 EGL,以便一套窗口化系统能够实现于
EGL 之上。该扩展的核心提供了一套 API
来列举可用的屏幕,设置屏幕的模式和帧缓冲配置,摇动屏幕,以及查询属性。两个领域,硬件光标和色彩映射,仍然需要
EGL 扩展加以解决。向 EGL 添加这些扩展提供了足够的硬件控制来实现一套 Xegl
这样的服务器和窗口化系统。OpenGL 加上 EGL 和 Mesa 扩展提供一套真正可移植的
API 来访问多种形式的图形硬件,范围从当前的蜂窝电话到 Playstation 3 到 PC
到图像超级计算机13。

扩展后的 EGL API 能够很好地和 Linux
匹配。它提供了一个坚实的基础来构造窗口化系统或嵌入式应用。易于使用,这使它成为研发和体验版的有趣平台。它令你集中精力到你的新应用或窗口系统,忘记所有那些和硬件打交道的复杂性。

我相信 Khronos Group 是 X.org 和 Linux
图形社区一个重要的未加利用的机遇。大多数 Khronos
标准缺乏开源参考实现、开发系统支持以及一致性测试。Khronos Group
后台中不少在销售给予 Linux 的产品系统。如果 X.org
扩大它的宪章,它能够作为一个中立的非盈利媒介在创建开源参考实现和开发基于
Linux 和 Khronos 标准的系统方面与 Khronos Group
进行接触。这种伙伴关系允许Khronos Group 成员对 X.org 作出慈善捐赠,正如
IBM 对 Eclipse 基金会所做的那样。
完美像素

完全精确到每一个像素其实是个神话。你唯一能提高的只是逼近精确的程度。误差的来源是多方面的。你
LCD
背光的均匀度,打印机墨水的一致性,数模转换的质量,纸张的反光度,颜色匹配问题,GPU
中绘制算法的不同实现,等等。OpenGL
并不保证不同实现之间的像素级精确性。要获得像素级完美性,最接近的方法是在你的每一个输出目标上使用完全相同版本的
Mesa 软件。顺便提一句,X
服务器也不是像素精确的。我的经验法则是如果差异需要用放大镜才能找到那就足够接近了。人们在这一点上往往没搞清楚。如果你丢给
OpenGL
一张位图供显示,它会原封不动地复制那些像素到屏幕上除非你让它改变它们。像素绘制精确性的讨论主要是针对直线这类可缩放的向量。

子像素反锯齿字体(Subpixel antialiased font14)并不是问题,OpenGL
提供了多种显示子像素反锯齿字体的方案。如果你选择那么做的话,OpenGL
也能使用和当前 X
字型显示严格相同的机制。既然机制相同,字型的表现也就相同。锁定到某个特定算法也令人不快,这么做会妨碍前进。例如,这篇论文(视频)探索了一种在
GPU
上生成字体的全新方法15。这里还有另一篇让人感兴趣的论文,"使用可编程图形硬件做解析度无关的曲线渲染,Loop
和 Blinn",发表于 SIGGRAPH
2005。如果字体绘制拘泥于像素级完美精度,也许就不可能应用这些新技术。这些字型由
GPU
生成,使用了硬件内建的算法,无法被用户调整。转换轮廓字型到像素然后作为混合的图像加以渲染只是显示字型的一条途径。可编程
GPU 则提供了新的替代手段。任何眼光长远的 API 都需要把这一点考虑在内。
三代同窗

在当前的 X 服务器和许多别的窗口化系统中,窗口是用 painter's algorithm
绘制到屏幕上的剪裁多边形里。 painter's algorithm
用和真实绘画一样的方式工作 –
每一个后来的层都覆盖前一层。你先绘制背景,然后以反向 Z
序绘制每个窗口。如果不存在透明并且你清楚所有窗口的来龙去脉,你可通过剪裁长方形优化此算法(正如
X
所做的),使屏幕中的每个像素仅绘制一次。性能还可通过追踪破损来提升。仅仅破损区域的窗口需要重绘,屏幕的其余部分被剪裁多边形保护起来。更进一步的收益可由"背景保存"获得。窗口化系统意识到部分组件如弹出菜单在失效时向屏幕上重绘相同的内容。"背景保存"保存了这些弹出窗口下的屏幕并在完成后替代它。

合成机制利用了近期硬件性能增进的优势。通过合成,窗口能够离屏绘制到不可见的那部分显存上。窗口管理器随即将窗口与屏幕的可见部分合成到一起。合成仍然使用
painter's
algorithm,不过既然窗口管理器总是拥有所有窗口内容,就有可能实现透明窗口。透明通过在复制到输出缓冲区时混合窗口在屏幕上的内容与前一个窗口的内容来实现。这称作
alpha 混合(alpha
blending)。大多数现代硬件支持它。绘制闪烁也通过双缓冲得以消除。在此模型下,一切仍然是
2D 并有简单的 Z 序。

高端多纹理硬件能够防止一味使用 painter's
algorithm。每个处于屏幕上关注区域的窗口将被视为独立的纹理。你绘制多边形到屏幕上以再现窗口。对每个窗口/纹理,这些多边形在顶点上都具有适当的纹理坐标,由此纹理合并器硬件会合并所有窗口/纹理并生成期望的结果。在极端情况下,整个屏幕通过渲染单个多纹理矩形来重绘!这项技术超快,既然闪烁最小化了,你可能甚至无须双缓冲。多纹理化的完整桌面可能还在今天的硬件的能力之外,但这是一个随着每一代硬件正快速提升的领域。

Xgl 实现了合成模型。虽然并非必须,Xgl 会运用一项新的 OpenGL
特性,帧缓冲对象 (framebuffer object)。通过 OpenGL 的一项扩展,FBO
允许窗口管理器治下离屏应用程序窗口的非常有效的共享。这项扩展并不那么困难,毕竟我们已经跨进程共享了
pbuffer。对于应用程序,FBO
看起来好象普通的可绘制窗口。对于窗口管理器,窗口看起来就象纹理,可以通过多纹理这样普通的绘制命令来操纵。在这个模型下,应用程序窗口仍然是
2D,但现在编写 Luminosity 这样基于 OpenGL 地窗口管理器成为可能。基于
OpenGL 的窗口管理器能使用 Z 缓冲合并窗口,并跳出严苛的 2D Z
序限制。例如,一个窗口能够变换成波状,并反复和另一个窗口相交。

最终你能够打破应用程序窗口的 2D 限制,赋予它们厚度或别的 3D
性状。比方说,弹出窗口其实可以弹出在较高的 3D
坐标处。当你将它与光源组合使用,自然形成的下拉阴影即可取 2D
下的人工构造而代之。绘制漂亮的阴影是复杂的,然而借助 OpenGL
的能力,任务变得容易许多。Sun 的项目 Looking Glass
就是这种类型的窗口管理器。在 Looking Glass 的 demo
视频中演示了窗口厚度。Looking Glass 使用一个 rootless 的 X
服务器运行现有的 X 应用。窗口由此具有了厚度,并和 CD changer demo 中的真
3D 应用共存。

3D 桌面的概念并不那么古怪。自从 Windows 1.0
的并列窗口前进到可覆盖窗口时我们已经拥有了3D 桌面—一旦 Z
序被引入,桌面即成为一非透视的 3D 空间16。看看菜单和弹出窗口,3D
概念遍及桌面。实现合成的一个主要理由在于提供下拉阴影,很明显是 3D
空间的一个 2D 再现。甚至按钮这样的控件也通过 2D 仿真被做得象
3D。何不把它们画成 3D 的,让用户控制光源呢?窗口透明显然包含着 3D
概念。我们何不干脆承认桌面是 3D 空间并使用 3D 图形来绘制它呢?
划清界限

这个主题存在一些争论。通往基于 GPU 的桌面的开源转换 Linux
真的只有一个选择- Mesa OpenGL 实现。自然我们能够克隆
DirectX,但谁来编写全部的代码和驱动? OpenGL
是个不坏的选择。无论我们构建什么,它都是 Linux
上必不可少的一项要求。它是标准化的,由 ARB (architecture review
board,体系结构评审委员会)所掌控。它设计精良,文档齐备。它的部署和应用广泛。大学教授有关它的课程,大量关于它的书籍已经写就。很酷的应用程序和游戏在它之上运行。

应该在何种层次上划分图形设备驱动的界线?XAA 和 fbdev
在低层次上划下界线。这些 API 把自己卷入到 framebuffer、bitblit
也许还有直线绘制的众多像素中去。在这一层次上图形芯片提供的任何特性不是根本不可访问就是需要芯片特定的
API 通过转码来访问。 Xgl 实现则以相当不同的方法来划这条线。界线被划在
OpenGL API 自身这样相当高的层次。我确信 Xgl
方案是较佳的选择。为了允许硅芯片在不破坏 API
的前提下演进,你期望以位于当前实现于硅芯片中的特性集之上的方式划分界限。我不相信
Linux 会从 DirectX 那样运行一堆 API
中受益。较好的模型是从真正高的层次出发,提供参考软件实现,即
Mesa,然后用加速的硬件实现,即 DRI,分片替代 Mesa。我们也拥有多个 OpenGL
实现:Mesa、nVidia 和
ATI。使用哪一个取决于你的选择,信不信由你有些人竟喜欢专有驱动。

Xgl 被设计为一项短期过渡方案。Xgl 的模型是用一套基于 OpenGL
作为设备驱动的兼容系统透明地取代现存 X 服务器的绘制系统。Xgl 将全部现存 X
API 作为主要 API 来维护。没有任何新 X API 被引入,也没有任何被废弃。Xgl
是一套高层次的、跨平台的代码库。它是一般化的代码,需要被移植到特定的
OpenGL 环境中。一项移植, Xglx,立足于 GLX API 上。另一项移植,
Xegl,工作在跨平台的 EGL API 上。注意 EGL 是一种表现 GLX、agl 和 wgl API
的平台无关的方法。通过 Mesa 扩展 EGL
能控制低层帧缓冲。该组合提供了在裸显示硬件上实现窗口化系统(类似目前的 X
服务器)所需的一切。然而 XGL是一项短期过渡设计,通过推迟对 XGL 的需求,EXA
牌创可贴很大程度上缓解了对它的需要。

一个被反复提及的争议是,因为所有那些在这个不断发展的世界上仍在使用的老旧硬件,我们不应当使用
OpenGL。对这个问题有两个解。其一,OpenGL 是一套可伸缩的
API。借助软件后备实现它能运行在最低档的硬件上。 OpenGL ES 也提供 API
profile。 Profile 是定义良好的 OpenGL API
子集。如果有必要我们能够定义一套包含可能的最小 OpenGL API 子集的最简
profile。代码尺寸应当不成问题,一个专有的 100KB OpenGL ES
实现已经可用。另一套 OpenGL ES profile
则不要求浮点支持。没有什么能够妨碍开源的对应软件的构建,如果我们选择投入资源的话。

另一个分歧是简单地在软件被设计来使用的硬件上运行它们。没人期望一台原始的
IBM PC 运行 Windows Longhorn,但是同一台 PC 可以毫无问题地继续运行 DOS。

这里的关键之处在于 OpenGL 比 EXA 更具伸缩性。在高端 EXA
的伸缩性不堪一用,它并未包含 3D 和可编程性这样的高级 GPU 特性。透过
OpenGL,就有可能对从蜂窝电话到超级计算机的所有情况都拥有单一 API。
九层之台

你有一堆缩写需要消化。感觉一下这些库是如何协同工作的例子:

App -> gtk+ -> X -> XAA -> hw

这就是当前的 X 服务器。应用程序和 toolkit 对话,toolkit 使用 xlib API 调用
X 服务器。X 服务器利用当前的 XAA 驱动绘制到硬件上。X
和应用程序位于两个不同的进程中。

App -> gtk+ -> Cairo -> X Render -> X -> XAA/EXA -> hw

Toolkit 使用新的 Cairo 库。Cairo 的行为则取决于 X Render。如果 EXA 可用,X
Render 被加速。X 和应用程序位于两个不同的进程中。

App -> qt -> Arthur -> X Render -> X -> XAA/EXA -> hw

Arthur 是 Trolltech 的 Cairo 等价物,很大程度上两者的作用是相同的。

App -> gtk+ -> Cairo -> glitz -> GL -> hw

Toolkit 使用新的 Cairo 库。Cairo 选择 glitz 后端来获得基于 OpenGL
直接渲染。一切都是加速的,鉴于 OpenGL 是直接渲染的,绘制发生在单个进程内。

App -> gtk+ -> Cairo -> X Render -> Xgl -> EGL(standalone) -> GL -> hw

这种情况下,toolkit 为 Cairo 选择 xlib 后端,从而和邻接 X Render 的 Xegl
服务器对话。Xegl 使用 Xegl 提供渲染实现。Glitz 则直接渲染到硬件。Xegl
和应用程序位于两个不同的进程中。注意 toolkit 能够选择直接使用 glitz
并在单个进程内直接渲染。

App -> gtk+ -> Cairo -> X Render -> Xgl -> GLX(X) -> GL -> hw

再一次地,Toolkit 通过 X render 和 Xglx 服务器对话。Xglx
并非独立的服务器,它是一个嵌套服务器。Xglx
也非一个普通的嵌套服务器,它利用嵌套获得输入,但在由父服务器提供的单个
OpenGL窗口内绘制自身的整个桌面。一旦进入全屏,你不再见到父服务器。存在三个进程,应用程序、Xglx
和 X 服务器。绘制在应用程序和 Xglx 之间发生,因为 Xglx
使用直接渲染。既然第三个进程,即 X
服务器,提供窗口和输入服务,它也是重任在肩。它还是 Xglx 程序的宿主。
前路17

Linux 目前成为最迟实现充分利用 GPU 优势的桌面 GUI
的主要桌面。鉴于这个既成事实,不再有任何时间压力,也许应该考虑一项长远的方案。我们能够围绕
OpenGL 和 Cairo 设计一个新的服务器。

一般而言,整个可编程图形硬件的概念并未在 xlib 和 Cairo 这样的 API
当中触及。这是非常重要的一点。一项主要的 GPU
新特性,即可编程性,简单地无法从当前的 X API 中访问。 OpenGL 通过它的
shader 语言提供这种可编程性。

当考虑新服务器的时候,理所当然将概念设计分解为两个组件:平台相关与平台无关。设备驱动属于平台相关部分,拟议中的模型里
OpenGL 被看作设备驱动,所以会有平台相关的实现。所有同其它 Linux
子系统整合的细节问题都会隐藏在特定的驱动之后。主服务器将使用跨平台
API,诸如 sockets、OpenGL 和 EGL,来实现。一套用于热拔插设备的跨平台 API
也需要规范。此服务器无须从头设计,其实质部分能够重用来自其它项目的代码,只是要合并到新路子上来。依我之见,构建一个新服务器所需代码的百分之九十五甚至更多已经有了。

模块化是构建优秀服务器的关键之处。设计应当分解为通过标准化接口沟通的独立库。这样分解让替代某个库变得容易。你可以在不同的平台上采用不同的库实现,或者在单个平台上以不同的方式实现库。自然,跨平台代码有它的优点。Mesa
库这类材料能在所有目标系统上共享。

还记得 DirectFB 是如何使用 rootless X 的吗?新服务器将通过运行软件渲染的
rootless X 来保持与遗留系统的兼容。 DRI
的直接渲染模型是良好的设计,在未来的服务器上应予保留。将 X
转为遗留状态允许在设计新服务器时获得完全的自由。

比方说,新服务器能够设计一个全新的网络协议。最近 Linux Journal 上关于 No
Machine 和 NX 协议的文章表明 X 协议能够被压缩至 200:1
甚至更多。新协议将是基于 OpenGL
的,并被设计来防止双程延迟以及提供持久图像缓存。 Chromium
是一套有吸引力的系统,支持将 OpenGL
显示分解到通过网络连接的多个显示器上。他们的网络库处理 OpenGL
状态追踪,作为防止网络流量的一种手段。

字型缓存也应当加以分析。在目前的 X
服务器中,客户端生成字型位图,然后将它们发送到服务器,在那里它们被缓存起来。这个模型排除了早先引用的论文中讨论的利用
GPU
生成字型的方法。客户端字体是好的想法。应用程序理所当然应当负责布局。但是并无实际的要求由客户端生成字型位图。

新服务器能够解决当前在网络音频和打印方面的不足。它能够支持重连会话所需要的适当的代理行为。它也应当明确地从一开始就设计为支持多用户。

事件处理是用库构建系统的良好范例。 Linux 有 evdev、kernel hotplug、HAL 和
D-BUS。这些子系统在大多数其它平台上并不存在。因此,为 BSD
设计的输入子系统看起来会和为 Linux
设计的相当不同。将主要的子系统模块化让它们能够被定制和充分利用它们运行的平台环境。比起针对不同环境的最小公分母来设计,这是一种不同的途径。

X 为世界各地的众多情报机构使用。当前的 X
服务器被认为还没有足够安全到可用于处理敏感文档。如果主要的设计工作开始进行,它能够从根基上就特别留意安全性。适当的投入会持续以确保正确的特性被实现。

长话短说,有很多工作需要完成,最近的开发已经开始解决这些问题。第一位的是
DRM 的内存管理器和打开 DRI 驱动中
FBO(帧缓冲对象)所需要的改写。第二位的是清理现有 fbdev
驱动,使它能与已有DRM
驱动的硬件协调工作。随着奠基工作的就绪,全新服务器的设计工作就可以着手进行了。
结语

我从 Xegl
的失败获得的经验告诉我,构建一个图形子系统是一项大而复杂的工作,其规模远超过一两个人所能承担的。作为一个整体,X.org
社区仅仅具有足够的资源创建单个服务器。将这些资源分配到不同的方向上只会导致一堆半途而废的项目。我理解开发者比较愿意为那些引起他们兴趣的东西工作,但是鉴于
X.org
拥有的资源,这种做法不会在近期孕育出新的服务器甚或基于旧服务器然而富有竞争力的桌面。也许
X.org 是时候释出一份路线图供所有人追随了18。

Jon Smirl

于 2005 年 8 月 30 日

授权可自由地翻译和再发布19。

0 以下的注解都是译者另加,主要目的是提供一点背景和 Linux
图形方面的进展供读者参考。首份译文完成于 2006 年 7 月 7 日,是 gogoliu
发起的《Modern X Tech. 中文翻译计划 》项目的一部分,这是 2006 年 8 月 4
日修正版,都是极细微的修正,读过的可略过。另外我花了点时间看了下 html 和
xhtml,现在的 html 和 xhtml 格式都是我手工编写的了,效果应该比
OpenOffice.org 2 生成的为佳,尺寸也小些。对译文的指教,可联络 mopz0506
[AT] gmail [DOT] com,标题请务必包含"The State of Linux Graphics"
字样。永远怀念在八年抗日战争中牺牲的国共两党将士们。

1 原文(http://jonsmirl.googlepages.com/graphics.html)发布于 2005 年 8 月
30 日,所以基本上是一年前的现状。

2 但是随着 Internet 的增大,对人们获取知识和真相的恐惧也增大了。

3 和 Jon Smirl 不同,其实 K.P. 作为 XFree86 的叛逆者,对一切 3D
化的倾向,反应并不是很积极的。 K.P. 说过,95% 的时间都是在跑
2D。译者就无所谓了,反正 95% 的时间都在跑控制台和 ncursor :)

4 X11R7.0 已于 2005 年 12 月 21 日由 X.Org 正式发布。 X11R7.1 已于 2006 年
5 月 22 日由 X.Org 正式发布。这是第一个享受模块化带来的益处的 roll-up
发布。

5 Porter-Duff 操作是 1 组 12 项用于描述数字图像合成的基本手法,包括
Clear、Source Only、Destination Only、Source Over、Source In、Source
Out、Source Atop、Destination Over、Destination In、Destination
Out、Destination Atop、XOR。通过组合使用 Porter-Duff 操作,可完成任意 2D
图像的合成。这里有 Thomas Porter 和 Tom Duff 发表于 1984
年原始论文的扫描版本 http://keithp.com/~keithp/porterduff/p253-porter.pdf

6 Cairo 1.2 已于 2006 年 7 月 1 日正式发布。另外,最近 Cairo 项目在 google
上搜索 Cairo 关键词时的排名已超过埃及城市 Cairo,稳居第一。

7
机构这个词很少在计算机方面的文章中出现。其实机构是一个很有内涵的词,也是机械方面的一种专门学问。我不喜欢架构这个词,因为架字让我感到隐含有草率的意味。我更喜欢体系结构这个说法。其实国内大概最早关于
architecture 的一本书(98年?99年?),《Software Architecture: Perspectives
on an Emerging Discipline》
影印版,印象中书名就是译成《软件体系结构》的。可惜不小心遗失了。

8 Mesa 就是作者忘了说的那个"再次"。

9 kernel OOPS 中的 OOPS 并不是某个缩写,来自英语中常说的
Oops,相当于汉语中哎呀呀,坏乐这类意思,随着时间逐步演进为特定场景下的专有名词。内核源代码的
Documents 目录下有一篇 oops-tracking.txt 文档。《Linux Kernel
Development》第18章 Debugging 有一节专门介绍 oops 的,可参考。

10 这让我回想起很久以前读过的一本描述 DEC 公司一群年轻工程师设计 PDP
小型机的故事的书,当中有个非常好的比喻,说某个改进方案是瘤子上又长瘤子。书名大概是《The
soul of a new machine》。

11 根据 opengl.org 在 The OpenGL Pipeline Newsletter
第一期(估计也是最后一期)中的官方说法,OpenGL ARB 将并入 Khronos
组织,OpenGL 也将随之和 OpenGL ES
成为同门,甚至再次融合也不是没有可能的。让我们期待此举为沉寂已久的 OpenGL
带来更多活力。

12 这段引文是来自 http://www.khronos.org/ 描述 EGL 的一段话。

13 graphics supercomputers 一般指比较强的可视化工作站,SGI 那种类型的。

14 LCD 上 RGB
三色其实是靠得很近的三个点,所谓子像素反锯齿字体就是利用这个特性增强 LCD
显示效果的一种手段。

15 论文中述及的方法已经在XGL中实现了。

16 这是说,此3D空间的对象并不具备透视关系,比如距离近点看起来大点什么的。

17 在那崎岖崎岖里看阳光......

18 很想译为:噫!树一帜而天下影从,此其时也!

19
译完了,似乎懂了一些,其实没有懂。一篇文章想要译得神完气足,实在需要不菲的心力。以我的理解,作者对
Linux
图形的现状显然是失望的,我无法译出这种味道来。感到非常对不起作者,可是没办法。

原文地址 http://mxtctp.googlepages.com/GraphicsCN.html

Linux的X窗口系统结构说明

一、说明
以X Server为中心,简要地分为四层,如图所示


二、X方式与Framebuffer方式的差异

1. X方式

1) 什么是X
我们常说的X Window,X,X11(指X协议的11版本)一般指X协议,或指是基于X协议的X服务端程序(X Server)

2) X Server与X Client

a) X协议指X Server及X Client组成的c/s架构,及其通讯协议的实现

b) X Server有主事件循环,由它来处理用户输入、显示及与X Client通讯

c) X Client即X桌面上运行的普通应用程序
应用程序如果想显示数据,需要利用X Lib库建立X窗口(X Client),它通过X协议与X Server通讯,让X Server完成显示;X Server会把接到键盘鼠标事件,传给焦点所在的X Client处理

2. Framebuffer方式
Framebuffer方式相对简单,它由内核直接支持,通常用于嵌入式系统。应用程序可以得到屏幕显示区域的指针,然后对其写数据来进行显示,其中窗口的概念不强,它自身不带窗口管理,需要应用软件自己管理窗口。比如qtopia基本于framebuffer显示时,qtopia自身实现了窗口管理功能

3. 应用程序的显示方式
很多应用程序同时支持X和Framebuffer两种模式显示,如gtk,qt等,以下我们只讨论它基本于X实现的部分

三、分层

1. 应用层(Application)
指X Window上运行所有带图形界面的应用程序,每个窗口都是一个X Client

1) X Lib app
直接使用X函数的应用程序,这种程序一般界面简单,比较底层,比如很多窗口管理器直接写在这层

2) Gtk app
gtk又分为gtk和gdk两层,
gtk为控件及主循环的实现
gdk相对底层,控制底层绘图部分,它支持framebuffer、X11、DirectFb等
应用程序可调用gtk函数,也可直接调用gdk函数
gtk常和cairo一起实现二维特效

3) Qt app
Qt也通过调用X Lib实现图形界面
Qt的优势在于它是C++实现的,使用起来程序结构更好,也有较成熟的嵌入式版本

4) SDL app
SDL也通过调用X Lib实现图形界面
SDL更底层,代码少,没有控件,但做特殊效果很好用

2. 窗口管理器层(Window manager简称wm)
Window manager是特殊的X Client,也通过X Lib库与X Server交互,与一般应用不同的是:它负责控制各个窗口的动作,及操作主窗口
WM的功能分为管理(manager)和工具(tools),

1) Manager
负责各个窗口的建立销毁/显示隐藏/最大最小化/移动缩放,管理窗口队列,设置焦点窗口,窗口切换效果等

2) Tools
实现桌面工具条,桌面菜单等基本界面及小工具

3) 具体实现
实现通常有两种方式:一种是manager和tools在一个程序中实现,一种是分开两个程序实现,使用时可以随意组合

a) qvwm, blackbox等较早期的wm,都是manager和tools在一个程序中实现的

b)
xfce、metacity等是分开的,例如:xfce包含tools和manager,但不在一个程序中实现,它的manager是xfwm,我们可在使用xfce时把xfwm替成metacity(metacity是一个manager,不带tools)

3. X服务器层(X Server)
主循环控制显示,读取设备数据,与X Client通讯,事件循环,并把事件送给焦点窗口

1) 普通X Server
功能完整的X Server,代码量大,支持全,常见的如XFree86,Xorg等

2) Tiny X Server
一般用于嵌入式系统,资源占用小,代码少,功能及逻辑相对简单,如KDrive(Xvesa/Xchips/Xfbdev/Xi810……)

4. 系统底层(System)

1) Kernel
与硬件交互,获得输入设备的数据,向显示设备输出

2) Dev
文件系统中的设备文件,程序通过对它的读写和操作与kernel交互,控制硬件

3) 中间层
在程序和Dev层之间,有时还需要库或程序处理设备数据,比如触摸屏就使用libts去除噪点,过滤出更有效的数据

Linux 服务的介绍

服务列表(按字母顺序排列)


服务名 必需(是/否) 用途描述

acon 否 语言支持
acpi 否 电源管理
acpid 否 监听精灵进程
adsl 否 内部ADSL开关控制
alsa 否 高级Linux声音构件
anacron 否 周期命令调度程序
apmd 否 电源管理
apmiser 否 电源管理
arpwatch 否 以太网IP地址配对监控器
atd 否 周期命令调度程序
autofs 否 自动安装服务
bluetooth 否 蓝牙技术核心
bootparamd 否 导入服务
canna 否 日语转换引擎
capi4linux 否 基本CAPI子系统
cpqarrayd 否 硬件服务
cpufreq 否 硬件服务
cpufreqd 否 硬件服务
crond 是 周期命令调度程序
Cups-lpd 否 使旧式Lunux或商业Unix系统连接到打印主机上.
cups 是 公共Unix打印系统
cvs 否 并发版本系统
devfsd 否 系统维护
dhcpd 否 DHCP服务器
diald 否 拨号网络智能自动拨号器
dkms 否 DKMS自安装导入
dm 是 显示管理器
dnbc 否 数字网络绑定Chrooter
Drakxtools-http 否 小型服务管理服务器
dund 否 蓝牙拨号网络
fam 否 文件系统变更监控器
finger 否 数据远程访问
freshclam 是 ClamAV更新器
gpm 是 鼠标
haldaemon 否 硬件监控系统
harddrake 否 硬件服务
heartbeat 否 高可用性服务
hidd 否 蓝牙H.I.D.服务器
hplip 否 惠普Linux打印与成像
hpoj 否 Pital?init,惠普办公喷墨打印机驱动器
httpd 否 Apache网络服务器
hylafax?server 否 企业传真机?调制调解器服务
ibod 否 按需ISDN MPPP带宽
identd 否 TCP连接鉴定
imaps 否 安全IMAP服务器
imaps 否 IMAP服务器
iplog 否 用主机名或远程主机记录TCP,UDP,ICMP.
ipop2 否 POP2邮件服务器
ipop3 否 POP3邮件服务器
ipsec 否 加密与验证通信
iptables 是 基于Packet过滤防火墙内核
ipvsadmin 否 Linux核心IP虚拟服务器
irda 否 红外线设备界面
keytable 是 键盘映射
kheader 否 导入服务
lads 否 登录异常探测系统
laptop mode 否 电源管理
leafnode 否 X? INETD NNTP服务
lisa 否 局域网信息服务器
lmsensors 否 硬件健康监控器
mailman 否 GUN邮件列表管理器
mandi 否 交互式防火墙
mdadm 否 软阵列监控服务
mdnsresponder 否 零配置DNS配置工具
messagebus 是 事件监控服务
mon 是 系统监控精灵进程
mysqld 否 MySQL服务器
named 否 绑定(BIND)服务器
netplugd 否 网卡精灵进程
network 是 网络
nfs 否 网络文件共享
nfsfs 否 网络文件共享服务器
nfslock 否 NFS文件锁定
nifd 否 Howl 客户端
nscd 否 密码与群查找服务
ntpd 否 NTP服务器的第4版
numlock 否 数字锁定键灯光控制
Oki4daemon 否 OKI4和兼容win打印机的兼容性精灵进程
pand 否 蓝牙个人区域网络
partmon 是 分区监控
pcmcia 否 个人电脑内存卡国际协会
pg_autovacum 否 PostgreSQL维护
pop3s 否 安全POP3服务
portmap 否 RPC支持
postgresql 否 Postgresql数据库引擎
postfix 否 电子邮件服务器
pptp 否 PPP断电服务
prelude 否 IDS
psacct 否 进程计算
rawdevices 是 分配raw设备,阻止其使用
rsync 否 远程同步
saned 否 网络扫描仪
shorwall 是 防火墙
smartd 否 自我监控服务
smb 否 Samba网络服务
snmpd 否 简单的网络管理协议
sound 否 声音系统
squid 否 高速缓存工具
ssh?xinetd 否 X?inetd OpenSSH服务器
sshd 否 OpenSSH服务器
subversion 否 并发版本系统
swat 否 Samba网络管理工具
syslog 是 系统登录
tmdns 否 多点传送DNS响应器
ultrabayed 否 ThinkPad工具
upsd 否 NUT精灵进程及驱动器
upsmon 否 UPS监控工具
vncserver 否 虚拟网络计算服务器
Webmin 否 远程管理工具
winbind 否 Samba名称服务器
wine 否 Wine并非竞争者
wlan 否 控制精灵进程
x?inetd 是 监控并控制其它服务器的服务器
xfs 是 X字体服务器
ypbind 否 SUN的YP服务器名称服务器

新“诗词填句”

年轻的女老师,在批改学生们的试卷时,被雷翻了!

1."床前明月光",下一句同学填"李白睡的香"…
2."三个臭皮匠"下一句他竟然填"臭味都一样"…批卷老师立即昏倒…
3.陶渊明的"不为五斗米折腰",那同学斗胆的写"给我六斗就可以"…
4."穷则独善其身",下一句同学填"富则妻妾成群"。
5."西塞山前白鹭飞",下一句"东村河边乌龟爬"?
6."天若有情天亦老",下一句"人若有情死的早"?
7."葡萄美酒夜光杯",下一句"金钱美女一大堆"…
8."想当年,金戈铁马",下一句"看今朝,死缠烂打"…
9.这个才过瘾!"洛阳亲友如相问",同学对"请你不要告诉他"…
10."两情若是长久时",同学对"该是两人结婚时"
11."书到用时方恨少",同学对"钱到月底不够花"…
12."清水出芙蓉",有人写"乱世出英雄"…
13."问君能有几多愁",同学填"恰似一壶二锅头"。
14.这个绝了!"日照香炉生紫烟,李白来到洗手间,小李飞刀一瞬间,李白变成小太监"…

2009年5月26日星期二

LCD刷新频率对系统性能影响

在ARM体系结构中:
在ARM体系结构中,GPU是不带自身的显存,而往往是在系统的RAM中预留一块留给GPU做为显存。这样的结果就是GPU对于显存操作时,要走AHB总线,LCD周期性从Frame
buffer中刷新也要走AHB总线。这样就会造成AHB总线的繁忙,从而造成性能的瓶颈。
以AHB总线频率为133Mhz,采用SDRAM内存,屏幕分辨率为800*600,32位色。
先说明一点,LCD从SDRAM中获取屏幕数据,是通过DMA的方式,其存储效率很高。
先来计算SDRAM的内存吞吐率,SDRAM的频率和AHB总线频率保持一致为133Mhz,按照数据总线宽度为32位,那么SDRAM的理论吞吐率为133*4=512MB/s。

LCD一帧的数据量:800*600*4=1,920,000。
那么LCD通过AHB总线传输一帧所花费的时间为1.92M/512M=3.75ms。
如果按照LCD刷新频率为60hz,那么AHB总线在一秒内光花在LCD刷新屏幕的时间就为3.75*60=225ms,可以说1/5的时间就没了。

在PC体系架构中:

在PC架构上,GPU自身是带显存的,这是和ARM架构中最重要的区别。这样LCD在刷新屏幕内容时,可以直接和GPU相连,而不必内部总线。这样LCD的刷新频率对于内部总线没有影响。

针对ARM平台下,LCD刷新频率的优化。
1、 减少每一帧的数据量:减小屏幕的分辨率、降低每像素的位数。
2、 减小LCD的刷新频率,对于LCD来讲没有必要做到60hz。
3、
如果LCD支持异步局部刷新的话,这样其能够只是刷新变化的内容,会减少总线数据传输量。
4、采用更加高速的内存,比如说DDR,或者提高AHB总线的频率。

一个研究生毕业以后的人生规划

我今年39岁了,
25岁研究生毕业,工作14年,回头看看,应该说走了不少的弯路,有一些经验和教训。现在开一个小公司,赚的钱刚够养家糊口的。看看这些刚毕业的学生,对前景也很迷茫,想抛砖引玉,谈谈自己的看法,局限于理工科的学生,我对文科的不懂,身边的朋友也没有这一类型的。
91年研究生毕业,那时出路就是1种:留在北京的国营单位,搞一个北京户口,这是最
好的选择。到后来的2~3年内,户口落定了,又分成4条出路:
1、 上国内的大企业,如:华为
2、 自己做公司,做产品开发;
3、 上外企,比如:爱立信、诺基亚
4、 自己做公司,做买卖;
5、 移民加拿大
我想,首先要看自己适合做什么?做技术还是做买卖。
做技术,需要你对技术感兴趣。我掰着数了一遍,我们研究生班的30来号人,实际上,适合做技术的,大概只有3、4个人,这几个人,1个现在还在华为,3个移民加拿大了,现在这4个人混的还可以,在华为的同学也移民加拿大了,他在华为呆了6年,在华为奖金工资加起来大概30万吧,还有华为的股票,再过几年,华为的股票一上市,也能值个100~200万。要是一毕业就去华为,那现在就绝对不是这个数字了。
要是做技术,最好的就是上大公司,国内的大型企业,象华为中兴肯定是首选,能学到很多东西。华为虽然累,但是,年轻人不能怕累,要是到老了,还需要去打拼,那才是
真的累啊。

在外企,我想他们主要就是技术支持和销售,但是技术是学不到的,当然不能一概而论,我指的是象爱立信和诺基亚,真正的研发不会在中国做的,学到的也不如在华为多,其它的中兴我不是很了解,我想应该也不错啊。一个人都有一技之长,有傍身之技,那是最好的,走到哪里,都能有一口饭吃,还吃的不错,这是传统的观点。

任何技术都是要在某个行业去应用,这个行业市场越大当然越好;要在一个领域之内,做深做精,成为绝对的专家,这是走技术道路的人的选择。不要跳来跳去,在中国,再小的行业你要做精深了,都可以产生很大的利润。
研究生刚毕业的时候,做产品开发的有不少人,都是自己拍拍脑子,觉得这个产品有市场,就自己出来做。现在看来,我的这些同学,做产品开发的成功的没有一例,为什么?资源不足。
1.
资金,刚毕业的学生啊,就是没钱;没钱,也意味着你开发的东西都是小产品;而且只能哥几个自己上,研发、生产、销售都是一个人或者几个人自己来,没有积累,什么都是重新来过。
2.
人脉,任何一个行业,要想进去,需要有很深的人脉,否则,谁会用你的东西啊
?谁敢用你的东西啊?
我看到的,我这个班上开发产品的,自己还在坚持的,只剩下一个人了,说实在的,
到现在,没有自己的汽车,也没有自己的房子,混的挺惨的。现在出国的不说了,在外企、在华为,至少都是几十万的年薪了,还有各种福利,就是产品开发成功了,又能如何?
也就是这样了,但是以前那些年,都没有金钱的积累,等于白干。
我身边的一个自动化系的研究生班的同学,能靠自己开发产品活得还可以的,也只有2个人。说明这条路不是那么好走的啊。
其次就是上外企。我的2个同学,一个上了爱立信,一个先到爱立信后到诺基亚,都混的不错。到诺基亚的后来利用在诺基亚结识的人脉(就是哪些电信的头头脑脑),自己开了公司,也赚了不少的钱。
外企最大的好处就是除了能学到比较规范的管理外,还能给你的职业生涯镀金。到了一个外企外,再到同行业的外企我想就很容易了。而且外企的收入高啊。
自己做公司,做买卖,一开始有3~4个人走这条路,但是真正发财的只有一个人,其他人后来上外企了。做买卖,还是要有一定的天赋,还有机遇。要有对金钱的赤裸裸的欲望,要有商业上的头脑。后来我们同学在一起谈,说,我们即使给自己这个机遇,也未必能做的好。何况当时那个同学看好的产品(做一个台湾产品的代理),我们大家都没有看好,说明,真理还是掌握在少数人手里。到后来,同学们纷纷移民移民加拿大。
移民加拿大对搞技术的人来说,还是一个不错的选择,但是要尽早,练了几年的技术,就赶紧出去,大概是在1996年走了不到10个,现在都还可以,买了房子和车了。要是晚
了,语言再学也难了,而且在国内都混的还可以了,也就没有必要出去了。
我自己呢,先是在国营的研究所混了4年,后来到一家公司干了6年,2002年出来自己做公司,现在也就是混了一个温饱吧,算是有房有车,有点积蓄,但是不多,还有一个可爱的女儿。回首这10来年,有一些经验和教训。
1.
要有一个职业生涯的规划。首先需要定位自己做什么合适,是做买卖还是做技术,一条路走到黑;当然,做了技术,后来改行也行;
2.
做技术,就是要做精做深,成为这个行业的这个技术的专家;最好就是去国内的大公司,才能全面学到东西,能够给你培训的机会;如果大公司进不去,先到小公司练技
术,找机会再到大公司去镀金,学高深的技术。千万不要自己做产品,要做也是对这个行业熟悉了,再去做。
3 .
积极争取机会。积极争取学习和进步的机会。比如,做技术,就需要多锻炼,多学习,来提高自己的水平。一门技术,只要有机会去学习,都能学的会;要是没有机会,天才也没有办法学到这个技术。柳传志就说,杨元庆就是"哭着喊着要进步",实际上,就是争取自己的机会;当然,这种强烈的进步欲望,也是领导看重的地方。每一步都走在前面,积累10年,你就有了比其他人更多的机会了。
4.
积累个人的信誉。从你的职业生涯的第一天,就要按照诚信的原则办事。要做到,当人们提起你的名字的时候,说,这哥们还不错,做事还行。
5.
注意利用资源。如果你有有钱的亲戚、成功的长辈或者朋友,可以充分利用这些机会,得到更加顺利的发展前景。
6.
注意财富的不断积累。人生要想得到自由,财富是很关键的。否则,永远仰人鼻息,永远看人脸色。人都是势利眼。今后的家庭、职业生涯,金钱的积累很重要,没有钱,永远不能开张自己的事业,得到更多的机会;财富要做到逐年积累,你才能家庭生活幸福。没有钱是不可能有幸福的家庭的。
7.
注意人脉的积累。最终,事业要靠在社会上的人脉的资源。要注意认识在你这个行业的人,结交他们,最终他们会成为你事业上的助力。
8.
寻求贵人相助。要找大老板来帮助你,得到大老板的赏识。想想看,大蛋糕,切一点就够了,小蛋糕,都给你也吃不饱啊。
9.
多听听成功的前辈和成功的朋友的意见。注意少听家里长辈的意见,尤其是都已经退休的长辈,他们对社会的认识还停留在很久以前,而这个社会已经发生很大的变化呢

最重要的是,长辈有时候会强求你做一些事情,但是,最终的结果他们是不负责的。

上拉电阻下拉电阻的总结

上拉电阻:
1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。
2、OC门电路必须加上拉电阻,才能使用。
3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。
4、在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗,提供泄荷通路。
5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。
6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。
7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。
上拉电阻阻值的选择原则包括:
1、从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。
2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
3、对于高速电路,过大的上拉电阻可能边沿变平缓。综合考虑
以上三点,通常在1k到10k之间选取。对下拉电阻也有类似道理
对上拉电阻和下拉电阻的选择应结合开关管特性和下级电路的输入特性进行设定,主要需要考虑以下几个因素:
1.
驱动能力与功耗的平衡。以上拉电阻为例,一般地说,上拉电阻越小,驱动能力越强,但功耗越大,设计是应注意两者之间的均衡。
2.
下级电路的驱动需求。同样以上拉电阻为例,当输出高电平时,开关管断开,上拉电阻应适当选择以能够向下级电路提供足够的电流。
3.
高低电平的设定。不同电路的高低电平的门槛电平会有不同,电阻应适当设定以确保能输出正确的电平。以上拉电阻为例,当输出低电平时,开关管导通,上拉电阻和开关管导通电阻分压值应确保在零电平门槛之下。
4.
频率特性。以上拉电阻为例,上拉电阻和开关管漏源级之间的电容和下级电路之间的输入电容会形成RC延迟,电阻越大,延迟越大。上拉电阻的设定应考虑电路在这方面的需求。
下拉电阻的设定的原则和上拉电阻是一样的。
OC门输出高电平时是一个高阻态,其上拉电流要由上拉电阻来提供,设输入端每端口不大于100uA,设输出口驱动电流约500uA,标准工作电压是5V,输入口的高低电平门限为0.8V(低于此值为低电平);2V(高电平门限值)。
选上拉电阻时:
500uA x 8.4K=
4.2即选大于8.4K时输出端能下拉至0.8V以下,此为最小阻值,再小就拉不下来了。如果输出口驱动电流较大,则阻值可减小,保证下拉时能低于0.8V即可。
当输出高电平时,忽略管子的漏电流,两输入口需200uA
200uA
x15K=3V即上拉电阻压降为3V,输出口可达到2V,此阻值为最大阻值,再大就拉不到2V了。选10K可用。COMS门的可参考74HC系列
设计时管子的漏电流不可忽略,IO口实际电流在不同电平下也是不同的,上述仅仅是原理,一句话概括为:输出高电平时要喂饱后面的输入口,输出低电平不要把输出口喂撑了(否则多余的电流喂给了级联的输入口,高于低电平门限值就不可靠了)

在数字电路中不用的输入脚都要接固定电平,通过1k电阻接高电平或接地。
1. 电阻作用:
l 接电组就是为了防止输入端悬空
l 减弱外部电流对芯片产生的干扰
l 保护cmos内的保护二极管,一般电流不大于10mA
l 上拉和下拉、限流
l 1. 改变电平的电位,常用在TTL-CMOS匹配
2. 在引脚悬空时有确定的状态
3.增加高电平输出时的驱动能力。
4、为OC门提供电流
l
那要看输出口驱动的是什么器件,如果该器件需要高电压的话,而输出口的输出电压又不够,就需要加上拉电阻。
l
如果有上拉电阻那它的端口在默认值为高电平你要控制它必须用低电平才能控制如三态门电路三极管的集电极,或二极管正极去控制把上拉电阻的电流拉下来成为低电平。反之,
l
尤其用在接口电路中,为了得到确定的电平,一般采用这种方法,以保证正确的电路状态,以免发生意外,比如,在电机控制中,逆变桥上下桥臂不能直通,如果它们都用同一个单片机来驱动,必须设置初始状态.防止直通!

2、定义:
l
上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!下拉同理!
l 上拉是对器件注入电流,下拉是输出电流
l 弱强只是上拉电阻的阻值不同,没有什么严格区分
l
对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。

3、为什么要使用拉电阻:
l
一般作单键触发使用时,如果IC本身没有内接电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在IC外部另接一电阻。
l
数字电路有三种状态:高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使处于稳定状态,具体视设计要求而定!
l
一般说的是I/O端口,有的可以设置,有的不可以设置,有的是内置,有的是需要外接,I/O端口的输出类似与一个三极管的C,当C接通过一个电阻和电源连接在一起的时候,该电阻成为上C拉电阻,也就是说,如果该端口正常时为高电平,C通过一个电阻和地连接在一起的时候,该电阻称为下拉电阻,使该端口平时为低电平,作用吗:
比如:当一个接有上拉电阻的端口设为输如状态时,他的常态就为高电平,用于检测低电平的输入。
l
上拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流,下拉电阻是用来吸收电流的,也就是所谓的灌电流。

如何把道理讲清楚的同时又不令人厌烦

倒不是我们每个人都"好为人师",而是生活经常迫使我们必须把道理说清楚。然而,把道理说清楚不仅不容易,并且还往往面临着风险,很可能被认为在"说教"、"虚伪"、"站着说话不嫌腰疼"……如何把道理讲清楚的同时有不令人生厌呢?很难,但起码有些可以参照的原则。

1. 只讲自己真正相信的道理
有些人整天讲一些自己都不相信的话,希望别人相信――李敖先生把这种人称为"放屁狗"。他们这么做的成功概率事实上并不低,甚至可能很高;但是,万一被揭穿了的话,风险也很大,名誉扫地只是起点而已,往下还可能有万劫不复的各种可能性。尽管"自己真正相信"与"事实上真正正确"并不总是一回事儿,但,毕竟因为"自己真正相信"所以必然身体力行;于是,那些自己真正相信的道理会因为自己已经反复实践过而更可能是正确的、或起码真的有一定道理的。自己写一手烂字却反复告诉孩子"一定要练好字"的父母,看起来要多滑稽就有多滑稽――尽管,写一手好字确确实实好处多多。

2. 千万不要装蛋
自以为是的人已经很令人生厌,在各个方面任何时候都总是自以为是的人基本上是个讨厌鬼。没有人完美无缺。说服他人之时,"自身完美"原本并不是必要条件。尽管自己最好在自己所讲的道理所涉及的范围内足够优秀乃至于人们更容易接受你的说教,不过,就算你在那方面确实杰出也最好不要装蛋。装蛋的人迟早会完蛋――蛋是装不出来的。放低自己的身段,因为谁都是正常人――只要是正常人,就必定有这样那样的缺点,曾经犯过这样那样的错误,也经常被命运折磨的手足无措沮丧无奈。生活苦难重重,谁都不容易,这不丢人――没什么不能承认的。

3. 提前做足功课
其实无论做什么,都要提前做功课。而讲道理更是如此――这原本是赢得尊重的体力活(我不太理解那种认为脑力比体力高级的看法,难道大脑就不是身体的一部分了?),然而,如果功课不足,临门一脚太臭,最终还很有可能颜面尽失。很多人以为自己是长辈或者是上司就自动拥有了"权威",殊不知恰恰因为自己是长辈或者是上司,自己赢得尊重的成本才很高很高,而弄不好颜面尽失的风险很大很大。给不同的人讲道理,很可能要用不同的方式,不演练一下就出手很可能搞砸;给不同层面不同领域的人讲道理,很可能需要不同的素材、不同的深度,不把功课做足,就很可能反过来被教训一通。

4. 以帮助他人为目标,而不是为了变相抬高自己
要是帮不上别人,就不要添乱――这是做人的基本美德。而所有想通过各种手段抬高自己或者变相抬高自己的企图最终都会被识破、都会"偷鸡不成反蚀一把米"。道理也很简单,真正的高人无需抬高自己――因为无论你高还是不高,判断是别人的事情,你又何必操心?操心也没用。因为人人心里都有一杆秤――就算那称不准,也不是你可以或者有权利抑或有义务去校准的。要是自我审视之后发现自己"说教"的目的本质上只不过是想抬高自己、证明自己正确,那就免了吧,人家不需要这个。

5. 选择对象、选择时机
所谓"可与言而不与之言,失人;不可与言而与之言,失言。"有些人不懂道理,那你给他讲道理无异于对牛弹琴。事实上,对牛弹琴还可能提高牛的产奶量,可是你要是不知死活非要跟听不懂道理的人讲道理,弄不好会被弄到气绝身亡的地步,不划算。有些人你必须帮助(或者你觉得你应该帮助),那可能要认真选择时机――只在必要的时候对合适的人用恰当的方式讲道理。很小的时候我母亲教我"饭桌上不要讲道理",后来我发现很多人不懂这个简单原则对生活质量的巨大影响。卡耐基提醒说,批评人的时候千万不要当着别人的面批评,可他的书卖了那么多年那么多本,却好像并没有改变什么――大约还是知易行难罢。

6. 简洁至上
讲道理和写文章没什么区别,都要简洁、朴素、有效、准确、全面、生动才好。而这些基本风格中最重要的是简洁。除非万不得已,千万不要�嗦。比如,很多孩子之所以"叛逆",其实倒不是他们喜欢叛逆,只不过是受不了父母没完没了地说车轱辘话而已。很多人之所以做不到讲道理时简单明了,说穿了还是因为从未养成做事提前做功课的习惯。所以,一旦开始讲道理,随时都可能被自己当然会占到的那一次两次"上风"所勾引,产生"乘胜追击"幻觉和快感,而最终把自己变成讲话又臭又长的、终究被(所有)人鄙视的家伙。

7. 不讲空话
无论什么道理,很难"放之四海皆准"。有用的道理,通常必然存在一个"适用范围"。更多的时候,说清楚那道理很可能并无必要,因为大伙都知道那显而易见的道理;真正能够帮助别人的是讲清楚那道理的适用范围。最令人生厌的大道理经常披着这样的外衣"……应该……"。谁都知道什么事应该怎样(除了那些极端缺乏常识的人之外),人们需要的往往不是"什么"(What),而是"为什么"(Why)和"怎么"(How)。只讲显而易见的,却无力说清楚原本必须讲明白才有效的,不仅偷懒,且不厚道,又莫名其妙。

8. 摆明立场很重要
给人讲道理,是为了帮助对方。有时明明是显而易见的道理却遭到了抵触,那往往是因为没提前让对方明白"我跟你是同一条战线上的"。你原本想帮助对方,可是不知不觉之间已经把自己变成了对方的敌人,而此时对方的唯一最重要目标就是战胜你――这基本上相当于所谓的"出师未捷身先死"。让对方明白你们之间应该是"合作关系",是"一伙"的,这是最重要的前提;没有这个前提,一切都白费。说服工作的基础永远是信任。而更多的时候,这件事儿也需要提前做大量的功课才行。信任不是想出来的或者抢来的,是慢慢赢来的。

9. 给对方足够的时间
知易行难。大多数人在犯错的时候确实"真的不是故意的"。知书达理并不见得总是可以成功地转换为恰当的行为。你讲的道理就算正确,对方也很可能需要一定的时间去消化;需要更多的经历才能产生进一步认同;就算对方已经接受你的道理,他还需要花费相当长的时间,并且动用足够的意志才可能把那接受来的想法以恰当的方式转换为恰当的行为。而这些都需要时间。很多尝试教会学生"独立思考"的老师,终生都要面临这样的尴尬:这些学生学会"独立思考"之后的第一件事情就是开始反对刚刚教会他的老师。这也是绝大多数老师自动回避那些涉及到必须"深入思考"的领域的重要原因――然而,你愿意做个这样没原则的人么?

10. 养成反思的习惯
人不仅可以进步,还可以不停地进步。前者猴子也能做到,后者只有人类才能做到――因为人类拥有强大的反思能力。尽管很多人的这种能力最终没有"用进"反而"废退",但至少每个人原本都拥有这个潜质。永远光荣伟大正确的道理都是扯淡,今天适用的明天可能不再适用,现在看起来无懈可击的,将来可能竟然被发现不值一驳。试错是人类进步的唯一方法,而反思是唯一使试错体现出价值的手段。反思不仅仅是一种应该养成的习惯,准确来讲,人无反思能力与蚁蜢无异。

挑战者:Wolfram|Alpha搜索――杨琳桦

  雄心勃勃的Wolfram|Alpha来了,带着一个笨重的名字。
  美国中部时间5月18日下午3时,披着橘红色页面的Wolfram|Alpha正式向公众开放。
  等待最初始于3月。其时,Wolfram|Alpha的创始人、美国计算机科学家史蒂芬・沃尔弗拉姆撰文透露,他正着手开发一款新型互联网搜索引擎;之后的4月28日,Wolfram|Alpha开通博客;5月1日,前沿科技博客SearchEngineLand刊登内部测后感《让人印象深刻:Wolfram|Alpha的"事实引擎"》。至此,硅谷进入躁动。
  "Something big is about to happen!"正如一位密切关注此事的雅虎工程师所说──硅谷对Wolfram|Alpha的热望,不仅因沃尔弗拉姆的影响力,更在于该引擎技术本身。
  通过这种新型搜索引擎,人们获得的将不再是网上已有的现成信息,而是经服务器计算生成的新信息。
  通过引入强大的"计算"能力,Wolfram|Alpha能帮助用户实现基于其输入的关键词或问题的统计学工作。这是否意味着,继以Google为代表的搜索引擎之后,人类与知识的关系将再一次被根本性改变?
  "5年前我们开始实施这一项目,经反复试验后,决定于今年推出,"Wolfram Research公司人士向本报记者表示,Wolfram|Alpha在Wolfram Research的内部代号为"计算型知识引擎"("Computational Knowledge Engine"),参与开发人员超过100名。
  "就像一个对答如流的婴儿"
  不少科技人士认为,Wolfram|Alpha将向全球互联网搜索巨头Google发起直接挑战。不过测试后,更准确的说法或许应该是──Wolfram|Alpha与Google同样重要,只不过,双方的目的截然不同。
  本报记者此前受邀获得Wolfram|Alpha内部测试密码。让我们先来做一个测试。
  在Google或雅虎中搜索输入"China GDP",正如你所料,看到的是一系列与中国GDP有关的网页──它们可能是来自BBC的最新报道,也可能是一篇有关中国经济增长情况的长篇大论,但这些不一定是我们最想要的。
  如果将"China GDP"输入Wolfram|Alpha,将出现什么?
  ──不是一大堆网页,而是直观的数据和图表。
  这包括:中国GDP的最新情况、从1970年至今的中国GDP增长情况(图表)、中国通货膨胀率、失业人口率等。
  看上去的确很聪明。
  本报记者再做了进一步测试,在Wolfram|Alpha中输入"How many people in China",结果看到的是目前中国的总人口数、人口密度、平均每年人口增长率、预期寿命和平均年龄等数据。
  据介绍,Wolfram|Alpha引擎能应对的问题还包括:"某年某月某日某旅游胜地的日出是什么时间"、"地球和月球的距离"、"吃一个苹果我将获得多少蛋白质"等。
  有一个例子,将有助于理解Wolfram|Alpha与Google等搜索引擎的区别。
  比如,当你不知道"叔叔的叔叔的兄弟的儿子"与自己是什么关系时,将"uncle's uncle's brother's son"输入Wolfram|Alpha,你将获得一份类似家谱的东西,当中包括血缘关系的具体数据。而如果用户将同样的指令输入Google,获得的则只是一些网页的清单。
  这也正是Wolfram|Alpha的最大噱头所在──给出一个直接明确的答案,从而超越Google、雅虎赋予人类有关搜索引擎的经验。
  "目前全球搜索引擎模式大致可分三类,"美国搜索引擎研究专家诺瓦・斯皮万克(Nova Spivack)在测试完Wolfram|Alpha后说,一类是以Google为代表的网页搜索,即用户键入关键词,搜索引擎返回不同的网页链接;第二类是维基百科(Wikipedia)搜索,搜索引擎返回至所查询词条的详细信息;第三类则是美国语义搜索服务商Powerset模式,返回至与查询要求相关的文档。
  "与这三种模式不同, Wolfram|Alpha利用其独有的专利性算法建起了一个庞大的信息资料库。"斯皮万克说,新型引擎能针对广泛的问题提供详尽的答案,即使这些问题以不同的方式询问,它也能应对自如:"这让人惊讶。"
  最特别的是,Wolfram|Alpha不是从一个庞大数据库中抄答案,而是能针对答案进行计算。这一方面它比Google聪明,因为后者只是通过关键词搜索来发现文件,而并不理解所谓的答案或问题,也不是基于人类对不同领域的知识进行的计算。
  "让外行人也能拥有专家的知识库,是引擎新技术的初衷所在。"Wolfram Research公司人士表示,Wolfram|Alpha的目标用户为所有人。除科学领域外,它还提供包括金融、技术、地理、天气、烹调、商业、旅行、人类、音乐等领域的知识和计算结果。
  当然,Wolfram|Alpha还有其它一些独特之处。比如向外部开发者开放API应用程序接口。这意味着,外部开发者可以在Wolfram|Alpha基础上组建更有针对性的搜索服务;又比如大量人工力量的干预,所有数据都有相应人员的专门验证和比较,以确保质量和更新。
  "关于信息更新,的确是一个挑战,"位于美国伊利诺伊州的Wolfram Research公司的人士对前来访问的本报记者说,"目前,Wolfram|Alpha会视具体的信息性质来确定更新频率,比如股票是实时更新,而各国的GDP,则根据确切资料的发布每年更新一次。"
  在未来一段时间内,Wolfram|Alpha仍将主要服务于英文语种。
  "Wolfram|Alpha之父":21岁就是"天才"
  "Wolfram|Alpha之父" ,是现年49岁的史蒂芬・沃尔弗拉姆(Stephen Wolfram)。他出生于英国,一直以推动计算机基础科学的突破闻名。
  在20岁那年,沃尔弗拉姆获得美国加州理工大学的物理学博士学位,21岁时获得麦克阿瑟基金会颁布的"天才"称号。之后他长期致力于对计算机复杂系统的研究。
  1988年,沃尔弗拉姆推出强大的计算机软件Mathematica。这是世界上通用计算系统中最强大的一个,对如何在科技和其它领域运用计算机产生了深刻影响,被称为是"现代科技计算的开始"。
  沃尔弗拉姆由此闻名于世。2002年时,他出版了一本厚达1280页的书《一种新科学》(〈A New Kind of Science〉),探讨"细胞自动控制器"(Cellular Automata)和复杂计算机系统,引发计算机科学界的热烈讨论。
  为使自己研发的软件能够有组织地制造和销售,沃尔弗拉姆还组建了沃尔夫勒姆集团,并亲任董事长和首席执行官。
  Wolfram Research即是集团旗下四家公司之一,多年来一直保持私营体制,主要通过旗下产品盈利。
  如何盈利,是Wolfram|Alpha一个至关重要的问题。
  Wolfram Research的人士透露,赞助商将成为挑大梁者。目前,其已确定的名单有联想、戴尔等,而类似潜在的商业机会也包括与各公司合作开发定向广告;其次,是开放API后带来的潜在商业模式;公司还希望 Wolfram|Alpha的免费推出能推动它的科学计算软件Mathematica在全球的使用和销售。事实上,这种软件很早即已进入中国市场。
  "我们正在启动向中国高校学生开放Mathematica免费使用一年的项目," Wolfram Research中国区商务经理王翔说,已确定或即将确定的中国高校名单包括中科大、南开等9所大学。
  终结Google还是卖给Google?
  但,Wolfram|Alpha远远称不上是完美的。
  这不仅仅在于有着两个类似"F"的发音可能会阻碍它成为一个家喻户晓的名字,更在于Wolfram|Alpha暴露出的部分缺点。
  至少在眼下,这种新型引擎还像一个刚出生的婴儿一样,对一些很简单的自然语言尚不能辨认。比如输入"WolframAlpha location"和"WolframAlpha address"时,前者能顺利抵达图片和数据,但后者却显示"Wolfram|Alpha不能确定输入的内容"。
  对此,沃尔弗拉姆声称,作为一个长远项目,Wolfram|Alpha已经有了一个谦卑的开始,类似漏洞将会在以后的日子中逐步改进。
  不过科普作家、《大英百科全书》编委尼古拉斯・卡尔(Nicholas Carr)仍然警告说:网民不会容忍不能按他们期望工作的网站,"一旦让网民产生挫败感,他们从此便不会再回来。"
  此外,Wolfram|Alpha也不可能代替Google。
  "用户可能不会使用它购买新车,也不会用它来寻找有关论题的博客或度蜜月的胜地,"斯皮万克说,"Wolfram|Alpha不是一个你认为懂得一切事情的系统。对人脑主导的搜索来说,目前仍没有任何东西可以替代。"
  与此同时, Google已于近日发布数据可视化工具,一旦完全设计完毕,Google在搜索市场的优势可能会进一步扩大。而微软也刚刚宣布,未来几天内他们将发布搜索引擎"Kumo"。几个月前,微软获得了前雅虎搜索重将陆奇的加盟。
  现在有一些问题,我们仍无法知晓,比如,Wolfram|Alpha最终会出售给Google、微软或雅虎吗?但至少,Wolfram|Alpha已经被认为有了一个伟大开端,它使人类在一个新层面受益的同时,也进一步增强了互联网搜索领域的竞争。
  正如不少社会学家所指出的,这种不断出现的新技术,是真正能够分散现有垄断权力的力量。或许在不久的未来,我们将不用再担心一个问题──谁来监管Google?

2009年5月25日星期一

2009年5月24日星期日

医药股投资策略

先看一个牛股15年来的走势图(已复权月线图)


这个大牛股15年间丛最低的2.63元涨到最高的405.7元,15年间涨了153倍。想必大家要问这个牛股名称,这个股市长青树样的大牛股就是传说中的云南白药。经历了08年的熊市,又创新高,仿佛熊市是别人的事,所有买入的只要你持有,都赚钱了。当然,婴儿已长大成人,2003年上市初的2000万股的股本也因送股和配股成24483万股,股本扩大了12倍。

上例说明投资医药股还是很有作为的,医药板块是培育大牛股的温床。

买入医药股主要是基于以下原因:

(1)过去的七八十年间,欧美国家以不到10亿人口的消费量,培养了14家跨国制药巨头。再过二三十年,我国肯定有超过14亿人口,这必将缔造出许多大型制药企业,这就是投资医药股的根本。

(2)国家将在未来3年内新增投入8500亿元以保障新医改能够顺利实施,8500亿元的新增投入将会加快药品终端消费的增长速度(与其是医疗器械相关股),对整个行业构成了实质性的利好。近期,国务院出台若干意见扶持和促进中医药事业发展和促进生物产业加快发展的若干政策,可视为长期利多.

(3)随着新医改政策的推出,随着新农村合作等医疗保险制度的实施,城市和农村的就诊率和住院率都有了明显的提高。又因环境的恶化,肿瘤、心脑血管等疾病的发病率仍然在继续上升,这些将成为医药需求增长的内部和外部的十足的动力,推动医药行业持续快速增长的巨大动力。

(4)1-2月份医药行业在所有行业中增速名列前茅,而未来医药行业的增长动力仍然十分充足。国家统计局公布1-2月份医药行业数据09年1-2月,医药行业实现营业收入1118亿元,同比增长16.4%;实现利润总额103亿元,同比增长19%。与08年同期营业收入和利润总额30%和51%的增速相比,09年的数据环比出现了较大幅度的下降。从子行业的情况来看,化学原料药行业同比出现了下降,化学制剂、中成药、生物制剂行业增速均出现了环比下降,中药饮片、医疗器械行业增速环比上升。

(5)
中药大有可为,潜力挖崛刚刚开始,中药将可能与西药、健康产品三足鼎。有例为证,中药凉茶王老吉年销售额140多亿,健胃消食片十几亿,霸王中药洗发水20多亿,中药饮片连续四年30%多高速增长,且可口可乐近几年来做凉茶的传闻一直不断,连日化大鳄宝洁都忍不住猛推"防掉发汉方"配方产品。

目前医药板块2009年整体市盈率在30倍附近,估值平均处于较高水平,而那些高成长性的医药股普遍高估很多,关键是在等合适的良机(如股指会暴跌)建仓那些垄断的"有独门绝技而不必血淋淋厮杀"的小般成长股。

下图为本稳者翻看所有医药股觉得还可以的股的对比表(以09年动态市盈率为序):

医药行业投资策略2009年医药行业的投资可以遵循以下投资策略:

(1)坚定持有持续增长的各个行业龙头公司,包括恒瑞医药、天坛生物、恩华药业、双鹭药业、康缘药业等公司;

(2)关注医改带来的结构性投资机会,例如有可能其独家品种进入基本药品目录的沃华医药、独一味、天士力等公司和由于医院门诊药房剥离至药店而受益的南京医药、上海医药和桐君阁等公司;

(3)09年还可以关注医药资产整合带来的投资机会,例如上药系的上海医药、上实医药和中西药业,太极系的太极集团、桐君阁和西南药业,华立系的华立药业、昆明制药和武汉健民。
(4)中小板企业中,双鹭药业、鱼跃医疗、科华生物、恩华药业都保持较好的发展势头,值得长期投资。

(5)中药饮片无法实现国家统一定价,产品有提价自主性,关注康美药业。


本隐者总体原则为:选择垄断成长小盘医药股。

关注的个股乱评:

(1)独一味:2008年市盈率34倍,不分红送股,利润增长31%
。传统经典藏药,垄断独一草原料,主营收入持续大的增长,产能有望扩大,毛利率持续上升或稳定,超小盘股,在三年内有望复合增长率超30%,成为又一个"云南白药",总之,独一味,小而美。

(2)片仔癀:2008年市盈率30倍(扣除非经常性损益),利润增长29%
,处方为国家绝密,绝对垄断,原产地标记保护,自主定价,可跑瀛通涨。有新药持上市,主营稳定低增长,化妆品等护肤品增长很快,可能会给人另类超预期的惊喜。上市来已证明有牛股潜质,高分红,不爱送股,难得。缺点可能第一季度业绩不估有很明显的增长。

(3)天士力:2008年市盈率28倍,利润增长37%
,有成为医药行业制药巨头潜质,上市来坚持高分红,一句话,这样的企业能拥有就是不错。

(4)双鹭药业:2008年市盈率35倍,利润增长61%
,主营收入增长超快,而主营成本持续降低,毛利率超高,走势也证明是个超级大牛股,09年后将步入稳步增长阶段,有调整就买点吧。

(5)康美药业:2008年市盈率39倍,利润增长61%
,中药软片行业,又创新高了,观察有一年多了,当初没介入真是后悔,2009年第一季度又以79%增长,只能说对于这个股,只能说可惜。康美现加快了走出广东走向全国的战略,值得期待。

(6)亚宝药业:2008年市盈率36倍,利润增长63%
,主营收入增长超快,又创新高了,超牛股啊。

(7)恩华药业:2008年市盈率55倍,利润增长58%
,唯一一家专注于中枢神经细分市场,两新药获批,好是好,就是市盈率超高,安全边际好小啊。

(8)沃华医药:2008年市盈率53倍,利润增长51%
,主产品为心可舒,国家中药保护品种,产能近年可能增长2倍多,还是一样,好是好,就是市盈率超高,安全边际好小啊。

对于以上医药股,双鹭,鱼跃医疗、片仔癀,独一味和康美能拥有就是不错。

对于价值投资者,当市场出现回调后以上都配置一点,分散,就成为一个医药基金了,在我眼中,因每一个成长性都还好,分散后也等同集中于一个成长医药股。

注:以上讨论的只是个人感悟和个股公司基本面,不够成荐股和操作方法推荐,注意风险,据此投资盈亏自负!