2007年3月28日星期三

吾虽不杀伯仁,伯仁由我而死 --资治通鉴卷第九十二

    【晋纪十四】 起玄黓敦牂,尽昭阳协洽,凡二年。
     中宗元皇帝下永昌元年(壬午,公元三二二年)
  春,正月,郭璞复上疏,请因皇孙生,下赦令,帝从之。乙卯,大赦,改元。
  王敦以璞为记室参军。璞善卜筮,知敦必为乱,己预其祸,甚忧之。大将军掾颖川陈述卒,璞哭之极哀,曰:“嗣祖,焉知非福也!”
   敦既与朝廷乖离,乃羁录朝士有时望者,置己幕府,以羊曼及陈国谢鲲为长史。曼,祜之兄孙也。曼、鲲终日酣醉,故敦不委以事。敦将作乱,谓鲲曰:“刘隗奸 邪,将危社稷,吾欲除君侧之恶,何如?”鲲曰:“隗诚始祸,然城狐社鼠。”敦怒曰:“君庸才,岂达大体!”出为豫章太守,又留不遣。
  戊 辰,敦举兵于武昌,上疏罪状刘隗,称:“隗佞邪谗贼,威福自由,妄兴事役,劳扰士民,赋役烦重,怨声盈路。臣备位宰辅,不可坐视成败,辄进军致讨。隗首朝 悬,诸军夕退。昔太甲颠覆厥度,幸纳伊尹之忠,殷道复昌。愿陛下深垂三思,则四海乂安,社稷永固矣。”沈充亦起兵于吴兴以应敦,敦以充为大都督、督护东吴 诸军事。敦至芜湖,又上表罪状刁协。帝大怒,乙亥,诏曰:“王敦凭恃宠灵,敢肆狂逆,方朕太甲,欲见幽囚。是可忍也,孰不可忍!今亲帅六军以诛大逆,有杀 敦者,封五千户侯。”敦兄光录勋含乘轻舟逃归于敦。
  太子中庶子温峤谓仆射周顗曰:“大将军此举似有所在,当无滥邪?”顗曰:“不然。人主自非尧、舜,何能无失,人臣安可举兵以胁之!举动如此,岂得云非乱乎!处仲狼抗无上,其意宁有限邪!”
   敦初起兵,遣使告梁州刺史甘卓,约与之俱下,卓许之。及敦升舟,而卓不赴,使参军孙双诣武昌谏止敦。敦惊曰:“甘侯前与吾语云何,而更有异?正当虑吾危 朝廷耳!吾今但除奸凶,若事济,当以甘侯作公。”双还报,卓意狐疑。或说卓:“且伪许敦,待敦至都而讨之。”卓曰:“昔陈敏之乱,吾先从而后图之,论者谓 吾惧逼而思变,心常愧之。今若复尔,何以自明!”卓使人以敦旨告顺阳太守魏该,该曰:“我所以起兵拒胡贼者,正欲忠于王室耳。今王公举兵向天子,非吾所宜 与也。”遂绝之。
  敦遣参军桓罴说谯王承,请承为军司。承叹曰:“吾其死矣!地荒民寡,势孤援绝,将何以济!然得死忠义,夫复何求!”承檄 长沙虞悝为长史,会悝遭母丧,承往吊之,曰:“吾欲讨王敦,而兵少粮乏,且新到,恩信未洽。卿兄弟,湘中之豪俊,王室方危,金革之事,古人所不辞,将何以 教之?”悝曰:“大王不以悝兄弟猥劣,亲屈临之,敢不致死!然鄙州荒弊,难以进讨;宜且收众固守,传檄四方,敦势必分,分而图之,庶几可捷也。”承乃囚桓 罴,以悝为长史,以其弟望为司马,督护诸军,与零陵太守尹奉、建昌太守长沙王循、衡阳太守淮陵刘翼、舂陵令长沙易雄,同举兵讨敦。雄移檄远近,列敦罪恶, 于是一州之内皆应承。惟湘东太守郑澹不从,承使虞望讨斩之,以徇四境。澹,敦姊夫也。
  承遣主簿邓骞至襄阳,说甘卓曰:“刘大连虽骄蹇失众 心,非有害于天下。大将军以其私憾,称兵向阙,此忠臣义士竭节之时也。公受任方伯,奉辞伐罪,乃桓、文之功也。”卓曰:“桓、文则非吾所能,然志在徇国, 当共详思之。”参军李梁说卓曰:“昔隗嚣跋扈,窦融保河西以奉光武,卒受其福。今将军有重望于天下,但当按兵坐以待之,使大将军事捷,当委将军以方面,不 捷,朝廷必以将军代之。何忧不富贵,而释此庙胜,决存亡于一战邪?”骞谓梁曰:“光武当创业之初,故隗、窦可以文服从容顾望。今将军之于本朝,非窦融之比 也;襄阳之于太府,非河西之固也。使大将军克刘隗,还武昌,增石城之戍,绝荆、湘之粟,将军欲安归乎!势在人手,而曰我处庙胜,未之闻也。且为人臣,国家 有难,坐视不救,于义安乎!”卓尚疑之。骞曰:“今既不为义举,又不承大将军檄,此必至之祸,愚智所见也。且议者之所难,以彼强而我弱也。今大将军兵不过 万馀,其留者不能五千;而将军见众既倍之矣。以将军之威名,帅此府之精锐,杖节鸣鼓,以顺讨逆,岂王含所能御哉!溯流之众,势不自救,将军之举武昌,若摧 枯拉朽,尚何顾虑邪!武昌既定,据其军实,镇抚二州,以恩意招怀士卒,使还者如归,此吕蒙所以克关羽也。今释必胜之策,安坐以待危亡,不可以言智矣。”
  敦恐卓于后为变,又遣参军丹杨乐道融往邀之,必欲与之俱东。道融虽事敦,而忿其悖逆,乃说卓曰:“主上亲临万机,自用谯王为湘州,非专任刘隗 也。而王氏擅权日久,卒见分政,便谓失职,背恩肆逆,举兵向阙。国家遇君至厚,今与之同,岂不违负大义!生为逆臣,死为愚鬼,永为宗党之耻,不亦惜乎!为 君之计,莫若伪许应命,而驰袭武昌,大将军士众闻之,必不战自溃,大勋可就矣。”卓雅不欲从敦,闻道融之言,遂决,曰:“吾本意也。”乃与巴东监军柳纯、 南平太守夏侯承、宜都太守谭该等露檄数敦逆状,帅所统致讨。遣参军司马赞、孙双奉表诣台,罗英至广州约陶侃同进。戴渊在江西,先得卓书,表上之,台内皆称 万岁。陶侃得卓信,即遣参军高宝帅兵北下。武昌城中传卓军至,人皆奔散。
  敦遣从母弟南蛮校尉魏乂、将军李恒帅甲卒二万攻长沙。长沙城池不 完,资储又阙,人情震恐。或说谯王承,南投陶侃或退据零、桂。承曰:“吾之起兵,志欲死于忠义,岂可贪生苟免,为奔败之将乎!事之不济,令百姓知吾心 耳。”乃婴城固守。未几,虞望战死,甘卓欲留邓骞为参军,骞不可。卓乃遣参军虞冲与骞偕至长沙,遗谯王承书,劝之固守,当以兵出沔口,断敦归路,则湘围自 解。承复书称:“江左中兴,草创始尔,岂图恶逆萌自宠臣!吾以宗室受任,志在陨命;而至止尚浅,凡百茫然。足下能卷甲电赴,犹有所及;若其狐疑,则求我于 枯鱼之肆矣。”卓不能从。
  二月,甲午,封皇子昱为琅邪王。
  后赵王勒立子弘为世子。遣中山公虎将精卒四万击徐龛。龛坚守不战,虎筑长围守之。
   赵主曜自将击杨难敌,难敌逆战,不胜,退保仇池。仇池诸氐、羌及故晋王保将杨韬、陇西太守梁勋皆降于曜。曜迁陇西万馀户于长安,进攻仇池。会军中大疫, 曜亦得疾,将引兵还;恐难敌蹑其后,乃遣光国中郎将王犷说难敌,谕以祸福,难敌遣使称籓。曜以难敌为假黄钺,都督益、宁、南秦、凉、梁、巴六州、陇上、西 域诸军事,上大将军、益、宁、南秦三州牧、武都王。
  秦州刺史陈安求朝于曜,曜辞以疾。安怒,以为曜已卒,大掠而归。曜疾甚,乘马舆而还。 使其将呼延寔监辎重于后,安邀击,获之,谓寔曰:“刘曜已死,子尚谁佐!吾当与子共定大业。”寔叱之曰:“汝受人宠禄而叛之,自视智能何如主上?吾见汝不 日枭首于上邽市,何谓大业!宜速杀我!”安怒,杀之,以寔长史鲁凭为参军。安遣其弟集帅骑三万追曜,卫将军呼延瑜逆击,斩之。安乃还上邽,遣将袭汧城,拔 之。陇上氐、羌皆附于安,有众十馀万,自称大都督、假黄钺、大将军、雍、凉、秦、梁四州牧、凉王,以赵募为相国。鲁凭对安大哭曰:“吾不忍见陈安之死 也!”安怒,命斩之。凭曰:“死自吾分,悬吾头于上邽市,观赵之斩陈安也!”遂杀之。曜闻之,恸哭曰:“贤人,民之望也。陈安于求贤之秋而多杀贤者,吾知 其无所为也!”
  休屠王石武以桑城降赵,赵以武为秦州刺史,封酒泉王。
  帝征戴渊、刘隗入卫建康。隗至,百官迎于道,隗岸帻大言,意气自若。及入见,与刁协劝帝尽诛王氏;帝不许,隗始有惧色。
   司空导帅其从弟中领军邃、左卫将军廙、侍中侃、彬及诸宗族二十馀人,每旦诣台待罪。周顗将入,导呼之曰:“伯仁,以百口累卿!”顗直入不顾。既见帝,言 导忠诚,申救甚至;帝纳其言。顗喜饮酒,至醉而出,导犹在门,又呼之。顗不与言,顾左右曰:“今年杀诸贼奴,取金印如斗大,系肘后。”既出,又上表明导无 罪,言甚切至。导不之知,甚恨之。
  帝命还导朝服,召见之。导稽首曰:“逆臣贼子,何代无之,不意今者近出臣族!”帝跣而执其手曰:“茂弘,方寄卿以百里之命,是何言邪!”
   三月,以导为前锋大都督,加戴渊骠骑将军。诏曰:“导以大义灭亲,可以吾为安东时节假之。”以周顗为尚书左仆射,王邃为右仆射。帝遣王廙往谕止敦;敦不 从而留之,廙更为敦用。征虏将军周札,素矜险好利,帝以为右将军、都督石头诸军事。敦将至,帝使刘隗军金城,札守石头,帝亲被甲徇师于郊外。以甘卓为镇南 大将军、侍中、都督荆、梁二州诸军事,陶侃领江州刺史;使各帅所统以蹑敦后。
  敦至石头,欲攻刘隗。杜弘言于敦曰:“刘隗死士众多,未易可 克,不如攻石头。周札少恩,兵不为用,攻之必败,札败则隗自走矣。”敦从之,以弘为前锋,攻石头,札果开门纳弘。敦据石头。叹曰:“吾不复得为盛德事 矣!”谢鲲曰:“何为其然也!但使自今已往,日忘日去耳。”
  帝命刁协、刘隗、戴渊帅众攻石头,王导、周顗、郭逸、虞潭等三道出战,协等兵 皆大败。太子绍闻之,欲自帅将士决战;升车将出,中庶子温峤执鞚谏曰:“殿下国之储副,奈何以身轻天下!”抽剑斩鞅,乃止。敦拥兵不朝,放士卒劫掠,宫省 奔散,惟安东将军刘超按兵直卫,及侍中二人侍帝侧。帝脱戎衣,着朝服,顾而言曰:“欲得我处,当早言!何至害民如此!”又遣使谓敦曰:“公若不忘本朝,于 此息兵,则天下尚可共安。如其不然,朕当归琅邪以避贤路。”
  刁协、刘隗既败,俱入宫,见帝于太极东除。帝执协、隗手,流涕呜咽,劝令避 祸。协曰:“臣当守死,不敢有贰。”帝曰:“今事逼矣,安可不行!”乃令给协、隗人马,使自为计。协老,不堪骑乘,素无恩纪,募从者,皆委之,行至江乘, 为人所杀,送首于敦。隗奔后赵,官至太子太傅而卒。
  帝令公卿百官诣石头见敦,敦谓戴渊曰:“前日之战,有馀力乎?”渊曰:“岂敢有馀,但 力不足耳!”敦曰:“吾今此举,天下以为何如?”渊曰:“见形者谓之逆,体诚者谓之忠。”敦笑曰:“卿可谓能言。”又谓周顗曰:“伯仁,卿负我!”顗曰: “公戎车犯顺,下官亲帅六军,不能其事,使王旅奔败,以此负公。”
  辛未,大赦。以敦为丞相、都督中外诸军、录尚书事、江州牧,封武昌郡公;并让不受。
  初,西都覆没,四方皆劝进于帝。敦欲专国政,忌帝年长难制,欲更议所立,王导不从。及敦克建康,谓导曰:“不用吾言,几至覆族。”
  敦以太子有勇略,为朝野所向,欲诬以不孝而废之。大会百官,问温峤曰:“皇太子以何德称?”声色俱厉。峤曰:“钩深致远,盖非浅局所量。以礼观之,可谓孝矣。”众皆以为信然,敦谋遂沮。
   帝召周顗于广室,谓之曰:“近日大事,二宫无恙,诸人平安,大将军固副所望邪?”顗曰:“二宫自如明诏,臣等尚未可知。”护军长史郝嘏等劝顗避敦,顗 曰:“吾备位大臣,朝廷丧败,宁可复草间求活,外投胡、越邪!敦参军吕猗,尝为台郎,性奸谄,戴渊为尚书,恶之。猗说敦曰:“周顗、戴渊,皆有高名,足以 惑众,近者之言,曾无怍色,公不除之,恐必有再举之忧。”敦素忌二人之才,心颇然之,从容问王导曰:“周、戴南北之望,当登三司无疑也。”导不答。又曰: “若不三司,止应令仆邪?”又不答。敦曰:“若不尔,正当诛尔!”又不答。丙子,敦遣部将陈郡邓岳收顗及渊。先是,敦谓谢鲲曰:“吾当以周伯仁为尚书令, 戴若思为仆射。”是日,又问鲲:“近来人情何如?”鲲曰:“明公之举,虽欲大存社稷,然悠悠之言,实未达高义。若果能举用周、戴,则群情贴然矣!”敦怒 曰:“君粗疏邪!二子不相当,吾已收之矣!”鲲愕然自失。参军王峤曰:“‘济济多士,文王以宁。’奈何戮诸名士!”敦大怒,欲斩峤,众莫敢言。鲲曰:“明 公举大事,不戮一人。峤以献替忤旨,便以衅鼓,不亦过乎!”敦乃释之,黜为领军长史。峤,浑之族孙也。
  顗被收,路经太庙,大言曰:“贼臣王敦,倾覆社稷,枉杀忠臣。神祇有灵,当速杀之!”收人以戟伤其口,血流至踵,容止自若,观者皆为流涕。并戴渊杀之于石头南门之外。
   帝使侍中王彬劳敦。彬素与顗善,先往哭顗,然后见敦。敦怪其容惨,问之。彬曰:“向哭伯仁,情不能已。”敦怒曰:“伯仁自致刑戮;且凡人遇汝,汝何哀而 哭之?”彬曰:“伯仁长者,兄之亲友;在朝虽无謇愕,亦非阿党,赦后加之极刑,所以伤惋也。”因勃然数敦曰:“兄抗旌犯顺,杀戮忠良,图为不轨,祸及门户 矣!”辞气慷慨,声泪俱下。敦大怒,厉声曰:“尔狂悖乃至此,以吾为不能杀汝邪!”时王导在坐,为之惧,劝彬起谢。彬曰:“脚痛不能拜!且此复何谢!”敦 曰:“脚痛孰若颈痛!”彬殊无惧容,竟不肯拜。
  王导后料检中书故事,乃见顗救己之表,执之流涕曰:“吾虽不杀伯仁,伯仁由我而死,幽冥之中,负此良友!”
  沈充拔吴国,杀内史张茂。
   初,王敦闻甘卓起兵,大惧。卓兄子卬为敦参军,敦使卬归卓曰:“君此自是臣节,不相责也。吾家计急,不得不尔。想便旋军襄阳,当更结好。”卓虽慕忠义, 性多疑少决,军于猪口,欲待诸方同出军,稽留累旬不前。敦既得建康。乃遣台使以驺虞幡驻卓军。卓闻周顗、戴渊死,流涕谓卬曰:“吾之所忧,正为今日。且使 圣上元吉,太子无恙,吾临敦上流,亦未敢遽危社稷。适吾径据武昌,敦势逼,必劫天子以绝四海之望,不如还襄阳,更思后图。”即命旋军。都尉秦康与乐道融说 卓曰:“今分兵断彭泽,使敦上下不得相赴,其众自然离散,可一战擒也。将军起义兵而中止,窃为将军不取。且将军之下,士卒各求其利,欲求西还,亦恐不可得 也。”卓不从。道融昼夜泣谏,卓不听;道融忧愤而卒。卓性本宽和,忽更强塞,径还襄阳,意气骚扰,举动失常,识者知其将死矣。
  王敦以西阳 王羕为太宰,加王导尚书令,王廙为荆州刺史;改易百官及诸军镇,转徙黜免者以百数;或朝行暮改,惟意所欲。敦将还武昌,谢鲲言于敦曰:“公至都以来,称疾 不朝,是以虽建勋而人心实有未达。今若朝天子,使君臣释然,则物情皆悦服矣。”敦曰:“君能保无变乎?”对曰:“鲲近日入觐,主上侧席,迟得见公,宫省穆 然,必无虞也。公若入朝,鲲请侍从。”敦勃然曰:“正复杀君等数百人,亦复何损于时!”竟不朝而去。夏,四月,敦还武昌。初,宜都内史天门周级闻谯王承起 兵,使其兄子该潜诣长沙,申款于承。魏乂等攻湘州急,承遣该及从事邵陵周崎间出求救,皆为逻者所得。又使崎语城中,称大将军已克建康,甘卓还襄阳,外援理 绝。崎伪许之,既至城下,大呼曰:“援兵寻至,努力坚守!”乂杀之。乂考该至死,竟不言其故,周级由是获免。
  乂等攻战日逼,敦又送所得台中人书疏,令乂射以示承。城中知朝廷不守,莫不怅惋。相持且百日,刘翼战死,士卒死伤相枕。癸巳,乂拔长沙,承等皆被执。乂将杀虞悝,子弟对之号泣。悝曰:“人生会当有死,今阖门为忠义之鬼,亦复何恨!”
   乂以槛车载承及易雄送武昌,佐吏皆奔散,惟主簿桓雄、西曹书佐韩阶、从事武延,毁服为僮,从承,不离左右。乂见桓雄姿貌举止非凡人,惮而杀之。韩阶、武 延执志愈固。荆州刺史王廙承敦旨,杀承于道中,阶、延送承丧至都,葬之而去。易雄至武昌,意气忼慨,曾无惧容。敦遣人以檄示雄而数之,雄曰:“此实有之, 惜雄位微力弱,不能救国难耳。今日之死,固所愿也!”敦惮其辞正,释之,遣就舍。众人皆贺之,雄笑曰:“吾安得生!”既而敦遣人潜杀之。
  魏乂求邓骞甚急,乡人皆为之惧,骞笑曰:“此欲用我耳,彼新得州,多杀忠良,故求我以厌人望也。”乃往诣乂。乂喜曰:“君,古之解扬也。”以为别驾。
  诏以陶侃领湘州刺史;王敦上侃复还广州,加散骑常侍。
  甲午,前赵羊后卒,谥曰献文。
  甘卓家人皆劝卓备王敦,卓不从,悉散兵佃作,闻谏,辄怒。襄阳太守周虑密承敦意,诈言湖中多鱼,劝卓遣左右悉出捕鱼。五月,乙亥,虑引兵袭卓于寝室,杀之,传首于敦,并杀其诸子。敦以从事中郎周抚督沔北诸军事,代卓镇沔中。抚,访之子也。
  敦既得志,暴慢滋甚,四方贡献多入其府,将相岳牧皆出其门。以沈充、钱凤为谋主,唯二人之言是从,所谮无不死者。以诸葛瑶、邓岳、周抚、李恒、谢雍为爪牙。充等并凶险骄恣,大起营府,侵人田宅,剽掠市道,识者咸知其将败焉。
  秋,七月,后赵中山公虎拔泰山,执徐龛送襄国;后赵王勒盛之以囊,于百尺楼上扑杀之,命王伏都等妻子刳而食之,坑其降卒三千人。
  兗州刺史郗鉴在邹山三年,有众数万。战争不息,百姓饥馑,掘野鼠、蛰燕而食之,为后赵所逼,退屯合肥。尚书右仆射纪瞻,以鉴雅望清德,宜从容台阁,上疏请征之;乃征拜尚书。徐、兗间诸坞多降于后赵,后赵置守宰以抚之。
  王敦自领宁、益二州都督。
  冬,十月,己丑,荆州刺史武陵康侯王廙卒。王敦以下邳内史王邃都督青、徐、幽、平四州诸军事,镇淮阴;卫将军王含都督沔南诸军事,领荆州刺史;武昌太守丹杨王谅为交州刺史。使谅收交州刺史脩湛、新昌太守梁硕杀之。谅诱湛。斩之。硕举兵围谅于龙编。
  祖逖既卒,后越屡寇河南,拔襄城、城父,围谯。豫州刺史祖约不能御,退屯寿春。后赵遂取陈留,梁、郑之间复骚然矣。
  十一月,以临颖元公荀组为太尉;辛酉,薨。
  罢司徒,并丞相府。王敦以司徒官属为留府。
  帝忧愤成疾,闰月,己丑,崩。司空王导受遣诏辅政。帝恭俭有馀而明断不足,故大业未复而祸乱内兴。庚寅,太子即皇帝位,大赦,尊所生母荀氏为建安君。
  十二月,赵主曜葬其父母于粟邑,大赦。陵下周二里,上高百尺,计用六万夫,作之百日乃成。役者夜作,继以脂烛,民甚苦之。游子远谏,不听。
  后赵濮阳景侯张宾卒,后赵王勒哭之恸,曰:“天不欲成吾事邪?何夺吾右侯之早也!”程遐代为右长史。遐,世子弘之舅也,勒每与遐议,有所不合,辄叹曰:“右侯舍我去,乃令我与此辈共事,岂非酷乎!”因流涕弥日。
  张茂使将军韩璞帅众取陇西、南安之地,置秦州。
  慕容廆遣其世子皝袭段末柸,入令支,掠其居民千馀家而还。
  肃宗明皇帝上
     中宗元皇帝下太宁元年(癸未,公元三二三年)
  春,正月,成李骧、任回寇台登,将军司马玖战死,越巂太守李钊、汉嘉太守王载皆以郡降于成。
  二月,庚戌,葬元帝于建平陵。
  三月,戊寅朔,改元。
  饶安、东光、安陵三县灾,烧七千馀家,死者万五千人。
  后赵寇彭城、下邳,徐州刺史卞敦与征北将军王邃退保盱眙。敦,壸之从父兄也。
   王敦谋篡位,讽朝廷征己;帝手诏征之。夏,四月,加敦黄钺、班剑,奏事不名,入朝不趋,剑履上殿。敦移镇姑孰,屯于湖,以司空导为司徒,敦自领扬州牧。 敦欲为逆,王彬谏之甚苦。敦变色,目左右,将收之。彬正色曰:“君昔岁杀兄,今又杀弟邪!”敦乃止,以彬为豫章太守。
  后赵王勒遣使结好于慕容廆,廆执送建康。
  成李骧等进攻宁州,刺史褒中壮公王逊使将军姚岳等拒之,战于螗良,成兵大败。岳追至泸水,成兵争济,溺死者千馀人。岳以道远,不敢济而还。逊以岳不穷追,大怒,鞭之,怒甚,冠裂而卒。逊在州十四年,威行殊俗,州人立其子坚行州府事。诏除坚宁州刺史。
  广州刺史陶侃遣兵救交州;未至,梁硕拔龙编,夺刺史王谅节,谅不与,硕断其右臂。谅曰:“死且不避,断臂何为!”逾旬而卒。
  六月,壬子,立妃庾氏为皇后;以后兄中领军亮为中书监。
  梁硕据交州,凶暴失众心。陶侃遣参军高宝攻硕,斩之。诏以侃领交州刺史,进号征南大将军、开府仪同三司。未几,吏部郎阮放求为交州刺史,许之。放行至宁浦,遇高宝,为宝设馔,伏兵杀之。宝兵击放,放走,得免,至州。少时,病卒。放,咸之族子也。
   陈安围赵征西将军刘贡于南安,休屠王石武自桑城引兵趣上邽以救之,与贡合击安,大破之。安收馀骑八千,走保陇城。秋,七月,赵主曜自将围陇城,别遣兵围 上邽。安频出战,辄败。右军将军刘干攻平襄,克之,陇上诸县悉降。安留其将杨伯支、姜冲儿守陇城,自帅精骑突围,出奔陕中。曜遣将军平先等追之。安左挥七 尺大刀,右运丈八蛇矛,近则刀矛俱发,辄殪五六人,远则左右驰射而走。先亦勇捷如飞,与安搏战,三交,遂夺其蛇矛。会日暮雨甚,安弃马与左右匿于山中;赵 兵索之,不知所在。明日,安遣其将石容觇赵兵,赵辅威将军呼延青人获之,拷问安所在,容卒不肯言,青人杀之。雨霁,青人寻其迹,获安于涧曲,斩之。安善抚 将士,与同甘苦,及死,陇上人思之,为作《壮士之歌》。杨伯支斩姜冲儿,以陇城降;别将宋亭斩赵募,以上邽降。曜徙秦州大姓杨、姜诸族二千馀户于长安。 氐、羌皆送任请降;以赤亭羌酋姚弋仲为平西将军,封平襄公。
  帝畏王敦之逼,欲以郗鉴为外援,拜鉴兗州刺史,都督扬州江西诸军事,镇合肥。 王敦忌之,表鉴为尚书令。八月,诏征鉴还,道经姑孰,敦与之论西朝人士,曰:“乐彦辅,短才耳。考其实,岂胜满武秋邪!”鉴曰:“彦辅道韵平淡,愍怀之 废,柔而能正。武秋失节之士,安得拟之!”敦曰:“当是时,危机交急。”鉴曰:“丈夫当死生以之。”敦恶其言,不复相见,久留不遣。敦党皆劝敦杀之,敦不 从。鉴还台,遂与帝谋讨敦。
  后赵中山公虎帅步骑四万击安东将军曹嶷,青州郡县多降之,遂围广固。嶷出降,送襄国杀之,坑其众三万。虎欲尽杀嶷众,青州刺史刘征曰:“今留征,使牧民也,无民焉牧!征将归耳!”虎乃留男女七百口配征,使镇广固。
   赵主曜自陇上西击凉州,遣其将刘咸攻韩璞于冀城,呼延晏攻宁羌护军阴鉴于桑壁,曜自将戎卒二十八万军于河上,列营百馀里,金鼓之声动地,河水为沸,张茂 临河诸戍,皆望风奔溃。曜扬声欲百道俱济,直抵姑臧,凉州大震。参军马岌劝茂亲出拒战,长史汜祎怒,请斩之。岌曰:“汜公糟粕书生,刺举小才,不思家国大 计。明公父子欲为朝廷诛刘曜有年矣,今曜自至,远近之情,共观明公此举,当立信勇之验以副秦、陇之望。力虽不敌,势不可以不出。”茂曰:“善!”乃出屯石 头。茂谓参军陈珍曰:“刘曜举三秦之众,乘胜席卷而来,将若之何?”珍曰:“曜兵虽多,精卒至少,大抵皆氐、羌乌合之众,恩信未洽,且有山东之虞,安能舍 其腹心之疾,旷日持久,与我争河西之地邪!若二旬不退,珍请得弊卒数千,为明公擒之。”茂喜,使珍将兵救韩璞。赵诸将争欲济河,赵主曜曰:“吾军势虽盛, 然畏威而来者三分有二,中军疲困,其实难用。今但按甲勿动,以吾威声震之,若出中旬张茂之表不至者,吾为负卿矣。”茂寻遣使称籓,献马、牛、羊、珍宝不可 胜纪。曜拜茂侍中、都督凉、南北秦、梁、益、巴、汉、陇右、西域杂夷、匈奴诸军事、太师、凉州牧,封凉王,加九锡。
  杨难敌闻陈安死,大 惧,与弟坚头南奔汉中,赵镇西将军刘厚追击之,大获而还。赵主曜以大鸿胪田崧为镇南大将军、益州刺史,镇仇池。难敌送任请降于成,成安北将军李稚受难敌 赂,不送难敌于成都。赵兵退,即遣不武都,难敌遂据险不服。稚自悔失计,亟请讨之。雄遣稚兄侍中、中领军琀与稚出白水,征东将军李寿及琀弟玝出阴平,以击 难敌;群臣谏,不听。难敌遣兵拒之,寿、玝不得进,而琀、稚长驱至下辨。难敌遣兵断其归路,四面攻之。琀、稚深入无继,皆为难敌所杀,死者数千人。琀,荡 之长子,有才望,雄欲以为嗣,闻其死,不食者数日。
  初,赵主曜长子俭,次子胤。胤年十岁,长七尺五寸,汉主聪奇之,谓曜曰:“此儿神气, 非义真之比也,当以为嗣。”曜曰:“籓国之嗣,能守祭祀足矣,不敢乱长幼之序。”聪曰:“卿之勋德,当世受专征之任,非他臣之比也,吾当更以一国封义 真。”乃封俭为临海王,立胤为世子。既长,多力善射,骁捷如风。靳准之乱,没于黑匿郁鞠部。陈安既败,胤自言于郁鞠,郁鞠大惊,礼而归之。曜悲喜,谓君臣 曰:“义光虽已为太子,然冲幼儒谨,恐不堪今之多难。义孙,故世子也,材器过人,且涉历艰难。吾欲法周文王、汉光武,以固社稷而安义光,何如?”太傅呼延 晏等皆曰:“陛下为国家无穷之计,岂惟臣等赖之,实宗庙四海之庆。”左光禄大夫卜泰、太子太保韩广进曰:“陛下以废立为是,不应更问群臣;若以为疑,固乐 闻异同之言。臣窃以为废太子,非也。昔文王定嗣于未立之前,则可也;光武以母失恩而废其子,岂足为圣朝之法!向以东海为嗣,未必不如明帝也。胤文武才略, 诚高绝于世。然太子孝友仁慈,亦足为承平贤主。况东宫者,民、神所系,岂可轻动!陛下诚欲如是,臣等有死而已,不敢奉诏,”曜默然。胤进曰:“父之于子, 当爱之如一,今黜熙而立臣,臣何敢自安!陛下苟以臣为颇堪驱策,岂不能辅熙以承圣业乎!必若以臣代熙,臣请效死于此,不敢闻命。”因歔欷流涕。曜亦以熙羊 后所生,不忍废也,乃追谥前妃卜氏为元悼皇后。泰,即胤之舅也,曜喜其公忠,以为上光禄大夫、仪同三司、领太子太傅;封胤为永安王,拜侍中、卫大将军、都 督二宫禁卫诸军事、开府仪同三司、录尚书事,命熙于胤尽家人之礼。
  张茂大城姑臧,修灵钧台。别驾吴绍谏曰:“明公所以修城筑台者,盖惩既 往之患耳。愚以为苟恩未洽于人心,虽处层台,亦无所益,适足以疑群下忠信之志,失士民系托之望,示怯弱之形,启邻敌之谋,将何以佐天子、霸诸候乎!愿亟罢 兹役,以息劳费。”茂曰:“亡兄一旦失身于物,岂无忠臣义士欲尽节者哉!顾祸生不意,虽有智勇,无所施耳。王公设险,勇夫重闭,古之道也。今国家未靖,不 可以太平之理责人于屯邅之世也。”卒为之。
  王敦从子允之,方总角,敦爱其聪警,常以自随。敦常夜饮,允之辞醉先卧。敦与钱凤谋为逆,允之 悉闻其言。即于卧处大吐,衣面并污。凤出,敦果照视,见允之卧于吐中,不复疑之。会其父舒拜廷尉,允之求归省父,悉以敦、凤之谋白舒。舒与王导俱启帝,阴 为之备。敦欲强其宗族,陵弱帝室,冬,十一月,徙王含为征东将军、都督扬州江西诸军事,王舒为荆州刺史、监荆州沔南诸军事,王彬为江州刺史。
  后赵王勒以参军樊坦为章武内史,勒见其衣冠弊坏,问之。坦率然对曰:“倾为羯贼所掠,资财荡尽。”勒笑曰:“羯贼乃尔无道邪!今当相偿。”坦大惧,叩头泣谢。勒赐车马、衣服、装钱三百万而遣之。
  是岁,越巂斯叟攻成将任回,成主雄遣征南将军费黑讨之。
  会稽内史周札,一门五候,宗族强盛,吴士莫与为比,王敦忌之。敦有疾,钱凤劝敦早除周氏,敦然之。周嵩以兄顗之死,心常愤愤。敦无子,养王含之子应为嗣,嵩尝于众中言应不宜统兵,敦恶之。嵩与札兄子莛皆为敦从事中郎。会道士李脱以妖术惑众,士民颇信事之。

  
  国学网站推出

2007年3月27日星期二

AWK Usage

打印文件特定行的内容
awk 'NR==5 {print $0}' /proc/meminfo

2007年3月26日星期一

视频监控摄像头芯片销售强劲放量,突破传统安防市场

上网时间:2007年03月27日

根据市场研究机构iSuppli报告,预计视频监控摄像头市场将出现短期的强劲增长,这将给芯片供应商带来一次增长机会,为半导体产业增长提速。

预计2011年全球视频监控摄像头销售规模超过90亿美元,2006年该市场规模为49亿美元,年复合增长率(CAGR)达13.2%。2011年视频监控设备单元出货量将从2006年的2,980万套增长到6,570万套,增幅超过两倍,年复合增长率为17.1%。

iSuppli表示,视频监控领域的增长将给相关半导体产业带来机会。监控摄像头芯片市场规模到2011年将达12.5亿美元,两倍于2006年的5.25亿美元。

iSuppli多媒体内容和服务部副总裁Mark Kirstein表示,“基于互联网的IP视频监控摄像头市场兴起,加上IP视频服务以及数字录象机(DVR)。视频监控已经超越了传统的安防领域,运用到诸如运输、零售、政府甚至家庭网络等新应用中。”

Kirstein表示,2011年网络摄像头将替代现有的闭路电视摄像头。家庭网络摄像头市场预计将出现增长。网络运营商把这作为一项宽带增值服务。

在视频监控市场增长带动下,视频处理器和以太网、以太网供电(Power over Ethernet)和无线局域网接口芯片销售将大大增长。但是由于产品价格下滑和采用更低价格的CMOS图像传感器,图像传感器方面的支出将会下降。

2007年3月23日星期五

CPU Knowledge

1.主频

  主频也叫时钟频率,单位是MHz,用来表示CPU的运算速度。CPU的主频=外频×倍频系数。很多人认为主频就决定着CPU的运行速度,这不仅是个片 面的,而且对于服务器来讲,这个认识也出现了偏差。至今,没有一条确定的公式能够实现主频和实际的运算速度两者之间的数值关系,即使是两大处理器厂家 Intel和AMD,在这点上也存在着很大的争议,我们从Intel的产品的发展趋势,可以看出Intel很注重加强自身主频的发展。像其他的处理器厂 家,有人曾经拿过一快1G的全美达来做比较,它的运行效率相当于2G的Intel处理器。

所以,CPU的主频与CPU实际的运算能力是没有直接关系的,主频表示在CPU内数字脉冲信号震荡的速度。在Intel的处理器产品中,我们也可以看到这 样的例子:1 GHz Itanium芯片能够表现得差不多跟2.66 GHz Xeon/Opteron一样快,或是1.5 GHz Itanium 2大约跟4 GHz Xeon/Opteron一样快。CPU的运算速度还要看CPU的流水线的各方面的性能指标。

  当然,主频和实际的运算速度是有关的,只能说主频仅仅是CPU性能表现的一个方面,而不代表CPU的整体性能。

2.外频

  外频是CPU的基准频率,单位也是MHz。CPU的外频决定着整块主板的运行速度。说白了,在台式机中,我们所说的超频,都是超CPU的外频(当然一 般情况下,CPU的倍频都是被锁住的)相信这点是很好理解的。但对于服务器CPU来讲,超频是绝对不允许的。前面说到CPU决定着主板的运行速度,两者是 同步运行的,如果把服务器CPU超频了,改变了外频,会产生异步运行,(台式机很多主板都支持异步运行)这样会造成整个服务器系统的不稳定。

目前的绝大部分电脑系统中外频也是内存与主板之间的同步运行的速度,在这种方式下,可以理解为CPU的外频直接与内存相连通,实现两者间的同步运行状态。外频与前端总线(FSB)频率很容易被混为一谈,下面的前端总线介绍我们谈谈两者的区别。

3.前端总线(FSB)频率

  前端总线(FSB)频率(即总线频率)是直接影响CPU与内存直接数据交换速度。有一条公式可以计算,即数据带宽=(总线频率×数据带宽)/8,数据 传输最大带宽取决于所有同时传输的数据的宽度和传输频率。比方,现在的支持64位的至强Nocona,前端总线是800MHz,按照公式,它的数据传输最 大带宽是6.4GB/秒。

外频与前端总线(FSB)频率的区别:前端总线的速度指的是数据传输的速度,外频是CPU与主板之间同步运行的速度。也就是说,100MHz外频特指数字 脉冲信号在每秒钟震荡一千万次;而100MHz前端总线指的是每秒钟CPU可接受的数据传输量是100MHz×64bit÷8Byte/bit= 800MB/s。

其实现在“HyperTransport”构架的出现,让这种实际意义上的前端总线(FSB)频率发生了变化。之前我们知道IA-32架构必须有三大重要 的构件:内存控制器Hub (MCH) ,I/O控制器Hub和PCI Hub,像Intel很典型的芯片组 Intel 7501、Intel7505芯片组,为双至强处理器量身定做的,它们所包含的MCH为CPU提供了频率为533MHz的前端总线,配合DDR内存,前端 总线带宽可达到4.3GB/秒。但随着处理器性能不断提高同时给系统架构带来了很多问题。而“HyperTransport”构架不但解决了问题,而且更 有效地提高了总线带宽,比方AMD Opteron处理器,灵活的HyperTransport I/O总线体系结构让它整合了内存控制器,使处理器不通过系统总线传给芯片组而直接和内存交换数据。这样的话,前端总线(FSB)频率在AMD Opteron处理器就不知道从何谈起了。

4、CPU的位和字长

  位:在数字电路和电脑技术中采用二进制,代码只有“0”和“1”,其中无论是 “0”或是“1”在CPU中都是 一“位”。

  字长:电脑技术中对CPU在单位时间内(同一时间)能一次处理的二进制数的位数叫字长。所以能处理字长为8位数据的CPU通常就叫8位的CPU。同理 32位的CPU就能在单位时间内处理字长为32位的二进制数据。字节和字长的区别:由于常用的英文字符用8位二进制就可以表示,所以通常就将8位称为一个 字节。字长的长度是不固定的,对于不同的CPU、字长的长度也不一样。8位的CPU一次只能处理一个字节,而32位的CPU一次就能处理4个字节,同理字 长为64位的CPU一次可以处理8个字节。

5.倍频系数

  倍频系数是指CPU主频与外频之间的相对比例关系。在相同的外频下,倍频越高CPU的频率也越高。但实际上,在相同外频的前提下,高倍频的CPU本身 意义并不大。这是因为CPU与系统之间数据传输速度是有限的,一味追求高倍频而得到高主频的CPU就会出现明显的“瓶颈”效应—CPU从系统中得到数据的 极限速度不能够满足CPU运算的速度。一般除了工程样版的Intel的CPU都是锁了倍频的,而AMD之前都没有锁。

6.缓存

  缓存大小也是CPU的重要指标之一,而且缓存的结构和大小对CPU速度的影响非常大,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率 远远大于系统内存和硬盘。实际工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可以大幅度提升CPU内部读取数据的命中率,而不用再到内 存或者硬盘上寻找,以此提高系统性能。但是由于CPU芯片面积和成本的因素来考虑,缓存都很小。

L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大,不过高速缓冲存 储器均由静态RAM组成,结构较复杂,在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做得太大。一般服务器CPU的L1缓存的容量通常在 32—256KB。

  L2 Cache(二级缓存)是CPU的第二层高速缓存,分内部和外部两种芯片。内部的芯片二级缓存运行速度与主频相同,而外部的二级缓存则只有主频 的一半。L2高速缓存容量也会影响CPU的性能,原则是越大越好,现在家庭用CPU容量最大的是512KB,而服务器和工作站上用CPU的L2高速缓存更 高达256-1MB,有的高达2MB或者3MB。

L3 Cache(三级缓存),分为两种,早期的是外置,现在的都是内置的。而它的实际作用即是,L3缓存的应用可以进一步降低内存延迟,同时提升大数据 量计算时处理器的性能。降低内存延迟和提升大数据量计算能力对游戏都很有帮助。而在服务器领域增加L3缓存在性能方面仍然有显著的提升。比方具有较大L3 缓存的配置利用物理内存会更有效,故它比较慢的磁盘I/O子系统可以处理更多的数据请求。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消 息和处理器队列长度。

其实最早的L3缓存被应用在AMD发布的K6-III处理器上,当时的L3缓存受限于制造工艺,并没有被集成进芯片内部,而是集成在主板上。在只能够和系 统总线频率同步的L3缓存同主内存其实差不了多少。后来使用L3缓存的是英特尔为服务器市场所推出的Itanium处理器。接着就是P4EE和至强MP。 Intel还打算推出一款9MB L3缓存的Itanium2处理器,和以后24MB L3缓存的双核心Itanium2处理器。

但基本上L3缓存对处理器的性能提高显得不是很重要,比方配备1MB L3缓存的Xeon MP处理器却仍然不是Opteron的对手,由此可见前端总线的增加,要比缓存增加带来更有效的性能提升。

7.CPU扩展指令集

  CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微 处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)、SEE3和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。我们通常会把 CPU的扩展指令集称为"CPU的指令集"。SSE3指令集也是目前规模最小的指令集,此前MMX包含有57条命令,SSE包含有50条命令,SSE2包 含有144条命令,SSE3包含有13条命令。目前SSE3也是最先进的指令集,英特尔Prescott处理器已经支持SSE3指令集,AMD会在未来双 核心处理器当中加入对SSE3指令集的支持,全美达的处理器也将支持这一指令集。

8.CPU内核和I/O工作电压

  从586CPU开始,CPU的工作电压分为内核电压和I/O电压两种,通常CPU的核心电压小于等于I/O电压。其中内核电压的大小是根据CPU的生 产工艺而定,一般制作工艺越小,内核工作电压越低;I/O电压一般都在1.6~5V。低电压能解决耗电过大和发热过高的问题。

9.制造工艺

  制造工艺的微米是指IC内电路与电路之间的距离。制造工艺的趋势是向密集度愈高的方向发展。密度愈高的IC电路设计,意味着在同样大小面积的IC中, 可以拥有密度更高、功能更复杂的电路设计。现在主要的180nm、130nm、90nm。最近官方已经表示有65nm的制造工艺了。

10.指令集

(1)CISC指令集

  CISC指令集,也称为复杂指令集,英文名是CISC,(Complex Instruction Set Computer的缩写)。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制 简单,但计算机各部分的利用率不高,执行速度慢。其实它是英特尔生产的x86系列(也就是IA-32架构)CPU及其兼容CPU,如AMD、VIA的。即 使是现在新起的X86-64(也被成AMD64)都是属于CISC的范畴。

要知道什么是指令集还要从当今的X86架构的CPU说起。X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,IBM1981年推 出的世界第一台PC机中的CPU—i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加了X87芯片,以后就将 X86指令集和X87指令集统称为X86指令集。

  虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486直到过去的PII至强、PIII至强、Pentium 3,最后到今天的Pentium 4系列、至强(不包括至强Nocona),但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有 CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。由于Intel X86系列及其兼容CPU(如AMD Athlon MP、)都使用X86指令集,所以就形成了今天庞大的X86系列及兼容CPU阵容。x86CPU目前主要有intel的服务器CPU和AMD的服务器 CPU两类。

(2)RISC指令集

  RISC是英文“Reduced Instruction Set Computing ” 的缩写,中文意思是“精简指令集”。它是在CISC指令系统基础上发展起来的,有人对CISC机进行测试表明,各种指令的使用频度相当悬殊,最常使用的是 一些比较简单的指令,它们仅占指令总数的20%,但在程序中出现的频度却占80%。复杂的指令系统必然增加微处理器的复杂性,使处理器的研制时间长,成本 高。并且复杂指令需要复杂的操作,必然会降低计算机的速度。基于上述原因,20世纪80年代RISC型CPU诞生了,相对于CISC型CPU ,RISC型CPU不仅精简了指令系统,还采用了一种叫做“超标量和超流水线结构”,大大增加了并行处理能力。RISC指令集是高性能CPU的发展方向。 它与传统的CISC(复杂指令集)相对。相比而言,RISC的指令格式统一,种类比较少,寻址方式也比复杂指令集少。当然处理速度就提高很多了。目前在中 高档服务器中普遍采用这一指令系统的CPU,特别是高档服务器全都采用RISC指令系统的CPU。RISC指令系统更加适合高档服务器的操作系统 UNIX,现在Linux也属于类似UNIX的操作系统。RISC型CPU与Intel和AMD的CPU在软件和硬件上都不兼容。

目前,在中高档服务器中采用RISC指令的CPU主要有以下几类:PowerPC处理器、SPARC处理器、PA-RISC处理器、MIPS处理器、Alpha处理器。

(3)IA-64

EPIC(Explicitly Parallel Instruction Computers,精确并行指令计算机)是否是RISC和CISC体系的继承者的争论已经有很多,单以EPIC体系来说,它更像Intel的处理器迈向 RISC体系的重要步骤。从理论上说,EPIC体系设计的CPU,在相同的主机配置下,处理Windows的应用软件比基于Unix下的应用软件要好得 多。

Intel采用EPIC技术的服务器CPU是安腾Itanium(开发代号即Merced)。它是64位处理器,也是IA-64系列中的第一款。微软也已 开发了代号为Win64的操作系统,在软件上加以支持。在Intel采用了X86指令集之后,它又转而寻求更先进的64-bit微处理器,Intel这样 做的原因是,它们想摆脱容量巨大的x86架构,从而引入精力充沛而又功能强大的指令集,于是采用EPIC指令集的IA-64架构便诞生了。IA-64 在很多方面来说,都比x86有了长足的进步。突破了传统IA32架构的许多限制,在数据的处理能力,系统的稳定性、安全性、可用性、可观理性等方面获得了 突破性的提高。

IA-64微处理器最大的缺陷是它们缺乏与x86的兼容,而Intel为了IA-64处理器能够更好地运行两个朝代的软件,它在IA-64处理器上 (Itanium、Itanium2 ……)引入了x86-to-IA-64的解码器,这样就能够把x86指令翻译为IA-64指令。这个解码器并不是最有效率的解码器,也不是运行x86代码 的最好途径(最好的途径是直接在x86处理器上运行x86代码),因此Itanium 和Itanium2在运行x86应用程序时候的性能非常糟糕。这也成为X86-64产生的根本原因。

(4)X86-64 (AMD64 / EM64T)

AMD公司设计,可以在同一时间内处理64位的整数运算,并兼容于X86-32架构。其中支持64位逻辑定址,同时提供转换为32位定址选项;但数据操作 指令默认为32位和8位,提供转换成64位和16位的选项;支持常规用途寄存器,如果是32位运算操作,就要将结果扩展成完整的64位。这样,指令中有 “直接执行”和“转换执行”的区别,其指令字段是8位或32位,可以避免字段过长。

x86-64(也叫AMD64)的产生也并非空穴来风,x86处理器的32bit寻址空间限制在4GB内存,而IA-64的处理器又不能兼容x86。 AMD充分考虑顾客的需求,加强x86指令集的功能,使这套指令集可同时支持64位的运算模式,因此AMD把它们的结构称之为x86-64。在技术上 AMD在x86-64架构中为了进行64位运算,AMD为其引入了新增了R8-R15通用寄存器作为原有X86处理器寄存器的扩充,但在而在32位环境下 并不完全使用到这些寄存器。原来的寄存器诸如EAX、EBX也由32位扩张至64位。在SSE单元中新加入了8个新寄存器以提供对SSE2的支持。寄存器 数量的增加将带来性能的提升。与此同时,为了同时支持32和64位代码及寄存器,x86-64架构允许处理器工作在以下两种模式:Long Mode(长模式)和Legacy Mode(遗传模式),Long模式又分为两种子模式(64bit模式和Compatibility mode兼容模式)。该标准已经被引进在AMD服务器处理器中的Opteron处理器。

而今年也推出了支持64位的EM64T技术,再还没被正式命为EM64T之前是IA32E,这是英特尔64位扩展技术的名字,用来区别X86指令集。 Intel的EM64T支持64位sub-mode,和AMD的X86-64技术类似,采用64位的线性平面寻址,加入8个新的通用寄存器(GPRs), 还增加8个寄存器支持SSE指令。与AMD相类似,Intel的64位技术将兼容IA32和IA32E,只有在运行64位操作系统下的时候,才将会采用 IA32E。IA32E将由2个sub-mode组成:64位sub-mode和32位sub-mode,同AMD64一样是向下兼容的。Intel的 EM64T将完全兼容AMD的X86-64技术。现在Nocona处理器已经加入了一些64位技术,Intel的Pentium 4E处理器也支持64位技术。
应该说,这两者都是兼容x86指令集的64位微处理器架构,但EM64T与AMD64还是有一些不一样的地方,AMD64处理器中的NX位在Intel的处理器中将没有提供。

11.超流水线与超标量

  在解释超流水线与超标量前,先了解流水线(pipeline)。流水线是Intel首次在486芯片中开始使用的。流水线的工作方式就象工业生产上的 装配流水线。在CPU中由5—6个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成5—6步后再由这些电路单元分别执行,这样就能实 现在一个CPU时钟周期完成一条指令,因此提高CPU的运算速度。经典奔腾每条整数流水线都分为四级流水,即指令预取、译码、执行、写回结果,浮点流水又 分为八级流水。

超标量是通过内置多条流水线来同时执行多个处理器,其实质是以空间换取时间。而超流水线是通过细化流水、提高主频,使得在一个机器周期内完成一个甚至多个 操作,其实质是以时间换取空间。例如Pentium 4的流水线就长达20级。将流水线设计的步(级)越长,其完成一条指令的速度越快,因此才能适应工作主频更高的CPU。但是流水线过长也带来了一定副作 用,很可能会出现主频较高的CPU实际运算速度较低的现象,Intel的奔腾4就出现了这种情况,虽然它的主频可以高达1.4G以上,但其运算性能却远远 比不上AMD 1.2G的速龙甚至奔腾III。

12.封装形式

  CPU封装是采用特定的材料将CPU芯片或CPU模块固化在其中以防损坏的保护措施,一般必须在封装后CPU才能交付用户使用。CPU的封装方式取决 于CPU安装形式和器件集成设计,从大的分类来看通常采用Socket插座进行安装的CPU使用PGA(栅格阵列)方式封装,而采用Slot x槽安装的CPU则全部采用SEC(单边接插盒)的形式封装。现在还有PLGA(Plastic Land Grid Array)、OLGA(Organic Land Grid Array)等封装技术。由于市场竞争日益激烈,目前CPU封装技术的发展方向以节约成本为主。


13、多线程

同时多线程Simultaneous multithreading,简称SMT。SMT可通过复制处理器上的结构状态,让同一个处理器上的多个线程同步执行并共享处理器的执行资源,可最大限 度地实现宽发射、乱序的超标量处理,提高处理器运算部件的利用率,缓和由于数据相关或Cache未命中带来的访问内存延时。当没有多个线程可用时,SMT 处理器几乎和传统的宽发射超标量处理器一样。SMT最具吸引力的是只需小规模改变处理器核心的设计,几乎不用增加额外的成本就可以显著地提升效能。多线程 技术则可以为高速的运算核心准备更多的待处理数据,减少运算核心的闲置时间。这对于桌面低端系统来说无疑十分具有吸引力。Intel从3.06GHz Pentium 4开始,所有处理器都将支持SMT技术。

14、多核心

多核心,也指单芯片多处理器(Chip multiprocessors,简称CMP)。CMP是由美国斯坦福大学提出的,其思想是将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片 内,各个处理器并行执行不同的进程。与CMP比较, SMT处理器结构的灵活性比较突出。但是,当半导体工艺进入0.18微米以后,线延时已经超过了门延迟,要求微处理器的设计通过划分许多规模更小、局部性 更好的基本单元结构来进行。相比之下,由于CMP结构已经被划分成多个处理器核来设计,每个核都比较简单,有利于优化设计,因此更有发展前途。目前, IBM 的Power 4芯片和Sun的 MAJC5200芯片都采用了CMP结构。多核处理器可以在处理器内部共享缓存,提高缓存利用率,同时简化多处理器系统设计的复杂度。

2005年下半年,Intel和AMD的新型处理器也将融入CMP结构。新安腾处理器开发代码为Montecito,采用双核心设计,拥有最少18MB片 内缓存,采取90nm工艺制造,它的设计绝对称得上是对当今芯片业的挑战。它的每个单独的核心都拥有独立的L1,L2和L3 cache,包含大约10亿支晶体管。

15、SMP

SMP(Symmetric Multi-Processing),对称多处理结构的简称,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结 构。在这种技术的支持下,一个服务器系统可以同时运行多个处理器,并共享内存和其他的主机资源。像双至强,也就是我们所说的二路,这是在对称处理器系统中 最常见的一种(至强MP可以支持到四路,AMD Opteron可以支持1-8路)。也有少数是16路的。但是一般来讲,SMP结构的机器可扩展性较差,很难做到100个以上多处理器,常规的一般是8个 到16个,不过这对于多数的用户来说已经够用了。在高性能服务器和工作站级主板架构中最为常见,像UNIX服务器可支持最多256个CPU的系统。

构建一套SMP系统的必要条件是:支持SMP的硬件包括主板和CPU;支持SMP的系统平台,再就是支持SMP的应用软件。

为了能够使得SMP系统发挥高效的性能,操作系统必须支持SMP系统,如WINNT、LINUX、以及UNIX等等32位操作系统。即能够进行多任务和多 线程处理。多任务是指操作系统能够在同一时间让不同的CPU完成不同的任务;多线程是指操作系统能够使得不同的CPU并行的完成同一个任务。

要组建SMP系统,对所选的CPU有很高的要求,首先、CPU内部必须内置APIC(Advanced Programmable Interrupt Controllers)单元。Intel 多处理规范的核心就是高级可编程中断控制器(Advanced Programmable Interrupt Controllers--APICs)的使用;再次,相同的产品型号,同样类型的CPU核心,完全相同的运行频率;最后,尽可能保持相同的产品序列编 号,因为两个生产批次的CPU作为双处理器运行的时候,有可能会发生一颗CPU负担过高,而另一颗负担很少的情况,无法发挥最大性能,更糟糕的是可能导致 死机。

16、NUMA技术

NUMA即非一致访问分布共享存储技术,它是由若干通过高速专用网络连接起来的独立节点构成的系统,各个节点可以是单个的CPU或是SMP系统。在 NUMA中,Cache 的一致性有多种解决方案,需要操作系统和特殊软件的支持。图2中是Sequent公司NUMA系统的例子。这里有3个SMP模块用高速专用网络联起来,组 成一个节点,每个节点可以有12个CPU。像Sequent的系统最多可以达到64个CPU甚至256个CPU。显然,这是在SMP的基础上,再用 NUMA的技术加以扩展,是这两种技术的结合。

17、乱序执行技术

乱序执行(out-of-orderexecution),是指CPU允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理的技术。这样将根据 个电路单元的状态和各指令能否提前执行的具体情况分析后,将能提前执行的指令立即发送给相应电路单元执行,在这期间不按规定顺序执行指令,然后由重新排列 单元将各执行单元结果按指令顺序重新排列。采用乱序执行技术的目的是为了使CPU内部电路满负荷运转并相应提高了CPU的运行程序的速度。分枝技术: (branch)指令进行运算时需要等待结果,一般无条件分枝只需要按指令顺序执行,而条件分枝必须根据处理后的结果,再决定是否按原先顺序进行。

18、CPU内部的内存控制器

许多应用程序拥有更为复杂的读取模式(几乎是随机地,特别是当cache hit不可预测的时候),并且没有有效地利用带宽。典型的这类应用程序就是业务处理软件,即使拥有如乱序执行(out of order execution)这样的CPU特性,也会受内存延迟的限制。这样CPU必须得等到运算所需数据被除数装载完成才能执行指令(无论这些数据来自CPU cache还是主内存系统)。当前低段系统的内存延迟大约是120-150ns,而CPU速度则达到了3GHz以上,一次单独的内存请求可能会浪费200 -300次CPU循环。即使在缓存命中率(cache hit rate)达到99%的情况下,CPU也可能会花50%的时间来等待内存请求的结束- 比如因为内存延迟的缘故。

你可以看到Opteron整合的内存控制器,它的延迟,与芯片组支持双通道DDR内存控制器的延迟相比来说,是要低很多的。英特尔也按照计划的那样在处理 器内部整合内存控制器,这样导致北桥芯片将变得不那么重要。但改变了处理器访问主存的方式,有助于提高带宽、降低内存延时和提升处理器性能。

Instruction TCM

多层式高速总线内部架构及专用的外设DMA
由于这款 MCU 采用多层总线矩阵的并行机理,因此可以显着提高数据流量。该总线矩阵能把五个高速总线 (AHB) 控制 (包括处理器指令和数据总线、外设直接存取内存 (DMA) 控制器 (peripheral DMA controller, PDC),以及两个用于USB主机和LCD控制器的专用DMA),同时连接到片上外设,以及内置或外置的存储器上。此外,Atmel已经扩展了基于 ARM7 MCU的外设 DMA 控制器,在AT91SAM9261中增加了19条 PDC通道。PDC的作用是为外设及存储器之间传输数据,这样既可分担CPU的工作量,而且也能提高数据传输率,并让ARM9 处理器专注于繁重的计算任务。
大容量片上 SRAM 和灵活的确定过程式TCM 支持机制
AT91SAM9261设有16K字节的数据高速缓存、16K字节的指令/写操作缓存、160K字节的 200 MHz单循环存取SRAM,以及USB器件专用的 2K字节内置式 DPRAM。Atmel 公司充分发挥了 ARM926EJ-S 紧密式耦合内存 (Tightly Coupled Memory, TCM) 构架之优势,让传统 (非高速缓存) SRAM直接连接到ARM 处理器上、而不会出现滞后情况。AT91SAM9261的独立指令和数据缓存能支持WinCE 和 Linux操作系统;而其基于TCM 构架的SRAM区块则是“确定过程式”实时操作系统的理想安排。另一方面,160K字节的片上SRAM可划分成多个16K字节的区块,作为“指令 TCM”、“数据TCM”或片上外设的缓冲,从而让编程人员灵活地优化系统的性能和功耗。

2007年3月22日星期四

WindowsXP下的网络配置文件

再C:\WINDOWS\system32\drivers\etc目录下有几个网络配置文件
hosts
hosts.msn
lmhosts.sam
network
protocol
services

关于volatile关键字的说明以及测试

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如

操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行

优化,从而可以提供对特殊地址的稳定访问。

使用该关键字的例子如下:

int volatile nVint;

当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指

令刚刚从该处读取过数据。而且读取的数据立刻被保存。

例如:

volatile int i=10;
int a = i;
。。。//其他代码,并未明确告诉编译器,对i进行过操作
int b = i;

volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的

汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从i读数据的代码之间

的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新从i里面读。这样以来,如果

i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问

注意,在vc6中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。下面通过插入汇编

代码,测试有无volatile关键字,对程序最终代码的影响:

首先用classwizard建一个win32 console工程,插入一个voltest.cpp文件,输入下面的代码:

#include
void main()
{
int i=10;
int a = i;

printf("i= %d\n",a);
//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
__asm {
mov dword ptr [ebp-4], 20h
}

int b = i;
printf("i= %d\n",b);
}

然后,在调试版本模式运行程序,输出结果如下:
i = 10
i = 32

然后,在release版本模式运行程序,输出结果如下:
i = 10
i = 10

输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。

下面,我们把 i的声明加上volatile关键字,看看有什么变化:


#include
void main()
{
volatile int i=10;
int a = i;

printf("i= %d\n",a);
__asm {
mov dword ptr [ebp-4], 20h
}

int b = i;
printf("i= %d\n",b);
}

分别在调试版本和release版本运行程序,输出都是:
i = 10
i = 32

这说明这个关键字发挥了它的作用!





volatile的本意是“易变的”

由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:

static int i=0;

int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}

/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}

程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能 只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。如果将将变量 加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。

Internet Resouces

1、幽蓝色绿软 http://liujing.qq.topzj.com/ 绿色软件下载论坛

http://www.wapforum.com/index.html

http://www.wapkf.com
WAP开发网

VoIP - SIP
http://www.huisetalage.nl/sip/
http://www.voip-info.org/wiki-Open+Source+VOIP+Software

无法访问blogspot

另外,目前国内似乎还是不能访问blogger,现在提供一个很好的方法,可以正常无错访问blogspot上的博客。

把你以前的blogspot的帐号名写在www.pkblogs.com/后面,譬如我以前的地址是gker.blogspot.com,现在要访问就用这个www.pkblogs.com/gker。经过尝试这个方法可以无错访问到你在blogger上的博客。

另外我们可以使用host大法来访问bloggerbeta:
用记事本打开C:/WINDOWS/system32/drivers/etc/hosts,添加72.14.219.190 beta.blogger.com 就可以了。


Blogger是全球最大的blog供应商,Google的blog。与MSN spaces强大功能相比, Blogger继承了Google简洁明快
的风格,与国内众多的blog provider的内容丰富相比,Blogger还原了blog最纯正最原始的精神。由于某种原因我们在中国不能完全享受
到Blogger的服务,国内无法连接上Blogger的发布服务器*.blogspot.com,幸运的是Blogger支持直接FTP发布,理论上说
就是Blogger用户可以使用自己的空间和域名。但是哪里来的空间和域名呢?Blogger Spaces就是一个全新的为中国的Blogger用户提
供域名和空间的服务。

Blogger Spaces提供50M的静态网页空间,而且还可以绑定你自己的域名:)

申请地址:http://www.bloggerspaces.com/2006/06/blogger-spaces_16.php

演示地址:http://daodao.bloggerspaces.com/

如何将Blogger TO BloggerSpaces

其实也很简单:
申请完bloggerspaces以后 bloggerspaces会发送一封mail到你的邮箱 按步骤申请以后会得到这样一个提示:
Blogger Spaces 激活帐号
欢迎使用我们的服务,你的Blogger Spaces已经成功开通,以下是你的帐号信息:

Web访问地址:http://daodao.bloggerspaces.com

FTP地址:ftp://daodao.bloggerspaces.com

FTP帐号:daodao

FTP密码:*********
----------------------------------------------------
这个时候回到 http://www.blogger.com/

登陆你的blogger帐号,进入控制面板,更改设置,在"发布"选项卡中点击FTP的超级链接,在这里的

FTP服务器:
ftp://******.bloggerspaces.com
BLOG URL:
http://*****.bloggerspaces.com(***就是你注册的帐号,目前好像用户比较少,可以抢注很多短一些的)
FTP路径:
/
blog文件名:
index.html

FTP用户名和密码在邮件中写的很清楚了。


以,根本不需要到blogger spaces这个网站进行任何操作就可以给Blogger一个可以在国内访问的域名。方法就是利用了Blogger程序
内建的ftp发布功能。学校的ftp似乎外网都不能访问,更不说google的服务器啦,过去测试用过swufe的ftp,没有成功。现在这个网站刚好提
供了这个服务,哈哈,该站点正如主页上宣称的: 中国Google Fans的Blogger空间服务器。对于国内不能使用Blogspot的现状来说,
这是个很好的解决方法。

2007年3月21日星期三

Build arm-linux-gdb

gdb-6.6

首先编译arm-linux-gdb
# cd /home/frank/temp/arm-debug
# tar xjvf gdb-6.6.tar.bz2
# mkdir build
# mkdir build-gdb
# cd build-gdb
# ../gdb-6.6/configuration --target=$TARGET --prefix=/home/frank/temp/arm-debug/build
# make
# make install

加入arm-linux环境变量, 将会出现错误

make[2]: Entering directory `/home/frank/temp/arm-debug/gdb-6.6/readline'
rm -f readline.o
gcc -c -DHAVE_CONFIG_H arm-linux- -I. -I.././readline -DRL_LIBRARY_VERSION='"5.1"' -g -O2 readline.c
gcc: arm-linux-: No such file or directory
make[2]: *** [readline.o] Error 1
make[2]: Leaving directory `/home/frank/temp/arm-debug/gdb-6.6/readline'
make[1]: *** [all-readline] Error 2
make[1]: Leaving directory `/home/frank/temp/arm-debug/gdb-6.6'
make: *** [all] Error 2
[frank@aladdin gdb-6.6]$


环境变量设置为
#!/bin/sh
export PREFIX=/usr/local/arm/3.2.3
export TARGET=arm-linux
#export HOST=arm
export PATH=$HOME/cross-arm/cross_LR3615/arm-linux/bin:$PATH
export KERNEL_DIR=$(pwd)/svn_ipcam/ipcam/trunk/LR3615_BII/kernel/linux-2.4.26
export CROSS_COMPILE=arm-linux-

不设置arm-linux环境变量, 编译可以通过. 两种方式生成的Makefile是一样的

使用gdb-6.3调试arm中的core dump, 无法看到符号信息, 而gdb-6.6版本是可以的

需要查看是哪个环境变量导致的问题
逐个加入环境变量, 运行make clean; make都可以编译通过, 由此推断出是在configuration时出的问题

检查readline/Makefile(设置环境变量时), 里面有
DEFS = -DHAVE_CONFIG_H arm-linux-

在设置环境变量之前做configuration, readline/Makefile内容为:
DEFS = @DEFS@ @CROSS_COMPILE@
LOCAL_DEFS = @LOCAL_DEFS@

由此可见是环境变量CROSS_COMPILE导致的问题
将export CROSS_COMPILE=arm-linux-注释掉, 重新设置环境变量, 再运行configuration
# ./configuration --target=$TARGET --prefix=/home/frank/test/arm-debug/build
# make

即可编译成功

总结:
编译arm版本gdb时, 不要加CROSS_COMPILE环境变量, 否则编译时会出现"gcc: arm-linux-: No such file or directory"错误.

接下来编译gdbserver
# cd /home/frank/temp/arm-debug
# cd build
# mkdir arm-linux
# cd ../../
# mkdir build_gdbserver
# cd build_gdbserver
# CC=arm-linux-gcc ../gdb-6.6/gdb/gdbserver/configure --host=$TARGET --prefix=/home/frank/temp/arm-debug/build/arm-linux
# make
# make install

然后将build目录下的东东copy到tools chain即可
# cd build
# find ./ -mount -print | cpio -pdm $PREFIX

在使用gdb时, 最好使用LD选项最好使用-static选项, 用静态链接的方式生成可执行文件, 否则在gdb中无法看到符号信息.

POXIS Thread

创建线程
struct sockets {
int local;
FILE *in, *out;
};

{
struct sockets s;
s.local = 1;
s.in = stdin;
s.out = stdout;
 pthread_create(&p, NULL, roll_dice, (void *) &s);
}
pthread_create() 将接受一个 void * 类型的参数,这个参数会被传到线程开始执行的那个函数中去。这样允许您创建一个任意复杂的数据结构,并将它作为一个指针传送给需要在这个数据结构上进行操作的线程。

线程函数对参数的处理
/* read dice on standard input, write results on standard output */
void *roll_dice(void *v) {
struct sockets *s = v;
char inbuf[512];

/* think globally, program defensively */
if (!s || !s->out || !s->in)
return NULL;

fprintf(s->out, "enter die rolls, or q to quit\n");
...
}
http://www.ibm.com/developerworks/cn/linux/l-pthred/index.html

pthreads 的基本用法


pthread_exit 线程终止
#include
void pthread_exit(void *value_ptr);
pthread_exit()函数将终止调用线程, 并使value_ptr值对任何与结束的线程成功结合(的线程)可用. 任何取消清除的已经压入并还没有压出的处理将以与压入相反的顺序压出并执行. 在所有取消清除的操作执行完毕后, 如果线程还有任何线程特定的数据, 相应的销毁函数将以不确定的顺序被调用. 线程终止并不释放任何应用程序可见进程资源, 包括, 但不仅仅是, 互斥和文件描述符, 它也不会执行任何进程级的清除操作, 包括, 但不限于, 调用任何可能退出的atexit()函数.

调用pthread_exit()的一个应用是当一个除了在第一次在main()调用的线程从用于创建它的起始程序中返回. 函数的返回值应用于线程的退出状态.

pthread_exit()如果从取消清除操作或作为隐式或显式的调用结果的销毁函数中调用, 其行为是不明确的.

在一个线程终止后, 线程内部的本地(自动)变量获取的结果是不明确的. 这样, 参考退出线程的本地变量不能作为pthread_exit() value_ptr参数值使用.

进程应该在最后一个线程终止后以带有0退出状态退出. 这种行为就像在线程终止时使用带有zero参数值的exit().

pthread_exit()--Terminate Calling Thread


Syntax:
 #include 
void pthread_exit(void *status);
Threadsafe: Yes

Signal Safe: No

The pthread_exit() function terminates the calling thread, making its exit status available to any waiting threads. Normally, a thread terminates by returning from the start routine that was specified in the pthread_create() call which started it. An implicit call to pthread_exit() occurs when any thread returns from its start routine. (With the exception of the initial thread, at which time an implicit call to exit() occurs). The pthread_exit() function provides an interface similar to exit() but on a per-thread basis.

Note that in the OS/400 implementation of threads, the initial thread is special. Termination of the initial thread by pthread_exit() or any thread termination mechanism terminates the entire process.

The following activities occur in this order when a thread terminates by a return from its start routine or pthread_exit() or thread cancellation:

  1. Any cancellation cleanup handlers that have been pushed and not popped will be executed in reverse order with cancellation disabled.
  2. Data destructors are called for any thread specific data entries that have a non NULL value for both the value and the destructor.
  3. The thread terminates.
  4. Thread termination may possibly cause the system to run OS/400 cancel handlers (registered with the #pragma cancel_handler directive), or C++ destructors for automatic objects.
  5. If thread termination is occurring in the initial thread, it will cause the system to terminate all other threads, then run C++ static object destructors, activation group cleanup routines and atexit() functions.
  6. Any mutexes that are held by a thread that terminates, become `abandoned' and are no longer valid. Subsequent calls by other threads that attempt to acquire the abandoned mutex though pthread_mutex_lock() will deadlock. Subsequent calls by other threads that attempt to acquire the abandoned mutex through pthread_mutex_trylock() will return EBUSY.
  7. No release of any application visible process resources occur. This includes but is not limited to mutexes, file descriptors, or any process level cleanup actions.

Do not call pthread_exit() from a cancellation cleanup handler or destructor function that was called as a result of either an implicit or explicit call to pthread_exit(). If pthread_exit() is called from a cancellation cleanup handler, the new invocation of pthread_exit() will continue cancellation cleanup processing using the next cancellation cleanup handler that was pushed. If pthread_exit() is called from a data destructor, the new invocation of pthread_exit() will skip all subsequent calls to any data destructors (regardless of the number of destructor iterations that have completed), and terminate the thread.

Cleanup handlers and data destructors are not called when the application calls exit() or abort() or otherwise terminates the process. Cleanup handlers and data destructors are not called when a thread terminates by any proprietary OS/400 mechanism other than the Pthread interfaces.

The meaning of the status parameter is determined by the application except for the following conditions:

  1. When the thread has been canceled using pthread_cancel(), the exit status of PTHREAD_CANCELED will be made available.
  2. When the thread has been terminated as a result of an unhandled OS/400 exception, operator intervention or other proprietary OS/400 mechanism, the exit status of PTHREAD_EXCEPTION_NP will be made available.

No address error checking is done on the status parameter. Do not call pthread_exit() with, or return the address of, a variable in a threads automatic storage. This storage will be unavailable after the thread terminates.

Note: If pthread_exit() is called by application code after step 3 in the above list, pthread_exit() will fail with the CPF1F81 exception. This indicates that the thread is already considered terminated by the system, and pthread_exit() cannot continue. If your code does not handle this exception, it will appear as if the call to pthread_exit() was successful.


Authorities and Locks

None.


Parameters

status
(Input) exit status of the thread

Return Value

pthread_exit() does not return.


Error Conditions

None.


Related Information

Core Dump

Core Dump?!

何谓 core?
    在使用半导体作为内存的材料前,人类是利用线圈当作内存的材料(发明 者为王安),线圈就叫作 core ,用线圈做的内存就叫作 core memory。如今 ,半导体工业澎勃发展,已经没有人用 core memory 了,不过,在许多情况下, 人们还是把记忆体叫作 core 。
何谓 core dump?
    我们在开发(或使用)一个程序时,最怕的就是程序莫明其妙地当掉。虽然系 统没事,但我们下次仍可能遇到相同的问题。于是这时操作系统就会把程序当掉 时的内存内容 dump 出来(现在通常是写在一个叫 core 的 file 里面),让 我们或是 debugger 做为参考。这个动作就叫作 core dump。
为何会发生 core dump?
    前面说过,在程序当掉时出错。在 C/C++语言中,最常发生错误的地方就是指 针有问题。您可以利用 core 文件和 debugger 把错误找出来(要怎麽在 debugger 中使用 core 文件?man 一下 gdb 吧!)。
我可以把 core 文件删掉吗?
    如果你不会、不能、不需要修改程序,那就放心地把它删除了吧!
要怎麽才不会让 core 文件出现?
    如果用的是tcsh的话, 以试著在 .tcshrc 里加一行:
    limit coredumpsize 0
    如果用的是bash的话, 在/etc/profile里加上(或者修改)一条:
    ulimit -c 0
有一招, 可以让你看出 core 最好用的地方 :)

gdb -c core, 进去後打 where, 就可以 show 出你是在程序哪一行当掉的, 还有在当掉时在哪个 function 里, 这个 function 是被哪个 function 所 call 的, 而这个 function 又是被哪个 function 所 call 的.... 一直到 main()

由这个信息, 可以找出五六成的 bug........ 屡试不爽

但, 先决条件, 当你在 compile 时必须把 debug information 的选项打开 不然, 就会出现一大堆你看不懂的东西,而不是你喜欢的源程序。

在编程的过程中,不可避免地会有一误操作,当然这些误操作编译器是不知道的,你运行gcc命令编译程序,编译通过了生成可运行程序了。这个程序虽然可以运行了,但可能是不正常的。
比如有的程序只顾着打开文件却不关闭文件,因为操作系统会为每个打开的文件分配一个句柄(file descriptor),这样的程序长久运行下去必然导致打开的文件句柄超出系统资源限制。超出系统资源限制的后果可能不仅仅影响到当前用户,整个系统都可能会受影响。
又比如有些程序,比如下面的代码:

#include
#include
#include
#include
int main()
{
while(1) if(fork() <>
这段代码虽然编译完全正确,也能运行。但它会导致系统死机,因为它不断产生进程,每产生一个进程,系统必然耗费一些资源,最终导致系统资源耗尽而死机。
作为一个初学者,编程过程中发生这些失误再所难免,但如果因为这样的错误就导致我们要不断重新启动计算机,甚至不小心丢失一些还未来得及保存的数据,那就可惜了。
Linux系统中提供了一些保护机制,我们可以避免不必要的麻烦。其中bash提供这样一个ulimit命令就可以用来帮助我们实现资源配置的目的。查看bash手册可以看到这些:
ulimit [-SHacdefilmnpqrstuvx [limit]]
Provides control over the resources available to the shell and to processes started by it, on systems that allow such con‐
trol. The -H and -S options specify that the hard or soft limit is set for the given resource. A hard limit cannot be
increased once it is set; a soft limit may be increased up to the value of the hard limit. If neither -H nor -S is speci‐
fied, both the soft and hard limits are set. The value of limit can be a number in the unit specified for the resource or
one of the special values hard, soft, or unlimited, which stand for the current hard limit, the current soft limit, and no
limit, respectively. If limit is omitted, the current value of the soft limit of the resource is printed, unless the -H
option is given. When more than one resource is specified, the limit name and unit are printed before the value. Other
options are interpreted as follows:
-a All current limits are reported
-c The maximum size of core files created
-d The maximum size of a process’s data segment
-e The maximum scheduling priority (‘nice’)
-f The maximum size of files created by the shell
-i The maximum number of pending signals
-l The maximum size that may be locked into memory
-m The maximum resident set size
-n The maximum number of open file descriptors (most systems do not allow this value to be set)
-p The pipe size in 512-byte blocks (this may not be set)
-q The maximum number of bytes in POSIX message queues
-r The maximum rt priority
-s The maximum stack size
-t The maximum amount of cpu time in seconds
-u The maximum number of processes available to a single user
-v The maximum amount of virtual memory available to the shell
-x The maximum number of file locks

If limit is given, it is the new value of the specified resource (the -a option is display only). If no option is given,
then -f is assumed. Values are in 1024-byte increments, except for -t, which is in seconds, -p, which is in units of
512-byte blocks, and -n and -u, which are unscaled values. The return status is 0 unless an invalid option or argument is
supplied, or an error occurs while setting a new limit.
这是一个bash内嵌命令(要通过man bash命令才能查看到)。用来设置当前shell及其开启的进程可使用的资源的。
你可以用下列命令试一下:
ulimit -a
这个命令显示所有当前资源限制情况。
限制有两种,一种是软限制(soft limit),另一种是硬限制(hard limit)。比如:
ulimit -S -f 1024
这个命令将限制当前shell创建的文件大小为1024K,所以你可能没办法产生一个超过1M的文件。但这是软限制。
又比如:
ulimit -H -u 100
这个命令将设置系统中当前用户能够开启的进程最多为100个,所以这一设置上面那个fork程序就不会让系统死机了。

软限制是可以突破的,而硬限制是不能突破的,软限制还可以突破到硬限制设定的值来。

用ulimit的另外一个好处就是设置系统资源以满足进行特定测试。
比如我们想要调试程序,可能有些系统默认是限制产生core dump文件的,而我们知道,core dump文件是我们调试程序的一个很有用的帮助文件,根据core dump文件提供的信息,我们可以比较快地定位到程序的bug。
如果用命令:
ulimit -c
看到的是0,则说明系统限制了产生core dump,我们可以设定一个文件大小以产生core dump文件。比如:
ulimit -c 1024
将设置允许产生的core dump文件最大为1024K
当然我们也可以设置为
ulimit -c unlimited
表示不限制产生的core dump文件的大小。


2007年3月20日星期二

Debugging On Linux

http://www.ibm.com/developerworks/cn/linux/sdk/l-debug/index.html
Linux调试技术

Valgrind目前不支持ARM CPU
http://valgrind.org/info/platforms.html

http://www.dwheeler.com/flawfinder/
Flawfinder 是一款用Python编写的c、c++程序安全审核工具,可以检查潜在的安全风险。它通过搜索检测文件源代码从而得到潜在的安全漏洞,支持检测数据库,以HTML格式生成报告。

2007年3月17日星期六

电脑测试工具软件


http://www.cpuid.com/cpuz.php
Cpu-Z 是一款家喻户晓的CPU检测软件,除了使用Intel或AMD自己的检测软件之外,我们平时使用最多的此类软件就数它了。它支持的CPU种类相当全面,软 件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用 原厂软件。

Applications
BAPCO SYSMark 2004 SE

Synthetics
Futuremark PCMark 2005_1.2.0
Futuremark 3DMark 2006_1.1.0

3D-Games
Company of Heroes_1.4
F.E.A.R.:Extraction Point_1.0

Prey_1.2
Serious Sam 2_2.070

2007年3月10日星期六

睡前必须做到的六件事

  (一)刷牙洗脸擦身
  睡前刷牙比早晨更重要,不仅可清除口腔积物,并且有利于保护牙齿,对安稳入睡也有帮助;电视看完后,洗洗脸、擦擦身,以保护皮肤清洁,使睡眠舒适、轻松。
  纠错>>>用温水洗脸并不可取?
  (二)梳头
  古医家探明头部穴位较多,通过梳理,可起到按摩、刺激作用,能平肝、熄风、开窍守神、止痛明目等。
[被屏蔽广告]早晚用双手指梳到头皮发红、发热,可疏通头部血流,提高大脑思维和记忆能力,促进发根营养,保护头发,减少脱发,消除大脑疲劳,早入梦乡。
  解惑>>>怎样梳头最有利于健康
  (三)散步
  心静气地散步10-20分钟,这会使血液循环到体表,入睡后皮肤能得到"活生生"的保养。躺下后不看书报,不考虑问题,使大脑的活动减少,较快地进入睡眠。
  答疑>>>每天何时散步最科学?
  (四)喝杯加蜜牛奶
  古代民间流传这样一句话:"朝朝盐汤,暮暮蜜。"就是说早喝淡盐开水,晚饮蜜糖水。据国外医学专家研究,牛奶中含有促进睡眠的L-色氨酸。睡前1小时喝杯加蜜的牛奶,可助眠。蜂蜜则有助于整夜保持血糖平衡,从而避免早醒,尤其对经常失眠的老年人更佳。
  警惕>>>牛奶连袋加热有何危害
  (五)开窗通气
  保持寝室内空气新鲜,风大或天冷时,可开一会儿,睡前再关好,有助于睡得香甜。但注意睡时不要用被蒙头。
  误区>>>清晨起床宜开窗通风吗
  (六)洗(搓)脚
  民谚曰,"睡前烫烫脚,胜服安眠药"、"睡前洗脚,胜服补药"、"养树护根,养人护脚"等等。早在1400多年前孙思邈就提出寒从脚上起的见解,"病从脚上来,双脚如树根,治脚治全身……。"国外医学家把脚称为"人体第二心脏"、"心之泵",十分推祟脚的保健作用。祖国医学认为,脚上的60多个穴位与五脏六腑有着十分密切的联系。若能养成每天睡觉前用温水(40-50℃)洗脚、按摩脚心和脚趾,可起到促进气血运行、舒筋活络、阴阳恢复平衡状态的作用。对老年人来说,更具有祛病健身的功效。
  前人对洗脚的作用早有肯定:春天洗脚,升阳固脱;夏天洗脚,暑湿可祛;秋天洗脚,肺润肠濡;冬天洗脚,丹田温灼。
  养生>>>洗脚 也是一种“进补”

冬季补肾最棒的一道菜

开场白:食物与人的肾功能之间存在着重要的依存关系。传统医学和现代医学都认为通过一定的膳食选择可以达到补肾功效,这里推荐一道适合冬季补肾的美味佳肴……【保健常识论坛

  单吃羊肉已经具有一定的补肾效果,如果配合海参食用,则属于“强强联手”不仅效果加倍,还不会上火。
  海参是海味食品,它富含蛋白质、粗脂肪、碳水化合物、氨基酸、钙、磷、铁、碘、维生素等营养成分,胆固醇的含量则几乎为零。而且海参肉质细嫩,又富有弹性,滋味鲜美爽口,是极好的滋补品。海参能补肾壮阳,益气滋阴,适用于精血亏虚,阴虚便秘者。在寒冷的冬天,用海参加羊肉煲成的羊肉海参汤做法简便,味道鲜美,非常适合进补食用。

  材料:水发海参20克,羊肉100克,葱、姜、盐适量。
  做法:海参和羊肉切成薄片。锅内水烧开后加入葱、姜煮片刻,放入海参、羊肉,煮熟调味即可。
  功效:滋补肾虚,用于治疗肾虚所引发的一系列疾病,如:小便疼痛、体虚乏力等。
具有补肾功能的食物
  虾、泥鳅、驴肉、牡蛎、鹌鹑、鸡蛋、鸽肉、蛇肉、韭菜、荔枝、麻雀、羊肾、枸杞、麻雀蛋、淡菜
  补肾良方大搜罗:
  花样韭菜补肾佳品 水果桑椹补肾养胃 补肾益肺胡桃粥 养肾补肾的药酒小偏方
眼下市场上,补肾壮阳药品五花八门,令人不知所从。一些中老年人往往盲目轻信其夸大的广告说词,购买了这类“无批文、无配方、无厂家”的廉价补肾产品……>>>人人易犯的补肾四大错
  长期以来医学界一直认为补充雌激素是改善女性更年期综合征的最好方法。然而最新研究发现,“雌激素替代疗法”有增加女性心血管、中风,甚至乳腺癌等疾病患病几率…… >>>更年期别忘记补肾

2007年3月9日星期五

Attitude

想仅仅凭着熟练的技能和勤恳的工作,就在职场游刃有余,未免天真了……

俗话说得好:会干的不如会说的。你想仅仅凭着熟练的技能和勤恳的工作,就在职场游刃有余、出人头地,未免有些天真了。虽然能力加勤奋很重要,但会说话,却能让你工作起来更轻松,并且可能帮助你加薪、升职。

1、应答上司交代的工作:我立即去办。

冷静、迅速地做出这样的回应,会让上司直观地感觉你是一个工作讲效率、处理问题果断,并且服从领导的好下属。如果你犹豫不决,只会让上司不快,会给上司留下优柔寡断的印象,下次重要的机会可能就轮不到你了。

2、传递坏消息时:我们似乎碰到一些情况……

一笔业务出现麻烦,或市场出现危机,如果你立刻冲到上司的办公室报告这个坏消息,就算不关你的事,也会让上司怀疑你对待危机的能力,弄不好还会惹得上司的责骂,成为出气筒。

正确的方式是你可以从容不迫地说:我们似乎碰到一些情况……千万不要乱了阵脚,要让上司觉得事情并没有到不可收拾的地步,并且感到你会与他并肩作战,解决问题。

3、体现团队精神:XX的主意真不错!

小马的创意或设计得到了上司的欣赏,虽然你心里为自己不成功的设计而难过,甚至有些妒忌,你还是要在上司的听力范围内夸夸小马:小马的主意真不错。在明争暗斗的职场,善于欣赏别人,会让上司认为你本性善良,并富有团队精神,从而给你更多的信任。

4、如果你不知道某件事:让我再认真地想一想,2点前答复您好吗?

上司问了你某个与业务有关的问题,你不知道如何作答,千万不要说“不知道”。而“让我再认真地想一想,2点前答复您好吗?”不仅暂时让你解围,也让上司认为你不轻率行事,而是个三思而后行的人。当然,要记得按时给出答复。

5、请同事帮忙:这个策划没有你真不行啊!

有个策划,你一个人搞不定,得找个比较内行的人帮忙,怎么开口呢?你可以诚恳地说:这个策划没有你真不行啊!同事为了不负自己内行的形象,通常是不会拒绝的。当然,事后要记得感谢人家。

6、拒绝黄段子:这种话好像不适合在办公室讲哦!

男人有时总喜欢说些黄段子,并且不大注意场合。如果女同事无法忍受,这句话可以让他们识趣地闭嘴。

7、减轻工作量:我知道这件事很重要,我们不妨先排一排手头的工作,按重要性排出先后顺序。

首先,强调你了解这项工作的重要性,然后请求上司指示,将这项工作与其它工作一起排出先后顺序,不露痕迹地让上司知道你的工作量其实很大,如果不是非你不可,有些事就可交给其他人或延期处理。

8、承认过失:是我一时疏忽,不过幸好……

犯错误在所难免,所以勇于承认自己的过失很重要,推卸责任只会使你错上加错。不过,承认过失也有诀窍,就是不要让所有的错误都自己扛,这句话可以转移别人的注意力,淡化你的过失。

9、打破冷场的话题:我很想知道您对这件事的看法……