锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一区二区三区四区在线观看,欧美电影在线观看,亚洲一区二区欧美http://m.shnenglu.com/zjl-1026-2001/zh-cnSun, 16 Nov 2025 14:19:57 GMTSun, 16 Nov 2025 14:19:57 GMT60緗楀畫姹?/title><link>http://m.shnenglu.com/zjl-1026-2001/archive/2010/04/19/112951.html</link><dc:creator>娌欐紶閲岀殑嫻瘋睔</dc:creator><author>娌欐紶閲岀殑嫻瘋睔</author><pubDate>Mon, 19 Apr 2010 00:30:00 GMT</pubDate><guid>http://m.shnenglu.com/zjl-1026-2001/archive/2010/04/19/112951.html</guid><wfw:comment>http://m.shnenglu.com/zjl-1026-2001/comments/112951.html</wfw:comment><comments>http://m.shnenglu.com/zjl-1026-2001/archive/2010/04/19/112951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/112951.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zjl-1026-2001/services/trackbacks/112951.html</trackback:ping><description><![CDATA[涓繪枡錛?br>鐗涜倝錛屽湡璞?涓紝鑳¤悵鍗?鏍癸紝媧嬭懕銆佽姽鑿溿佸渾鐧借彍銆佽タ綰㈡熆鍚勯傞噺錛岃タ綰㈡熆閰卞皯閲忋?br><br>鍋氭硶錛?br>1銆佸皢鐗涜倝媧楀噣鍒囧潡鍏ラ攨錛岄攨閲屽姞姘淬傜叜寮浠ュ悗錛屾拠鍘繪誕娌紝杞皬鐏參鐐栦袱涓皬鏃跺乏鍙熾?br><br>2銆佸湡璞嗐佹磱钁卞垏鍧楋紝鑳¤悵鍗滃幓鐨垏鍧楋紝鑺硅彍鏂滅潃鍒囨錛屽渾鐧借彍鍒囧ぇ鐗囥?br><br>3銆佸皢鎵鏈夌殑钄彍閮芥斁鍏ラ攨閲岋紝澶х伀鐑у紑鍚庤漿灝忕伀鎺ョ潃鐐栥?br><br>4銆佽タ綰㈡熆鍒囦竵錛屽彟璧蜂竴閿呯儹娌癸紝鍊掑叆瑗跨孩鏌夸竵鍜岃タ綰㈡熆閰辯炕鐐掕嚦瑗跨孩鏌夸竵鐔熺儌浠ュ悗錛屽掑叆<br>姹ら攨閲岋紝鍔犵洂璋冨懗錛屽啀鐐栦竴涓皬鏃跺乏鍙沖嵆鍙? <img src ="http://m.shnenglu.com/zjl-1026-2001/aggbug/112951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zjl-1026-2001/" target="_blank">娌欐紶閲岀殑嫻瘋睔</a> 2010-04-19 08:30 <a href="http://m.shnenglu.com/zjl-1026-2001/archive/2010/04/19/112951.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍐嶈皥QQ娓告垙鐧句竾浜哄湪綰跨殑鎶鏈疄鐜幫細璐熻澆鍧囪 ---澶у瀷鍦ㄧ嚎緋葷粺瀹炵幇鐨勫叧閿?/title><link>http://m.shnenglu.com/zjl-1026-2001/archive/2010/04/16/112755.html</link><dc:creator>娌欐紶閲岀殑嫻瘋睔</dc:creator><author>娌欐紶閲岀殑嫻瘋睔</author><pubDate>Fri, 16 Apr 2010 03:38:00 GMT</pubDate><guid>http://m.shnenglu.com/zjl-1026-2001/archive/2010/04/16/112755.html</guid><wfw:comment>http://m.shnenglu.com/zjl-1026-2001/comments/112755.html</wfw:comment><comments>http://m.shnenglu.com/zjl-1026-2001/archive/2010/04/16/112755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/112755.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zjl-1026-2001/services/trackbacks/112755.html</trackback:ping><description><![CDATA[鏈枃浣滆咃細sodme<br>鏈枃鍑哄錛歨ttp://blog.csdn.net/sodme<br>澹版槑錛氭湰鏂囧彲浠ヤ笉緇忎綔鑰呭悓鎰忎換鎰忚漿杞斤紝浣嗕換浣曞鏈枃鐨勫紩鐢ㄩ兘欏繪敞鏄庝綔鑰呫佸嚭澶勫強姝ゅ0鏄庝俊鎭傝阿璋紒錛?br><br>銆銆瑕佷簡瑙f綃囨枃绔犱腑寮曠敤鐨勬湰浜哄啓鐨勫彟涓綃囨枃绔狅紝璇峰埌浠ヤ笅鍦板潃錛?br><a href="http://m.shnenglu.com/zjl-1026-2001/archive/2009/08/15/93427.html">http://m.shnenglu.com/zjl-1026-2001/archive/2009/08/15/93427.html</a><br><br><br>浠ヤ笂鐨勮繖綃囨枃绔犳槸鏃╁湪鍘誨勾鐨勬椂鍊欏啓鐨勪簡錛屽綋鏃舵鍦ㄤ綔浼戦棽騫沖彴錛屼竴鐩村湪鎯崇潃濡備綍瀹炵幇涓涓彲鎵╁厖鐨勬敮鎸佺櫨涓囦漢鍦ㄧ嚎鐨勬父鎴忓鉤鍙幫紝鍚庢潵鎬濊礬鏈変簡錛屽氨鍐欎簡閭g瘒鎬葷粨銆傛枃绔犵殑鎰忔濓紝閲嶇偣鍦ㄤ簬闃愯堪涓涓櫨涓囩駭鍦ㄧ嚎鐨勭郴緇熸槸濡備綍瀹炴柦鐨勶紝鍊掓病鐪熸璁ょ湡鍦拌冨療榪嘠Q娓告垙鍒板簳鏄笉鏄偅鏍峰疄鐜扮殑銆?br><br>銆銆榪戞棩鍦ㄤ笌涓氬唴浜哄+璁ㄨ鏃訛紝鎻愬埌QQ娓告垙鐨勫疄鐜版柟寮忓茍涓嶆槸鎴戝師鏉ユ墍鎯崇殑閭f牱錛屼簬鏄紝浠婂ぉ鍙堣鐪熸姄浜嗕竴涓婹Q娓告垙鐨勫寘錛岀粨鏋滅‘濡傝繖浣嶅厔寮熸墍璦錛孮Q娓告垙鐨勬灦鏋勪笌鎴戝綋鍒濇墍璁炬兂鐨勯偅涓灦鏋勭浉宸‘瀹炰笉灝忋備笅闈紝鎴戦噸鏂扮粰鍑篞Q鐧句竾綰у湪綰跨殑鎶鏈疄鐜版柟妗堬紝騫朵互姝ゅ睍寮錛岃皥璋堝ぇ鍨嬪湪綰跨郴緇熶腑鐨勮礋杞藉潎琛℃満鍒剁殑璁捐銆?br><br>銆銆浠嶲Q娓告垙鐨勭櫥褰曞強娓告垙榪囩▼鏉ョ湅錛孮Q娓告垙涓紝涔熻嚦灝戝垎涓轟笁綾?a class=mykeyword title=http://www.doserver.net/tag.php?tag=%E6%9C%8D%E5%8A%A1%E5%99%A8 target=_blank><u><font color=#810081>鏈嶅姟鍣?/font></u></a>銆傚畠浠槸錛?br>銆銆絎竴灞傦細鐧婚檰/璐﹀彿鏈嶅姟鍣?Login Server)錛岃礋璐i獙璇佺敤鎴瘋韓浠姐佸悜瀹㈡埛绔紶閫佸垵濮嬩俊鎭紝浠嶲Q鑱婂ぉ杞歡鐨勫皝鍖呭父璇嗘潵鐪嬶紝榪欎簺鍒濆淇℃伅鍙兘鍖呮嫭“浼氳瘽瀵嗛挜”姝ょ被鐨勪俊鎭紝浠ュ悗瀹㈡埛绔笌鍚庣畫鏈嶅姟鍣ㄧ殑閫氫俊灝變嬌鐢ㄦ浼氳瘽瀵嗛挜榪涜韜喚楠岃瘉鍜屼俊鎭姞瀵嗭紱<br>銆銆絎簩灞傦細澶у巺鏈嶅姟鍣?浼頒笖榪欎箞鍙惂, Game Hall Server)錛岃礋璐e悜瀹㈡埛绔紶閫掑綋鍓嶆父鎴忎腑鐨勬墍鏈夋埧闂翠俊鎭紝榪欎簺鎴塊棿淇℃伅鍖呮嫭錛氬悇鎴塊棿鐨勮繛鎺P錛孭ORT錛屽悇鎴塊棿鐨勫綋鍓嶅湪綰夸漢鏁幫紝鎴塊棿鍚嶇О絳夌瓑銆?br>銆銆絎笁灞傦細娓告垙閫昏緫鏈嶅姟鍣?Game Logic Server)錛岃礋璐e鐞嗘埧闂撮昏緫鍙婃埧闂村唴鐨勬瀛愰昏緫銆?br><br>銆銆浠庨潤鎬佺殑琛ㄨ堪鏉ョ湅錛屼互涓婄殑涓夊眰緇撴瀯浼間箮涓庢垜浠ュ墠鍐欑殑閭g瘒鏂囩珷鐩告瘮騫舵病鏈夊お澶х殑鍖哄埆錛屼簨瀹炰笂錛岄噸鐐規槸瀹冪殑宸ヤ綔嫻佺▼錛孮Q娓告垙鐨勯氫俊嫻佺▼涓庢垜浠ュ墠鐨勮鎯沖彲璋撳ぇ鐩稿緞搴紝鍏惰璁℃濇兂鍜屾妧鏈按騫崇‘瀹為潪甯鎬紭縐銆傚叿浣撴潵璇達紝QQ娓告垙鐨勯氫俊榪囩▼鏄繖鏍風殑錛?br><br>銆銆1.鐢盋lient鍚慙ogin Server鍙戦佽處鍙峰強瀵嗙爜絳夌櫥褰曟秷鎭紝Login Server鏍規嵁鏍¢獙緇撴灉榪斿洖鐩稿簲淇℃伅銆傚彲浠ヨ鎯崇殑鏄紝濡傛灉Login Server閫氳繃浜咰lient鐨勯獙璇侊紝閭d箞瀹冧細閫氱煡鍏跺畠Game Hall Server鎴栧皢閫氳繃楠岃瘉鐨勬秷鎭互鍙婁細璇濆瘑閽ユ斁鍦℅ame Hall Server涔熷彲浠ュ彇鍒扮殑鍦版柟銆傛諱箣錛孡ogin Server涓嶨ame Hall Server涔嬮棿鏄彲浠ュ叡浜繖涓牎楠屾垚鍔熸秷鎭殑銆備竴鏃lient鏀跺埌浜哃ogin Server榪斿洖鎴愬姛鏍¢獙鐨勬秷鎭悗錛孡ogin Server浼氫富鍔ㄦ柇寮涓嶤lient鐨勮繛鎺ワ紝浠ヨ吘鍑簊ocket璧勬簮銆侺ogin Server鐨処P淇℃伅錛屾槸瀛樻斁鍦≦QGame\config\QQSvrInfo.ini閲岀殑銆?br><br>銆銆2.Client鏀跺埌Login Server鐨勬牎楠屾垚鍔熺瓑娑堟伅鍚庯紝寮濮嬫牴鎹簨鍏堥夊畾鐨勬父鎴忓ぇ鍘呭叆鍙g櫥褰曟父鎴忓ぇ鍘咃紝鍚勪釜娓告垙澶у巺Game Hall Server鐨処P鍙奝ort淇℃伅錛屾槸瀛樻斁鍦≦QGame\Dirconfig.ini閲岀殑銆侴ame Hall Server鏀跺埌瀹㈡埛绔疌lient鐨勭櫥褰曟秷鎭悗錛屼細鏍規嵁涓瀹氱殑絳栫暐鍐沖畾鏄惁鎺ュ彈Client鐨勭櫥褰曪紝濡傛灉褰撳墠鐨凣ame Hall Server宸茬粡鍒頒簡涓婇檺鎴栨殏鏃朵笉鑳藉鐞嗗綋鍓嶇帺瀹剁櫥褰曟秷鎭紝鍒欑敱Game Hall Server鍙戞秷鎭粰Client錛屼互璁〤lient閲嶅畾鍚戝埌鍙﹀鐨凣ame Hall Server鐧誨綍銆傞噸瀹氬悜鐨処P鍙婄鍙d俊鎭紝鏈湴娌℃湁淇濆瓨錛屾槸閫氳繃鏁版嵁鍖呮垨涓瀹氱殑綆楁硶寰楀埌鐨勩傚鏋滃綋鍓嶇殑Game Hall Server鎺ュ彈浜嗚鐜╁鐨勭櫥褰曟秷鎭悗錛屼細鍚戣Client鍙戦佹埧闂寸洰褰曚俊鎭紝榪欎簺淇℃伅鐨勫唴瀹規垜涓婇潰宸茬粡鎻愬埌銆傜洰褰曠瓑娑堟伅鍙戦佸畬姣曞悗錛孏ame Hall Server鍗蟲柇寮涓嶤lient鐨勮繛鎺ワ紝浠ヨ吘鍑簊ocket璧勬簮銆傚湪姝ゅ悗鐨勬椂闂撮噷錛孋lient姣忛殧30鍒嗛挓浼氶噸鏂拌繛鎺ame Hall Server騫跺悜鍏剁儲瑕佹渶鏂扮殑鎴塊棿鐩綍淇℃伅鍙婂湪綰夸漢鏁頒俊鎭?br><br>銆銆3.Client鏍規嵁鍒楀嚭鐨勬埧闂村垪琛紝閫夋嫨鏌愪釜鎴塊棿榪涘叆娓告垙銆傛牴鎹垜鐨勬姄鍖呯粨鏋滃垎鏋愶紝QQ娓告垙錛屽茍涓嶆槸緇欐瘡涓涓父鎴忔埧闂撮兘鍒嗛厤浜嗕竴涓崟鐙殑绔彛榪涜澶勭悊銆傚湪QQ娓告垙閲岋紝鏈夊緢澶氭埧闂存槸鍏辯敤鐨勫悓涓涓狪P鍜屽悓涓涓鍙c傛瘮濡傦紝鍦ㄦ枟鍦頒富涓鍖猴紝鍓?0涓埧闂達紝鐢ㄧ殑閮芥槸鍚屼竴涓狪P鍜孭ort淇℃伅銆傝繖鎰忓懗鐫錛岃繖浜涙埧闂達紝鍦≦Q娓告垙鐨勬湇鍔″櫒涓婏紝浜嬪疄涓婏紝鍙兘鏄悓涓涓▼搴忓湪澶勭悊錛侊紒錛丵Q娓告垙鎴塊棿鐨勪漢鏁頒笂闄愭槸400浜猴紝涓嶉毦鎺ㄧ畻錛孮Q娓告垙鍗曚釜鏈嶅姟鍣ㄧ▼搴忕殑鐢ㄦ埛鎵胯澆閲忔槸2涓囷紝鍗砆Q鐨勪竴涓父鎴忛昏緫鏈嶅姟鍣ㄧ▼搴忔渶澶氬彲鍚屾椂涓?涓囦釜鐜╁淇濇寔TCP榪炴帴騫朵繚璇佹父鎴忔晥鐜囧拰鍝佽川錛屾洿閲嶈鐨勬槸錛岃繖鏍峰彲浠ヤ負鑵捐鐪佸灝憁oney鍛錛侊紒錛佸搰鍝︼紒QQ紜疄寰堢墰銆備互2涓囩殑鍦ㄧ嚎鏁拌繕鑳戒繚鎸佽繖涔堝ソ鐨勬父鎴忓搧璐紝紜疄涓嶅鏄擄紒QQ娓告垙鐨勫崟涓湇鍔″櫒紼嬪簭錛岀鐞嗙殑涓嶅啀鍙槸閫昏緫鎰忎箟涓婄殑鍗曚釜鎴塊棿錛岃屽彲鑳芥槸璁稿閫昏緫鎰忎箟涓婄殑鎴塊棿銆傚叾瀹烇紝瀵逛簬鏈嶅姟鍣ㄨ岃█錛屽畠灝辨槸涓涓ぇ鍖烘湇鍔″櫒鎴栧ぇ鍖烘湇鍔″櫒鐨勪竴閮ㄥ垎錛屾垜浠彲浠ユ妸瀹冪悊瑙d負涓涓簽澶х殑娓告垙鍦板浘錛屽畠瀹炵幇鐨勪篃鏄垎鍧楀鐞嗐傝屽浜庢瘡涓寮犳瀛愪笂鐨勬墦鐗岄昏緫錛屽垯鏄湁涓涓粺涓鐨勫鐞嗘祦紼嬶紝50涓埧闂寸殑50錛?00寮犳瀛愬叏鐢辮繖涓涓湇鍔″櫒紼嬪簭榪涜澶勭悊(鎴戜笉鐭ラ亾QQ娓告垙鐨勫叿浣撴墦鐗岄昏緫鏄浣曡璁$殑錛屾垜鎯沖緢鏈夊彲鑳戒篃鏄垎鍖哄煙鐨勶紝鍒嗗潡鐨?銆傚綋鐒訛紝浠ヤ笂榪欎簺鍙槸鏈嶅姟鍣ㄤ綔鐨勪簨錛岄拡瀵逛簬瀹㈡埛绔岃█錛屽鎴風鍙槸鍦ㄨ〃鐜頒笂錛屽皢涓涓釜鎴塊棿鍗曠嫭緗楀垪浜嗗嚭鏉ワ紝榪欐牱浣滐紝鏄負渚夸簬鐜╁榪涜娓告垙浠ュ強鍑忓皯鏈嶅姟鍣ㄧ殑寮閿錛屾妸榪欎釜澶у尯涓殑姣?00浜烘斁鍦ㄤ竴涓泦鍚堝唴榪涜澶勭悊錛堟瘮濡傝亰澶╀俊鎭紝“鍚?00浜哄箍鎾?#8221;鍜?#8220;鍚?涓囦漢騫挎挱”錛岃繖鏄畬鍏ㄤ笉鍚岀殑涓や釜姒傚康錛夈?br><br>銆銆4.闇瑕佺壒鍒鏄庣殑涓鐐廣傝繘鍏Q娓告垙鎴塊棿鍚庯紝鐩村埌鐐瑰嚮鏌愪釜浣嶇疆鍧愪笅鎵撳紑鍙︿竴涓▼搴忕晫闈紝瀹㈡埛绔殑紼嬪簭錛屾病鏈夊啀鍒涘緩鏂扮殑socket錛岃屼粛鐒朵嬌鐢ㄥ師鏉ュぇ鍘呮埧闂村鎴風璺熸父鎴忛昏緫鏈嶅姟鍣ㄤ氦浜掔敤鐨剆ocket銆備篃灝辨槸璇達紝榪欐槸涓や釜榪涚▼鍏辯敤鐨勫悓涓涓猻ocket錛佷笉瑕佸皬鐪嬭繖涓鐐廣傚鏋滀綘鍦ㄥ垱寤烘瀛愬鎴風紼嬪簭鍚庡張鏂板緩浜嗕竴涓柊鐨剆ocket涓庢父鎴忛昏緫鏈嶅姟鍣ㄨ繘琛岄氫俊錛岄偅涔堢敱姝ゅ甫鏉ョ殑鐜╁榪涘叆銆侀鍑恒侀冭窇絳夋秷鎭細甯︽潵闈炲父楹葷儲鐨勬暟鎹悓姝ラ棶棰橈紝淇哄湪鍒氬紑濮嬬殑鏃跺欏氨娣卞彈鍏跺銆傝屼竴鏃﹀叡鐢ㄤ簡鍚屼竴涓猻ocket鍚庯紝浣犲鏋滈鍑烘瀛愶紝鏈嶅姟鍣ㄤ笉娑夊強閲婃斁socket鐨勯棶棰橈紝鎵浠ワ紝榪欓噷灝卞皯浜嗗緢澶氱殑鏁版嵁鍚屾闂銆傚叧浜庡涓繘紼嬪浣曞叡浜悓涓涓猻ocket鐨勯棶棰橈紝璇峰幓google浠ヤ笅鍐呭錛歐SADuplicateSocket銆?br><br>銆銆浠ヤ笂渚挎槸鎴戞牴鎹渶鏂扮殑QQ娓告垙鎶撳寘緇撴灉鍒嗘瀽寰楀埌鐨凲Q娓告垙鐨勯氫俊嫻佺▼錛屽綋鐒訛紝榪欎釜嫻佺▼鏇村鐨勬槸瀹㈡埛绔浣曚笌鏈嶅姟鍣ㄤ箣闂翠氦浜掔殑錛屽嵈娌℃湁娑夊強鍒版湇鍔″櫒褰兼涔嬮棿鏄浣曢氫俊鍜屼綔鏁版嵁鍚屾鐨勩傚叧浜庢湇鍔″櫒涔嬮棿鐨勯氫俊嫻佺▼錛屾垜浠彧鑳藉熀浜庤嚜宸辯殑緇忛獙鍜岀寽鎯籌紝寰楀嚭浠ヤ笅鎯蟲硶錛?br><br>銆銆1.Login Server涓嶨ame Hall Server涔嬪墠鐨勯氫俊闂銆侺ogin Server鏄礋璐g敤鎴烽獙璇佺殑錛屼竴鏃﹂獙璇侀氳繃涔嬪悗錛屽畠瑕佽娉曡Game Hall Server鐭ラ亾榪欎釜娑堟伅銆傚畠浠箣鍓嶅疄鐜頒俊鎭氦嫻佺殑閫斿緞錛屾垜鎯沖彲鑳芥湁榪欐牱鍑犳潯錛歛. Login Server灝嗛氳繃楠岃瘉鐨勭敤鎴峰瓨鏀懼埌涓存椂鏁版嵁搴撲腑錛沚.銆Login Server灝嗛獙璇侀氳繃鐨勭敤鎴峰瓨鏀懼湪鍐呭瓨涓紝褰撶劧錛岃繖涓俊鎭紝搴旇鏄叏灞鍙闂殑錛屽氨鏄鎵鏈塓Q鐨凣ame Hall Server閮藉彲浠ラ氳繃鏈嶅姟鍣ㄤ箣闂寸殑鏁版嵁鍖呴氫俊鍘昏幏寰楄繖鏍風殑淇℃伅銆?br><br>銆銆2.Game Hall Server鐨勬渶鏂版埧闂寸洰褰曚俊鎭殑鍙栧緱銆傝繖涓俊鎭紝鏄叏灞鐨勶紝涔熷氨鏄暣涓父鎴忎腑錛屽彧淇濈暀涓涓洰褰曘傚畠鐨勪俊鎭潵婧愶紝鍙互鐢卞簳灞傜殑鎴塊棿鏈嶅姟鍣ㄩ愮駭鎶ヤ笂鏉ワ紝鎶ョ粰璋侊紵鎴戣涓哄氨濡備繚瀛樼殑鍏ㄥ眬鐧誨綍鍒楄〃涓鏍鳳紝瀹冩姤緇欎繚瀛樺叏灞鐧誨綍鍒楄〃鐨勯偅涓湇鍔″櫒鎴栨暟鎹簱銆?br><br>銆銆3.鍦≦Q娓告垙涓紝鍚屼竴綾誨瀷鐨勬父鎴忥紝鏃犳硶鎵撳紑涓や笂浠ヤ笂鐨勬父鎴忔埧闂淬傝繖涓俊鎭殑鍒ゅ畾錛屽彲浠ユ牴鎹叏灞淇℃伅鏉ュ垽瀹氥?br><br>銆銆浠ヤ笂鍏充簬鏈嶅姟鍣ㄤ箣闂村浣曢氫俊鐨勫唴瀹癸紝鍧囧睘浜庝釜浜虹寽鎯籌紝QQ鍒板簳鎬庝箞浣滅殑錛屾亹鎬曞彧鏈夌瓑澶у涓殑鏌愪竴浣嶈繘浜嗚吘璁箣鍚庢墠鐭ラ亾浜嗐傚懙鍛點備笉榪囷紝鏈変竴鐐規槸鍙互鑲畾鐨勶紝鍦ㄦ暣涓湇鍔″櫒鏋舵瀯涓紝搴旇鏈変竴涓湴鏂規槸涓撻棬淇濆瓨浜嗗叏灞鐨勭櫥褰曠帺瀹跺垪琛紝鍙湁榪欐牱鎵嶈兘淇濊瘉鐜╁涓嶄細閲嶅鐧誨綍浠ュ強榪涘叆澶氫釜鐩稿悓綾誨瀷鐨勬埧闂淬?br><br>銆銆鍦ㄥ墠闈㈢殑鎻忚堪涓紝鎴戞浘緇忔彁鍒拌繃涓涓棶棰橈細褰撶櫥褰曞綋鍓岹ame Hall Server涓嶆垚鍔熸椂錛孮Q娓告垙鏈嶅姟鍣ㄤ細閫夋嫨璁╁鎴風閲嶅畾鍚戝埌鍙︿綅鐨勬湇鍔″櫒鍘葷櫥褰曪紝浜嬪疄涓婏紝QQ鑱婂ぉ鏈嶅姟鍣ㄥ拰MSN鏈嶅姟鍣ㄧ殑鐧誨綍涔熸槸綾諱技鐨勶紝瀹冧篃瀛樺湪鐧誨綍閲嶅畾鍚戦棶棰樸?br><br>銆銆閭d箞錛岃繖灝卞紩鍑轟簡鍙﹀鐨勯棶棰橈紝鐢辮皝鏉ヤ綔榪欎釜絳栫暐閫夋嫨錛熶互鍙婄敱璋佹潵鎻愪緵榪欐牱鐨勯夋嫨璧勬簮錛熻繖鏍風殑澶勭悊錛屼究鏄礋璐h礋杞藉潎琛$殑鏈嶅姟鍣ㄧ殑澶勭悊鑼冨洿浜嗐傜敱QQ娓告垙鐨勯氫俊榪囩▼鍒嗘瀽媧劇敓鍑烘潵鐨勯拡瀵硅礋璐e潎琛″強鐧句竾綰у湪綰跨郴緇熺殑鏇磋繘涓姝ヨ璁猴紝灝嗗湪涓嬬瘒鏂囩珷涓戶緇?br><br>銆銆鍦ㄦ錛岀壒鍒劅璋㈢綉鍙媡illy鍙婃煇浣嶄笉渚塊忛湶濮撳悕鐨勭綉鍙嬬殑璁ㄨ錛屾槸浣犱滑璁╂垜鍐沖畾璁ょ湡鍐嶆姄涓嬈″寘鎺釜絀剁珶銆?br><br>銆銆<鏈畬寰呯畫><br> <img src ="http://m.shnenglu.com/zjl-1026-2001/aggbug/112755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zjl-1026-2001/" target="_blank">娌欐紶閲岀殑嫻瘋睔</a> 2010-04-16 11:38 <a href="http://m.shnenglu.com/zjl-1026-2001/archive/2010/04/16/112755.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>ADSL浠嬬粛http://m.shnenglu.com/zjl-1026-2001/archive/2010/04/16/112750.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Fri, 16 Apr 2010 02:33:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/04/16/112750.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/112750.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/04/16/112750.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/112750.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/112750.html 

ADSL錛屽叏鍚岮symmetric Digital Subscriber Line錛岃瘧涓洪潪瀵圭О鏁板瓧鐢ㄦ埛綰胯礬錛屾垨闈炲縐版暟瀛楃敤鎴風幆璺紙Aysmmetric Digital Subscriber Loop錛夈?br>
浠嬬粛錛?br>
ADSL鍥犱負涓婅錛堜粠鐢ㄦ埛鍒扮數淇℃湇鍔℃彁渚涘晢鏂瑰悜錛屽涓婁紶鍔ㄤ綔錛夊拰涓嬭錛堜粠鐢典俊鏈嶅姟鎻愪緵鍟嗗埌鐢ㄦ埛鐨勬柟鍚戯紝濡備笅杞藉姩浣滐級甯﹀涓嶅縐幫紙鍗充笂琛屽拰涓嬭鐨勯熺巼涓嶇浉鍚岋級鍥犳縐頒負闈炲縐版暟瀛楃敤鎴風嚎璺傚畠閲囩敤棰戝垎澶嶇敤鎶鏈妸鏅氱殑鐢佃瘽綰垮垎鎴愪簡鐢佃瘽銆佷笂琛屽拰涓嬭涓変釜鐩稿鐙珛鐨勪俊閬擄紝浠庤岄伩鍏嶄簡鐩鎬簰涔嬮棿鐨勫共鎵般傞氬父ADSL鍦ㄤ笉褰卞搷姝e父鐢佃瘽閫氫俊鐨勬儏鍐典笅鍙互鎻愪緵鏈楂?.5Mbps鐨勪笂琛岄熷害鍜屾渶楂?4Mbps鐨勪笅琛岄熷害銆?br>
璁懼錛?br>

ADSL鏄竴縐?a title=寮傛浼犺緭妯″紡 href="http://m.shnenglu.com/zh-cn/%E5%BC%82%E6%AD%A5%E4%BC%A0%E8%BE%93%E6%A8%A1%E5%BC%8F">寮傛浼犺緭妯″紡錛圓TM錛夈?/p>

鍦ㄧ數淇℃湇鍔℃彁渚涘晢绔紝闇瑕佸皢姣忔潯寮閫欰DSL涓氬姟鐨勭數璇濈嚎璺繛鎺ュ湪鏁板瓧鐢ㄦ埛綰胯礬璁塊棶澶氳礬澶嶇敤鍣?/em>錛圖SLAM錛変笂銆傝屽湪鐢ㄦ埛绔紝鐢ㄦ埛闇瑕佷嬌鐢ㄤ竴涓?em>ADSL緇堢錛堝洜涓哄拰浼犵粺鐨?a title=璋冨埗瑙h皟鍣?href="http://m.shnenglu.com/zh-cn/%E8%B0%83%E5%88%B6%E8%A7%A3%E8%B0%83%E5%99%A8">璋冨埗瑙h皟鍣?/font>錛圡odem錛夌被浼鹼紝鎵浠ヤ篃琚О涓?#8220;鐚?#8221;錛夋潵榪炴帴鐢佃瘽綰胯礬銆傜敱浜嶢DSL浣跨敤楂橀淇″彿錛屾墍浠ュ湪涓ょ榪橀兘瑕佷嬌鐢?em>ADSL淇″彿鍒嗙鍣?/em>灝咥DSL鏁版嵁淇″彿鍜屾櫘閫氶煶棰戠數璇濅俊鍙峰垎紱誨嚭鏉ワ紝閬垮厤鎵撶數璇濈殑鏃跺欏嚭鐜板櫔闊沖共鎵般?/p>

閫氬父鐨凙DSL緇堢鏈変竴涓數璇滾ine-In錛屼竴涓?a title=浠ュお緗?href="http://m.shnenglu.com/zh-cn/%E4%BB%A5%E5%A4%AA%E7%BD%91">浠ュお緗?/font>鍙o紝鏈変簺緇堢闆嗘垚浜咥DSL淇″彿鍒嗙鍣紝榪樻彁渚涗竴涓繛鎺ョ殑Phone鎺ュ彛銆?/p>

鏌愪簺ADSL璋冨埗瑙h皟鍣ㄤ嬌鐢║SB鎺ュ彛涓庣數鑴戠浉榪烇紝闇瑕佸湪鐢佃剳涓婂畨瑁呮寚瀹氱殑杞歡浠ユ坊鍔犺櫄鎷熺綉鍗℃潵榪涜閫氫俊銆?/p>
鏍囧噯錛?br>
浼犺緭鏍囧噯

鐢變簬鍙楀埌浼犺緭楂橀淇″彿鐨勯檺鍒訛紝ADSL闇瑕佺數淇℃湇鍔℃彁渚涘晢绔帴鍏ヨ澶囧拰鐢ㄦ埛緇堢涔嬮棿鐨勮窛紱諱笉鑳借秴榪?鍗冪背錛屼篃灝辨槸鐢ㄦ埛鐨勭數璇濈嚎榪炲埌鐢佃瘽灞鐨勮窛紱諱笉鑳借秴榪?鍗冪背銆?/p>

ADSL璁懼鍦ㄤ紶杈撲腑闇瑕侀伒寰互涓嬫爣鍑嗕箣涓錛?/p>

  • ITU-T G.992.1(G.dmt)
    • G.dmt錛氬叏閫熺巼錛屼笅琛?Mbps錛屼笂琛?96Kbps
  • ITU-T G.992.2(G.lite)
    • G.lite錛氫笅琛?.5Mbps錛屼笂琛?12Kbps
  • ITU-T G.994.1(G.hs)
    • 鍙彉姣旂壒鐜囷紙VBR錛?
  • ANSI T1.413 Issue #2
    • 涓嬭8Mbps錛屼笂琛?96Kbps

榪樻湁涓浜涙洿蹇洿鏂扮殑鏍囧噯錛屼絾鏄洰鍓嶈繕寰堝皯鏈夌數淇℃湇鍔℃彁渚涘晢浣跨敤錛?/p>

  • ITU G.992.3/4
    • ADSL2 涓嬭12Mbps錛屼笂琛?.0Mbps
  • ITU G.992.3/4
    • Annex J ADSL2 涓嬭12Mbps錛屼笂琛?.5Mbps
  • ITU G.992.5
    • ADSL2+ 涓嬭24Mbps錛屼笂琛?.0Mbps
  • ITU G.992.5
    • Annex M ADSL2+ 涓嬭24Mbps錛屼笂琛?.5Mbps

褰撶數淇℃湇鍔℃彁渚涘晢鐨勮澶囩鍜岀敤鎴風粓绔箣闂磋窛紱誨皬浜?.3鍗冪背鐨勬椂鍊欙紝榪樺彲浠ヤ嬌鐢ㄩ熺巼鏇撮珮鐨?a title=VDSL href="http://m.shnenglu.com/zh-cn/VDSL">VDSL錛屽畠鐨勯熺巼鍙互杈懼埌涓嬭55.2Mbps錛屼笂琛?9.2Mbps銆?/p>

 緗戠粶鐧誨綍鏍囧噯

ADSL閫氬父鎻愪緵涓夌緗戠粶鐧誨綍鏂瑰紡錛?/p>

  • 妗ユ帴錛岀洿鎺ユ彁渚涢潤鎬?a title=IP href="http://m.shnenglu.com/zh-cn/IP">IP
  • PPPoA錛屽熀浜嶢TM鐨勭瀵圭鍗忚
  • PPPoE錛屽熀浜庝互澶綉鐨勭瀵圭鍗忚

鍚庝袱縐嶉氬父涓嶆彁渚涢潤鎬両P錛岃屾槸鍔ㄦ佺殑緇欑敤鎴峰垎閰嶇綉緇滃湴鍧銆?/p>



]]>
[杞澆]GRUB2鍩虹鏁欑▼http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/18/109959.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Thu, 18 Mar 2010 01:54:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/18/109959.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/109959.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/18/109959.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/109959.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/109959.html闃呰鍏ㄦ枃

]]>
[杞澆]POSIX 綰跨▼璇﹁В-絎?閮ㄥ垎http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109419.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Thu, 11 Mar 2010 03:54:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109419.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/109419.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109419.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/109419.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/109419.html
鏈枃鏄?POSIX 綰跨▼涓夐儴鏇茬郴鍒楃殑鏈鍚庝竴閮ㄥ垎錛孌aniel 灝嗚緇嗚璁哄浣曚嬌鐢ㄦ潯浠跺彉閲忋傛潯浠跺彉閲忔槸 POSIX 綰跨▼緇撴瀯錛屽彲浠ヨ鎮ㄥ湪閬囧埌鏌愪簺鏉′歡鏃?#8220;鍞ら啋”綰跨▼銆傚彲浠ュ皢瀹冧滑鐪嬩綔鏄竴縐嶇嚎紼嬪畨鍏ㄧ殑淇″彿鍙戦併侱aniel 浣跨敤鐩墠鎮ㄦ墍瀛﹀埌鐨勭煡璇嗗疄鐜頒簡涓涓綰跨▼宸ヤ綔緇勫簲鐢ㄧ▼搴忥紝鏈枃灝嗗洿緇曠潃榪欎竴紺轟緥鑰岃繘琛岃璁恒?/blockquote>

鏉′歡鍙橀噺璇﹁В

鍦?涓婁竴綃囨枃绔?/font>緇撴潫鏃訛紝鎴戞弿榪頒簡涓涓瘮杈冪壒孌婄殑闅鵑錛氬鏋滅嚎紼嬫鍦ㄧ瓑寰呮煇涓壒瀹氭潯浠跺彂鐢燂紝瀹冨簲璇ュ浣曞鐞嗚繖縐嶆儏鍐碉紵瀹冨彲浠ラ噸澶嶅浜掓枼瀵硅薄閿佸畾鍜岃В閿侊紝姣忔閮戒細媯鏌ュ叡浜暟鎹粨鏋勶紝浠ユ煡鎵炬煇涓箋備絾榪欐槸鍦ㄦ氮璐規椂闂村拰璧勬簮錛岃屼笖榪欑綣佸繖鏌ヨ鐨勬晥鐜囬潪甯鎬綆銆傝В鍐寵繖涓棶棰樼殑鏈浣蟲柟娉曟槸浣跨敤 pthread_cond_wait() 璋冪敤鏉ョ瓑寰呯壒孌婃潯浠跺彂鐢熴?

浜嗚В pthread_cond_wait() 鐨勪綔鐢ㄩ潪甯擱噸瑕?-- 瀹冩槸 POSIX 綰跨▼淇″彿鍙戦佺郴緇熺殑鏍稿績錛屼篃鏄渶闅句互鐞嗚В鐨勯儴鍒嗐?/p>

棣栧厛錛岃鎴戜滑鑰冭檻浠ヤ笅鎯呭喌錛氱嚎紼嬩負鏌ョ湅宸查摼鎺ュ垪琛ㄨ岄攣瀹氫簡浜掓枼瀵硅薄錛岀劧鑰岃鍒楄〃鎭板閥鏄┖鐨勩傝繖涓鐗瑰畾綰跨▼浠涔堜篃騫蹭笉浜?-- 鍏惰璁℃剰鍥炬槸浠庡垪琛ㄤ腑闄ゅ幓鑺傜偣錛屼絾鏄幇鍦ㄥ嵈娌℃湁鑺傜偣銆傚洜姝わ紝瀹冨彧鑳斤細

閿佸畾浜掓枼瀵硅薄鏃訛紝綰跨▼灝嗚皟鐢?pthread_cond_wait(&mycond,&mymutex)銆俻thread_cond_wait() 璋冪敤鐩稿綋澶嶆潅錛屽洜姝ゆ垜浠瘡嬈″彧鎵ц瀹冪殑涓涓搷浣溿?/p>

pthread_cond_wait() 鎵鍋氱殑絎竴浠朵簨灝辨槸鍚屾椂瀵逛簰鏂ュ璞¤В閿侊紙浜庢槸鍏跺畠綰跨▼鍙互淇敼宸查摼鎺ュ垪琛級錛屽茍絳夊緟鏉′歡 mycond 鍙戠敓錛堣繖鏍峰綋 pthread_cond_wait() 鎺ユ敹鍒板彟涓涓嚎紼嬬殑“淇″彿”鏃訛紝瀹冨皢鑻忛啋錛夈傜幇鍦ㄤ簰鏂ュ璞″凡琚В閿侊紝鍏跺畠綰跨▼鍙互璁塊棶鍜屼慨鏀瑰凡閾炬帴鍒楄〃錛屽彲鑳借繕浼氭坊鍔犻」銆?/p>

姝ゆ椂錛宲thread_cond_wait() 璋冪敤榪樻湭榪斿洖銆傚浜掓枼瀵硅薄瑙i攣浼氱珛鍗沖彂鐢燂紝浣嗙瓑寰呮潯浠?mycond 閫氬父鏄竴涓樆濉炴搷浣滐紝榪欐剰鍛崇潃綰跨▼灝嗙潯鐪狅紝鍦ㄥ畠鑻忛啋涔嬪墠涓嶄細娑堣?CPU 鍛ㄦ湡銆傝繖姝f槸鎴戜滑鏈熷緟鍙戠敓鐨勬儏鍐點傜嚎紼嬪皢涓鐩寸潯鐪狅紝鐩村埌鐗瑰畾鏉′歡鍙戠敓錛屽湪榪欐湡闂翠笉浼氬彂鐢熶換浣曟氮璐?CPU 鏃墮棿鐨勭箒蹇欐煡璇€備粠綰跨▼鐨勮搴︽潵鐪嬶紝瀹冨彧鏄湪絳夊緟 pthread_cond_wait() 璋冪敤榪斿洖銆?/p>

鐜板湪緇х畫璇存槑錛屽亣璁懼彟涓涓嚎紼嬶紙縐頒綔“2 鍙風嚎紼?#8221;錛夐攣瀹氫簡 mymutex 騫跺宸查摼鎺ュ垪琛ㄦ坊鍔犱簡涓欏廣傚湪瀵逛簰鏂ュ璞¤В閿佷箣鍚庯紝2 鍙風嚎紼嬩細绔嬪嵆璋冪敤鍑芥暟 pthread_cond_broadcast(&mycond)銆傛鎿嶄綔涔嬪悗錛? 鍙風嚎紼嬪皢浣挎墍鏈夌瓑寰?mycond 鏉′歡鍙橀噺鐨勭嚎紼嬬珛鍗寵嫃閱掋傝繖鎰忓懗鐫絎竴涓嚎紼嬶紙浠嶅浜?pthread_cond_wait() 璋冪敤涓級鐜板湪灝嗚嫃閱掋?/p>

鐜板湪錛岀湅涓涓嬬涓涓嚎紼嬪彂鐢熶簡浠涔堛傛偍鍙兘浼氳涓哄湪 2 鍙風嚎紼嬭皟鐢?pthread_cond_broadcast(&mymutex) 涔嬪悗錛? 鍙風嚎紼嬬殑 pthread_cond_wait() 浼氱珛鍗寵繑鍥炪備笉鏄偅鏍鳳紒瀹為檯涓婏紝pthread_cond_wait() 灝嗘墽琛屾渶鍚庝竴涓搷浣滐細閲嶆柊閿佸畾 mymutex銆備竴鏃?pthread_cond_wait() 閿佸畾浜嗕簰鏂ュ璞★紝閭d箞瀹冨皢榪斿洖騫跺厑璁?1 鍙風嚎紼嬬戶緇墽琛屻傞偅鏃訛紝瀹冨彲浠ラ┈涓婃鏌ュ垪琛紝鏌ョ湅瀹冩墍鎰熷叴瓚g殑鏇存敼銆?/p>

鍋滄騫跺洖欏撅紒

閭d釜榪囩▼闈炲父澶嶆潅錛屽洜姝よ鎴戜滑鍏堟潵鍥為【涓涓嬨傜涓涓嚎紼嬮鍏堣皟鐢細

    pthread_mutex_lock(&mymutex);
            

鐒跺悗錛屽畠媯鏌ヤ簡鍒楄〃銆傛病鏈夋壘鍒版劅鍏磋叮鐨勪笢瑗匡紝浜庢槸瀹冭皟鐢細

    pthread_cond_wait(&mycond, &mymutex);
            

鐒跺悗錛宲thread_cond_wait() 璋冪敤鍦ㄨ繑鍥炲墠鎵ц璁稿鎿嶄綔錛?/p>
            pthread_mutex_unlock(&mymutex);
            

瀹冨 mymutex 瑙i攣錛岀劧鍚庤繘鍏ョ潯鐪犵姸鎬侊紝絳夊緟 mycond 浠ユ帴鏀?POSIX 綰跨▼“淇″彿”銆備竴鏃︽帴鏀跺埌“淇″彿”錛堝姞寮曞彿鏄洜涓烘垜浠茍涓嶆槸鍦ㄨ璁轟紶緇熺殑 UNIX 淇″彿錛岃屾槸鏉ヨ嚜 pthread_cond_signal() 鎴?pthread_cond_broadcast() 璋冪敤鐨勪俊鍙鳳級錛屽畠灝變細鑻忛啋銆備絾 pthread_cond_wait() 娌℃湁绔嬪嵆榪斿洖 -- 瀹冭繕瑕佸仛涓浠朵簨錛氶噸鏂伴攣瀹?mutex錛?/p>
            pthread_mutex_lock(&mymutex);
            

pthread_cond_wait() 鐭ラ亾鎴戜滑鍦ㄦ煡鎵?mymutex “鑳屽悗”鐨勫彉鍖栵紝鍥犳瀹冪戶緇搷浣滐紝涓烘垜浠攣瀹氫簰鏂ュ璞★紝鐒跺悗鎵嶈繑鍥炪?/p>

pthread_cond_wait() 灝忔祴楠?/span>

鐜板湪宸插洖欏句簡 pthread_cond_wait() 璋冪敤錛屾偍搴旇浜嗚В浜嗗畠鐨勫伐浣滄柟寮忋傚簲璇ヨ兘澶熷彊榪?pthread_cond_wait() 渚濇鎵ц鐨勬墍鏈夋搷浣溿傚皾璇曚竴涓嬨傚鏋滅悊瑙d簡 pthread_cond_wait()錛屽叾浣欓儴鍒嗗氨鐩稿綋瀹規槗錛屽洜姝よ閲嶆柊闃呰浠ヤ笂閮ㄥ垎錛岀洿鍒拌浣忎負姝€傚ソ錛岃瀹屼箣鍚庯紝鑳藉惁鍛婅瘔鎴戝湪璋冪敤 pthread_cond_wait() 涔?鍓?/em>錛屼簰鏂ュ璞″繀欏誨浜庝粈涔堢姸鎬侊紵pthread_cond_wait() 璋冪敤榪斿洖涔嬪悗錛屼簰鏂ュ璞″浜庝粈涔堢姸鎬侊紵榪欎袱涓棶棰樼殑絳旀閮芥槸“閿佸畾”銆傛棦鐒跺凡緇忓畬鍏ㄧ悊瑙d簡 pthread_cond_wait() 璋冪敤錛岀幇鍦ㄦ潵緇х畫鐮旂┒鏇寸畝鍗曠殑涓滆タ -- 鍒濆鍖栧拰鐪熸鐨勫彂閫佷俊鍙峰拰騫挎挱榪涚▼銆傚埌閭f椂錛屾垜浠皢浼氬鍖呭惈浜嗗綰跨▼宸ヤ綔闃熷垪鐨?C 浠g爜浜嗗鎸囨帉銆?



鍒濆鍖栧拰娓呴櫎

鏉′歡鍙橀噺鏄竴涓渶瑕佸垵濮嬪寲鐨勭湡瀹炴暟鎹粨鏋勩備互涓嬪氨鍒濆鍖栫殑鏂規硶銆傞鍏堬紝瀹氫箟鎴栧垎閰嶄竴涓潯浠跺彉閲忥紝濡備笅鎵紺猴細

    pthread_cond_t mycond;
            

鐒跺悗錛岃皟鐢ㄤ互涓嬪嚱鏁拌繘琛屽垵濮嬪寲錛?/p>
    pthread_cond_init(&mycond,NULL);
            

鐬э紝鍒濆鍖栧畬鎴愪簡錛佸湪閲婃斁鎴栧簾寮冩潯浠跺彉閲忎箣鍓嶏紝闇瑕佹瘉鍧忓畠錛屽涓嬫墍紺猴細

    pthread_cond_destroy(&mycond);
            

寰堢畝鍗曞惂銆傛帴鐫璁ㄨ pthread_cond_wait() 璋冪敤銆?/p>

絳夊緟

涓鏃﹀垵濮嬪寲浜嗕簰鏂ュ璞″拰鏉′歡鍙橀噺錛屽氨鍙互絳夊緟鏌愪釜鏉′歡錛屽涓嬫墍紺猴細

    pthread_cond_wait(&mycond, &mymutex);
            

璇鋒敞鎰忥紝浠g爜鍦ㄩ昏緫涓婂簲璇ュ寘鍚?mycond 鍜?mymutex銆備竴涓壒瀹氭潯浠跺彧鑳芥湁涓涓簰鏂ュ璞★紝鑰屼笖鏉′歡鍙橀噺搴旇琛ㄧず浜掓枼鏁版嵁“鍐呴儴”鐨勪竴縐嶇壒孌婄殑鏉′歡鏇存敼銆備竴涓簰鏂ュ璞″彲浠ョ敤璁稿鏉′歡鍙橀噺錛堜緥濡傦紝cond_empty銆乧ond_full銆乧ond_cleanup錛夛紝浣嗘瘡涓潯浠跺彉閲忓彧鑳芥湁涓涓簰鏂ュ璞°?/p>

鍙戦佷俊鍙峰拰騫挎挱

瀵逛簬鍙戦佷俊鍙峰拰騫挎挱錛岄渶瑕佹敞鎰忎竴鐐廣傚鏋滅嚎紼嬫洿鏀規煇浜涘叡浜暟鎹紝鑰屼笖瀹冩兂瑕佸敜閱掓墍鏈夋鍦ㄧ瓑寰呯殑綰跨▼錛屽垯搴斾嬌鐢?pthread_cond_broadcast 璋冪敤錛屽涓嬫墍紺猴細

    pthread_cond_broadcast(&mycond);
            

鍦ㄦ煇浜涙儏鍐典笅錛屾椿鍔ㄧ嚎紼嬪彧闇瑕佸敜閱掔涓涓鍦ㄧ潯鐪犵殑綰跨▼銆傚亣璁炬偍鍙闃熷垪娣誨姞浜嗕竴涓伐浣滀綔涓氥傞偅涔堝彧闇瑕佸敜閱掍竴涓伐浣滅▼搴忕嚎紼嬶紙鍐嶅敜閱掑叾瀹冪嚎紼嬫槸涓嶇ぜ璨岀殑錛侊級錛?/p>
    pthread_cond_signal(&mycond);
            

姝ゅ嚱鏁板彧鍞ら啋涓涓嚎紼嬨傚鏋?POSIX 綰跨▼鏍囧噯鍏佽鎸囧畾涓涓暣鏁幫紝鍙互璁╂偍鍞ら啋涓瀹氭暟閲忕殑姝e湪鐫$湢鐨勭嚎紼嬶紝閭e氨鏇村畬緹庝簡銆備絾鏄緢鍙儨錛屾垜娌℃湁琚個璇峰弬鍔犱細璁?/p>

宸ヤ綔緇?/span>

鎴戝皢婕旂ず濡備綍鍒涘緩澶氱嚎紼嬪伐浣滅粍銆傚湪榪欎釜鏂規涓紝鎴戜滑鍒涘緩浜嗚澶氬伐浣滅▼搴忕嚎紼嬨傛瘡涓嚎紼嬮兘浼氭鏌?wq錛?#8220;宸ヤ綔闃熷垪”錛夛紝鏌ョ湅鏄惁鏈夐渶瑕佸畬鎴愮殑宸ヤ綔銆傚鏋滄湁闇瑕佸畬鎴愮殑宸ヤ綔錛岄偅涔堢嚎紼嬪皢浠庨槦鍒椾腑闄ゅ幓涓涓妭鐐癸紝鎵ц榪欎簺鐗瑰畾宸ヤ綔錛岀劧鍚庣瓑寰呮柊鐨勫伐浣滃埌杈俱?/p>

涓庢鍚屾椂錛屼富綰跨▼璐熻矗鍒涘緩榪欎簺宸ヤ綔紼嬪簭綰跨▼銆佸皢宸ヤ綔娣誨姞鍒伴槦鍒楋紝鐒跺悗鍦ㄥ畠閫鍑烘椂鏀墮泦鎵鏈夊伐浣滅▼搴忕嚎紼嬨傛偍灝嗕細閬囧埌璁稿 C 浠g爜錛屽ソ濂藉噯澶囧惂錛?/p>

闃熷垪

闇瑕侀槦鍒楁槸鍑轟簬涓や釜鍘熷洜銆傞鍏堬紝闇瑕侀槦鍒楁潵淇濆瓨宸ヤ綔浣滀笟銆傝繕闇瑕佸彲鐢ㄤ簬璺熻釜宸茬粓姝㈢嚎紼嬬殑鏁版嵁緇撴瀯銆傝繕璁板緱鍓嶅嚑綃囨枃绔狅紙璇峰弬闃呮湰鏂囩粨灝懼鐨?鍙傝冭祫鏂?/font>錛変腑錛屾垜鏇炬彁鍒拌繃闇瑕佷嬌鐢ㄥ甫鏈夌壒瀹氳繘紼嬫爣璇嗙殑 pthread_join 鍚楋紵浣跨敤“娓呴櫎闃熷垪”錛堢О浣?"cq"錛夊彲浠ヨВ鍐蟲棤娉曠瓑寰?浠諱綍宸茬粓姝㈢嚎紼嬬殑闂錛堢◢鍚庡皢璇︾粏璁ㄨ榪欎釜闂錛夈備互涓嬫槸鏍囧噯闃熷垪浠g爜銆傚皢姝や唬鐮佷繚瀛樺埌鏂囦歡 queue.h 鍜?queue.c錛?


queue.h
/* queue.h
            ** Copyright 2000 Daniel Robbins, Gentoo Technologies, Inc.
            ** Author: Daniel Robbins
            ** Date: 16 Jun 2000
            */
            typedef struct node {
            struct node *next;
            } node;
            typedef struct queue {
            node *head, *tail;
            } queue;
            void queue_init(queue *myroot);
            void queue_put(queue *myroot, node *mynode);
            node *queue_get(queue *myroot);
            



queue.c
/* queue.c
            ** Copyright 2000 Daniel Robbins, Gentoo Technologies, Inc.
            ** Author: Daniel Robbins
            ** Date: 16 Jun 2000
            **
            ** This set of queue functions was originally thread-aware.  I
            ** redesigned the code to make this set of queue routines
            ** thread-ignorant (just a generic, boring yet very fast set of queue
            ** routines).  Why the change?  Because it makes more sense to have
            ** the thread support as an optional add-on.  Consider a situation
            ** where you want to add 5 nodes to the queue.  With the
            ** thread-enabled version, each call to queue_put() would
            ** automatically lock and unlock the queue mutex 5 times -- that's a
            ** lot of unnecessary overhead.  However, by moving the thread stuff
            ** out of the queue routines, the caller can lock the mutex once at
            ** the beginning, then insert 5 items, and then unlock at the end.
            ** Moving the lock/unlock code out of the queue functions allows for
            ** optimizations that aren't possible otherwise.  It also makes this
            ** code useful for non-threaded applications.
            **
            ** We can easily thread-enable this data structure by using the
            ** data_control type defined in control.c and control.h.  */
            #include <stdio.h>
            #include "queue.h"
            void queue_init(queue *myroot) {
            myroot->head=NULL;
            myroot->tail=NULL;
            }
            void queue_put(queue *myroot,node *mynode) {
            mynode->next=NULL;
            if (myroot->tail!=NULL)
            myroot->tail->next=mynode;
            myroot->tail=mynode;
            if (myroot->:head==NULL)
            myroot->head=mynode;
            }
            node *queue_get(queue *myroot) {
            //get from root
            node *mynode;
            mynode=myroot->head;
            if (myroot->head!=NULL)
            myroot->head=myroot->head->next;
            return mynode;
            }
            

data_control 浠g爜

鎴戠紪鍐欑殑騫朵笉鏄嚎紼嬪畨鍏ㄧ殑闃熷垪渚嬬▼錛屼簨瀹炰笂鎴戝垱寤轟簡涓涓?#8220;鏁版嵁鍖呰”鎴?#8220;鎺у埗”緇撴瀯錛屽畠鍙互鏄換浣曠嚎紼嬫敮鎸佺殑鏁版嵁緇撴瀯銆傜湅涓涓?control.h錛?/p>
control.h
#include
            typedef struct data_control {
            pthread_mutex_t mutex;
            pthread_cond_t cond;
            int active;
            } data_control;
            

鐜板湪鎮ㄧ湅鍒頒簡 data_control 緇撴瀯瀹氫箟錛屼互涓嬫槸瀹冪殑瑙嗚琛ㄧず錛?/p>
鎵浣跨敤鐨?data_control 緇撴瀯

鍥懼儚涓殑閿佷唬琛ㄤ簰鏂ュ璞★紝瀹冨厑璁稿鏁版嵁緇撴瀯榪涜浜掓枼璁塊棶銆傞粍鑹茬殑鏄熶唬琛ㄦ潯浠跺彉閲忥紝瀹冨彲浠ョ潯鐪狅紝鐩村埌鎵璁ㄨ鐨勬暟鎹粨鏋勬敼鍙樹負姝€俹n/off 寮鍏寵〃紺烘暣鏁?"active"錛屽畠鍛婅瘔綰跨▼姝ゆ暟鎹槸鍚︽槸媧誨姩鐨勩傚湪浠g爜涓紝鎴戜嬌鐢ㄦ暣鏁?active 浣滀負鏍囧織錛屽憡璇夊伐浣滈槦鍒椾綍鏃跺簲璇ュ叧闂備互涓嬫槸 control.c錛?/p>
control.c
/* control.c
            ** Copyright 2000 Daniel Robbins, Gentoo Technologies, Inc.
            ** Author: Daniel Robbins
            ** Date: 16 Jun 2000
            **
            ** These routines provide an easy way to make any type of
            ** data-structure thread-aware.  Simply associate a data_control
            ** structure with the data structure (by creating a new struct, for
            ** example).  Then, simply lock and unlock the mutex, or
            ** wait/signal/broadcast on the condition variable in the data_control
            ** structure as needed.
            **
            ** data_control structs contain an int called "active".  This int is
            ** intended to be used for a specific kind of multithreaded design,
            ** where each thread checks the state of "active" every time it locks
            ** the mutex.  If active is 0, the thread knows that instead of doing
            ** its normal routine, it should stop itself.  If active is 1, it
            ** should continue as normal.  So, by setting active to 0, a
            ** controlling thread can easily inform a thread work crew to shut
            ** down instead of processing new jobs.  Use the control_activate()
            ** and control_deactivate() functions, which will also broadcast on
            ** the data_control struct's condition variable, so that all threads
            ** stuck in pthread_cond_wait() will wake up, have an opportunity to
            ** notice the change, and then terminate.
            */
            #include "control.h"
            int control_init(data_control *mycontrol) {
            int mystatus;
            if (pthread_mutex_init(&(mycontrol->mutex),NULL))
            return 1;
            if (pthread_cond_init(&(mycontrol->cond),NULL))
            return 1;
            mycontrol->active=0;
            return 0;
            }
            int control_destroy(data_control *mycontrol) {
            int mystatus;
            if (pthread_cond_destroy(&(mycontrol->cond)))
            return 1;
            if (pthread_cond_destroy(&(mycontrol->cond)))
            return 1;
            mycontrol->active=0;
            return 0;
            }
            int control_activate(data_control *mycontrol) {
            int mystatus;
            if (pthread_mutex_lock(&(mycontrol->mutex)))
            return 0;
            mycontrol->active=1;
            pthread_mutex_unlock(&(mycontrol->mutex));
            pthread_cond_broadcast(&(mycontrol->cond));
            return 1;
            }
            int control_deactivate(data_control *mycontrol) {
            int mystatus;
            if (pthread_mutex_lock(&(mycontrol->mutex)))
            return 0;
            mycontrol->active=0;
            pthread_mutex_unlock(&(mycontrol->mutex));
            pthread_cond_broadcast(&(mycontrol->cond));
            return 1;
            }
            

璋冭瘯鏃墮棿

鍦ㄥ紑濮嬭皟璇曚箣鍓嶏紝榪橀渶瑕佷竴涓枃浠躲備互涓嬫槸 dbug.h錛?/p>
dbug.h
#define dabort() \
            {  printf("Aborting at line %d in source file %s\n",__LINE__,__FILE__); abort(); }
            

姝や唬鐮佺敤浜庡鐞嗗伐浣滅粍浠g爜涓殑涓嶅彲綰犳閿欒銆?/p>

宸ヤ綔緇勪唬鐮?/span>

璇村埌宸ヤ綔緇勪唬鐮侊紝浠ヤ笅灝辨槸錛?/p>
workcrew.c
#include <stdio.h>
            #include <stdlib.h>
            #include "control.h"
            #include "queue.h"
            #include "dbug.h"
            /* the work_queue holds tasks for the various threads to complete. */
            struct work_queue {
            data_control control;
            queue work;
            } wq;
            /* I added a job number to the work node.  Normally, the work node
            would contain additional data that needed to be processed. */
            typedef struct work_node {
            struct node *next;
            int jobnum;
            } wnode;
            /* the cleanup queue holds stopped threads.  Before a thread
            terminates, it adds itself to this list.  Since the main thread is
            waiting for changes in this list, it will then wake up and clean up
            the newly terminated thread. */
            struct cleanup_queue {
            data_control control;
            queue cleanup;
            } cq;
            /* I added a thread number (for debugging/instructional purposes) and
            a thread id to the cleanup node.  The cleanup node gets passed to
            the new thread on startup, and just before the thread stops, it
            attaches the cleanup node to the cleanup queue.  The main thread
            monitors the cleanup queue and is the one that performs the
            necessary cleanup. */
            typedef struct cleanup_node {
            struct node *next;
            int threadnum;
            pthread_t tid;
            } cnode;
            void *threadfunc(void *myarg) {
            wnode *mywork;
            cnode *mynode;
            mynode=(cnode *) myarg;
            pthread_mutex_lock(&wq.control.mutex);
            while (wq.control.active) {
            while (wq.work.head==NULL && wq.control.active) {
            pthread_cond_wait(&wq.control.cond, &wq.control.mutex);
            }
            if (!wq.control.active)
            break;
            //we got something!
            mywork=(wnode *) queue_get(&wq.work);
            pthread_mutex_unlock(&wq.control.mutex);
            //perform processing...
            printf("Thread number %d processing job %d\n",mynode->threadnum,mywork->jobnum);
            free(mywork);
            pthread_mutex_lock(&wq.control.mutex);
            }
            pthread_mutex_unlock(&wq.control.mutex);
            pthread_mutex_lock(&cq.control.mutex);
            queue_put(&cq.cleanup,(node *) mynode);
            pthread_mutex_unlock(&cq.control.mutex);
            pthread_cond_signal(&cq.control.cond);
            printf("thread %d shutting down...\n",mynode->threadnum);
            return NULL;
            }
            #define NUM_WORKERS 4
            int numthreads;
            void join_threads(void) {
            cnode *curnode;
            printf("joining threads...\n");
            while (numthreads) {
            pthread_mutex_lock(&cq.control.mutex);
            /* below, we sleep until there really is a new cleanup node.  This
            takes care of any false wakeups... even if we break out of
            pthread_cond_wait(), we don't make any assumptions that the
            condition we were waiting for is true.  */
            while (cq.cleanup.head==NULL) {
            pthread_cond_wait(&cq.control.cond,&cq.control.mutex);
            }
            /* at this point, we hold the mutex and there is an item in the
            list that we need to process.  First, we remove the node from
            the queue.  Then, we call pthread_join() on the tid stored in
            the node.  When pthread_join() returns, we have cleaned up
            after a thread.  Only then do we free() the node, decrement the
            number of additional threads we need to wait for and repeat the
            entire process, if necessary */
            curnode = (cnode *) queue_get(&cq.cleanup);
            pthread_mutex_unlock(&cq.control.mutex);
            pthread_join(curnode->tid,NULL);
            printf("joined with thread %d\n",curnode->threadnum);
            free(curnode);
            numthreads--;
            }
            }
            int create_threads(void) {
            int x;
            cnode *curnode;
            for (x=0; x<NUM_WORKERS; x++) {
            curnode=malloc(sizeof(cnode));
            if (!curnode)
            return 1;
            curnode->threadnum=x;
            if (pthread_create(&curnode->tid, NULL, threadfunc, (void *) curnode))
            return 1;
            printf("created thread %d\n",x);
            numthreads++;
            }
            return 0;
            }
            void initialize_structs(void) {
            numthreads=0;
            if (control_init(&wq.control))
            dabort();
            queue_init(&wq.work);
            if (control_init(&cq.control)) {
            control_destroy(&wq.control);
            dabort();
            }
            queue_init(&wq.work);
            control_activate(&wq.control);
            }
            void cleanup_structs(void) {
            control_destroy(&cq.control);
            control_destroy(&wq.control);
            }
            int main(void) {
            int x;
            wnode *mywork;
            initialize_structs();
            /* CREATION */
            if (create_threads()) {
            printf("Error starting threads... cleaning up.\n");
            join_threads();
            dabort();
            }
            pthread_mutex_lock(&wq.control.mutex);
            for (x=0; x<16000; x++) {
            mywork=malloc(sizeof(wnode));
            if (!mywork) {
            printf("ouch! can't malloc!\n");
            break;
            }
            mywork->jobnum=x;
            queue_put(&wq.work,(node *) mywork);
            }
            pthread_mutex_unlock(&wq.control.mutex);
            pthread_cond_broadcast(&wq.control.cond);
            printf("sleeping...\n");
            sleep(2);
            printf("deactivating work queue...\n");
            control_deactivate(&wq.control);
            /* CLEANUP  */
            join_threads();
            cleanup_structs();
            }
            

浠g爜鍒濇帓

鐜板湪鏉ュ揩閫熷垵鎺掍唬鐮併傚畾涔夌殑絎竴涓粨鏋勭О浣?"wq"錛屽畠鍖呭惈浜?data_control 鍜岄槦鍒楀ご銆俤ata_control 緇撴瀯鐢ㄤ簬浠茶瀵規暣涓槦鍒楃殑璁塊棶錛屽寘鎷槦鍒椾腑鐨勮妭鐐廣備笅涓姝ュ伐浣滄槸瀹氫箟瀹為檯鐨勫伐浣滆妭鐐廣傝浣夸唬鐮佺鍚堟湰鏂囦腑鐨勭ず渚嬶紝姝ゅ鎵鍖呭惈鐨勯兘鏄綔涓氬彿銆?/p>

鎺ョ潃錛屽垱寤烘竻闄ら槦鍒椼傛敞閲婅鏄庝簡瀹冪殑宸ヤ綔鏂瑰紡銆傚ソ錛岀幇鍦ㄨ鎴戜滑璺寵繃 threadfunc()銆乯oin_threads()銆乧reate_threads() 鍜?initialize_structs() 璋冪敤錛岀洿鎺ヨ煩鍒?main()銆傛墍鍋氱殑絎竴浠朵簨灝辨槸鍒濆鍖栫粨鏋?-- 榪欏寘鎷垵濮嬪寲 data_controls 鍜岄槦鍒楋紝浠ュ強嬋媧誨伐浣滈槦鍒椼?/p>

鏈夊叧娓呴櫎鐨勬敞鎰忎簨欏?/span>

鐜板湪鍒濆鍖栫嚎紼嬨傚鏋滅湅涓涓?create_threads() 璋冪敤錛屼技涔庝竴鍒囨甯?-- 闄や簡涓浠朵簨銆傝娉ㄦ剰錛屾垜浠鍦ㄥ垎閰嶆竻闄よ妭鐐癸紝浠ュ強鍒濆鍖栧畠鐨勭嚎紼嬪彿鍜?TID 緇勪歡銆傛垜浠繕灝嗘竻闄よ妭鐐逛綔涓哄垵濮嬭嚜鍙橀噺浼犻掔粰姣忎竴涓柊鐨勫伐浣滅▼搴忕嚎紼嬨備負浠涔堣繖鏍峰仛錛?/p>

鍥犱負褰撴煇涓伐浣滅▼搴忕嚎紼嬮鍑烘椂錛屽畠浼氬皢鍏舵竻闄よ妭鐐硅繛鎺ュ埌娓呴櫎闃熷垪錛岀劧鍚庣粓姝€傞偅鏃訛紝涓葷嚎紼嬩細鍦ㄦ竻闄ら槦鍒椾腑媯嫻嬪埌榪欎釜鑺傜偣錛堝埄鐢ㄦ潯浠跺彉閲忥級錛屽茍灝嗚繖涓妭鐐圭Щ鍑洪槦鍒椼傚洜涓?TID錛堢嚎紼嬫爣璇嗭級瀛樺偍鍦ㄦ竻闄よ妭鐐逛腑錛屾墍浠ヤ富綰跨▼鍙互紜垏鐭ラ亾鍝釜綰跨▼宸茬粓姝簡銆傜劧鍚庯紝涓葷嚎紼嬪皢璋冪敤 pthread_join(tid)錛屽茍鑱旀帴閫傚綋鐨勫伐浣滅▼搴忕嚎紼嬨傚鏋滄病鏈夊仛璁板綍錛岄偅涔堜富綰跨▼灝遍渶瑕佹寜浠繪剰欏哄簭鑱旀帴宸ヤ綔紼嬪簭綰跨▼錛屽彲鑳芥槸鎸夊畠浠殑鍒涘緩欏哄簭銆傜敱浜庣嚎紼嬩笉涓瀹氭寜姝ら『搴忕粓姝紝閭d箞涓葷嚎紼嬪彲鑳戒細鍦ㄥ凡緇忚仈鎺ヤ簡鍗佷釜綰跨▼鏃訛紝絳夊緟鑱旀帴鍙︿竴涓嚎紼嬨傛偍鑳界悊瑙h繖縐嶈璁″喅絳栨槸濡備綍浣垮叧闂唬鐮佸姞閫熺殑鍚楋紙灝ゅ叾鍦ㄤ嬌鐢ㄥ嚑鐧句釜宸ヤ綔紼嬪簭綰跨▼鐨勬儏鍐典笅錛夛紵


鍒涘緩宸ヤ綔

鎴戜滑宸插惎鍔ㄤ簡宸ヤ綔紼嬪簭綰跨▼錛堝畠浠凡緇忓畬鎴愪簡鎵ц threadfunc()錛岀◢鍚庡皢璁ㄨ姝ゅ嚱鏁幫級錛岀幇鍦ㄤ富綰跨▼寮濮嬪皢宸ヤ綔鑺傜偣鎻掑叆宸ヤ綔闃熷垪銆傞鍏堬紝瀹冮攣瀹?wq 鐨勬帶鍒朵簰鏂ュ璞★紝鐒跺悗鍒嗛厤 16000 涓伐浣滃寘錛屽皢瀹冧滑閫愪釜鎻掑叆闃熷垪銆傚畬鎴愪箣鍚庯紝灝嗚皟鐢?pthread_cond_broadcast()錛屼簬鏄墍鏈夋鍦ㄧ潯鐪犵殑綰跨▼浼氳鍞ら啋錛屽茍寮濮嬫墽琛屽伐浣溿傛鏃訛紝涓葷嚎紼嬪皢鐫$湢涓ょ閽燂紝鐒跺悗閲婃斁宸ヤ綔闃熷垪錛屽茍閫氱煡宸ヤ綔紼嬪簭綰跨▼緇堟媧誨姩銆傛帴鐫錛屼富綰跨▼浼氳皟鐢?join_threads() 鍑芥暟鏉ユ竻闄ゆ墍鏈夊伐浣滅▼搴忕嚎紼嬨?/p>

threadfunc()

鐜板湪鏉ヨ璁?threadfunc()錛岃繖鏄墍鏈夊伐浣滅▼搴忕嚎紼嬮兘瑕佹墽琛岀殑浠g爜銆傚綋宸ヤ綔紼嬪簭綰跨▼鍚姩鏃訛紝瀹冧細绔嬪嵆閿佸畾宸ヤ綔闃熷垪浜掓枼瀵硅薄錛岃幏鍙栦竴涓伐浣滆妭鐐癸紙濡傛灉鏈夌殑璇濓級錛岀劧鍚庡瀹冭繘琛屽鐞嗐傚鏋滄病鏈夊伐浣滐紝鍒欒皟鐢?pthread_cond_wait()銆傛偍浼氭敞鎰忓埌榪欎釜璋冪敤鍦ㄤ竴涓潪甯哥揣鍑戠殑 while() 寰幆涓紝榪欐槸闈炲父閲嶈鐨勩傚綋浠?pthread_cond_wait() 璋冪敤涓嫃閱掓椂錛屽喅涓嶈兘璁や負鏉′歡鑲畾鍙戠敓浜?-- 瀹?鍙兘鍙戠敓浜嗭紝涔熷彲鑳芥病鏈夊彂鐢熴傚鏋滃彂鐢熶簡榪欑鎯呭喌錛屽嵆閿欒鍦板敜閱掍簡綰跨▼錛岃屽垪琛ㄦ槸絀虹殑錛岄偅涔?while 寰幆灝嗗啀嬈¤皟鐢?pthread_cond_wait()銆?

濡傛灉鏈変竴涓伐浣滆妭鐐癸紝閭d箞鎴戜滑鍙墦鍗板畠鐨勪綔涓氬彿錛岄噴鏀懼畠騫墮鍑恒傜劧鑰岋紝瀹為檯浠g爜浼氭墽琛屼竴浜涙洿瀹炶川鎬х殑鎿嶄綔銆傚湪 while() 寰幆緇撳熬錛屾垜浠攣瀹氫簡浜掓枼瀵硅薄錛屼互渚挎鏌?active 鍙橀噺錛屼互鍙婂湪寰幆欏墮儴媯鏌ユ柊鐨勫伐浣滆妭鐐廣傚鏋滄墽琛屽畬姝や唬鐮侊紝灝變細鍙戠幇濡傛灉 wq.control.active 鏄?0錛寃hile 寰幆灝變細緇堟錛屽茍浼氭墽琛?threadfunc() 緇撳熬澶勭殑娓呴櫎浠g爜銆?/p>

宸ヤ綔紼嬪簭綰跨▼鐨勬竻闄や唬鐮侀儴浠墮潪甯告湁瓚c傞鍏堬紝鐢變簬 pthread_cond_wait() 榪斿洖浜嗛攣瀹氱殑浜掓枼瀵硅薄錛屽畠浼氬 work_queue 瑙i攣銆傜劧鍚庯紝瀹冮攣瀹氭竻闄ら槦鍒楋紝娣誨姞娓呴櫎浠g爜錛堝寘鍚簡 TID錛屼富綰跨▼灝嗕嬌鐢ㄦ TID 鏉ヨ皟鐢?pthread_join()錛夛紝鐒跺悗鍐嶅娓呴櫎闃熷垪瑙i攣銆傛鍚庯紝瀹冨彂淇″彿緇欐墍鏈?cq 絳夊緟鑰?(pthread_cond_signal(&cq.control.cond))錛屼簬鏄富綰跨▼灝辯煡閬撴湁涓涓緟澶勭悊鐨勬柊鑺傜偣銆傛垜浠笉浣跨敤 pthread_cond_broadcast()錛屽洜涓烘病鏈夎繖涓繀瑕?-- 鍙湁涓涓嚎紼嬶紙涓葷嚎紼嬶級鍦ㄧ瓑寰呮竻闄ら槦鍒椾腑鐨勬柊鑺傜偣銆傚綋瀹冭皟鐢?join_threads() 鏃訛紝宸ヤ綔紼嬪簭綰跨▼灝嗘墦鍗板叧闂秷鎭紝鐒跺悗緇堟錛岀瓑寰呬富綰跨▼鍙戝嚭鐨?pthread_join() 璋冪敤銆?/p>

join_threads()

濡傛灉瑕佹煡鐪嬪叧浜庡浣曚嬌鐢ㄦ潯浠跺彉閲忕殑綆鍗曠ず渚嬶紝璇峰弬鑰?join_threads() 鍑芥暟銆傚鏋滆繕鏈夊伐浣滅▼搴忕嚎紼嬶紝join_threads() 浼氫竴鐩存墽琛岋紝絳夊緟娓呴櫎闃熷垪涓柊鐨勬竻闄よ妭鐐廣傚鏋滄湁鏂拌妭鐐癸紝鎴戜滑浼氬皢姝よ妭鐐圭Щ鍑洪槦鍒椼佸娓呴櫎闃熷垪瑙i攣錛堜粠鑰屼嬌宸ヤ綔紼嬪簭鍙互娣誨姞娓呴櫎鑺傜偣錛夈佽仈鎺ユ柊鐨勫伐浣滅▼搴忕嚎紼嬶紙浣跨敤瀛樺偍鍦ㄦ竻闄よ妭鐐逛腑鐨?TID錛夈侀噴鏀炬竻闄よ妭鐐廣佸噺灝?#8220;鐜版湁”綰跨▼鐨勬暟閲忥紝鐒跺悗緇х畫銆?/p>

緇撴潫璇?/span>

鐜板湪宸茬粡鍒頒簡“POSIX 綰跨▼璇﹁В”緋誨垪鐨勫熬澹幫紝甯屾湜鎮ㄥ凡緇忓噯澶囧ソ寮濮嬪皢澶氱嚎紼嬩唬鐮佹坊鍔犲埌鎮ㄨ嚜宸辯殑搴旂敤紼嬪簭涓傛湁鍏寵緇嗕俊鎭紝璇峰弬闃?鍙傝冭祫鏂?/font>閮ㄥ垎錛岃繖閮ㄥ垎鍐呭榪樺寘鍚簡鏈枃涓嬌鐢ㄧ殑鎵鏈夋簮鐮佺殑 tar 鏂囦歡銆備笅涓涓郴鍒椾腑鍐嶈錛?


鍙傝冭祫鏂?

  • 鎮ㄥ彲浠ュ弬闃呮湰鏂囧湪 developerWorks 鍏ㄧ悆绔欑偣涓婄殑 鑻辨枃鍘熸枃.

  • 鏈枃涓嬌鐢ㄧ殑 婧愮爜鐨?tar 鏂囦歡銆?

  • 鍙嬪ソ鐨?Linux pthread 鍦ㄧ嚎甯姪 ("man -k pthread") 鏄瀬濂界殑鍙傝冭祫鏂欍?br>
  • 濡傛灉瑕佸交搴曚簡瑙?POSIX 綰跨▼錛屾垜鎺ㄨ崘姝や功錛?Programming with POSIX Threads 錛孌avid R. Butenhof (Addison-Wesley, 1997)銆傛嵁璇佸疄錛屾涔︽槸鐜版湁鏈濂界殑璁ㄨ POSIX 綰跨▼鐨勪功綾嶃?

  • W. Richard Stevens 鎾板啓鐨?UNIX Network Programming - Networking APIs: Sockets and XTI 錛?Prentice Hall, 1997) 涓涔﹁繕娑電洊浜?POSIX 綰跨▼銆傝繖鏄竴鏈粡鍏歌憲浣滐紝浣嗗畠璁ㄨ綰跨▼涓嶅涓婅堪鐨?Programming with POSIX Threads閭f牱璇︾粏銆?

  • 璇峰弬鑰?Daniel 鍦?developerWorks涓婂彂琛ㄧ殑 POSIX 綰跨▼緋誨垪涓殑鍓嶅嚑綃囨枃绔狅細
    • POSIX 綰跨▼璇﹁В浠嬬粛浜?POSIX 綰跨▼錛屽茍婕旂ず浜嗗浣曞湪浠g爜涓嬌鐢ㄧ嚎紼嬨?
    • POSIX 綰跨▼璇﹁В錛岀 2 閮ㄥ垎婕旂ず浜嗗浣曚嬌鐢ㄨ縐頒負浜掓枼瀵硅薄鐨勭伒宸у皬鐜╂剰錛屾潵淇濇姢綰跨▼浠g爜涓叡浜暟鎹粨鏋勭殑瀹屾暣鎬с?

  • 璇峰弬闃?Sean Walton 鎾板啓鐨勬湁鍏?Linux 綰跨▼鐨勬枃妗o紝KB7rfa

  • 璇峰涔犱簹閲屾閭eぇ瀛︾殑 Mark Hays 緙栧啓鐨?POSIX 綰跨▼ 鏁欑▼銆?

  • 璇峰湪 Pthreads-Tcl 浠嬬粛涓煡鐪嬪 Tcl 鐨勬洿鏀癸紝姝ゆ洿鏀逛嬌 Tcl 鑳藉涓?POSIX 綰跨▼涓璧蜂嬌鐢ㄣ?

  • 璇瘋闂?LINUX POSIX 鍜?DCE 綰跨▼涓婚〉銆?

  • 璇峰弬闃?LinuxThreads 璧勬枡搴?/font>銆?

  • Proolix鏄竴縐嶇畝鍗曠殑閬典粠 POSIX 鏍囧噯鐨勫熀浜?i8086+ 鐨勬搷浣滅郴緇熴?


鍏充簬浣滆?/span>

 

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛孏entoo 欏圭洰鐨勬昏璁″笀錛孧acMillan 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細 Caldera OpenLinux Unleashed, SuSE Linux Unleashed, 鍜?Samba Unleashed銆侱aniel 鑷簩騫寸駭璧峰氨涓庤綆楁満鏌愪簺棰嗗煙緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屾柊鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡搴︽椂鍏夈傚彲閫氳繃 drobbins@gentoo.org涓?Daniel 鑱旂郴銆?

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛孏entoo 欏圭洰鐨勬昏璁″笀錛孧acMillan 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細 Caldera OpenLinux Unleashed, SuSE Linux Unleashed, 鍜?Samba Unleashed銆侱aniel 鑷簩騫寸駭璧峰氨涓庤綆楁満鏌愪簺棰嗗煙緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屾柊鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡搴︽椂鍏夈傚彲閫氳繃 drobbins@gentoo.org涓?Daniel 鑱旂郴銆?

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛孏entoo 欏圭洰鐨勬昏璁″笀錛孧acMillan 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細 Caldera OpenLinux Unleashed, SuSE Linux Unleashed, 鍜?Samba Unleashed銆侱aniel 鑷簩騫寸駭璧峰氨涓庤綆楁満鏌愪簺棰嗗煙緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屾柊鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡搴︽椂鍏夈傚彲閫氳繃 drobbins@gentoo.org涓?Daniel 鑱旂郴銆?

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛孏entoo 欏圭洰鐨勬昏璁″笀錛孧acMillan 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細 Caldera OpenLinux Unleashed, SuSE Linux Unleashed, 鍜?Samba Unleashed銆侱aniel 鑷簩騫寸駭璧峰氨涓庤綆楁満鏌愪簺棰嗗煙緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屾柊鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡搴︽椂鍏夈傚彲閫氳繃 drobbins@gentoo.org涓?Daniel 鑱旂郴銆?




]]>[杞澆]POSIX 綰跨▼璇﹁В-絎?閮ㄥ垎http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109417.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Thu, 11 Mar 2010 03:46:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109417.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/109417.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109417.html#Feedback8http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/109417.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/109417.htmlhttp://www.ibm.com/developerworks/cn/linux/thread/posix_thread2/

POSIX 綰跨▼鏄彁楂樹唬鐮佸搷搴斿拰鎬ц兘鐨勬湁鍔涙墜孌點傚湪姝や笁閮ㄥ垎緋誨垪鏂囩珷鐨勭浜岀瘒涓紝Daniel Robbins 灝嗚鏄庯紝濡備綍浣跨敤琚О涓轟簰鏂ュ璞$殑鐏靛閥灝忕帺鎰忥紝鏉ヤ繚鎶ょ嚎紼嬩唬鐮佷腑鍏變韓鏁版嵁緇撴瀯鐨勫畬鏁存с?/blockquote>

浜掓枼鎴戝惂錛?/span>

鍦?鍓嶄竴綃囨枃绔犱腑 錛岃皥鍒頒簡浼氬鑷村紓甯哥粨鏋滅殑綰跨▼浠g爜銆備袱涓嚎紼嬪垎鍒鍚屼竴涓叏灞鍙橀噺榪涜浜嗕簩鍗佹鍔犱竴銆傚彉閲忕殑鍊兼渶鍚庡簲璇ユ槸 40錛屼絾鏈緇堝煎嵈鏄?21銆傝繖鏄庝箞鍥炰簨鍛紵鍥犱負涓涓嚎紼嬩笉鍋滃湴“鍙栨秷”浜嗗彟涓涓嚎紼嬫墽琛岀殑鍔犱竴鎿嶄綔錛屾墍浠ヤ駭鐢熻繖涓棶棰樸傜幇鍦ㄨ鎴戜滑鏉ユ煡鐪嬫敼姝e悗鐨勪唬鐮侊紝瀹冧嬌鐢?浜掓枼瀵硅薄(mutex)鏉ヨВ鍐寵闂錛?


thread3.c

#include <pthread.h>
            #include <stdlib.h>
            #include <unistd.h>
            #include <stdio.h>
            int myglobal;
            pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;
            void *thread_function(void *arg) {
            int i,j;
            for ( i=0; i<20; i++) {
            pthread_mutex_lock(&mymutex);
            j=myglobal;
            j=j+1;
            printf(".");
            fflush(stdout);
            sleep(1);
            myglobal=j;
            pthread_mutex_unlock(&mymutex);
            }
            return NULL;
            }
            int main(void) {
            pthread_t mythread;
            int i;
            if ( pthread_create( &mythread, NULL, thread_function, NULL) ) {
            printf("error creating thread.");
            abort();
            }
            for ( i=0; i<20; i++) {
            pthread_mutex_lock(&mymutex);
            myglobal=myglobal+1;
            pthread_mutex_unlock(&mymutex);
            printf("o");
            fflush(stdout);
            sleep(1);
            }
            if ( pthread_join ( mythread, NULL ) ) {
            printf("error joining thread.");
            abort();
            }
            printf("\nmyglobal equals %d\n",myglobal);
            exit(0);
            }
            

瑙h涓涓?/font>

濡傛灉灝嗚繖孌典唬鐮佷笌 鍓嶄竴綃囨枃绔?/font> 涓粰鍑虹殑鐗堟湰浣滀竴涓瘮杈冿紝灝變細娉ㄦ剰鍒板鍔犱簡 pthread_mutex_lock() 鍜?pthread_mutex_unlock() 鍑芥暟璋冪敤銆傚湪綰跨▼紼嬪簭涓繖浜涜皟鐢ㄦ墽琛屼簡涓嶅彲鎴栫己鐨勫姛鑳姐備粬浠彁渚涗簡涓縐?鐩鎬簰鎺掓枼鐨勬柟娉曪紙浜掓枼瀵硅薄鍗崇敱姝ゅ緱鍚嶏級銆備袱涓嚎紼嬩笉鑳藉悓鏃跺鍚屼竴涓簰鏂ュ璞″姞閿併?

浜掓枼瀵硅薄鏄繖鏍峰伐浣滅殑銆傚鏋滅嚎紼?a 璇曞浘閿佸畾涓涓簰鏂ュ璞★紝鑰屾鏃剁嚎紼?b 宸查攣瀹氫簡鍚屼竴涓簰鏂ュ璞℃椂錛岀嚎紼?a 灝卞皢榪涘叆鐫$湢鐘舵併備竴鏃︾嚎紼?b 閲婃斁浜嗕簰鏂ュ璞★紙閫氳繃 pthread_mutex_unlock() 璋冪敤錛夛紝綰跨▼ a 灝辮兘澶熼攣瀹氳繖涓簰鏂ュ璞★紙鎹㈠彞璇濊錛岀嚎紼?a 灝卞皢浠?pthread_mutex_lock() 鍑芥暟璋冪敤涓繑鍥烇紝鍚屾椂浜掓枼瀵硅薄琚攣瀹氾級銆傚悓鏍峰湴錛屽綋綰跨▼ a 姝i攣瀹氫簰鏂ュ璞℃椂錛屽鏋滅嚎紼?c 璇曞浘閿佸畾浜掓枼瀵硅薄鐨勮瘽錛岀嚎紼?c 涔熷皢涓存椂榪涘叆鐫$湢鐘舵併傚宸查攣瀹氱殑浜掓枼瀵硅薄涓婅皟鐢?pthread_mutex_lock() 鐨勬墍鏈夌嚎紼嬮兘灝嗚繘鍏ョ潯鐪犵姸鎬侊紝榪欎簺鐫$湢鐨勭嚎紼嬪皢“鎺掗槦”璁塊棶榪欎釜浜掓枼瀵硅薄銆?/p>

閫氬父浣跨敤 pthread_mutex_lock() 鍜?pthread_mutex_unlock() 鏉ヤ繚鎶ゆ暟鎹粨鏋勩傝繖灝辨槸璇達紝閫氳繃綰跨▼鐨勯攣瀹氬拰瑙i攣錛屽浜庢煇涓鏁版嵁緇撴瀯錛岀‘淇濇煇涓鏃跺埢鍙兘鏈変竴涓嚎紼嬭兘澶熻闂畠銆傚彲浠ユ帹嫻嬪埌錛屽綋綰跨▼璇曞浘閿佸畾涓涓湭鍔犻攣鐨勪簰鏂ュ璞℃椂錛孭OSIX 綰跨▼搴撳皢鍚屾剰閿佸畾錛岃屼笉浼氫嬌綰跨▼榪涘叆鐫$湢鐘舵併?/p>
璇風湅榪欏箙杞繪澗鐨勬極鐢伙紝鍥涗釜灝忕簿鐏甸噸鐜頒簡鏈榪戜竴嬈?pthread_mutex_lock() 璋冪敤鐨勪竴涓満闈€?/strong>

鍥句腑錛岄攣瀹氫簡浜掓枼瀵硅薄鐨勭嚎紼嬭兘澶熷瓨鍙栧鏉傜殑鏁版嵁緇撴瀯錛岃屼笉蹇呮媴蹇冨悓鏃朵細鏈夊叾瀹冪嚎紼嬪共鎵般傞偅涓暟鎹粨鏋勫疄闄呬笂鏄?#8220;鍐葷粨”浜嗭紝鐩村埌浜掓枼瀵硅薄琚В閿佷負姝€俻thread_mutex_lock() 鍜?pthread_mutex_unlock() 鍑芥暟璋冪敤錛屽鍚?#8220;鍦ㄦ柦宸ヤ腑”鏍囧織涓鏍鳳紝灝嗘鍦ㄤ慨鏀瑰拰璇誨彇鐨勬煇涓鐗瑰畾鍏變韓鏁版嵁鍖呭洿璧鋒潵銆傝繖涓や釜鍑芥暟璋冪敤鐨勪綔鐢ㄥ氨鏄鍛婂叾瀹冪嚎紼嬶紝瑕佸畠浠戶緇潯鐪犲茍絳夊緟杞埌瀹冧滑瀵逛簰鏂ュ璞″姞閿併傚綋鐒訛紝闄ら潪鍦?姣忎釜 瀵圭壒瀹氭暟鎹粨鏋勮繘琛岃鍐欐搷浣滅殑璇彞鍓嶅悗錛岄兘鍒嗗埆鏀句笂 pthread_mutex_lock() 鍜?pthread_mutext_unlock() 璋冪敤錛屾墠浼氬嚭鐜拌繖縐嶆儏鍐點?br>

涓轟粈涔堣鐢ㄤ簰鏂ュ璞★紵

鍚笂鍘誨緢鏈夎叮錛屼絾絀剁珶涓轟粈涔堣璁╃嚎紼嬬潯鐪犲憿錛熻鐭ラ亾錛岀嚎紼嬬殑涓昏浼樼偣涓嶅氨鏄叾鍏鋒湁鐙珛宸ヤ綔銆佹洿澶氱殑鏃跺欐槸鍚屾椂宸ヤ綔鐨勮兘鍔涘悧錛熸槸鐨勶紝紜疄鏄繖鏍楓傜劧鑰岋紝姣忎釜閲嶈鐨勭嚎紼嬬▼搴忛兘闇瑕佷嬌鐢ㄦ煇浜涗簰鏂ュ璞°傝鎴戜滑鍐嶇湅涓涓嬬ず渚嬬▼搴忎互渚跨悊瑙e師鍥犳墍鍦ㄣ?/p>

璇風湅 thread_function()錛屽驚鐜腑涓寮濮嬪氨閿佸畾浜嗕簰鏂ュ璞★紝鏈鍚庢墠灝嗗畠瑙i攣銆傚湪榪欎釜紺轟緥紼嬪簭涓紝mymutex 鐢ㄦ潵淇濇姢 myglobal 鐨勫箋備粩緇嗘煡鐪?thread_function()錛屽姞涓浠g爜鎶?myglobal 澶嶅埗鍒頒竴涓眬閮ㄥ彉閲忥紝瀵瑰眬閮ㄥ彉閲忓姞涓錛岀潯鐪犱竴縐掗挓錛屽湪榪欎箣鍚庢墠鎶婂眬閮ㄥ彉閲忕殑鍊間紶鍥炵粰 myglobal銆備笉浣跨敤浜掓枼瀵硅薄鏃訛紝鍗充嬌涓葷嚎紼嬪湪 thread_function() 綰跨▼鐫$湢涓縐掗挓鏈熼棿鍐呭 myglobal 鍔犱竴錛宼hread_function() 鑻忛啋鍚庝篃浼氳鐩栦富綰跨▼鎵鍔犵殑鍊箋備嬌鐢ㄤ簰鏂ュ璞¤兘澶熶繚璇佽繖縐嶆儏褰笉浼氬彂鐢熴傦紙鎮ㄤ篃璁鎬細鎯沖埌錛屾垜澧炲姞浜嗕竴縐掗挓寤惰繜浠ヨЕ鍙戜笉姝g‘鐨勭粨鏋溿傛妸灞閮ㄥ彉閲忕殑鍊艱祴緇?myglobal 涔嬪墠錛屽疄闄呬笂娌℃湁浠涔堢湡姝g悊鐢辮姹?thread_function() 鐫$湢涓縐掗挓銆傦級浣跨敤浜掓枼瀵硅薄鐨勬柊紼嬪簭浜х敓浜嗘湡鏈涚殑緇撴灉錛?/p>

$ ./thread3
            o..o..o.o..o..o.o.o.o.o..o..o..o.ooooooo
            myglobal equals 40
            

涓轟簡榪涗竴姝ユ帰绱㈣繖涓瀬涓洪噸瑕佺殑姒傚康錛岃鎴戜滑鐪嬩竴鐪嬬▼搴忎腑榪涜鍔犱竴鎿嶄綔鐨勪唬鐮侊細

thread_function() 鍔犱竴浠g爜錛?
            j=myglobal;
            j=j+1;
            printf(".");
            fflush(stdout);
            sleep(1);
            myglobal=j;
            涓葷嚎紼嬪姞涓浠g爜錛?
            myglobal=myglobal+1;
            

濡傛灉浠g爜鏄綅浜庡崟綰跨▼紼嬪簭涓紝鍙互棰勬湡 thread_function() 浠g爜灝嗗畬鏁存墽琛屻傛帴涓嬫潵鎵嶄細鎵ц涓葷嚎紼嬩唬鐮侊紙鎴栬呮槸浠ョ浉鍙嶇殑欏哄簭鎵ц錛夈傚湪涓嶄嬌鐢ㄤ簰鏂ュ璞$殑綰跨▼紼嬪簭涓紝浠g爜鍙兘錛堝嚑涔庢槸錛岀敱浜庤皟鐢ㄤ簡 sleep() 鐨勭紭鏁咃級浠ュ涓嬬殑欏哄簭鎵ц錛?/p>

    thread_function() 綰跨▼        涓葷嚎紼?
            j=myglobal;
            j=j+1;
            printf(".");
            fflush(stdout);
            sleep(1);                     myglobal=myglobal+1;
            myglobal=j;
            

褰撲唬鐮佷互姝ょ壒瀹氶『搴忔墽琛屾椂錛屽皢瑕嗙洊涓葷嚎紼嬪 myglobal 鐨勪慨鏀廣傜▼搴忕粨鏉熷悗錛屽氨灝嗗緱鍒頒笉姝g‘鐨勫箋傚鏋滄槸鍦ㄦ搷綰墊寚閽堢殑璇濓紝灝卞彲鑳戒駭鐢熸閿欒銆傛敞鎰忓埌 thread_function() 綰跨▼鎸夐『搴忔墽琛屼簡瀹冪殑鎵鏈夋寚浠ゃ傜湅鏉ヤ笉璞℃槸 thread_function() 鏈変粈涔堟搴忛鍊掋傞棶棰樻槸錛屽悓涓鏃墮棿鍐咃紝鍙︿竴涓嚎紼嬪鍚屼竴鏁版嵁緇撴瀯榪涜浜嗗彟涓涓慨鏀廣?/p>


綰跨▼鍐呭箷 1

鍦ㄨВ閲婂浣曠‘瀹氬湪浣曞浣跨敤浜掓枼瀵硅薄涔嬪墠錛屽厛鏉ユ繁鍏ヤ簡瑙d竴涓嬬嚎紼嬬殑鍐呴儴宸ヤ綔鏈哄埗銆傝鐪嬬涓涓緥瀛愶細

鍋囪涓葷嚎紼嬪皢鍒涘緩涓変釜鏂扮嚎紼嬶細綰跨▼ a銆佺嚎紼?b 鍜岀嚎紼?c銆傚亣瀹氶鍏堝垱寤虹嚎紼?a錛岀劧鍚庢槸綰跨▼ b錛屾渶鍚庡垱寤虹嚎紼?c銆?/p>

    pthread_create( &thread_a, NULL, thread_function, NULL);
            pthread_create( &thread_b, NULL, thread_function, NULL);
            pthread_create( &thread_c, NULL, thread_function, NULL);
            

鍦ㄧ涓涓?pthread_create() 璋冪敤瀹屾垚鍚庯紝鍙互鍋囧畾綰跨▼ a 涓嶆槸宸插瓨鍦ㄥ氨鏄凡緇撴潫騫跺仠姝€傜浜屼釜 pthread_create() 璋冪敤鍚庯紝涓葷嚎紼嬪拰綰跨▼ b 閮藉彲浠ュ亣瀹氱嚎紼?a 瀛樺湪錛堟垨宸插仠姝級銆?/p>

鐒惰岋紝灝卞湪絎簩涓?create() 璋冪敤榪斿洖鍚庯紝涓葷嚎紼嬫棤娉曞亣瀹氭槸鍝竴涓嚎紼嬶紙a 鎴?b錛変細棣栧厛寮濮嬭繍琛屻傝櫧鐒朵袱涓嚎紼嬮兘宸插瓨鍦紝綰跨▼ CPU 鏃墮棿鐗囩殑鍒嗛厤鍙栧喅浜庡唴鏍稿拰綰跨▼搴撱傝嚦浜庤皝灝嗛鍏堣繍琛岋紝騫舵病鏈変弗鏍肩殑瑙勫垯銆傚敖綆$嚎紼?a 鏇存湁鍙兘鍦ㄧ嚎紼?b 涔嬪墠寮濮嬫墽琛岋紝浣嗚繖騫舵棤淇濊瘉銆傚浜庡澶勭悊鍣ㄧ郴緇燂紝鎯呭喌鏇存槸濡傛銆傚鏋滅紪鍐欑殑浠g爜鍋囧畾鍦ㄧ嚎紼?b 寮濮嬫墽琛屼箣鍓嶅疄闄呬笂鎵ц綰跨▼ a 鐨勪唬鐮侊紝閭d箞錛岀▼搴忔渶緇堟紜繍琛岀殑姒傜巼鏄?99%銆傛垨鑰呮洿緋熺硶錛岀▼搴忓湪鎮ㄧ殑鏈哄櫒涓?100% 鍦版紜繍琛岋紝鑰屽湪鎮ㄥ鎴風殑鍥涘鐞嗗櫒鏈嶅姟鍣ㄤ笂姝g‘榪愯鐨勬鐜囧嵈鏄浂銆?/p>

浠庤繖涓緥瀛愯繕鍙互寰楃煡錛岀嚎紼嬪簱淇濈暀浜嗘瘡涓崟鐙嚎紼嬬殑浠g爜鎵ц欏哄簭銆傛崲鍙ヨ瘽璇達紝瀹為檯涓婇偅涓変釜 pthread_create() 璋冪敤灝嗘寜瀹冧滑鍑虹幇鐨勯『搴忔墽琛屻備粠涓葷嚎紼嬩笂鏉ョ湅錛屾墍鏈変唬鐮侀兘鏄緷嬈℃墽琛岀殑銆傛湁鏃訛紝鍙互鍒╃敤榪欎竴鐐規潵浼樺寲閮ㄥ垎綰跨▼紼嬪簭銆備緥濡傦紝鍦ㄤ笂渚嬩腑錛岀嚎紼?c 灝卞彲浠ュ亣瀹氱嚎紼?a 鍜岀嚎紼?b 涓嶆槸姝e湪榪愯灝辨槸宸茬粡緇堟銆傚畠涓嶅繀鎷呭績瀛樺湪榪樻病鏈夊垱寤虹嚎紼?a 鍜岀嚎紼?b 鐨勫彲鑳芥с傚彲浠ヤ嬌鐢ㄨ繖涓閫昏緫鏉ヤ紭鍖栫嚎紼嬬▼搴忋?/p>


綰跨▼鍐呭箷 2

鐜板湪鏉ョ湅鍙︿竴涓亣鎯崇殑渚嬪瓙銆傚亣璁炬湁璁稿綰跨▼錛屼粬浠兘姝e湪鎵ц涓嬪垪浠g爜錛?/p>

    myglobal=myglobal+1;
            

閭d箞錛屾槸鍚﹂渶瑕佸湪鍔犱竴鎿嶄綔璇彞鍓嶅悗鍒嗗埆閿佸畾鍜岃В閿佷簰鏂ュ璞″憿錛熶篃璁告湁浜轟細璇?#8220;涓?#8221;銆傜紪璇戝櫒鏋佹湁鍙兘鎶婁笂榪拌祴鍊艱鍙ョ紪璇戞垚涓鏉℃満鍣ㄦ寚浠ゃ傚ぇ瀹墮兘鐭ラ亾錛屼笉鍙兘"鍗婇?涓柇涓鏉℃満鍣ㄦ寚浠ゃ傚嵆浣挎槸紜歡涓柇涔熶笉浼氱牬鍧忔満鍣ㄦ寚浠ょ殑瀹屾暣鎬с傚熀浜庝互涓婅冭檻錛屽緢鍙兘鍊懼悜浜庡畬鍏ㄧ渷鐣?pthread_mutex_lock() 鍜?pthread_mutex_unlock() 璋冪敤銆備笉瑕佽繖鏍峰仛銆?/p>

鎴戝湪璇村簾璇濆悧錛熶笉瀹屽叏鏄繖鏍楓傞鍏堬紝涓嶅簲璇ュ亣瀹氫笂榪拌祴鍊艱鍙ヤ竴瀹氫細琚紪璇戞垚涓鏉℃満鍣ㄦ寚浠わ紝闄ら潪浜茶嚜楠岃瘉浜嗘満鍣ㄤ唬鐮併傚嵆浣挎彃鍏ユ煇浜涘唴宓屾眹緙栬鍙ヤ互紜繚鍔犱竴鎿嶄綔鐨勫畬鏁存墽琛屸曗曠敋鑷籌紝鍗充嬌鏄嚜宸卞姩鎵嬪啓緙栬瘧鍣紒-- 浠嶇劧鍙兘鏈夐棶棰樸?/p>

絳旀鍦ㄨ繖閲屻備嬌鐢ㄥ崟鏉″唴宓屾眹緙栨搷浣滅爜鍦ㄥ崟澶勭悊鍣ㄧ郴緇熶笂鍙兘涓嶄細鏈変粈涔堥棶棰樸傛瘡涓姞涓鎿嶄綔閮藉皢瀹屾暣鍦拌繘琛岋紝騫朵笖澶氬崐浼氬緱鍒版湡鏈涚殑緇撴灉銆備絾鏄澶勭悊鍣ㄧ郴緇熷垯鎴劧涓嶅悓銆傚湪澶?CPU 鏈哄櫒涓婏紝涓や釜鍗曠嫭鐨勫鐞嗗櫒鍙兘浼氬湪鍑犱箮鍚屼竴鏃跺埢錛堟垨鑰咃紝灝卞湪鍚屼竴鏃跺埢錛夋墽琛屼笂榪拌祴鍊艱鍙ャ備笉瑕佸繕浜嗭紝榪欐椂瀵瑰唴瀛樼殑淇敼闇瑕佸厛浠?L1 鍐欏叆 L2 楂橀熺紦瀛樸佺劧鍚庢墠鍐欏叆涓誨瓨銆傦紙SMP 鏈哄櫒騫朵笉鍙槸澧炲姞浜嗗鐞嗗櫒鑰屽凡錛涘畠榪樻湁鐢ㄦ潵浠茶瀵?RAM 瀛樺彇鐨勭壒孌婄‖浠躲傦級鏈緇堬紝鏍規湰鏃犳硶鎼炴竻鍦ㄥ啓鍏ヤ富瀛樼殑绔炰簤涓紝鍝釜 CPU 灝嗕細"鑳滃嚭"銆傝浜х敓鍙嫻嬬殑浠g爜錛屽簲浣跨敤浜掓枼瀵硅薄銆備簰鏂ュ璞″皢鎻掑叆涓閬?鍐呭瓨鍏沖崱"錛岀敱瀹冩潵紜繚瀵逛富瀛樼殑鍐欏叆鎸夌収綰跨▼閿佸畾浜掓枼瀵硅薄鐨勯『搴忚繘琛屻?/p>

鑰冭檻涓縐嶄互 32 浣嶅潡涓哄崟浣嶆洿鏂頒富瀛樼殑 SMP 浣撶郴緇撴瀯銆傚鏋滄湭浣跨敤浜掓枼瀵硅薄灝卞涓涓?64 浣嶆暣鏁拌繘琛屽姞涓鎿嶄綔錛屾暣鏁扮殑鏈楂?4 浣嶅瓧鑺傚彲鑳芥潵鑷竴涓?CPU錛岃屽叾瀹?4 涓瓧鑺傚嵈鏉ヨ嚜鍙︿竴 CPU銆傜碂緋曞惂錛佹渶緋熺硶鐨勬槸錛屼嬌鐢ㄥ樊鍔茬殑鎶鏈紝鎮ㄧ殑紼嬪簭鍦ㄩ噸瑕佸鎴風殑緋葷粺涓婃湁鍙兘涓嶆槸寰堥暱鏃墮棿鎵嶅穿婧冧竴嬈★紝灝辨槸鏃╀笂涓夌偣閽熷氨宕╂簝銆侱avid R. Butenhof 鍦ㄤ粬鐨勩奝OSIX 綰跨▼緙栫▼銆嬶紙璇峰弬闃呮湰鏂囨湯灝劇殑 鍙傝冭祫鏂?/font>閮ㄥ垎錛変竴涔︿腑錛岃璁轟簡鐢變簬鏈嬌鐢ㄤ簰鏂ュ璞¤屽皢浜х敓鐨勭縐嶆儏鍐點?


璁稿浜掓枼瀵硅薄

濡傛灉鏀劇疆浜嗚繃澶氱殑浜掓枼瀵硅薄錛屼唬鐮佸氨娌℃湁浠涔堝茍鍙戞у彲璦錛岃繍琛岃搗鏉ヤ篃姣斿崟綰跨▼瑙e喅鏂規鎱€傚鏋滄斁緗簡榪囧皯鐨勪簰鏂ュ璞★紝浠g爜灝嗗嚭鐜板鎬拰浠や漢灝村艾鐨勯敊璇傚垢榪愮殑鏄紝鏈変竴涓腑闂寸珛鍦恒傞鍏堬紝浜掓枼瀵硅薄鏄敤浜庝覆琛屽寲瀛樺彇*鍏變韓鏁版嵁*銆備笉瑕佸闈炲叡浜暟鎹嬌鐢ㄤ簰鏂ュ璞★紝騫朵笖錛屽鏋滅▼搴忛昏緫紜繚浠諱綍鏃跺欓兘鍙湁涓涓嚎紼嬭兘瀛樺彇鐗瑰畾鏁版嵁緇撴瀯錛岄偅涔堜篃涓嶈浣跨敤浜掓枼瀵硅薄銆?/p>

鍏舵錛屽鏋滆浣跨敤鍏變韓鏁版嵁錛岄偅涔堝湪璇匯佸啓鍏變韓鏁版嵁鏃墮兘搴斾嬌鐢ㄤ簰鏂ュ璞°傜敤 pthread_mutex_lock() 鍜?pthread_mutex_unlock() 鎶婅鍐欓儴鍒嗕繚鎶よ搗鏉ワ紝鎴栬呭湪紼嬪簭涓笉鍥哄畾鐨勫湴鏂歸殢鏈轟嬌鐢ㄥ畠浠傚浼氫粠涓涓嚎紼嬬殑瑙掑害鏉ュ瑙嗕唬鐮侊紝騫剁‘淇濈▼搴忎腑姣忎竴涓嚎紼嬪鍐呭瓨鐨勮鐐歸兘鏄竴鑷村拰鍚堥傜殑銆備負浜嗙啛鎮変簰鏂ュ璞$殑鐢ㄦ硶錛屾渶鍒濆彲鑳借鑺卞ソ鍑犱釜灝忔椂鏉ョ紪鍐欎唬鐮侊紝浣嗘槸寰堝揩灝變細涔犳儻騫朵笖*涔?涓嶅繀澶氭兂灝辮兘澶熸紜嬌鐢ㄥ畠浠?/p>


浣跨敤璋冪敤錛氬垵濮嬪寲

鐜板湪璇ユ潵鐪嬬湅浣跨敤浜掓枼瀵硅薄鐨勫悇縐嶄笉鍚屾柟娉曚簡銆傝鎴戜滑浠庡垵濮嬪寲寮濮嬨傚湪 thread3.c 紺轟緥 涓紝鎴戜滑浣跨敤浜嗛潤鎬佸垵濮嬪寲鏂規硶銆傝繖闇瑕佸0鏄庝竴涓?pthread_mutex_t 鍙橀噺錛屽茍璧嬬粰瀹冨父鏁?PTHREAD_MUTEX_INITIALIZER錛?

pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;
            

寰堢畝鍗曞惂銆備絾鏄繕鍙互鍔ㄦ佸湴鍒涘緩浜掓枼瀵硅薄銆傚綋浠g爜浣跨敤 malloc() 鍒嗛厤涓涓柊鐨勪簰鏂ュ璞℃椂錛屼嬌鐢ㄨ繖縐嶅姩鎬佹柟娉曘傛鏃訛紝闈欐佸垵濮嬪寲鏂規硶鏄涓嶉氱殑錛屽茍涓斿簲褰撲嬌鐢ㄤ緥紼?pthread_mutex_init()錛?/p>

int pthread_mutex_init( pthread_mutex_t *mymutex, const pthread_mutexattr_t *attr)
            

姝e鎵紺猴紝pthread_mutex_init 鎺ュ彈涓涓寚閽堜綔涓哄弬鏁頒互鍒濆鍖栦負浜掓枼瀵硅薄錛岃鎸囬拡鎸囧悜涓鍧楀凡鍒嗛厤濂界殑鍐呭瓨鍖恒傜浜屼釜鍙傛暟錛屽彲浠ユ帴鍙椾竴涓彲閫夌殑 pthread_mutexattr_t 鎸囬拡銆傝繖涓粨鏋勫彲鐢ㄦ潵璁劇疆鍚勭浜掓枼瀵硅薄灞炴с備絾鏄氬父騫朵笉闇瑕佽繖浜涘睘鎬э紝鎵浠ユ甯稿仛娉曟槸鎸囧畾 NULL銆?/p>

涓鏃︿嬌鐢?pthread_mutex_init() 鍒濆鍖栦簡浜掓枼瀵硅薄錛屽氨搴斾嬌鐢?pthread_mutex_destroy() 娑堥櫎瀹冦俻thread_mutex_destroy() 鎺ュ彈涓涓寚鍚?pthread_mutext_t 鐨勬寚閽堜綔涓哄弬鏁幫紝騫墮噴鏀懼垱寤轟簰鏂ュ璞℃椂鍒嗛厤緇欏畠鐨勪換浣曡祫婧愩傝娉ㄦ剰錛?pthread_mutex_destroy() 涓嶄細 閲婃斁鐢ㄦ潵瀛樺偍 pthread_mutex_t 鐨勫唴瀛樸傞噴鏀捐嚜宸辯殑鍐呭瓨瀹屽叏鍙栧喅浜庢偍銆傝繕蹇呴』娉ㄦ剰涓鐐癸紝pthread_mutex_init() 鍜?pthread_mutex_destroy() 鎴愬姛鏃墮兘榪斿洖闆躲?


浣跨敤璋冪敤錛氶攣瀹?/font>

pthread_mutex_lock(pthread_mutex_t *mutex)
            

pthread_mutex_lock() 鎺ュ彈涓涓寚鍚戜簰鏂ュ璞$殑鎸囬拡浣滀負鍙傛暟浠ュ皢鍏墮攣瀹氥傚鏋滅宸у凡緇忛攣瀹氫簡浜掓枼瀵硅薄錛岃皟鐢ㄨ呭皢榪涘叆鐫$湢鐘舵併傚嚱鏁拌繑鍥炴椂錛屽皢鍞ら啋璋冪敤鑰咃紙鏄劇劧錛夊茍涓旇皟鐢ㄨ呰繕灝嗕繚鐣欒閿併傚嚱鏁拌皟鐢ㄦ垚鍔熸椂榪斿洖闆訛紝澶辮觸鏃惰繑鍥為潪闆剁殑閿欒浠g爜銆?/p>

pthread_mutex_unlock(pthread_mutex_t *mutex)
            

pthread_mutex_unlock() 涓?pthread_mutex_lock() 鐩擱厤鍚堬紝瀹冩妸綰跨▼宸茬粡鍔犻攣鐨勪簰鏂ュ璞¤В閿併傚緇堝簲璇ュ敖蹇宸插姞閿佺殑浜掓枼瀵硅薄榪涜瑙i攣錛堜互鎻愰珮鎬ц兘錛夈傚茍涓旂粷瀵逛笉瑕佸鎮ㄦ湭淇濇寔閿佺殑浜掓枼瀵硅薄榪涜瑙i攣鎿嶄綔錛堝惁鍒欙紝pthread_mutex_unlock() 璋冪敤灝嗗け璐ュ茍甯︿竴涓潪闆剁殑 EPERM 榪斿洖鍊鹼級銆?/p>

pthread_mutex_trylock(pthread_mutex_t *mutex)
            

褰撶嚎紼嬫鍦ㄥ仛鍏跺畠浜嬫儏鐨勬椂鍊欙紙鐢變簬浜掓枼瀵硅薄褰撳墠鏄攣瀹氱殑錛夛紝濡傛灉甯屾湜閿佸畾浜掓枼瀵硅薄錛岃繖涓皟鐢ㄥ氨鐩稿綋鏂逛究銆傝皟鐢?pthread_mutex_trylock() 鏃跺皢灝濊瘯閿佸畾浜掓枼瀵硅薄銆傚鏋滀簰鏂ュ璞″綋鍓嶅浜庤В閿佺姸鎬侊紝閭d箞鎮ㄥ皢鑾峰緱璇ラ攣騫朵笖鍑芥暟灝嗚繑鍥為浂銆傜劧鑰岋紝濡傛灉浜掓枼瀵硅薄宸查攣瀹氾紝榪欎釜璋冪敤涔熶笉浼氶樆濉炪傚綋鐒訛紝瀹冧細榪斿洖闈為浂鐨?EBUSY 閿欒鍊箋傜劧鍚庡彲浠ョ戶緇仛鍏跺畠浜嬫儏錛岀◢鍚庡啀灝濊瘯閿佸畾銆?/p>


絳夊緟鏉′歡鍙戠敓

浜掓枼瀵硅薄鏄嚎紼嬬▼搴忓繀闇鐨勫伐鍏鳳紝浣嗗畠浠茍闈炰竾鑳界殑銆備緥濡傦紝濡傛灉綰跨▼姝e湪絳夊緟鍏變韓鏁版嵁鍐呮煇涓潯浠跺嚭鐜幫紝閭d細鍙戠敓浠涔堝憿錛熶唬鐮佸彲浠ュ弽澶嶅浜掓枼瀵硅薄閿佸畾鍜岃В閿侊紝浠ユ鏌ュ肩殑浠諱綍鍙樺寲銆傚悓鏃訛紝榪樿蹇熷皢浜掓枼瀵硅薄瑙i攣錛屼互渚垮叾瀹冪嚎紼嬭兘澶熻繘琛屼換浣曞繀闇鐨勬洿鏀廣傝繖鏄竴縐嶉潪甯稿彲鎬曠殑鏂規硶錛屽洜涓虹嚎紼嬮渶瑕佸湪鍚堢悊鐨勬椂闂磋寖鍥村唴棰戠箒鍦板驚鐜嫻嬪彉鍖栥?/p>

鍦ㄦ瘡嬈℃鏌ヤ箣闂達紝鍙互璁╄皟鐢ㄧ嚎紼嬬煭鏆傚湴榪涘叆鐫$湢錛屾瘮濡傜潯鐪犱笁縐掗挓錛屼絾鏄洜姝ょ嚎紼嬩唬鐮佸氨鏃犳硶鏈蹇綔鍑哄搷搴斻傜湡姝i渶瑕佺殑鏄繖鏍蜂竴縐嶆柟娉曪紝褰撶嚎紼嬪湪絳夊緟婊¤凍鏌愪簺鏉′歡鏃朵嬌綰跨▼榪涘叆鐫$湢鐘舵併備竴鏃︽潯浠舵弧瓚籌紝榪橀渶瑕佷竴縐嶆柟娉曚互鍞ら啋鍥犵瓑寰呮弧瓚崇壒瀹氭潯浠惰岀潯鐪犵殑綰跨▼銆傚鏋滆兘澶熷仛鍒拌繖涓鐐癸紝綰跨▼浠g爜灝嗘槸闈炲父楂樻晥鐨勶紝騫朵笖涓嶄細鍗犵敤瀹濊吹鐨勪簰鏂ュ璞¢攣銆傝繖姝f槸 POSIX 鏉′歡鍙橀噺鑳藉仛鐨勪簨錛?/p>

鑰?POSIX 鏉′歡鍙橀噺灝嗘槸鎴戜笅涓綃囨枃绔犵殑涓婚錛屽叾涓皢璇存槑濡備綍姝g‘浣跨敤鏉′歡鍙橀噺銆傚埌閭f椂錛屾偍灝嗘嫢鏈変簡鍒涘緩澶嶆潅綰跨▼紼嬪簭鎵闇鐨勫叏閮ㄨ祫婧愶紝閭d簺綰跨▼紼嬪簭鍙互妯℃嫙宸ヤ綔浜哄憳銆佽閰嶇嚎絳夌瓑銆傛棦鐒舵偍宸茬粡瓚婃潵瓚婄啛鎮夌嚎紼嬶紝鎴戝皢鍦ㄤ笅涓綃囨枃绔犱腑鍔犲揩榪涘害銆傝繖鏍鳳紝鍦ㄤ笅涓綃囨枃绔犵殑緇撳熬灝辮兘鏀句笂涓涓浉瀵瑰鏉傜殑綰跨▼紼嬪簭銆傝鍒扮瓑鍒版潯浠朵駭鐢燂紝涓嬫鍐嶈錛?/p>



鍙傝冭祫鏂?



鍏充簬浣滆?/font>

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛?Gentoo 欏圭洰鐨勬昏璁″笀錛屽鏈?MacMillan 鍑虹増涔︾睄鐨勪綔鑰咃紝鍖呮嫭錛?Caldera OpenLinux Unleashed銆?SuSE Linux Unleashed鍜?Samba Unleashed 銆侱aniel 鑷皬瀛︿簩騫寸駭璧峰氨涓庤綆楁満緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屽垰鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡娓℃椂鍏夈傚彲閫氳繃 drobbins@gentoo.org 涓?Daniel 鍙栧緱鑱旂郴銆?

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛?Gentoo 欏圭洰鐨勬昏璁″笀錛屽鏈?MacMillan 鍑虹増涔︾睄鐨勪綔鑰咃紝鍖呮嫭錛?Caldera OpenLinux Unleashed銆?SuSE Linux Unleashed鍜?Samba Unleashed 銆侱aniel 鑷皬瀛︿簩騫寸駭璧峰氨涓庤綆楁満緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屽垰鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡娓℃椂鍏夈傚彲閫氳繃 drobbins@gentoo.org 涓?Daniel 鍙栧緱鑱旂郴銆?









]]>[杞澆]POSIX 綰跨▼璇﹁В-絎?閮ㄥ垎http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109415.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Thu, 11 Mar 2010 03:39:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109415.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/109415.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/11/109415.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/109415.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/109415.html

[鍘熸枃鍦板潃]http://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/


POSIX錛堝彲縐繪鎿嶄綔緋葷粺鎺ュ彛錛夌嚎紼嬫槸鎻愰珮浠g爜鍝嶅簲鍜屾ц兘鐨勬湁鍔涙墜孌點傚湪鏈郴鍒椾腑錛孌aniel Robbins 鍚戞偍綺劇‘鍦板睍紺哄湪緙栫▼涓浣曚嬌鐢ㄧ嚎紼嬨傚叾涓繕娑夊強澶ч噺騫曞悗緇嗚妭錛岃瀹屾湰緋誨垪鏂囩珷錛屾偍瀹屽叏鍙互榪愮敤 POSIX 綰跨▼鍒涘緩澶氱嚎紼嬬▼搴忋?/p>

綰跨▼鏄湁瓚g殑

浜嗚В濡備綍姝g‘榪愮敤綰跨▼鏄瘡涓涓紭縐紼嬪簭鍛樺繀澶囩殑绱犺川銆傜嚎紼嬬被浼間簬榪涚▼銆傚鍚岃繘紼嬶紝綰跨▼鐢卞唴鏍告寜鏃墮棿鍒嗙墖榪涜綆$悊銆傚湪鍗曞鐞嗗櫒緋葷粺涓紝鍐呮牳浣跨敤鏃墮棿鍒嗙墖鏉ユā鎷熺嚎紼嬬殑騫跺彂鎵ц錛岃繖縐嶆柟寮忓拰榪涚▼鐨勭浉鍚屻傝屽湪澶氬鐞嗗櫒緋葷粺涓紝濡傚悓澶氫釜榪涚▼錛岀嚎紼嬪疄闄呬笂涓鏍峰彲浠ュ茍鍙戞墽琛屻?/p>

閭d箞涓轟粈涔堝浜庡ぇ澶氭暟鍚堜綔鎬т換鍔★紝澶氱嚎紼嬫瘮澶氫釜鐙珛鐨勮繘紼嬫洿浼樿秺鍛紵榪欐槸鍥犱負錛岀嚎紼嬪叡浜浉鍚岀殑鍐呭瓨絀洪棿銆備笉鍚岀殑綰跨▼鍙互瀛樺彇鍐呭瓨涓殑鍚屼竴涓彉閲忋傛墍浠ワ紝紼嬪簭涓殑鎵鏈夌嚎紼嬮兘鍙互璇繪垨鍐欏0鏄庤繃鐨勫叏灞鍙橀噺銆傚鏋滄浘鐢?fork() 緙栧啓榪囬噸瑕佷唬鐮侊紝灝變細璁よ瘑鍒拌繖涓伐鍏風殑閲嶈鎬с備負浠涔堝憿錛熻櫧鐒?fork() 鍏佽鍒涘緩澶氫釜榪涚▼錛屼絾瀹冭繕浼氬甫鏉ヤ互涓嬮氫俊闂: 濡備綍璁╁涓繘紼嬬浉浜掗氫俊錛岃繖閲屾瘡涓繘紼嬮兘鏈夊悇鑷嫭绔嬬殑鍐呭瓨絀洪棿銆傚榪欎釜闂娌℃湁涓涓畝鍗曠殑絳旀銆傝櫧鐒舵湁璁稿涓嶅悓縐嶇被鐨勬湰鍦?IPC (榪涚▼闂撮氫俊錛夛紝浣嗗畠浠兘閬囧埌涓や釜閲嶈闅滅錛?/p>

  • 寮哄姞浜嗘煇縐嶅艦寮忕殑棰濆鍐呮牳寮閿錛屼粠鑰岄檷浣庢ц兘銆?
  • 瀵逛簬澶у鏁版儏褰紝IPC 涓嶆槸瀵逛簬浠g爜鐨?#8220;鑷劧”鎵╁睍銆傞氬父鏋佸ぇ鍦板鍔犱簡紼嬪簭鐨勫鏉傛с?

鍙岄噸鍧忎簨: 寮閿鍜屽鏉傛ч兘闈炲ソ浜嬨傚鏋滄浘緇忎負浜嗘敮鎸?IPC 鑰屽紼嬪簭澶у姩騫叉垐榪囷紝閭d箞鎮ㄥ氨浼氱湡姝f璧忕嚎紼嬫彁渚涚殑綆鍗曞叡浜唴瀛樻満鍒躲傜敱浜庢墍鏈夌殑綰跨▼閮介┗鐣欏湪鍚屼竴鍐呭瓨絀洪棿錛孭OSIX 綰跨▼鏃犻渶榪涜寮閿澶ц屽鏉傜殑闀胯窛紱昏皟鐢ㄣ傚彧瑕佸埄鐢ㄧ畝鍗曠殑鍚屾鏈哄埗錛岀▼搴忎腑鎵鏈夌殑綰跨▼閮藉彲浠ヨ鍙栧拰淇敼宸叉湁鐨勬暟鎹粨鏋勩傝屾棤闇灝嗘暟鎹粡鐢辨枃浠舵弿榪扮杞偍鎴栨尋鍏ョ揣紿勭殑鍏變韓鍐呭瓨絀洪棿銆備粎姝や竴涓師鍥狅紝灝辮凍浠ヨ鎮ㄨ冭檻搴旇閲囩敤鍗曡繘紼?澶氱嚎紼嬫ā寮忚岄潪澶氳繘紼?鍗曠嚎紼嬫ā寮忋?/p>

綰跨▼鏄揩鎹風殑

涓嶄粎濡傛銆傜嚎紼嬪悓鏍瘋繕鏄潪甯稿揩鎹風殑銆備笌鏍囧噯 fork() 鐩告瘮錛岀嚎紼嬪甫鏉ョ殑寮閿寰堝皬銆傚唴鏍告棤闇鍗曠嫭澶嶅埗榪涚▼鐨勫唴瀛樼┖闂存垨鏂囦歡鎻忚堪絎︾瓑絳夈傝繖灝辮妭鐪佷簡澶ч噺鐨?CPU 鏃墮棿錛屼嬌寰楃嚎紼嬪垱寤烘瘮鏂拌繘紼嬪垱寤哄揩涓婂崄鍒頒竴鐧懼嶃傚洜涓鴻繖涓鐐癸紝鍙互澶ч噺浣跨敤綰跨▼鑰屾棤闇澶繃浜庢媴蹇冨甫鏉ョ殑 CPU 鎴栧唴瀛樹笉瓚熾備嬌鐢?fork() 鏃跺鑷寸殑澶ч噺 CPU 鍗犵敤涔熶笉澶嶅瓨鍦ㄣ傝繖琛ㄧず鍙鍦ㄧ▼搴忎腑鏈夋剰涔夛紝閫氬父灝卞彲浠ュ垱寤虹嚎紼嬨?/p>

褰撶劧錛屽拰榪涚▼涓鏍鳳紝綰跨▼灝嗗埄鐢ㄥ CPU銆傚鏋滆蔣浠舵槸閽堝澶氬鐞嗗櫒緋葷粺璁捐鐨勶紝榪欏氨鐪熺殑鏄竴澶х壒鎬э紙濡傛灉杞歡鏄紑鏀炬簮鐮侊紝鍒欐渶緇堝彲鑳藉湪涓嶅皯騫沖彴涓婅繍琛岋級銆傜壒瀹氱被鍨嬬嚎紼嬬▼搴忥紙灝ゅ叾鏄?CPU 瀵嗛泦鍨嬬▼搴忥級鐨勬ц兘灝嗛殢緋葷粺涓鐞嗗櫒鐨勬暟鐩嚑涔庣嚎鎬у湴鎻愰珮銆傚鏋滄鍦ㄧ紪鍐?CPU 闈炲父瀵嗛泦鍨嬬殑紼嬪簭錛屽垯緇濆鎯寵娉曞湪浠g爜涓嬌鐢ㄥ綰跨▼銆備竴鏃︽帉鎻′簡綰跨▼緙栫爜錛屾棤闇浣跨敤綣佺悙鐨?IPC 鍜屽叾瀹冨鏉傜殑閫氫俊鏈哄埗錛屽氨鑳藉浠ュ叏鏂板拰鍒涢犳х殑鏂規硶瑙e喅緙栫爜闅鵑銆傛墍鏈夎繖浜涚壒鎬ч厤鍚堝湪涓璧蜂嬌寰楀綰跨▼緙栫▼鏇存湁瓚c佸揩閫熷拰鐏墊椿銆?/p>

綰跨▼鏄彲縐繪鐨?/span>

濡傛灉鐔熸倝 Linux 緙栫▼錛屽氨鏈夊彲鑳界煡閬?__clone() 緋葷粺璋冪敤銆俖_clone() 綾諱技浜?fork()錛屽悓鏃朵篃鏈夎澶氱嚎紼嬬殑鐗規с備緥濡傦紝浣跨敤 __clone()錛屾柊鐨勫瓙榪涚▼鍙互鏈夐夋嫨鍦板叡浜埗榪涚▼鐨勬墽琛岀幆澧冿紙鍐呭瓨絀洪棿錛屾枃浠舵弿榪扮絳夛級銆傝繖鏄ソ鐨勪竴闈€備絾 __clone() 涔熸湁涓嶈凍涔嬪銆傛濡俖_clone() 鍦ㄧ嚎甯姪鎸囧嚭錛?/p>

“__clone 璋冪敤鏄壒瀹氫簬 Linux 騫沖彴鐨勶紝涓嶉傜敤浜庡疄鐜板彲縐繪鐨勭▼搴忋傛緙栧啓綰跨▼鍖栧簲鐢ㄧ▼搴忥紙澶氱嚎紼嬫帶鍒跺悓涓鍐呭瓨絀洪棿錛夛紝鏈濂戒嬌鐢ㄥ疄鐜?POSIX 1003.1c 綰跨▼ API 鐨勫簱錛屼緥濡?Linux-Threads 搴撱傚弬闃?pthread_create(3thr)銆?#8221;

铏界劧 __clone() 鏈夌嚎紼嬬殑璁稿鐗規э紝浣嗗畠鏄笉鍙Щ妞嶇殑銆傚綋鐒惰繖騫朵笉鎰忓懗鐫浠g爜涓笉鑳戒嬌鐢ㄥ畠銆備絾鍦ㄨ蔣浠朵腑鑰冭檻浣跨敤 __clone() 鏃跺簲褰撴潈琛¤繖涓浜嬪疄銆傚煎緱搴嗗垢鐨勬槸錛屾濡?__clone() 鍦ㄧ嚎甯姪鎸囧嚭錛屾湁涓縐嶆洿濂界殑鏇夸唬鏂規錛歅OSIX 綰跨▼銆傚鏋滄兂緙栧啓 鍙Щ妞嶇殑 澶氱嚎紼嬩唬鐮侊紝浠g爜鍙繍琛屼簬 Solaris銆丗reeBSD銆丩inux 鍜屽叾瀹冨鉤鍙幫紝POSIX 綰跨▼鏄竴縐嶅綋鐒朵箣閫夈?/p>

絎竴涓嚎紼?/span>

涓嬮潰鏄竴涓?POSIX 綰跨▼鐨勭畝鍗曠ず渚嬬▼搴忥細


thread1.c

#include <pthread.h>
            #include <stdlib.h>
            #include <unistd.h>
            void *thread_function(void *arg) {
            int i;
            for ( i=0; i<20; i++) {
            printf("Thread says hi!\n");
            sleep(1);
            }
            return NULL;
            }
            int main(void) {
            pthread_t mythread;
            if ( pthread_create( &mythread, NULL, thread_function, NULL) ) {
            printf("error creating thread.");
            abort();
            }
            if ( pthread_join ( mythread, NULL ) ) {
            printf("error joining thread.");
            abort();
            }
            exit(0);
            }
            

瑕佺紪璇戣繖涓▼搴忥紝鍙渶鍏堝皢紼嬪簭瀛樹負 thread1.c錛岀劧鍚庤緭鍏ワ細

$ gcc thread1.c -o thread1 -lpthread
            

榪愯鍒欒緭鍏ワ細

$ ./thread1
            


鐞嗚В thread1.c

thread1.c 鏄竴涓潪甯哥畝鍗曠殑綰跨▼紼嬪簭銆傝櫧鐒跺畠娌℃湁瀹炵幇浠涔堟湁鐢ㄧ殑鍔熻兘錛屼絾鍙互甯姪鐞嗚В綰跨▼鐨勮繍琛屾満鍒躲備笅闈紝鎴戜滑涓姝ヤ竴姝ュ湴浜嗚В榪欎釜紼嬪簭鏄共浠涔堢殑銆俶ain() 涓0鏄庝簡鍙橀噺 mythread錛岀被鍨嬫槸 pthread_t銆俻thread_t 綾誨瀷鍦?pthread.h 涓畾涔夛紝閫氬父縐頒負“綰跨▼ id”錛堢緝鍐欎負 "tid"錛夈傚彲浠ヨ涓哄畠鏄竴縐嶇嚎紼嬪彞鏌勩?/p>

mythread 澹版槑鍚庯紙璁頒綇 mythread 鍙槸涓涓?"tid"錛屾垨鏄皢瑕佸垱寤虹殑綰跨▼鐨勫彞鏌勶級錛岃皟鐢?pthread_create 鍑芥暟鍒涘緩涓涓湡瀹炴椿鍔ㄧ殑綰跨▼銆備笉瑕佸洜涓?pthread_create() 鍦?"if" 璇彞鍐呰屽彈鍏惰糠鎯戙傜敱浜?pthread_create() 鎵ц鎴愬姛鏃惰繑鍥為浂鑰屽け璐ユ椂鍒欒繑鍥為潪闆跺鹼紝灝?pthread_create() 鍑芥暟璋冪敤鏀懼湪 if() 璇彞涓彧鏄負浜嗘柟渚垮湴媯嫻嬪け璐ョ殑璋冪敤銆傝鎴戜滑鏌ョ湅涓涓?pthread_create 鍙傛暟銆傜涓涓弬鏁?&mythread 鏄寚鍚?mythread 鐨勬寚閽堛傜浜屼釜鍙傛暟褰撳墠涓?NULL錛屽彲鐢ㄦ潵瀹氫箟綰跨▼鐨勬煇浜涘睘鎬с傜敱浜庣己鐪佺殑綰跨▼灞炴ф槸閫傜敤鐨勶紝鍙渶灝嗚鍙傛暟璁句負 NULL銆?/p>

絎笁涓弬鏁版槸鏂扮嚎紼嬪惎鍔ㄦ椂璋冪敤鐨勫嚱鏁板悕銆傛湰渚嬩腑錛屽嚱鏁板悕涓?thread_function()銆傚綋 thread_function() 榪斿洖鏃訛紝鏂扮嚎紼嬪皢緇堟銆傛湰渚嬩腑錛岀嚎紼嬪嚱鏁版病鏈夊疄鐜板ぇ鐨勫姛鑳姐傚畠浠呭皢 "Thread says hi!" 杈撳嚭 20 嬈$劧鍚庨鍑恒傛敞鎰?thread_function() 鎺ュ彈 void * 浣滀負鍙傛暟錛屽悓鏃惰繑鍥炲肩殑綾誨瀷涔熸槸 void *銆傝繖琛ㄦ槑鍙互鐢?void * 鍚戞柊綰跨▼浼犻掍換鎰忕被鍨嬬殑鏁版嵁錛屾柊綰跨▼瀹屾垚鏃朵篃鍙繑鍥炰換鎰忕被鍨嬬殑鏁版嵁銆傞偅濡備綍鍚戠嚎紼嬩紶閫掍竴涓換鎰忓弬鏁幫紵寰堢畝鍗曘傚彧瑕佸埄鐢?pthread_create() 涓殑絎洓涓弬鏁般傛湰渚嬩腑錛屽洜涓烘病鏈夊繀瑕佸皢浠諱綍鏁版嵁浼犵粰寰笉瓚抽亾鐨?thread_function()錛屾墍浠ュ皢絎洓涓弬鏁拌涓?NULL銆?/p>

鎮ㄤ篃璁稿凡鎺ㄦ祴鍒幫紝鍦?pthread_create() 鎴愬姛榪斿洖涔嬪悗錛岀▼搴忓皢鍖呭惈涓や釜綰跨▼銆傜瓑涓絳夛紝 涓や釜 綰跨▼錛熸垜浠笉鏄彧鍒涘緩浜嗕竴涓嚎紼嬪悧錛熶笉閿欙紝鎴戜滑鍙垱寤轟簡涓涓繘紼嬨備絾鏄富紼嬪簭鍚屾牱涔熸槸涓涓嚎紼嬨傚彲浠ヨ繖鏍風悊瑙o細濡傛灉緙栧啓鐨勭▼搴忔牴鏈病鏈変嬌鐢?POSIX 綰跨▼錛屽垯璇ョ▼搴忔槸鍗曠嚎紼嬬殑錛堣繖涓崟綰跨▼縐頒負“涓?#8221;綰跨▼錛夈傚垱寤轟竴涓柊綰跨▼涔嬪悗紼嬪簭鎬誨叡灝辨湁涓や釜綰跨▼浜嗐?

鎴戞兂姝ゆ椂鎮ㄨ嚦灝戞湁涓や釜閲嶈闂銆傜涓涓棶棰橈紝鏂扮嚎紼嬪垱寤轟箣鍚庝富綰跨▼濡備綍榪愯銆傜瓟妗堬紝涓葷嚎紼嬫寜欏哄簭緇х畫鎵ц涓嬩竴琛岀▼搴忥紙鏈緥涓墽琛?"if (pthread_join(...))"錛夈傜浜屼釜闂錛屾柊綰跨▼緇撴潫鏃跺浣曞鐞嗐傜瓟妗堬紝鏂扮嚎紼嬪厛鍋滄錛岀劧鍚庝綔涓哄叾娓呯悊榪囩▼鐨勪竴閮ㄥ垎錛岀瓑寰呬笌鍙︿竴涓嚎紼嬪悎騫舵垨“榪炴帴”銆?/p>

鐜板湪錛屾潵鐪嬩竴涓?pthread_join()銆傛濡?pthread_create() 灝嗕竴涓嚎紼嬫媶鍒嗕負涓や釜錛?pthread_join() 灝嗕袱涓嚎紼嬪悎騫朵負涓涓嚎紼嬨俻thread_join() 鐨勭涓涓弬鏁版槸 tid mythread銆傜浜屼釜鍙傛暟鏄寚鍚?void 鎸囬拡鐨勬寚閽堛傚鏋?void 鎸囬拡涓嶄負 NULL錛宲thread_join 灝嗙嚎紼嬬殑 void * 榪斿洖鍊兼斁緗湪鎸囧畾鐨勪綅緗笂銆傜敱浜庢垜浠笉蹇呯悊浼?thread_function() 鐨勮繑鍥炲鹼紝鎵浠ュ皢鍏惰涓?NULL.

鎮ㄤ細娉ㄦ剰鍒?thread_function() 鑺變簡 20 縐掓墠瀹屾垚銆傚湪 thread_function() 緇撴潫寰堜箙涔嬪墠錛屼富綰跨▼灝卞凡緇忚皟鐢ㄤ簡 pthread_join()銆傚鏋滃彂鐢熻繖縐嶆儏鍐碉紝涓葷嚎紼嬪皢涓柇錛堣漿鍚戠潯鐪狅級鐒跺悗絳夊緟 thread_function() 瀹屾垚銆傚綋 thread_function() 瀹屾垚鍚? pthread_join() 灝嗚繑鍥炪傝繖鏃剁▼搴忓張鍙湁涓涓富綰跨▼銆傚綋紼嬪簭閫鍑烘椂錛屾墍鏈夋柊綰跨▼宸茬粡浣跨敤 pthread_join() 鍚堝茍浜嗐傝繖灝辨槸搴旇濡備綍澶勭悊鍦ㄧ▼搴忎腑鍒涘緩鐨勬瘡涓柊綰跨▼鐨勮繃紼嬨傚鏋滄病鏈夊悎騫朵竴涓柊綰跨▼錛屽垯瀹冧粛鐒跺緋葷粺鐨勬渶澶х嚎紼嬫暟闄愬埗涓嶅埄銆傝繖鎰忓懗鐫濡傛灉鏈綰跨▼鍋氭紜殑娓呯悊錛屾渶緇堜細瀵艱嚧 pthread_create() 璋冪敤澶辮觸銆?/p>

鏃犵埗錛屾棤瀛?/span>

濡傛灉浣跨敤榪?fork() 緋葷粺璋冪敤錛屽彲鑳界啛鎮夌埗榪涚▼鍜屽瓙榪涚▼鐨勬蹇點傚綋鐢?fork() 鍒涘緩鍙︿竴涓柊榪涚▼鏃訛紝鏂拌繘紼嬫槸瀛愯繘紼嬶紝鍘熷榪涚▼鏄埗榪涚▼銆傝繖鍒涘緩浜嗗彲鑳介潪甯告湁鐢ㄧ殑灞傛鍏崇郴錛屽挨鍏舵槸絳夊緟瀛愯繘紼嬬粓姝㈡椂銆備緥濡傦紝waitpid() 鍑芥暟璁╁綋鍓嶈繘紼嬬瓑寰呮墍鏈夊瓙榪涚▼緇堟銆倃aitpid() 鐢ㄦ潵鍦ㄧ埗榪涚▼涓疄鐜扮畝鍗曠殑娓呯悊榪囩▼銆?/p>

鑰?POSIX 綰跨▼灝辨洿鏈夋剰鎬濄傛偍鍙兘宸茬粡娉ㄦ剰鍒版垜涓鐩存湁鎰忛伩鍏嶄嬌鐢?#8220;鐖剁嚎紼?#8221;鍜?#8220;瀛愮嚎紼?#8221;鐨勮娉曘傝繖鏄洜涓?POSIX 綰跨▼涓笉瀛樺湪榪欑灞傛鍏崇郴銆傝櫧鐒朵富綰跨▼鍙互鍒涘緩涓涓柊綰跨▼錛屾柊綰跨▼鍙互鍒涘緩鍙︿竴涓柊綰跨▼錛孭OSIX 綰跨▼鏍囧噯灝嗗畠浠涓虹瓑鍚岀殑灞傛銆傛墍浠ョ瓑寰呭瓙綰跨▼閫鍑虹殑姒傚康鍦ㄨ繖閲屾病鏈夋剰涔夈侾OSIX 綰跨▼鏍囧噯涓嶈褰曚換浣?#8220;瀹舵棌”淇℃伅銆傜己灝戝鏃忎俊鎭湁涓涓富瑕佸惈鎰忥細濡傛灉瑕佺瓑寰呬竴涓嚎紼嬬粓姝紝灝卞繀欏誨皢綰跨▼鐨?tid 浼犻掔粰 pthread_join()銆傜嚎紼嬪簱鏃犳硶涓烘偍鏂畾 tid銆?/p>

瀵瑰ぇ澶氭暟寮鍙戣呮潵璇磋繖涓嶆槸涓ソ娑堟伅錛屽洜涓鴻繖浼氫嬌鏈夊涓嚎紼嬬殑紼嬪簭澶嶆潅鍖栥備笉榪囦笉瑕佷負姝ゆ媴蹇с侾OSIX 綰跨▼鏍囧噯鎻愪緵浜嗘湁鏁堝湴綆$悊澶氫釜綰跨▼鎵闇瑕佺殑鎵鏈夊伐鍏楓傚疄闄呬笂錛屾病鏈夌埗/瀛愬叧緋昏繖涓浜嬪疄鍗翠負鍦ㄧ▼搴忎腑浣跨敤綰跨▼寮杈熶簡鏇村垱閫犳х殑鏂規硶銆備緥濡傦紝濡傛灉鏈変竴涓嚎紼嬬О涓虹嚎紼?1錛岀嚎紼?1 鍒涘緩浜嗙О涓虹嚎紼?2 鐨勭嚎紼嬶紝鍒欑嚎紼?1 鑷繁娌℃湁蹇呰璋冪敤 pthread_join() 鏉ュ悎騫剁嚎紼?2錛岀▼搴忎腑鍏跺畠浠諱竴綰跨▼閮藉彲浠ュ仛鍒般傚綋緙栧啓澶ч噺浣跨敤綰跨▼鐨勪唬鐮佹椂錛岃繖灝卞彲鑳藉厑璁稿彂鐢熸湁瓚g殑浜嬫儏銆備緥濡傦紝鍙互鍒涘緩涓涓寘鍚墍鏈夊凡鍋滄綰跨▼鐨勫叏灞“姝葷嚎紼嬪垪琛?#8221;錛岀劧鍚庤涓涓笓闂ㄧ殑娓呯悊綰跨▼涓撶瓑鍋滄鐨勭嚎紼嬪姞鍒板垪琛ㄤ腑銆傝繖涓竻鐞嗙嚎紼嬭皟鐢?pthread_join() 灝嗗垰鍋滄鐨勭嚎紼嬩笌鑷繁鍚堝茍銆傜幇鍦紝浠呯敤涓涓嚎紼嬪氨宸у鍜屾湁鏁堝湴澶勭悊浜嗗叏閮ㄦ竻鐞嗐?br>

鍚屾婕父

鐜板湪鎴戜滑鏉ョ湅涓浜涗唬鐮侊紝榪欎簺浠g爜鍋氫簡涓浜涙剰鎯充笉鍒扮殑浜嬫儏銆倀hread2.c 鐨勪唬鐮佸涓嬶細


thread2.c
#include <pthread.h>
            #include <stdlib.h>
            #include <unistd.h>
            #include <stdio.h>
            int myglobal;
            void *thread_function(void *arg) {
            int i,j;
            for ( i=0; i<20; i++) {
            j=myglobal;
            j=j+1;
            printf(".");
            fflush(stdout);
            sleep(1);
            myglobal=j;
            }
            return NULL;
            }
            int main(void) {
            pthread_t mythread;
            int i;
            if ( pthread_create( &mythread, NULL, thread_function, NULL) ) {
            printf("error creating thread.");
            abort();
            }
            for ( i=0; i<20; i++) {
            myglobal=myglobal+1;
            printf("o");
            fflush(stdout);
            sleep(1);
            }
            if ( pthread_join ( mythread, NULL ) ) {
            printf("error joining thread.");
            abort();
            }
            printf("\nmyglobal equals %d\n",myglobal);
            exit(0);
            }
            

鐞嗚В thread2.c

濡傚悓絎竴涓▼搴忥紝榪欎釜紼嬪簭鍒涘緩涓涓柊綰跨▼銆備富綰跨▼鍜屾柊綰跨▼閮藉皢鍏ㄥ眬鍙橀噺 myglobal 鍔犱竴 20 嬈°備絾鏄▼搴忔湰韜駭鐢熶簡鏌愪簺鎰忔兂涓嶅埌鐨勭粨鏋溿傜紪璇戜唬鐮佽杈撳叆錛?/p>

$ gcc thread2.c -o thread2 -lpthread
            

榪愯璇瘋緭鍏ワ細

$ ./thread2
            

杈撳嚭錛?/p>

$ ./thread2
            ..o.o.o.o.oo.o.o.o.o.o.o.o.o.o..o.o.o.o.o
            myglobal equals 21
            

闈炲父鎰忓鍚э紒鍥犱負 myglobal 浠庨浂寮濮嬶紝涓葷嚎紼嬪拰鏂扮嚎紼嬪悇鑷鍏惰繘琛屼簡 20 嬈″姞涓, 紼嬪簭緇撴潫鏃?myglobal 鍊煎簲褰撶瓑浜?40銆傜敱浜?myglobal 杈撳嚭緇撴灉涓?21錛岃繖鍏朵腑鑲畾鏈夐棶棰樸備絾鏄┒绔熸槸浠涔堝憿錛?/p>

鏀懼純鍚楋紵濂斤紝璁╂垜鏉ヨВ閲婃槸鎬庝箞涓鍥炰簨銆傞鍏堟煡鐪嬪嚱鏁?thread_function()銆傛敞鎰忓浣曞皢 myglobal 澶嶅埗鍒板眬閮ㄥ彉閲?"j" 浜嗗悧? 鎺ョ潃灝?j 鍔犱竴, 鍐嶇潯鐪犱竴縐掞紝鐒跺悗鍒拌繖鏃舵墠灝嗘柊鐨?j 鍊煎鍒跺埌 myglobal錛熻繖灝辨槸鍏抽敭鎵鍦ㄣ傝鎯充竴涓嬶紝濡傛灉涓葷嚎紼嬪氨鍦ㄦ柊綰跨▼灝?myglobal 鍊煎鍒剁粰 j 鍚?/strong> 绔嬪嵆灝?myglobal 鍔犱竴錛屼細鍙戠敓浠涔堬紵褰?thread_function() 灝?j 鐨勫煎啓鍥?myglobal 鏃訛紝灝辮鐩栦簡涓葷嚎紼嬫墍鍋氱殑淇敼銆?

褰撶紪鍐欑嚎紼嬬▼搴忔椂錛屽簲閬垮厤浜х敓榪欑鏃犵敤鐨勫壇浣滅敤錛屽惁鍒欏彧浼氭氮璐規椂闂達紙褰撶劧錛岄櫎浜嗙紪鍐欏叧浜?POSIX 綰跨▼鐨勬枃绔犳椂鏈夌敤錛夈傞偅涔堬紝濡備綍鎵嶈兘鎺掗櫎榪欑闂鍛紵

鐢變簬鏄皢 myglobal 澶嶅埗緇?j 騫朵笖絳変簡涓縐掍箣鍚庢墠鍐欏洖鏃朵駭鐢熼棶棰橈紝鍙互灝濊瘯閬垮厤浣跨敤涓存椂灞閮ㄥ彉閲忓茍鐩存帴灝?myglobal 鍔犱竴銆傝櫧鐒惰繖縐嶈В鍐蟲柟妗堝榪欎釜鐗瑰畾渚嬪瓙閫傜敤錛屼絾瀹冭繕鏄笉姝g‘銆傚鏋滄垜浠 myglobal 榪涜鐩稿澶嶆潅鐨勬暟瀛﹁繍綆楋紝鑰屼笉鏄畝鍗曠殑鍔犱竴錛岃繖縐嶆柟娉曞氨浼氬け鏁堛備絾鏄負浠涔堝憿錛?/p>

瑕佺悊瑙h繖涓棶棰橈紝蹇呴』璁頒綇綰跨▼鏄茍鍙戣繍琛岀殑銆傚嵆浣垮湪鍗曞鐞嗗櫒緋葷粺涓婅繍琛岋紙鍐呮牳鍒╃敤鏃墮棿鍒嗙墖妯℃嫙澶氫換鍔★級涔熸槸鍙互鐨勶紝浠庣▼搴忓憳鐨勮搴︼紝鎯沖儚涓や釜綰跨▼鏄悓鏃舵墽琛岀殑銆倀hread2.c 鍑虹幇闂鏄洜涓?thread_function() 渚濊禆浠ヤ笅璁烘嵁錛氬湪 myglobal 鍔犱竴涔嬪墠鐨勫ぇ綰︿竴縐掗挓鏈熼棿涓嶄細淇敼 myglobal銆傞渶瑕佹湁浜涢斿緞璁╀竴涓嚎紼嬪湪瀵?myglobal 鍋氭洿鏀規椂閫氱煡鍏跺畠綰跨▼“涓嶈闈犺繎”銆傛垜灝嗗湪涓嬩竴綃囨枃绔犱腑璁茶В濡備綍鍋氬埌榪欎竴鐐廣傚埌鏃跺欒銆?/p>


鍙傝冭祫鏂?

  • 鍙傞槄 Linux threads涓殑鏂囨。錛孲ean Walton, KB7rfa

  • 鍦?An Introduction to Pthreads-Tcl 涓紝鏌ョ湅瀵?Tcl 鐨勬洿鏀逛互浣垮叾鑳藉浣跨敤 POSIX 綰跨▼

  • 浣跨敤鍙嬪ソ鐨?Linux pthread 鍦ㄧ嚎甯姪 ("man -k pthread")

  • 鍙傝?POSIX and DCE threads for Linux涓婚〉

  • 鏌ョ湅 The LinuxThreads Library

  • Proolix 錛屼竴縐嶇畝鍗曢伒浠?POSIX 鏍囧噯鐨勬搷浣滅郴緇燂紝鐢ㄤ簬 i8086+錛屼竴鐩村湪寮鍙戜腑

  • 闃呰 David R. Butenhof 鐨勮憲浣?Programming with POSIX Threads錛屼功涓璁轟簡璁稿闂錛屽叾涓皥鍒頒笉浣跨敤浜掓枼瀵硅薄鏄彲鑳藉嚭鐜扮殑縐嶇鎯呭喌



鍏充簬浣滆?/span>

 

Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛?Gentoo 欏圭洰鐨勬昏璁″笀錛屽鏈?MacMillan 鍑虹増涔︾睄鐨勪綔鑰咃紝鍖呮嫭錛?Caldera OpenLinux Unleashed銆?SuSE Linux Unleashed鍜?Samba Unleashed 銆侱aniel 鑷皬瀛︿簩騫寸駭璧峰氨涓庤綆楁満緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屽垰鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡娓℃椂鍏夈傚彲閫氳繃 drobbins@gentoo.org 涓?Daniel Robbins 鍙栧緱鑱旂郴銆?



]]>
Linux涓嬬敤淇″彿閲忓疄鐜板鍏變韓鍐呭瓨鐨勮闂繚鎶?浜?http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108778.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Wed, 03 Mar 2010 05:49:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108778.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/108778.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108778.html#Feedback1http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/108778.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/108778.html1錛氬緢澶氳祫鏂欎腑璁插埌錛岀郴緇烿鍏變韓鍐呭瓨鏄殢鍐呮牳鎸佺畫鐨勶紝鍗充嬌鎵鏈夎闂叡浜唴瀛樼殑榪涚▼閮藉凡緇忔甯哥粓姝紝鍏變韓鍐呭瓨浠嶇劧瀛樺湪錛屽湪鍐呮牳寮曞涔嬪墠錛屽璇ュ叡浜唴瀛樺尯鍩熺殑浠諱綍鏀瑰啓鎿嶄綔閮藉皢涓鐩翠繚鐣欙紝闄ら潪鏄懼紡鍒犻櫎鍏變韓鍐呭瓨銆傜殑紜槸榪欐牱鐨勶紝緋葷粺V鏈哄埗鍒嗛厤鐨勫叡浜唴瀛樺皢涓鐩翠繚鐣欙紝鑻ヨ鍒犻櫎瑕佷箞閲嶅惎緋葷粺錛岃涔堝氨璋冪敤shmctl鏉ユ樉紺哄垹闄ゃ傞偅涔堬紝shmctl鎬庝箞浣跨敤鍛紵榪欏湪涓嬮潰灝嗕細璁插埌銆?br>
2錛氬浜庝袱涓笉鍚岀殑榪涚▼錛屽浣曞湪鍏朵腑涓涓繘紼嬫弧瓚蟲煇縐嶆潯浠舵椂鍞ら啋鍙︿竴涓繘紼嬪憿錛熶笅闈篃浼氳鍒般?br>
.....................................(寰呯畫)

]]>
Linux涓嬬敤淇″彿閲忓疄鐜板鍏變韓鍐呭瓨鐨勮闂繚鎶?涓)http://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108768.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Wed, 03 Mar 2010 03:42:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108768.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/108768.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2010/03/03/108768.html#Feedback2http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/108768.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/108768.html闃呰鍏ㄦ枃

]]>
浠涔堟槸闆嗙兢錛熷摢縐嶇兢闆嗛傚悎鎮紵http://m.shnenglu.com/zjl-1026-2001/archive/2009/12/18/103479.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Fri, 18 Dec 2009 09:04:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2009/12/18/103479.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/103479.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2009/12/18/103479.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/103479.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/103479.html綆鍗曠殑璇達紝闆嗙兢錛坈luster錛夊氨鏄竴緇勮綆楁満錛屽畠浠綔涓轟竴涓暣浣撳悜鐢ㄦ埛鎻愪緵涓緇勭綉緇滆祫婧愩傝繖浜涘崟涓殑璁$畻鏈虹郴緇熷氨鏄泦緹ょ殑鑺傜偣錛坣ode錛夈備竴涓悊鎯崇殑闆嗙兢鏄紝鐢ㄦ埛浠庢潵涓嶄細鎰忚瘑鍒伴泦緹ょ郴緇熷簳灞傜殑鑺傜偣錛屽湪浠?濂逛滑鐪嬫潵錛岄泦緹ゆ槸涓涓郴緇燂紝鑰岄潪澶氫釜璁$畻鏈虹郴緇熴傚茍涓旈泦緹ょ郴緇熺殑綆$悊鍛樺彲浠ラ殢鎰忓鍔犲拰鍒犳敼闆嗙兢緋葷粺鐨勮妭鐐廣?

闆嗙兢騫朵笉鏄竴涓叏鏂扮殑姒傚康錛屽叾瀹炴棭鍦ㄤ竷鍗佸勾浠h綆楁満鍘傚晢鍜岀爺絀舵満鏋勫氨寮濮嬩簡瀵歸泦緹ょ郴緇熺殑鐮旂┒鍜屽紑鍙戙傜敱浜庝富瑕佺敤浜庣瀛﹀伐紼嬭綆楋紝鎵浠ヨ繖浜涚郴緇熷茍涓嶄負澶у鎵鐔熺煡銆傜洿鍒癓inux闆嗙兢鐨勫嚭鐜幫紝闆嗙兢鐨勬蹇墊墠寰椾互騫夸負浼犳挱銆傞泦緹ょ郴緇熶富瑕佸垎涓洪珮鍙敤(High Availability)闆嗙兢,綆縐?HA 闆嗙兢錛屽拰楂樻ц兘璁$畻(High Perfermance Computing)闆嗙兢錛岀畝縐?HPC 闆嗙兢銆?/p>

閫氳繃涓嬮潰榪欑瘒鏂囩珷鎴戜滑鍙互鏂規柟闈㈤潰浜嗚В Linux 闆嗙兢娑夊強鐨勭‖浠跺拰杞歡銆?br>

鍝緹ら泦閫傚悎鎮紵


2000 騫?5 鏈?01 鏃?/p>

Rawn Shah 浣滀負涓撳錛屽湪 Linux 鐜版湁鐨勫紑鏀炬簮鐮佸拰灝侀棴婧愮爜闆嗙兢瑙e喅鏂規鏂歸潰涓烘偍鎸囩偣榪鋒觸銆?/blockquote>

璁$畻 Linux 涓泦緹ら」鐩殑鏁伴噺灝辮薄璁$畻紜呰胺涓垱涓氬叕鍙哥殑鏁伴噺涓鏍楓備笉璞?Windows NT 宸茬粡鍙楀叾鑷韓鐨勫皝闂幆澧冮樆紕嶏紝Linux 鏈夊ぇ閲忕殑闆嗙兢緋葷粺鍙緵閫夋嫨錛岄傚悎浜庝笉鍚岀殑鐢ㄩ斿拰闇瑕併備絾紜畾搴旇浣跨敤鍝竴涓泦緹ょ殑宸ヤ綔鍗存病鏈夊洜姝ゅ彉寰楃畝鍗曘?/p>

闂鐨勯儴鍒嗗師鍥犲湪浜庢湳璇泦緹ょ敤浜庝笉鍚屽満鍚堛侷T 緇忕悊鍙兘鍏沖績濡備綍浣挎湇鍔″櫒榪愯鏃墮棿鏇撮暱錛屾垨浣垮簲鐢ㄧ▼搴忚繍琛屽緱鏇村揩錛岃屾暟瀛﹀鍙兘鏇村叧蹇冨湪鏈嶅姟鍣ㄤ笂榪涜澶ц妯℃暟鍊艱綆椼備袱鑰呴兘闇瑕佺兢闆嗭紝浣嗘槸鍚勮嚜闇瑕佷笉鍚岀壒鎬х殑緹ら泦銆?/p>

鏈枃璋冩煡浜嗕笉鍚屽艦寮忕殑闆嗙兢浠ュ強璁稿瀹炵幇涓殑涓閮ㄥ垎錛岃繖浜涘疄鐜板彲浠ヤ拱鍒幫紝涔熷彲浠ュ厤璐硅蔣浠跺艦寮忚幏寰椼傚敖綆″垪鍑虹殑鎵鏈夎В鍐蟲柟妗堝茍涓嶉兘鏄紑鏀炬簮鐮侊紝浣嗘槸澶у鏁拌蔣浠墮兘閬靛驚鍒嗗彂 Linux 婧愮爜鐨勫叕鍏辨儻渚嬶紝鐗瑰埆鏄敱浜庨偅浜涘疄鐜伴泦緹ょ殑浜鴻繕甯稿父甯屾湜璋冩暣緋葷粺鎬ц兘錛屼互婊¤凍闇瑕併?/p>

紜歡

闆嗙兢鎬繪槸娑夊強鍒版満鍣ㄤ箣闂寸殑紜歡榪炴帴銆傚湪鐜頒粖澶у鏁版儏鍐典笅錛岃繖鍙槸鎸?#8220;蹇熶互澶綉”緗戝崱鍜岄泦綰垮櫒銆備絾鍦ㄥ皷绔瀛﹂鍩熶腑錛屾湁璁稿涓撲負闆嗙兢璁捐鐨勭綉緇滄帴鍙e崱銆?/p>

瀹冧滑鍖呮嫭 Myricom 鐨?Myrinet銆丟iganet 鐨?cLAN 鍜?IEEE 1596 鏍囧噯鍙幾緙╀竴鑷存帴鍙?(SCI)銆傞偅浜涘崱鐨勫姛鑳戒笉浣嗗湪緹ら泦鐨勮妭鐐逛箣闂存彁渚涢珮甯﹀錛岃屼笖榪樺噺灝戝歡榪燂紙鍙戦佹秷鎭墍鐢ㄧ殑鏃墮棿錛夈傚浜庡湪鑺傜偣闂翠氦鎹㈢姸鎬佷俊鎭互浣垮叾鎿嶄綔淇濇寔鍚屾鎯呭喌錛岄偅浜涘歡榪熸槸鑷沖叧閲嶈鐨勩?/p>

Myricom

Myricom 鎻愪緵緗戝崱鍜屼氦鎹㈡満錛屽叾鍗曞悜浜掕繛閫熷害鏈楂樺彲杈懼埌 1.28 Gbps銆傜綉鍗℃湁涓ょ褰㈠紡錛岄摐綰垮瀷鍜屽厜綰ゅ瀷銆傞摐綰垮瀷 LAN 鍙互鍦?10 鑻卞昂璺濈鍐呬互鍏ㄩ熻繘琛岄氫俊錛岃屽湪闀胯揪 60 鑻卞昂璺濈鍐呬互鍗婇熻繘琛屾搷浣溿傚厜綰ゅ瀷 Myrinet 鍙互鍦?6.25 鑻遍噷闀跨殑鍗曟ā鍏夌氦鎴栬?340 鑻卞昂闀跨殑澶氭ā鍏夌氦涓婂叏閫熻繍琛屻侻yrinet 鍙彁渚涚洿鎺ョ偣鍒扮偣銆佸熀浜庨泦綰垮櫒鎴栧熀浜庝氦鎹㈡満鐨勭綉緇滈厤緗紝浣嗗湪鍙互榪炴帴鍒頒竴璧風殑浜ゆ崲鍏夌氦鏁伴噺鏂歸潰娌℃湁闄愬埗銆傛坊鍔犱氦鎹㈠厜綰ゅ彧浼氬鍔犺妭鐐歸棿鐨勫歡榪熴備袱涓洿鎺ヨ繛鎺ョ殑鑺傜偣涔嬮棿鐨勫鉤鍧囧歡榪熸槸 5 鍒?18 寰錛屾瘮浠ュお緗戝揩寰楀銆?/p>

闆嗙兢綾誨瀷

鏈甯歌鐨勪笁縐嶇兢闆嗙被鍨嬪寘鎷珮鎬ц兘縐戝緹ら泦銆佽礋杞藉潎琛$兢闆嗗拰楂樺彲鐢ㄦх兢闆嗐?/p>

縐戝緹ら泦

閫氬父錛岀涓縐嶆秹鍙婁負緹ら泦寮鍙戝茍琛岀紪紼嬪簲鐢ㄧ▼搴忥紝浠ヨВ鍐沖鏉傜殑縐戝闂銆傝繖鏄茍琛岃綆楃殑鍩虹錛屽敖綆″畠涓嶄嬌鐢ㄤ笓闂ㄧ殑騫惰瓚呯駭璁$畻鏈猴紝榪欑瓚呯駭璁$畻鏈哄唴閮ㄧ敱鍗佽嚦涓婁竾涓嫭绔嬪鐞嗗櫒緇勬垚銆備絾瀹冨嵈浣跨敤鍟嗕笟緋葷粺錛屽閫氳繃楂橀熻繛鎺ユ潵閾炬帴鐨勪竴緇勫崟澶勭悊鍣ㄦ垨鍙屽鐞嗗櫒 PC錛屽茍涓斿湪鍏叡娑堟伅浼犻掑眰涓婅繘琛岄氫俊浠ヨ繍琛屽茍琛屽簲鐢ㄧ▼搴忋傚洜姝わ紝鎮ㄤ細甯稿父鍚鍙堟湁涓縐嶄究瀹滅殑 Linux 瓚呯駭璁$畻鏈洪棶涓栦簡銆備絾瀹冨疄闄呮槸涓涓綆楁満緹ら泦錛屽叾澶勭悊鑳藉姏涓庣湡鐨勮秴綰ц綆楁満鐩哥瓑錛岄氬父涓濂楄薄鏍風殑緹ら泦閰嶇疆寮閿瑕佽秴榪?$100,000銆傝繖瀵逛竴鑸漢鏉ヨ浼間箮鏄お璐典簡錛屼絾涓庝環鍊間笂鐧句竾緹庡厓鐨勪笓鐢ㄨ秴綰ц綆楁満鐩告瘮榪樼畻鏄究瀹滅殑銆?/p>

璐熻澆鍧囪 緹ら泦

璐熻澆鍧囪 緹ら泦涓轟紒涓氶渶姹傛彁渚涗簡鏇村疄鐢ㄧ殑緋葷粺銆傚鍚嶇О鎵鏆楃ず鐨勶紝璇ョ郴緇熶嬌璐熻澆鍙互鍦ㄨ綆楁満緹ら泦涓敖鍙兘騫沖潎鍦板垎鎽婂鐞嗐傝璐熻澆鍙兘鏄渶瑕佸潎琛$殑搴旂敤紼嬪簭澶勭悊璐熻澆鎴栫綉緇滄祦閲忚礋杞姐傝繖鏍風殑緋葷粺闈炲父閫傚悎浜庤繍琛屽悓涓緇勫簲鐢ㄧ▼搴忕殑澶ч噺鐢ㄦ埛銆傛瘡涓妭鐐歸兘鍙互澶勭悊涓閮ㄥ垎璐熻澆錛屽茍涓斿彲浠ュ湪鑺傜偣涔嬮棿鍔ㄦ佸垎閰嶈礋杞斤紝浠ュ疄鐜板鉤琛°傚浜庣綉緇滄祦閲忎篃鏄姝ゃ傞氬父錛岀綉緇滄湇鍔″櫒搴旂敤紼嬪簭鎺ュ彈浜嗗お澶氬叆緗戞祦閲忥紝浠ヨ嚧鏃犳硶榪呴熷鐞嗭紝榪欏氨闇瑕佸皢嫻侀噺鍙戦佺粰鍦ㄥ叾瀹冭妭鐐逛笂榪愯鐨勭綉緇滄湇鍔″櫒搴旂敤銆傝繕鍙互鏍規嵁姣忎釜鑺傜偣涓婁笉鍚岀殑鍙敤璧勬簮鎴栫綉緇滅殑鐗規畩鐜鏉ヨ繘琛屼紭鍖栥?/p>

楂樺彲鐢ㄦх兢闆?/span>

楂樺彲鐢ㄦх兢闆嗙殑鍑虹幇鏄負浜嗕嬌緹ら泦鐨勬暣浣撴湇鍔″敖鍙兘鍙敤錛屼互渚胯冭檻璁$畻紜歡鍜岃蔣浠剁殑鏄撻敊鎬с傚鏋滈珮鍙敤鎬х兢闆嗕腑鐨勪富鑺傜偣鍙戠敓浜嗘晠闅滐紝閭d箞榪欐鏃墮棿鍐呭皢鐢辨鑺傜偣浠f浛瀹冦傛鑺傜偣閫氬父鏄富鑺傜偣鐨勯暅鍍忥紝鎵浠ュ綋瀹冧唬鏇夸富鑺傜偣鏃訛紝瀹冨彲浠ュ畬鍏ㄦ帴綆″叾韜喚錛屽茍涓斿洜姝や嬌緋葷粺鐜瀵逛簬鐢ㄦ埛鏄竴鑷寸殑銆?/p>

鍦ㄧ兢闆嗙殑榪欎笁縐嶅熀鏈被鍨嬩箣闂達紝緇忓父浼氬彂鐢熸販鍚堜笌浜ゆ潅銆備簬鏄紝鍙互鍙戠幇楂樺彲鐢ㄦх兢闆嗕篃鍙互鍦ㄥ叾鑺傜偣涔嬮棿鍧囪 鐢ㄦ埛璐熻澆錛屽悓鏃朵粛璇曞浘緇存寔楂樺彲鐢ㄦх▼搴︺傚悓鏍鳳紝鍙互浠庤緙栧叆搴旂敤紼嬪簭鐨勭兢闆嗕腑鎵懼埌涓涓茍琛岀兢闆嗭紝瀹冨彲浠ュ湪鑺傜偣涔嬮棿鎵ц璐熻澆鍧囪 銆傚敖綆¢泦緹ょ郴緇熸湰韜嫭绔嬩簬瀹冨湪浣跨敤鐨勮蔣浠舵垨紜歡錛屼絾瑕佹湁鏁堣繍琛岀郴緇熸椂錛岀‖浠惰繛鎺ュ皢璧峰叧閿綔鐢ㄣ?/p>

Giganet

Giganet 鏄敤浜?Linux 騫沖彴鐨勮櫄鎷熸帴鍙?(VI) 浣撶郴緇撴瀯鍗$殑絎竴瀹朵緵搴斿晢錛屾彁渚?cLAN 鍗″拰浜ゆ崲鏈恒俈I 浣撶郴緇撴瀯鏄嫭绔嬩簬騫沖彴鐨勮蔣浠跺拰紜歡緋葷粺錛屽畠鐢?Intel 寮鍙戯紝鐢ㄤ簬鍒涘緩緹ら泦銆傚畠浣跨敤鑷繁鐨勭綉緇滈氫俊鍗忚鍦ㄦ湇鍔″櫒涔嬮棿鐩存帴浜ゆ崲鏁版嵁錛岃屼笉鏄嬌鐢?IP錛屽茍涓斿畠騫朵笉鎵撶畻鎴愪負 WAN 鍙礬鐢辯殑緋葷粺銆傜幇鍦紝VI 鐨勬湭鏉ュ彇鍐充簬姝e湪榪涜鐨?#8220;緋葷粺 I/O 緇?#8221;鐨勫伐浣滐紝榪欎釜灝忕粍鏈槸 Intel 棰嗗鐨?#8220;涓嬩竴浠?I/O”灝忕粍涓?IBM 鍜?Compaq 棰嗗鐨?#8220;鏈潵 I/O 灝忕粍”鐨勫悎騫躲侴iganet 浜у搧褰撳墠鍙互鍦ㄨ妭鐐逛箣闂存彁渚?1 Gbps 鍗曞悜閫氫俊錛屾渶灝忓歡榪熶負 7 寰銆?/p>

IEEE SCI

IEEE 鏍囧噯 SCI 鐨勫歡榪熸洿灝戯紙浣庝簬 2.5 寰錛夛紝騫朵笖鍏跺崟鍚戦熷害鍙揪鍒?400 MB錛忕 (3.2 Gbps)銆係CI 鏄熀浜庣幆鎷撴墤鐨勭綉緇滅郴緇燂紝涓嶅儚浠ュお緗戞槸鏄熷艦鎷撴墤銆傝繖灝嗕嬌鍦ㄨ緝澶ц妯$殑鑺傜偣涔嬮棿閫氫俊閫熷害鏇村揩銆傛洿鏈夌敤鐨勬槸鐜潰鎷撴墤緗戠粶錛屽畠鍦ㄨ妭鐐逛箣闂存湁璁稿鐜艦緇撴瀯銆備袱緇寸幆闈㈠彲浠ョ敤 n 涔?m 鐨勭綉鏍艱〃紺猴紝鍏朵腑鍦ㄦ瘡涓琛屽拰姣忎竴鍒楅兘鏈変竴涓幆褰㈢綉緇溿備笁緇寸幆闈篃綾諱技錛屽彲浠ョ敤涓夌淮绔嬩綋鑺傜偣緗戞牸琛ㄧず錛屾瘡涓灞備笂鏈変竴涓幆褰㈢綉緇溿傚瘑闆嗚秴綰ц綆楀茍琛岀郴緇熶嬌鐢ㄧ幆闈㈡嫇鎵戠綉緇滐紝涓烘垚鐧句笂鍗冧釜鑺傜偣涔嬮棿鐨勯氫俊鎻愪緵鐩稿鏈蹇殑璺緞銆?/p>

澶у鏁版搷浣滅郴緇熺殑闄愬埗鍥犵礌涓嶆槸鎿嶄綔緋葷粺鎴栫綉緇滄帴鍙o紝鑰屾槸鏈嶅姟鍣ㄧ殑鍐呴儴 PCI 鎬葷嚎緋葷粺銆傚嚑涔庢墍鏈夊彴寮?PC 閫氬父鏈夊熀鏈?32-浣嶏紝33-MHz PCI錛屽茍涓斿ぇ澶氭暟浣庣鏈嶅姟鍣ㄥ彧鎻愪緵 133 MB錛忕 (1 Gbps)錛岃繖闄愬埗浜嗛偅浜涚綉鍗$殑鑳藉姏銆備竴浜涙槀璐電殑楂樼鏈嶅姟鍣紝濡?Compaq Proliant 6500 鍜?IBM Netfinity 7000 緋誨垪錛岄兘鏈?64-浣嶏紝 66-MHz 緗戝崱錛屽畠浠兘澶熶互鍥涘嶉熷害榪愯銆備笉騫稿湴鏄紝鐭涚浘鏄洿澶氬叕鍙鎬嬌鐢ㄤ綆绔殑緋葷粺錛屽洜姝ゅぇ澶氭暟渚涘簲鍟嗘渶緇堢敓浜у拰閿鍞洿澶氫綆绔?PCI 緗戝崱銆備篃鏈変笓闂ㄧ殑 64-浣嶏紝66-MHz PCI 緗戝崱錛屼絾浠鋒牸瑕佽吹璁稿銆備緥濡傦紝Intel 鎻愪緵浜嗚繖縐嶇被鍨嬬殑“蹇熶互澶綉”緗戝崱錛屼環鏍肩害 $400 鍒?$500錛屽嚑涔庢槸鏅?PCI 鐗堟湰浠鋒牸鐨?5 鍊嶃?/p>

縐戝緹ら泦

鏌愪簺騫惰緹ら泦緋葷粺鍙互杈懼埌濡傛楂樼殑甯﹀鍜屼綆寤惰繜錛屽叾鍘熷洜鏄畠浠氬父緇曡繃浣跨敤緗戠粶鍗忚錛屽 TCP/IP銆傝櫧鐒剁綉闄呭崗璁浜庡箍鍩熺綉寰堥噸瑕侊紝浣嗗畠鍖呭惈浜嗗お澶氱殑寮閿錛岃岃繖浜涘紑閿鍦ㄨ妭鐐圭浉浜掑凡鐭ョ殑灝侀棴緗戠粶緹ら泦涓槸涓嶅繀瑕佺殑銆傚叾瀹烇紝閭d簺緋葷粺涓湁涓閮ㄥ垎鍙互鍦ㄨ妭鐐逛箣闂翠嬌鐢ㄧ洿鎺ュ唴瀛樿闂?(DMA)錛屽畠綾諱技浜庡浘褰㈠崱鍜屽叾瀹冨鍥磋澶囧湪涓鍙版満鍣ㄤ腑鐨勫伐浣滄柟寮忋傚洜姝ゆí璺ㄧ兢闆嗭紝鍙互閫氳繃浠諱綍鑺傜偣涓婄殑浠諱綍澶勭悊鍣ㄧ洿鎺ヨ闂竴縐嶅艦寮忕殑鍒嗗竷寮忓叡浜唴瀛樸傚畠浠篃鍙互浣跨敤浣庡紑閿鐨勬秷鎭紶閫掔郴緇燂紝鍦ㄨ妭鐐逛箣闂磋繘琛岄氫俊銆?/p>

娑堟伅浼犻掓帴鍙?(MPI) 鏄茍琛岀兢闆嗙郴緇熼棿娑堟伅浼犻掑眰鐨勬渶甯歌瀹炵幇銆侻PI 瀛樺湪鍑犵琛嶇敓鐗堟湰錛屼絾鍦ㄦ墍鏈夋儏鍐典笅錛屽畠涓哄紑鍙戣呰闂茍琛屽簲鐢ㄧ▼搴忔彁渚涗簡涓涓叕鍏?API錛岃繖鏍峰紑鍙戣呭氨涓嶅繀鎵嬪伐瑙e喅濡備綍鍦ㄧ兢闆嗙殑鑺傜偣涔嬮棿鍒嗗彂浠g爜孌點傚叾涓竴涓紝Beowulf 緋葷粺棣栧厛灝?MPI 鐢ㄤ綔鍏叡緙栫▼鎺ュ彛銆?/p>

寰堥毦鍐沖畾浣跨敤鍝楂樻ц兘闆嗙兢鍖呫傝澶氶兘鎻愪緵綾諱技鏈嶅姟錛屼絾璁$畻鐨勫叿浣撹姹傛墠鏄喅瀹氭у洜绱犮傚緢澶氭儏鍐典笅錛屽湪閭d簺緋葷粺涓殑鐮旂┒宸ヤ綔鍙槸瑙e喅闇姹傜殑涓鍗婏紝鑰屼笖浣跨敤閭d簺杞歡闇瑕侀泦緹ゅ寘寮鍙戣呯殑鐗規畩甯姪鍜屽悎浣溿?/p>

Beowulf

褰撹皥鍒?Linux 闆嗙兢鏃訛紝璁稿浜虹殑絎竴鍙嶆槧鏄?Beowulf銆傞偅鏄渶钁楀悕鐨?Linux 縐戝杞歡闆嗙兢緋葷粺銆傛病鏈変竴涓寘鍙仛 Beowulf銆傚疄闄呬笂錛屽畠鏄竴涓湳璇紝閫傜敤浜庡湪 Linux 鍐呮牳涓婅繍琛岀殑涓緇勫叕鍏辮蔣浠跺伐鍏楓傚叾涓寘鎷祦琛岀殑杞歡娑堟伅浼犻?API錛屽“娑堟伅浼犻佹帴鍙?#8221;(MPI) 鎴?#8220;騫惰铏氭嫙鏈?#8221;(PVM)錛屽 Linux 鍐呮牳鐨勪慨鏀癸紝浠ュ厑璁哥粨鍚堝嚑涓互澶綉鎺ュ彛銆侀珮鎬ц兘緗戠粶椹卞姩鍣紝瀵硅櫄鎷熷唴瀛樼鐞嗗櫒鐨勬洿鏀癸紝浠ュ強鍒嗗竷寮忚繘紼嬮棿閫氫俊 (DIPC) 鏈嶅姟銆傚叕鍏卞叏灞榪涚▼鏍囪瘑絀洪棿鍏佽浣跨敤 DIPC 鏈哄埗浠庝換浣曡妭鐐硅闂換浣曡繘紼嬨侭eowulf 榪樺湪鑺傜偣闂存敮鎸佷竴緋誨垪紜歡榪為氭ч変歡銆?/p>

Beowulf 鍙兘鏄冭檻 Linux 鏃舵敞鎰忓埌鐨勭涓涓珮鎬ц兘闆嗙兢緋葷粺錛岃繖鍙槸鍥犱負瀹冪殑騫挎硾浣跨敤鍜屾敮鎸併傚叧浜庤繖涓富棰橈紝鏈夎澶氭枃。鍜屼功绫嶃侭eowulf 涓庝互涓嬩竴浜涚瀛﹂泦緹ょ郴緇熶箣闂寸殑宸紓鍙互鏄疄闄呯殑錛屾垨鑰呭彧鏄湪浜у搧鍚嶇О涓湁宸紓銆備緥濡傦紝灝界鍚嶇О涓嶅悓錛孉lta Technologies 鐨?AltaCluster 灝辨槸涓涓?Beowulf 緋葷粺銆傛煇浜涗緵搴斿晢錛屽 ParTec AG錛屼竴瀹跺痙鍥藉叕鍙革紝鎻愪緵浜?Beowulf 妯″瀷鐨勮鐢熺増鏈紝浠ュ寘鎷叾瀹冪鐞嗘帴鍙e拰閫氫俊鍗忚銆?/p>

Giganet cLAN

Giganet 鎻愪緵浜嗕竴縐嶅畾鍒剁殑鍩轟簬紜歡鐨勮В鍐蟲柟妗堬紝瀹冧嬌鐢ㄩ潪 IP 鍗忚鍦ㄤ竴涓瀛︾兢闆嗙殑鑺傜偣闂磋繘琛岄氫俊銆傚鍓嶆墍榪幫紝“铏氭嫙鎺ュ彛”鍗忚閫氳繃闄ゅ幓涓嶅皯鍗忚鐨勫紑閿錛屽 IP錛屼互鏀寔鏈嶅姟鍣ㄩ棿鏇村揩鐨勯氫俊銆傚彟澶栵紝紜歡緋葷粺鍙寜鍗冨厗姣旂壒閫熷害榪愯錛屽茍涓斿歡榪熷緢鐭紝浣垮畠闈炲父閫傚悎鏋勫緩鏈澶氳揪 256 涓妭鐐圭殑縐戝緹ら泦銆傝渚涘簲鍟嗘敮鎸?MPI錛岃繖鏍瘋澶氬茍琛屽簲鐢ㄧ▼搴忓氨鍙互鍦ㄧ被浼肩殑緋葷粺錛堝 Beowulf錛変笂榪愯銆?/p>

瀹冧篃鏈?Beowulf 鐨勭己鐐癸紝鍗充笉鑳界敤浣滅綉緇滆礋杞藉叡浜郴緇燂紝闄ら潪鎯寵緙栧啓搴旂敤紼嬪簭鏉ョ洃鎺у拰鍒嗗彂鍦ㄦ湇鍔″櫒闂翠紶閫佺殑緗戠粶鍖呫?br>

Legion

Legion 璇曞浘鏋勫緩涓涓湡姝g殑澶氳綆楁満緋葷粺銆傝繖鏄竴涓兢闆嗭紝鍏朵腑姣忎釜鑺傜偣閮芥槸涓涓嫭绔嬬郴緇燂紝浣嗗湪鐢ㄦ埛鐪嬫潵錛屾暣涓郴緇熷彧鏄竴鍙拌綆楁満銆侺egion 璁捐鎴愭敮鎸佷竴鍙頒笘鐣岃寖鍥寸殑璁$畻鏈猴紝鐢變笂鐧句竾涓富鏈轟互鍙婃暟浠ヤ竾浜胯鐨勮蔣浠跺璞$粍鎴愩傚湪 Legion 涓紝鐢ㄦ埛鍙互鍒涚珛浠栦滑鑷繁鐨勫悎浣滃皬緇勩?/p>

Legion 鎻愪緵浜嗛珮鎬ц兘騫惰銆佽礋杞藉潎琛°佸垎甯冨紡鏁版嵁綆$悊鍜屽閿欐с?/p>

Legion 鎻愪緵浜嗛珮鎬ц兘騫惰銆佽礋杞藉潎琛°佸垎甯冨紡鏁版嵁綆$悊鍜屽閿欐с傚畠閫氳繃鍏跺閿欑鐞嗗拰鎴愬憳鑺傜偣闂寸殑鍔ㄦ侀噸鏂伴厤緗潵鏀寔楂樺彲鐢ㄦс傚畠榪樻湁涓涓彲鎵╁厖鏍稿績錛岃鏍稿績鍙互鍦ㄥ嚭鐜版柊鐨勬敼榪涘拰榪涘睍鏃跺姩鎬佹浛鎹㈡垨鍗囩駭銆傜郴緇熷茍涓嶆槸鍙帴鍙楀崟涓鎺у埗錛岃屾槸鍙互鐢變換鎰忔暟閲忕殑緇勭粐綆$悊錛岃屾瘡涓粍緇囬兘鏀寔鏁翠綋鐨勮嚜娌婚儴鍒嗐侺egion API 閫氳繃鍏跺唴緗殑騫惰鎬ф彁渚涗簡楂樻ц兘璁$畻銆?/p>

Legion 闇瑕佷嬌鐢ㄧ壒鍒紪鍐欑殑杞歡錛屼互浣垮畠鍙互浣跨敤鍏?API 搴撱傚畠浣嶄簬鐢ㄦ埛璁$畻鏈烘搷浣滅郴緇熶箣涓婏紝鍗忚皟鏈湴璧勬簮鍜屽垎甯冨紡璧勬簮銆傚畠鑷姩澶勭悊璧勬簮璋冨害鍜屽畨鍏ㄦэ紝榪樼鐞嗕笂涓嬫枃絀洪棿浠ユ弿榪板拰璁塊棶鏁翠釜緋葷粺涓笂浜跨鍙兘涔嬪鐨勫璞°傜劧鑰岋紝鍦ㄦ瘡涓妭鐐逛笂榪愯鏃訛紝涓嶉渶瑕佷嬌鐢ㄧ郴緇熺鐞嗗憳鐗規潈錛屽茍涓斿彲浠ヤ嬌鐢ㄦ棤鐗規潈鐨勭敤鎴峰笎鍙瘋繘琛屽伐浣溿傝繖灝嗗鍔犲姞鍏?Legion 鐨勮妭鐐瑰拰鐢ㄦ埛鐨勭伒媧繪с?/p>



Cplant

Sandia National Lab 涓殑 Computational Plant 鏄竴涓ぇ瑙勬ā鏁翠綋騫惰緹ら泦錛岀敤浜庡疄鐜?TeraFLOP錛堜竾浜挎嫻偣榪愮畻錛夎綆楀茍鏋勫緩鍦ㄥ晢涓氱粍浠朵笂銆傛暣涓郴緇熺敱“鍙幾緙╁崟鍏?#8221;緇勬垚錛岃繖浜?#8220;鍙幾緙╁崟鍏?#8221;鍙互鍒掑垎鎴愰傚悎涓嶅悓鐩殑錛堣綆椼佺鐩?I/O銆佺綉緇?I/O銆佹湇鍔$鐞嗭級銆傜兢闆嗕腑鐨勬瘡涓妭鐐歸兘鏄竴涓?Linux 緋葷粺錛屽甫鏈変笓闂ㄥ紑鍙戠殑銆佹彁渚涘垎鍖烘湇鍔$殑鍐呮牳綰фā鍧椼傛瘡涓垎鍖虹殑鍔熻兘鍙互閫氳繃瑁呭叆鍜屽嵏杞藉唴鏍哥駭妯″潡鏉ヤ慨鏀廣?/p>

欏圭洰鍒嗕笁涓樁孌靛畬鎴愶紝寮濮嬮樁孌墊槸鍘熷瀷錛屾湁 128 涓熀浜?433-MHz DEC Alpha 21164 鐨勭郴緇燂紝鍏朵腑姣忎釜閮芥湁 192 MB RAM 鍜?2 GB 椹卞姩鍣紝鐩鎬簰涔嬮棿鐢?Myrinet 緗戝崱鍜?8-绔彛鐨?SAN 浜ゆ崲鏈鴻繛鎺ャ傜 1 闃舵灝嗗畠鎵╁厖涓?400 涓熀浜?21164 鐨勫伐浣滅珯錛岃繖浜涘伐浣滅珯鐨勮繍琛岄熷害涓?500 MHz錛屾湁 192 MB RAM錛屾病鏈夊瓨鍌ㄥ櫒錛岀敤 16-绔彛鐨?SAN 浜ゆ崲鏈轟互瓚呯珛鏂逛綋緇撴瀯榪炴帴璧鋒潵錛屽茍涓旇繍琛?Red Hat 5.1銆傚綋鍓嶇殑絎?2 闃舵鏈?592 鍙板熀浜?DEC 21264 鐨勬満鍣紝瀹冧滑鐨勮繍琛岄熷害涓?500 MHz錛屾湁 256 MB RAM錛屾病鏈夐┍鍔ㄥ櫒銆傛瘡涓妭鐐歸兘浣跨敤 64-浣嶏紝33-MHz PCI Myrinet 緗戝崱錛屽茍涓斾粛浣跨敤 16-绔彛浜ゆ崲鏈轟互瓚呯珛鏂逛綋緇撴瀯榪炴帴銆?/p>

鍦?Cplant 涓婅繍琛岀殑搴旂敤紼嬪簭鍖呮嫭瑙e喅紼鐤忕嚎鎬х郴緇熴佹祦浣撳姏瀛﹀拰緇撴瀯鍔涘涓綆楃郴緇熺殑浼樺寲銆佸垎瀛愬姏瀛︾殑妯℃嫙銆佺嚎鎬х粨鏋勫姏瀛︾殑鏈夐檺鍏冨垎鏋愶紝浠ュ強騫惰搴旂敤紼嬪簭鐨勫姩鎬佽礋杞藉潎琛″簱銆?/p>


JESSICA 2

棣欐腐澶у鐨勭郴緇熺爺絀跺皬緇勬湁涓涓熀浜?Java 鐨勭兢闆嗭紝鍙仛鏀寔 Java 鐨勫崟緋葷粺鏄犲儚璁$畻浣撶郴緇撴瀯 (JESSICA)錛屽畠浣滀負涓涓腑闂翠歡灞備互瀹屾垚鍗曠郴緇熸槧鍍忕殑騫繪兂銆傝灞傛槸姣忎釜浣跨敤鍒嗗竷寮忓叡浜唴瀛?(DSM) 緋葷粺榪涜閫氫俊鐨勮妭鐐逛笂榪愯鐨勬墍鏈夌嚎紼嬬殑涓涓叏灞綰跨▼絀洪棿銆傝欏圭洰浣跨敤 ThreadMark DSM錛屼絾鏈緇堝皢鐢ㄤ粬浠嚜宸卞垱寤虹殑 JiaJia Using Migrating-home Protocol (JUMP)銆備粬浠嬌鐢ㄥ畾鍒剁殑鍩轟簬 Java 鐨?ClusterProbe 杞歡鏉ョ鐞嗙兢闆嗙殑 50 涓妭鐐廣?/p>



PARIS

娉曞浗鐨?IRISA 鐮旂┒鎵鐨?#8220;澶ц妯℃暟瀛楁ā鎷熷簲鐢ㄧ▼搴忕殑緙栫▼騫惰鍜屽垎甯冨紡緋葷粺”(PARIS) 欏圭洰鎻愪緵浜嗗嚑縐嶇敤浜庡垱寤?Linux 鏈嶅姟鍣ㄧ兢闆嗙殑宸ュ叿銆傝欏圭洰鐢變笁閮ㄥ垎緇勬垚錛氱兢闆嗙殑璧勬簮綆$悊杞歡銆佸茍琛岀紪紼嬭璦鐨勮繍琛屾椂鐜錛屼互鍙婂垎甯冨紡鏁板瓧妯℃嫙鐨勮蔣浠跺伐鍏楓?/p>

璧勬簮綆$悊杞歡鍖呮嫭鐢ㄤ簬鍏變韓鍐呭瓨銆佺鐩樺拰澶勭悊鍣ㄨ祫婧愮殑 Globelins 鍒嗗竷寮忕郴緇燂紝鍙婂叾 Dupleix 鍜?Mome 鍒嗗竷寮忓叡浜唴瀛樼郴緇熴?/p>



璐熻澆鍧囪 緹ら泦

璐熻澆鍧囪 緹ら泦鍦ㄥ鑺傜偣涔嬮棿鍒嗗彂緗戠粶鎴栬綆楀鐞嗚礋杞姐傚湪榪欑鎯呭喌涓嬶紝鍖哄埆鍦ㄤ簬緙哄皯璺ㄨ妭鐐硅繍琛岀殑鍗曞茍琛岀▼搴忋傚ぇ澶氭暟鎯呭喌涓嬶紝閭g緹ら泦涓殑姣忎釜鑺傜偣閮芥槸榪愯鍗曠嫭杞歡鐨勭嫭绔嬬郴緇熴備絾鏄紝涓嶇鏄湪鑺傜偣涔嬮棿榪涜鐩存帴閫氫俊錛岃繕鏄氳繃涓ぎ璐熻澆鍧囪 鏈嶅姟鍣ㄦ潵鎺у埗姣忎釜鑺傜偣鐨勮礋杞斤紝鍦ㄨ妭鐐逛箣闂撮兘鏈変竴縐嶅叕鍏卞叧緋匯傞氬父錛屼嬌鐢ㄧ壒瀹氱殑綆楁硶鏉ュ垎鍙戣璐熻澆銆?/p>

緗戠粶嫻侀噺璐熻澆鍧囪 鏄竴涓繃紼嬶紝瀹冩鏌ュ埌鏌愪釜緹ら泦鐨勫叆緗戞祦閲忥紝鐒跺悗灝嗘祦閲忓垎鍙戝埌鍚勪釜鑺傜偣浠ヨ繘琛岄傚綋澶勭悊銆傚畠鏈閫傚悎澶у瀷緗戠粶搴旂敤紼嬪簭錛屽 Web 鎴?FTP 鏈嶅姟鍣ㄣ傝礋杞藉潎琛$綉緇滃簲鐢ㄦ湇鍔¤姹傜兢闆嗚蔣浠舵鏌ユ瘡涓妭鐐圭殑褰撳墠璐熻澆錛屽茍紜畾鍝簺鑺傜偣鍙互鎺ュ彈鏂扮殑浣滀笟銆傝繖鏈閫傚悎榪愯濡傛暟鎹垎鏋愮瓑涓茶鍜屾壒澶勭悊浣滀笟銆傞偅浜涚郴緇熻繕鍙互閰嶇疆鎴愬叧娉ㄦ煇鐗瑰畾鑺傜偣鐨勭‖浠舵垨鎿嶄綔緋葷粺鍔熻兘錛氳繖鏍鳳紝緹ら泦涓殑鑺傜偣灝辨病鏈夊繀瑕佹槸涓鑷寸殑銆?/p>



Linux 铏氭嫙鏈嶅姟鍣?/span>

“Linux 铏氭嫙鏈嶅姟鍣?#8221;欏圭洰宸茬粡瀹炵幇浜嗚澶氬唴鏍歌ˉ涓侊紝瀹冧滑涓哄叆緗?TCP/IP 嫻侀噺鍒涘緩浜嗚礋杞藉潎琛$郴緇熴侺VS 杞歡媯鏌ュ叆緗戞祦閲忥紝鐒跺悗鏍規嵁璐熻澆鍧囪 綆楁硶錛屽皢嫻侀噺閲嶅畾鍚戝埌涓緇勫厖褰撶兢闆嗙殑鏈嶅姟鍣ㄣ傝繖鍏佽緗戠粶搴旂敤紼嬪簭錛屽 Web 鏈嶅姟鍣紝鍦ㄨ妭鐐圭兢闆嗕笂榪愯浠ユ敮鎸佸ぇ閲忕敤鎴楓?/p>

LVS 鏀寔浣滀負璐熻澆鍧囪 鏈嶅姟鍣ㄧ洿鎺ヨ繛鎺ュ埌鍚屼竴涓?LAN 鐨勭兢闆嗚妭鐐癸紝浣嗗畠榪樿兘澶熶互閫氶亾浼犻?IP 鍖呯殑鏂瑰紡榪炴帴鍒拌繙紼嬫湇鍔″櫒銆傚悗涓縐嶆柟娉曞寘鎷帇緙?IP 鍖呬腑鐨勫潎琛¤姹傦紝榪欎簺 IP 淇℃伅鍖呬粠璐熻澆鍧囪 鏈嶅姟鍣ㄧ洿鎺ュ彂閫佸埌榪滅▼緹ら泦鑺傜偣銆傚敖綆?LVS 鍙互榪滅▼鏀寔緗戠珯鐨勮礋杞藉潎琛★紝浣嗗畠浣跨敤鐨勮礋杞藉潎琛$畻娉曠幇鍦ㄥ浜庤櫄鎷熺兢闆嗕腑鐨勫箍鍩?Web 鏈嶅姟鍣ㄤ粛鏃犳晥銆傚洜姝わ紝濡傛灉 Web 鏈嶅姟鍣ㄩ兘鍦ㄥ悓涓涓?LAN 涓紝LVS 鏈濂藉綋浣滆礋杞藉潎琛℃湇鍔″櫒浣跨敤銆?/p>

璐熻澆鍧囪 緋葷粺鐨勫嚑縐嶇‖浠跺疄鐜版瘮鍦ㄩ氱敤鎿嶄綔緋葷粺錛屽 Linux錛屼笂榪愯寰楁洿蹇傚畠浠寘鎷潵鑷?Alteon 鍜?Foundry 鐨勭‖浠訛紝鍏剁‖浠墮昏緫鍜屾渶灝戞搷浣滅郴緇熷彲浠ュ湪紜歡涓墽琛屾祦閲忕鐞嗭紝騫朵笖閫熷害姣旂函杞歡蹇傚畠浠殑浠鋒牸涔熷緢楂橈紝閫氬父閮藉湪 $10,000 浠ヤ笂銆傚鏋滈渶瑕佺畝鍗曞拰渚垮疁鐨勮В鍐蟲柟妗堬紝涓涓湁寰堝鍐呭瓨 (256 MB) 鐨勪腑絳?Linux 緋葷粺灝嗕細鏄竴涓ソ鐨勮礋杞藉潎琛$郴緇熴?br>

TurboLinux TurboCluster 鍜?enFuzion

TurboLinux 鏈変竴涓駭鍝佸彨 TurboCluster錛屽畠鏈鍒濅互“Linux 铏氭嫙鏈嶅姟鍣?#8221;欏圭洰寮鍙戠殑鍐呮牳琛ヤ竵涓哄熀紜銆傚洜姝わ紝瀹冨彲浠ュ緱鍒板ぇ閮ㄥ垎浼樼偣錛屼絾瀹冪殑緙虹偣涔熶笌鍘熸潵鐨勯」鐩竴鏍楓俆urboLinux 涓烘榪樺紑鍙戜簡涓浜涘伐鍏鳳紝鐢ㄤ簬鐩戞帶澧炲姞浜у搧瀹炵敤鎬х殑緹ら泦琛屼負銆備竴瀹朵富瑕佷緵搴斿晢鐨勫晢涓氭敮鎸佷篃浣垮畠瀵逛簬澶у瀷緗戠珯鏇村叿鍚稿紩鍔涖?/p>

EnFuzion 鏀寔鍦ㄨ妭鐐逛箣闂村疄鐜拌嚜鍔ㄨ礋杞藉潎琛″拰璧勬簮鍏變韓錛岃屼笖鍙互鑷姩閲嶆柊瀹夋帓澶辮觸鐨勪綔涓氥?/p>

EnFuzion 鏄?TurboLinux 鍗沖皢鎺ㄥ嚭鐨勭瀛︾兢闆嗕駭鍝侊紝瀹冨茍涓嶅熀浜?Beowulf銆備絾鏄紝瀹冨彲浠ユ敮鎸佷笂鐧句釜鑺傜偣浠ュ強璁稿涓嶅悓鐨勯潪 Linux 騫沖彴錛屽寘鎷?Solaris銆乄indows NT銆丠P-UX銆両BM AIX銆丼GI Irix 鍜?Tru64銆侲nFuzion 闈炲父鏈夎叮錛屽洜涓哄畠榪愯鎵鏈夌幇鏈夎蔣浠訛紝騫朵笖涓嶉渶瑕佷負鐜緙栧啓瀹氬埗鐨勫茍琛屽簲鐢ㄧ▼搴忋傚畠鏀寔鍦ㄨ妭鐐歸棿瀹炵幇鑷姩璐熻澆鍧囪 鍜岃祫婧愬叡浜紝鑰屼笖鍙互鑷姩閲嶆柊瀹夋帓澶辮觸鐨勪綔涓氥?/p>


Platform Computing 鐨?LSF 鎵瑰鐞?/span>

Platform Computing 鏄兢闆嗚綆楅鍩熺殑鑰佹墜錛岀幇鍦ㄦ彁渚涗簡 Linux 騫沖彴涓婄殑“璐熻澆鍧囪 璁炬柦 (LSF) 鎵瑰鐞?#8221;杞歡銆侺SF 鎵瑰鐞嗗厑璁鎬腑澶帶鍒跺櫒瀹夋帓浣滀笟鍦ㄧ兢闆嗕腑浠繪剰鏁伴噺鐨勮妭鐐逛笂榪愯銆傚湪姒傚康涓婏紝瀹冪被浼間簬 TurboLinux enFuzion 杞歡錛屽茍涓旀敮鎸佸湪鑺傜偣涓婅繍琛屼換浣曠被鍨嬬殑搴旂敤紼嬪簭銆?/p>

榪欑鏂規硶瀵逛簬緹ら泦澶у皬鏄潪甯哥伒媧葷殑錛屽洜涓哄彲浠ユ槑紜夋嫨鑺傜偣鐨勬暟閲忥紝鐢氳嚦鏄繍琛屽簲鐢ㄧ▼搴忕殑鑺傜偣銆備簬鏄紝鍙互灝?64 涓妭鐐圭殑緹ら泦鍒嗘垚鏇村皬鐨勯昏緫緹ら泦錛屾瘡涓昏緫緹ら泦閮借繍琛岃嚜宸辯殑鎵瑰鐞嗗簲鐢ㄧ▼搴忋傝屼笖錛屽鏋滃簲鐢ㄧ▼搴忔垨鑺傜偣澶辮觸錛屽畠鍙互鍦ㄥ叾瀹冩湇鍔″櫒涓婇噸鏂板畨鎺掍綔涓氥?/p>

Platform 鐨勪駭鍝佸湪涓昏 Unix 緋葷粺鍜?Windows NT 涓婅繍琛屻傜洰鍓嶏紝鍙湁瀹冧滑鐨?LSF 鎵瑰鐞嗕駭鍝佸凡緇忕Щ妞嶅埌 Linux 涓娿傛渶緇堬紝LSF Suite 緇勪歡鐨勫叾浣欓儴鍒嗕篃灝嗙揣闅忓叾鍚庣Щ妞嶅埌 Linux 涓娿?br>

Resonate Dispatch 緋誨垪

Resonate 鏈変竴縐嶅熀浜庤蔣浠剁殑璐熻澆鍧囪 鏂規硶錛岀被浼間簬 Linux 铏氭嫙鏈嶅姟鍣ㄣ備絾鏄紝瀹冩敮鎸佹洿澶氱壒鎬э紝浠ュ強涓浜涙洿濂界殑璐熻澆鍧囪 綆楁硶銆備緥濡傦紝浣跨敤 Resonate錛屽彲浠ュ湪姣忎釜緹ら泦鑺傜偣瑁呭叆涓涓唬鐞嗭紝浠ョ‘瀹氳鑺傜偣褰撳墠鐨勭郴緇熻礋杞姐傜劧鍚庯紝璐熻澆鍧囪 鏈嶅姟鍣ㄦ鏌ユ瘡涓妭鐐圭殑浠g悊錛屼互紜畾鍝釜鑺傜偣鐨勮礋杞芥渶灝戯紝騫朵笖灝嗘柊鐨勬祦閲忓彂閫佺粰瀹冦傚彟澶栵紝Resonate 榪樺彲浠ヤ嬌鐢ㄥ畠鐨?Global Dispatch 浜у搧鏇存湁鏁堝湴鏀寔鍦板尯鎬у垎甯冨紡鏈嶅姟鍣ㄣ?/p>

Resonate 宸茬粡鍦?Red Hat Linux 涓婂交搴曟祴璇曚簡璇ヨ蔣浠訛紝鐩鎬俊瀹冧篃鍙互鍦ㄥ叾瀹冨彂琛岀増涓婅繍琛屻俁esonate 鐨勮蔣浠惰繕鍙互鍦ㄥ叾瀹冨悇縐嶅鉤鍙頒笂榪愯錛屽寘鎷?Solaris銆丄IX銆乄indows NT錛屽茍涓斿畠榪樺彲浠ュ湪娣峰悎鐜涓繘琛岃礋杞藉潎琛°?/p>



MOSIX

MOSIX 浣跨敤 Linux 鍐呮牳鏂扮増鏈潵瀹炵幇榪涚▼璐熻澆鍧囪 闆嗙兢緋葷粺銆傝緹ら泦涓紝浠諱綍鏈嶅姟鍣ㄦ垨宸ヤ綔绔欏彲浠ユ寜鎸囧畾鍔犲叆鎴栫寮錛屽嵆娣誨姞鍒扮兢闆嗙殑鎬誨鐞嗚兘鍔涳紝鎴栦粠涓櫎鍘匯傛牴鎹叾鏂囨。錛孧OSIX 浣跨敤鑷傚簲榪涚▼璐熻澆鍧囪 鍜屽唴瀛樺紩瀵肩畻娉曚嬌鏁翠綋鎬ц兘鏈澶у寲銆傚簲鐢ㄧ▼搴忚繘紼嬪彲浠ュ湪鑺傜偣涔嬮棿鎶㈠厛榪佺Щ錛屼互鍒╃敤鏈濂界殑璧勬簮錛岃繖綾諱技浜庡縐板澶勭悊鍣ㄧ郴緇熷彲浠ュ湪鍚勪釜澶勭悊鍣ㄤ箣闂村垏鎹㈠簲鐢ㄧ▼搴忋?/p>

MOSIX 鍦ㄥ簲鐢ㄥ眰鏄畬鍏ㄩ忔槑鐨勶紝騫朵笖涓嶉渶瑕侀噸鏂扮紪璇戞垨鑰呴噸鏂伴摼鎺ュ埌鏂扮殑搴擄紝鍥犱負鎵鏈変竴鍒囬兘鍙戠敓鍦ㄥ唴鏍哥駭涓娿傚彲浠ユ湁鍑犵鏂規硶灝嗗畠閰嶇疆鎴愬鐢ㄦ埛鍏變韓鐜緹ら泦銆傛墍鏈夋湇鍔″櫒鍙互鍏變韓涓涓睜錛岀郴緇熷彲浠ユ槸緹ら泦鐨勪竴閮ㄥ垎錛屾垨鑰呯兢闆嗗彲浠ュ姩鎬佸湴鍒嗘垚鍑犱釜瀛愮兢闆嗭紝姣忕鏂規硶閮芥湁涓嶅悓鐨勭敤閫斻侺inux 宸ヤ綔绔欒繕鍙互鏄兢闆嗙殑涓閮ㄥ垎錛屽彲浠ユ槸鍥哄畾鐨勶紝涔熷彲浠ユ槸涓存椂鐨勶紝鎴栬呭彧鏄綔涓烘壒澶勭悊浣滀笟鎻愪氦鑰呫備綔涓轟復鏃剁兢闆嗚妭鐐癸紝宸ヤ綔绔欏彲浠ュ湪鍏剁┖闂叉椂鐢ㄤ簬澧炲姞緹ら泦澶勭悊鑳藉姏銆備篃鍏佽鍙互鎵瑰鐞嗘柟寮忎嬌鐢ㄧ兢闆嗭紝鍦ㄨ繖縐嶆柟寮忎腑錛岀兢闆嗚閰嶇疆鎴愰氳繃闃熷垪鎺ュ彈鎵瑰鐞嗕綔涓氥傜劧鍚庯紝瀹堟姢紼嬪簭鍙栬蛋浣滀笟騫跺皢瀹冧滑鍙戦佸埌緹ら泦鑺傜偣榪涜澶勭悊銆?/p>

MOSIX 鐨勪笉鍒╀箣澶勬槸瀹冩洿鏀?Linux 鍐呮牳琛屼負鐨勪竴浜涙牳蹇冮儴鍒嗭紝浜庢槸緋葷粺綰у簲鐢ㄧ▼搴忓皢涓嶄細鎸夋湡鏈涜繍琛屻?/p>

闄や簡楂樻ц兘縐戝璁$畻錛孧OSIX 鎻愪緵浜嗕竴涓湁瓚g殑閫夐」錛岀敤浜庝互鍏卞悓璁劇疆鍒涘緩闆嗙兢鐜銆傞氳繃浣跨敤鏈嶅姟鍣ㄥ拰宸ヤ綔绔欎笂鐨勯棽緗祫婧愶紝瀹冨彲浠ユ洿蹇洿鏈夋晥鍦板垱寤哄拰榪愯搴旂敤紼嬪簭銆傜敱浜庤闂簡澶氬彴鏈嶅姟鍣紝騫朵笖鍙互鍔ㄦ佽皟鏁寸兢闆嗗ぇ灝忓拰鏇存敼璐熻澆鍧囪 瑙勫垯錛屽畠榪樺彲浠ユ彁渚涢珮搴︾殑鏈嶅姟鍣ㄥ彲鐢ㄦс侻OSIX 鐨勪笉鍒╀箣澶勬槸瀹冩洿鏀?Linux 鍐呮牳琛屼負鐨勪竴浜涙牳蹇冮儴鍒嗭紝浜庢槸緋葷粺綰у簲鐢ㄧ▼搴忓皢涓嶄細鎸夋湡鏈涜繍琛屻傝浣跨敤緗戠粶搴旂敤紼嬪簭鏃訛紝鑰岃紼嬪簭浣跨敤鍩轟簬鍗曚釜鏈嶅姟鍣ㄥ湴鍧鐨勫鎺ュ瓧榪炴帴錛孧OSIX 閫氬父涔熶細鍙楀埌闄愬埗銆傝繖鎰忓懗鐫緗戠粶搴旂敤紼嬪簭鍦ㄤ竴涓湇鍔″櫒鑺傜偣涓婂紑濮嬭繍琛屾椂錛屽鏋?IP 鍦板潃涓庡鎺ュ瓧緇戝畾錛岄偅涔堝畠蹇呴』緇х畫鍦ㄨ鑺傜偣涓婅繍琛屻傛樉鐒訛紝MOSIX 榪樻鍦ㄥ紑濮嬭縼縐誨鎺ュ瓧錛屽洜姝よ繖寰堝揩灝卞彉鎴愪簡浜夎鐨勭劍鐐廣?/p>


楂樺彲鐢ㄦх兢闆?/span>

楂樺彲鐢ㄦ?(HA) 緹ら泦鑷村姏浜庝嬌鏈嶅姟鍣ㄧ郴緇熺殑榪愯閫熷害鍜屽搷搴旈熷害灝藉彲鑳藉揩銆傚畠浠粡甯鎬嬌鐢ㄥ湪澶氬彴鏈哄櫒涓婅繍琛岀殑鍐椾綑鑺傜偣鍜屾湇鍔★紝鐢ㄦ潵鐩鎬簰璺熻釜銆傚鏋滄煇涓妭鐐瑰け璐ワ紝瀹冪殑鏇胯ˉ灝嗗湪鍑犵閽熸垨鏇寸煭鏃墮棿鍐呮帴綆″畠鐨勮亴璐c傚洜姝わ紝瀵逛簬鐢ㄦ埛鑰岃█錛岀兢闆嗘案榪滀笉浼氬仠鏈恒?/p>

鏌愪簺 HA 緹ら泦涔熷彲浠ョ淮鎶よ妭鐐歸棿鍐椾綑搴旂敤紼嬪簭銆傚洜姝わ紝鐢ㄦ埛鐨勫簲鐢ㄧ▼搴忓皢緇х畫榪愯錛屽嵆浣夸粬鎴栧ス浣跨敤鐨勮妭鐐瑰嚭浜嗘晠闅溿傛鍦ㄨ繍琛岀殑搴旂敤紼嬪簭浼氬湪鍑犵涔嬪唴榪佺Щ鍒板彟涓涓妭鐐癸紝鑰屾墍鏈夌敤鎴峰彧浼氬療瑙夊埌鍝嶅簲紼嶅井鎱簡涓鐐廣備絾鏄紝榪欑搴旂敤紼嬪簭綰у啑浣欒姹傚皢杞歡璁捐鎴愬叿鏈夌兢闆嗘剰璇嗙殑錛屽茍涓旂煡閬撹妭鐐瑰け璐ユ椂搴旇鍋氫粈涔堛備絾瀵逛簬 Linux錛屽ぇ澶氭暟鐜板湪榪樺仛涓嶅埌銆傚洜涓?Linux 緋葷粺娌℃湁 HA 闆嗙兢鏍囧噯錛屽茍涓斾篃娌℃湁鍏叡 API 鍙緵搴旂敤紼嬪簭寮鍙戣呮瀯寤烘湁緹ら泦鎰忚瘑鐨勮蔣浠躲?/p>

HA 緹ら泦鍙互鎵ц璐熻澆鍧囪 錛屼絾閫氬父涓繪湇鍔″櫒榪愯浣滀笟錛岃岀郴緇熶嬌杈呭姪鏈嶅姟鍣ㄤ繚鎸侀棽緗傝緟鍔╂湇鍔″櫒閫氬父鏄富鏈嶅姟鍣ㄦ搷浣滅郴緇熻緗殑闀滃儚錛屽敖綆$‖浠舵湰韜◢鏈変笉鍚屻傝緟鍔╄妭鐐瑰涓繪湇鍔″櫒榪涜媧誨姩鐩戞帶鎴栧績璺寵瀵燂紝浠ユ煡鐪嬪畠鏄惁浠嶅湪榪愯銆傚鏋滃績璺寵鏃跺櫒娌℃湁鎺ユ敹鍒頒富鏈嶅姟鍣ㄧ殑鍝嶅簲錛屽垯杈呭姪鑺傜偣灝嗘帴綆$綉緇滃拰緋葷粺韜喚錛堝鏋滄槸 Linux 緋葷粺錛屽垯鏄?IP 涓繪満鍚嶅拰鍦板潃錛夈?/p>

浣嗘槸錛孡inux 鍦ㄨ繖涓棰嗗煙浠嶆湁涓鐐瑰拷鐣ャ傚ソ娑堟伅鏄湁涓瀹惰憲鍚嶇殑渚涘簲鍟嗘鍦ㄥ姫鍔涘敖蹇爺鍒墮珮鍙敤鎬х兢闆嗭紝鍥犱負瀹冩槸浼佷笟綰ф湇鍔″櫒閮藉繀闇鐨勫姛鑳姐?/p>



Linux-HA 欏圭洰

楂樺彲鐢ㄦ?Linux 欏圭洰錛屾牴鎹叾鐩爣澹版槑錛屾棬鍦ㄤ負 Linux 鎻愪緵楂樺彲鐢ㄦцВ鍐蟲柟妗堬紝浠ラ氳繃紺懼尯寮鍙戞垚鏋滄彁楂樺彲闈犳с佸彲鐢ㄦу拰鏈嶅姟鑳藉姏銆侺inux 杈懼埌楂樺彲鐢ㄦч泦緹ゆ椂錛岃繖鏄竴縐嶈瘯鍥劇粰浜?Linux 涓庡厛榪涚殑 Unix 緋葷粺錛屽 Solaris銆丄IX 鍜?HP/UX錛屼竴鏍峰叿鏈夌珵浜夊姏鐨勭壒鎬с傚洜姝わ紝欏圭洰鐨勭洰鏍囨槸鍦?2001 騫翠箣鍓嶈揪鍒?Unix 闆嗙兢姣旇緝鎶ュ憡 ( http://www.sun.com/clusters/dh.brown.pdf) 涓垎鏋愪笓瀹剁粍 D. H. Brown 鐗瑰畾鍔熻兘鎬х駭鍒?

欏圭洰涓湁鍙互緇存姢鑺傜偣闂村績璺沖茍鎺ョ澶辮觸鑺傜偣鐨?IP 鍦板潃鐨勮蔣浠躲傚鏋滀竴涓妭鐐瑰け璐ワ紝瀹冧嬌鐢?#8220;浼犲啑浣?IP”杞歡鍖呭皢澶辮觸鑺傜偣鐨勫湴鍧娣誨姞鍒板伐浣滆妭鐐逛互鎵挎媴瀹冪殑鑱岃矗銆備簬鏄紝鍙互鍦ㄥ嚑姣鏃墮棿鍐呰嚜鍔ㄦ浛鎹㈠け璐ョ殑鑺傜偣銆傚疄闄呬嬌鐢ㄤ腑錛屽績璺抽氬父鍦ㄥ嚑縐掕寖鍥村唴錛岄櫎闈炲湪鑺傜偣涔嬮棿鏈変笓鐢ㄧ綉緇滈摼鎺ャ傚洜姝わ紝澶辮觸緋葷粺涓殑鐢ㄦ埛搴旂敤紼嬪簭浠嶉渶瑕佸湪鏂扮殑鑺傜偣涓婇噸鏂板惎鍔ㄣ?/p>

鏃犲涓嶅湪鐨勯泦緹?/span>

瀵逛簬 Linux錛屾湁璁稿闆嗙兢緋葷粺鍙緵閫夌敤銆傚悓鏃訛紝閭d簺欏圭洰涓湁鍑犱釜鏄潪鍟嗕笟鎬х殑錛岀敋鑷蟲槸瀹為獙鎬ц川鐨勩傝櫧鐒跺瀛︽湳鐣屽拰鏌愪簺緇勭粐榪欎篃娌℃湁褰㈡垚闂錛屼絾澶у叕鍙擱氬父棣栭夎憲鍚嶄緵搴斿晢鐨勫晢涓氭敮鎸佸鉤鍙般備緵搴斿晢錛屽 IBM銆丼GI銆丠P 鍜?Sun錛屾彁渚涗簡鐢ㄤ簬鍦?Linux 涓瀯寤虹瀛︾兢闆嗙殑浜у搧鍜屾湇鍔★紝鍥犱負緹ら泦寰堟祦琛岋紝騫朵笖鍙互閿鍞ぇ閲忕殑鏈嶅姟鍣ㄨ澶囥備竴鏃﹀晢涓氭満鏋勮涓哄叾瀹冨艦寮忕殑闆嗙兢鏄彲闈犵殑錛岄偅浜涚浉鍚岀殑鏈嶅姟鍣ㄤ緵搴斿晢鎴栬浼氬洿緇曠潃寮鏀炬簮鐮侀泦緹よВ鍐蟲柟妗堝垱寤鴻嚜宸辯殑浜у搧銆?/p>

Linux 浣滀負鏈嶅姟鍣ㄥ鉤鍙扮殑閲嶈鎬т緷璧栦簬鏀寔澶у瀷鏈嶅姟鍣ㄥ拰鏈嶅姟鍣ㄧ兢闆嗙殑鑳藉姏銆傝繖灝變嬌瀹冨彲浠ヤ笌 Sun銆丠P銆両BM 鍜屽叾瀹冨叕鍙哥殑 UNIX 鏈嶅姟鍣ㄥ湪鏇撮珮灞傞潰涓婄珵浜夈傝櫧鐒?Windows NT 鍜?2000 涓嶆敮鎸?Linux 鑳藉鏀寔鐨勯泦緹よ寖鍥達紝浣嗘槸 HA 闆嗙兢姝h鏂規硶鐨勫彲鐢ㄦт互鍙婄敤浜庢瀯寤烘湁緹ら泦鎰忚瘑鐨?API 涔熶嬌瀹冭兘澶熷弬涓庣珵浜夈?/p>

濡傛灉姝e湪鑰冭檻鏋勫緩涓涓兢闆嗭紝閭d箞鎮ㄥ簲褰撲粩緇嗘鏌ラ偅浜涘彲鑳芥э紝騫跺皢瀹冧滑涓庢偍鐨勯渶姹傚仛姣旇緝銆傛偍涔熻浼氬彂鐜版兂瑕佸疄鐜扮殑鐩爣榪樹笉鑳芥垚涓轟竴涓畬鏁寸殑瑙e喅鏂規錛屾垨璁鎬細鍙戠幇宸茬粡鏈変簡鐜版垚鐨勮В鍐蟲柟妗堛備笉綆℃槸鍝鎯呭喌錛岃鐩鎬俊璁稿鐜版湁鍏徃灝嗕粬浠殑搴旂敤紼嬪簭鎵樹粯緇欒繘琛屾繁搴﹁綆楀茍鎻愪緵澶ч噺緗戦〉鐨?Linux 緋葷粺緹ら泦銆傞泦緹ゆ槸涓縐嶄紒涓氱郴緇熸湇鍔★紝宸茬粡鍦?Linux 涓嬫垚鍔熸祴璇曡繃銆傚敖綆℃柊鐨勯泦緹ゅ皢鍑虹幇錛屼絾閫夋嫨鐨勫鏍鋒ф鏄?Linux 瓚呰繃鍏跺畠緋葷粺錛屽 Windows NT錛岀殑浼樺娍銆?/p>

鍏充簬浣滆?/span>

 

Rawn Shah 鏄眳浣忓湪浜氬埄妗戦偅宸炲浘媯競鐨勪竴浣嶇嫭绔嬮【闂備粬澶氬勾鏉ヤ笌澶氬鉤鍙伴棶棰樻墦浜ら亾騫舵挵鍐欑浉鍏蟲枃绔狅紝浣嗗父甯鎬護浠栦笉瑙g殑鏄緢灝戞湁浜虹煡閬撴湁鐢ㄧ殑緋葷粺宸ュ叿銆?/p>





]]>Linux涓媠ocket緙栫▼涓殑鑻ュ共闂(鎸佺畫鏇存柊涓?http://m.shnenglu.com/zjl-1026-2001/archive/2009/08/20/93914.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Thu, 20 Aug 2009 07:52:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2009/08/20/93914.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/93914.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2009/08/20/93914.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/93914.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/93914.html(1) 鏈榪戝湪linux涓嬪紑鍙戜簡涓涓氫俊鏈嶅姟紼嬪簭錛屼富瑕佽礋璐d笌瀹㈡埛绔緩绔嬭繛鎺ワ紝杞彂瀹㈡埛绔殑娑堟伅緇欏悗鍙頒俊鎭鐞嗘ā鍧楋紝鍚屾椂涔熷皢鍚庡彴鐨勫鐞嗙粨鏋滆漿鍙戠粰瀹㈡埛绔?br>鐢變簬鍦╳indows涓嬪凡緇忔湁浜嗕竴涓浉鍚屽姛鑳界殑紼嬪簭錛屼究鍋氫簡縐繪銆傜Щ妞嶅埌linux涓嬪姛鑳芥槸鍙互瀹炵幇鐨勶紝浣嗗彂鐜版紼嬪簭鐨刢pu鍒╃敤鐜囬潪甯擱珮銆傜粡鍒嗘瀽鍙戠幇鏄痩inux涓嬬殑
select璋冪敤涓巜indows鐨剆elect璋冪敤鐨勪竴涓尯鍒犳垚鐨勩?br>
紼嬪簭澶勭悊嫻佺▼濡備笅錛?br>
 1bool msg_recv_thread(void)
 2{
 3    int          max = 0;
 4    fd_set       readfds;         // 緇撴灉闆?/span>
 5    struct timeval  RevTimeOut;
 6    RevTimeOut.tv_sec = 1;        // 璁懼畾select鐨勮秴鏃舵椂闂翠負1s
 7    RevtimeOut.tv_usec = 0;
 8
 9    while(1)
10    {
11        FD_SET(conn_socket, &readfds);
12        max = (max > conn_socket) ? max : conn_socket;
13        int ret = select(max+1&readfds, NULL, NULL, &RevTimeOut);
14
15        if (ret <= 0)
16        {
17            continue;
18        }

19
20        if (FD_ISSET(conn_socket, &readfds) != 0)
21        {
22            // 鎺ュ彈榪炴帴璇鋒眰澶勭悊……
23        }

24
25        // 鍏朵粬澶勭悊……
26}

windows涓嬭繖鏍風殑嫻佺▼娌℃湁闂錛屼絾鏄湪linux涓嬶紝select璋冪敤鍦ㄨ瀹氱殑瓚呮椂鏃墮棿鍐呯瓑寰呮椂浼氫笉鏂湴鏇存柊鏈鍚庝竴涓弬鏁幫紝灝嗗叾瀹炴椂鏇存柊涓虹璁懼畾鐨勮秴鏃舵椂闂寸殑鏃墮棿宸紝鐩村埌榪欎釜鍊艱鏇存柊涓?錛屽嵆鍒拌揪瓚呮椂鏃墮棿鏃秙elect鍑芥暟榪斿洖銆傚湪涓婇潰鐨勭▼搴忔涓紝絎竴嬈″驚鐜椂select鐨勮秴鏃跺弬鏁板間負1s錛屽綋絎竴嬈″驚鐜畬姣曟椂錛孯evTimeOut鐨勫煎凡緇忚鍙樻垚浜?錛岃繖鏍蜂互鍚庣殑寰幆灝變細鏄棤闃誨鐨勶紝鍗沖鏋渟elec娌℃湁鏀跺埌浠諱綍鐨勮姹備究绔嬪埢榪斿洖錛岀劧鍚庣戶緇驚鐜紝榪欐牱灝卞艦鎴愪簡姝誨驚鐜紝浠庤岃楀厜浜哻pu銆?br>
灝嗕笂榪扮▼搴忔涓殑5-7琛岀Щ鍒扮13琛屼互鍓嶏紝闂渚胯В鍐充簡銆?br>

銆愭葷粨銆?br>            榪欓噷娑夊強鍒頒竴涓紪紼嬩範鎯殑闂錛屾湰浜虹粡楠屾瑺緙猴紝鍦ㄥ仛windows鍒發inux鐨勭Щ妞嶆椂涓鐩磋涓烘棦鐒秝indows涓嬫紜偅涔坙inux涓瀹氫篃鏄紜殑錛屽畬鍏ㄦ病鏈夎冭檻鍒頒袱涓狾S濂戒箣闂寸殑緋葷粺璋冪敤鏂歸潰鐨勫尯鍒紝瀵艱嚧寮濮嬫椂灝辨悶閿欎簡鏂瑰悜錛屾氮璐逛簡涓嶅皯鏃墮棿銆傚笇鏈涘ぇ瀹朵笉瑕佺姱鎴戣繖鏍風殑閿欒銆?br>

]]>
QQ娓告垙鐧句竾浜哄悓鏃跺湪綰挎湇鍔″櫒鏋舵瀯瀹炵幇(杞澆)http://m.shnenglu.com/zjl-1026-2001/archive/2009/08/15/93427.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Sat, 15 Aug 2009 07:29:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2009/08/15/93427.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/93427.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2009/08/15/93427.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/93427.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/93427.html闃呰鍏ㄦ枃

]]>
鍫嗗拰鏍堢殑鍖哄埆 (杞創)http://m.shnenglu.com/zjl-1026-2001/archive/2009/05/19/83385.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Tue, 19 May 2009 08:53:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2009/05/19/83385.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/83385.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2009/05/19/83385.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/83385.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/83385.html

鍫嗗拰鏍堢殑鍖哄埆 (杞創)

闈炴湰浜轟綔涔?鍥犻潪甯哥粡鍏?鎵浠ユ敹褰掓棗涓?涓庝紬浜洪槄涔?鍘熶綔鑰呬笉紲?

鍫嗗拰鏍堢殑鍖哄埆
涓銆侀澶囩煡璇嗏旂▼搴忕殑鍐呭瓨鍒嗛厤
涓涓敱c/C++緙栬瘧鐨勭▼搴忓崰鐢ㄧ殑鍐呭瓨鍒嗕負浠ヤ笅鍑犱釜閮ㄥ垎
1銆佹爤鍖猴紙stack錛夆?nbsp;鐢辯紪璇戝櫒鑷姩鍒嗛厤閲婃斁 錛屽瓨鏀懼嚱鏁扮殑鍙傛暟鍊鹼紝灞閮ㄥ彉閲忕殑鍊肩瓑銆傚叾鎿嶄綔鏂瑰紡綾諱技浜庢暟鎹粨鏋勪腑鐨勬爤銆?br>2銆佸爢鍖猴紙heap錛?nbsp;鈥?nbsp;涓鑸敱紼嬪簭鍛樺垎閰嶉噴鏀撅紝 鑻ョ▼搴忓憳涓嶉噴鏀撅紝紼嬪簭緇撴潫鏃跺彲鑳界敱OS鍥炴敹 銆傛敞鎰忓畠涓庢暟鎹粨鏋勪腑鐨勫爢鏄袱鍥炰簨錛屽垎閰嶆柟寮忓掓槸綾諱技浜庨摼琛紝鍛靛懙銆?br>3銆佸叏灞鍖猴紙闈欐佸尯錛夛紙static錛夆旓紝鍏ㄥ眬鍙橀噺鍜岄潤鎬佸彉閲忕殑瀛樺偍鏄斁鍦ㄤ竴鍧楃殑錛屽垵濮嬪寲鐨勫叏灞鍙橀噺鍜岄潤鎬佸彉閲忓湪涓鍧楀尯鍩燂紝 鏈垵濮嬪寲鐨勫叏灞鍙橀噺鍜屾湭鍒濆鍖栫殑闈欐佸彉閲忓湪鐩擱偦鐨勫彟涓鍧楀尯鍩熴?nbsp;- 紼嬪簭緇撴潫鍚庢湁緋葷粺閲婃斁 
4銆佹枃瀛楀父閲忓尯鈥斿父閲忓瓧絎︿覆灝辨槸鏀懼湪榪欓噷鐨勩?nbsp;紼嬪簭緇撴潫鍚庣敱緋葷粺閲婃斁
5銆佺▼搴忎唬鐮佸尯鈥斿瓨鏀懼嚱鏁頒綋鐨勪簩榪涘埗浠g爜銆?br>浜屻佷緥瀛愮▼搴?nbsp;
榪欐槸涓涓墠杈堝啓鐨勶紝闈炲父璇︾粏 
//main.cpp 
int a = 0; 鍏ㄥ眬鍒濆鍖栧尯 
char *p1; 鍏ㄥ眬鏈垵濮嬪寲鍖?nbsp;
main() 

int b; 鏍?nbsp;
char s[] = "abc"; 鏍?nbsp;
char *p2; 鏍?nbsp;
char *p3 = "123456"; 123456\0鍦ㄥ父閲忓尯錛宲3鍦ㄦ爤涓娿?nbsp;
static int c =0錛?nbsp;鍏ㄥ眬錛堥潤鎬侊級鍒濆鍖栧尯 
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); 
鍒嗛厤寰楁潵寰?0鍜?0瀛楄妭鐨勫尯鍩熷氨鍦ㄥ爢鍖恒?nbsp;
strcpy(p1, "123456"); 123456\0鏀懼湪甯擱噺鍖猴紝緙栬瘧鍣ㄥ彲鑳戒細灝嗗畠涓巔3鎵鎸囧悜鐨?123456"浼樺寲鎴愪竴涓湴鏂廣?nbsp;

 


浜屻佸爢鍜屾爤鐨勭悊璁虹煡璇?nbsp;
2.1鐢寵鏂瑰紡 
stack: 
鐢辯郴緇熻嚜鍔ㄥ垎閰嶃?nbsp;渚嬪錛屽0鏄庡湪鍑芥暟涓竴涓眬閮ㄥ彉閲?nbsp;int b; 緋葷粺鑷姩鍦ㄦ爤涓負b寮杈熺┖闂?nbsp;
heap: 
闇瑕佺▼搴忓憳鑷繁鐢寵錛屽茍鎸囨槑澶у皬錛屽湪c涓璵alloc鍑芥暟 
濡俻1 = (char *)malloc(10); 
鍦–++涓敤new榪愮畻絎?nbsp;
濡俻2 = (char *)malloc(10); 
浣嗘槸娉ㄦ剰p1銆乸2鏈韓鏄湪鏍堜腑鐨勩?nbsp;


2.2 
鐢寵鍚庣郴緇熺殑鍝嶅簲 
鏍堬細鍙鏍堢殑鍓╀綑絀洪棿澶т簬鎵鐢寵絀洪棿錛岀郴緇熷皢涓虹▼搴忔彁渚涘唴瀛橈紝鍚﹀垯灝嗘姤寮傚父鎻愮ず鏍堟孩鍑恒?nbsp;
鍫嗭細棣栧厛搴旇鐭ラ亾鎿嶄綔緋葷粺鏈変竴涓褰曠┖闂插唴瀛樺湴鍧鐨勯摼琛紝褰撶郴緇熸敹鍒扮▼搴忕殑鐢寵鏃訛紝 
浼氶亶鍘嗚閾捐〃錛屽鎵劇涓涓┖闂村ぇ浜庢墍鐢寵絀洪棿鐨勫爢緇撶偣錛岀劧鍚庡皢璇ョ粨鐐逛粠絀洪棽緇撶偣閾捐〃涓垹闄わ紝騫跺皢璇ョ粨鐐圭殑絀洪棿鍒嗛厤緇欑▼搴忥紝鍙﹀錛屽浜庡ぇ澶氭暟緋葷粺錛屼細鍦ㄨ繖鍧楀唴瀛樼┖闂翠腑鐨勯鍦板潃澶勮褰曟湰嬈″垎閰嶇殑澶у皬錛岃繖鏍鳳紝浠g爜涓殑delete璇彞鎵嶈兘姝g‘鐨勯噴鏀炬湰鍐呭瓨絀洪棿銆傚彟澶栵紝鐢變簬鎵懼埌鐨勫爢緇撶偣鐨勫ぇ灝忎笉涓瀹氭濂界瓑浜庣敵璇風殑澶у皬錛岀郴緇熶細鑷姩鐨勫皢澶氫綑鐨勯偅閮ㄥ垎閲嶆柊鏀懼叆絀洪棽閾捐〃涓?nbsp;

2.3鐢寵澶у皬鐨勯檺鍒?nbsp;
鏍堬細鍦╓indows涓?鏍堟槸鍚戜綆鍦板潃鎵╁睍鐨勬暟鎹粨鏋勶紝鏄竴鍧楄繛緇殑鍐呭瓨鐨勫尯鍩熴傝繖鍙ヨ瘽鐨勬剰鎬濇槸鏍堥《鐨勫湴鍧鍜屾爤鐨勬渶澶у閲忔槸緋葷粺棰勫厛瑙勫畾濂界殑錛屽湪WINDOWS涓嬶紝鏍堢殑澶у皬鏄?M錛堜篃鏈夌殑璇存槸1M錛屾諱箣鏄竴涓紪璇戞椂灝辯‘瀹氱殑甯告暟錛夛紝濡傛灉鐢寵鐨勭┖闂磋秴榪囨爤鐨勫墿浣欑┖闂存椂錛屽皢鎻愮ずoverflow銆傚洜姝わ紝鑳戒粠鏍堣幏寰楃殑絀洪棿杈冨皬銆?nbsp;
鍫嗭細鍫嗘槸鍚戦珮鍦板潃鎵╁睍鐨勬暟鎹粨鏋勶紝鏄笉榪炵畫鐨勫唴瀛樺尯鍩熴傝繖鏄敱浜庣郴緇熸槸鐢ㄩ摼琛ㄦ潵瀛樺偍鐨勭┖闂插唴瀛樺湴鍧鐨勶紝鑷劧鏄笉榪炵畫鐨勶紝鑰岄摼琛ㄧ殑閬嶅巻鏂瑰悜鏄敱浣庡湴鍧鍚戦珮鍦板潃銆傚爢鐨勫ぇ灝忓彈闄愪簬璁$畻鏈虹郴緇熶腑鏈夋晥鐨勮櫄鎷熷唴瀛樸傜敱姝ゅ彲瑙侊紝鍫嗚幏寰楃殑絀洪棿姣旇緝鐏墊椿錛屼篃姣旇緝澶с?nbsp;


2.4鐢寵鏁堢巼鐨勬瘮杈冿細 
鏍堢敱緋葷粺鑷姩鍒嗛厤錛岄熷害杈冨揩銆備絾紼嬪簭鍛樻槸鏃犳硶鎺у埗鐨勩?nbsp;
鍫嗘槸鐢眓ew鍒嗛厤鐨勫唴瀛橈紝涓鑸熷害姣旇緝鎱紝鑰屼笖瀹規槗浜х敓鍐呭瓨紕庣墖,涓嶈繃鐢ㄨ搗鏉ユ渶鏂逛究. 
鍙﹀錛屽湪WINDOWS涓嬶紝鏈濂界殑鏂瑰紡鏄敤VirtualAlloc鍒嗛厤鍐呭瓨錛屼粬涓嶆槸鍦ㄥ爢錛屼篃涓嶆槸鍦ㄦ爤鏄洿鎺ュ湪榪涚▼鐨勫湴鍧絀洪棿涓繚鐣欎竴蹇唴瀛橈紝铏界劧鐢ㄨ搗鏉ユ渶涓嶆柟渚褲備絾鏄熷害蹇紝涔熸渶鐏墊椿銆?nbsp;

2.5鍫嗗拰鏍堜腑鐨勫瓨鍌ㄥ唴瀹?nbsp;
鏍堬細 鍦ㄥ嚱鏁拌皟鐢ㄦ椂錛岀涓涓繘鏍堢殑鏄富鍑芥暟涓悗鐨勪笅涓鏉℃寚浠わ紙鍑芥暟璋冪敤璇彞鐨勪笅涓鏉″彲鎵ц璇彞錛夌殑鍦板潃錛岀劧鍚庢槸鍑芥暟鐨勫悇涓弬鏁幫紝鍦ㄥぇ澶氭暟鐨凜緙栬瘧鍣ㄤ腑錛屽弬鏁版槸鐢卞彸寰宸﹀叆鏍堢殑錛岀劧鍚庢槸鍑芥暟涓殑灞閮ㄥ彉閲忋傛敞鎰忛潤鎬佸彉閲忔槸涓嶅叆鏍堢殑銆?nbsp;
褰撴湰嬈″嚱鏁拌皟鐢ㄧ粨鏉熷悗錛屽眬閮ㄥ彉閲忓厛鍑烘爤錛岀劧鍚庢槸鍙傛暟錛屾渶鍚庢爤欏舵寚閽堟寚鍚戞渶寮濮嬪瓨鐨勫湴鍧錛屼篃灝辨槸涓誨嚱鏁頒腑鐨勪笅涓鏉℃寚浠わ紝紼嬪簭鐢辮鐐圭戶緇繍琛屻?nbsp;
鍫嗭細涓鑸槸鍦ㄥ爢鐨勫ご閮ㄧ敤涓涓瓧鑺傚瓨鏀懼爢鐨勫ぇ灝忋傚爢涓殑鍏蜂綋鍐呭鏈夌▼搴忓憳瀹夋帓銆?nbsp;

2.6瀛樺彇鏁堢巼鐨勬瘮杈?nbsp;

char s1[] = "aaaaaaaaaaaaaaa"; 
char *s2 = "bbbbbbbbbbbbbbbbb"; 
aaaaaaaaaaa鏄湪榪愯鏃跺埢璧嬪肩殑錛?nbsp;
鑰宐bbbbbbbbbb鏄湪緙栬瘧鏃跺氨紜畾鐨勶紱 
浣嗘槸錛屽湪浠ュ悗鐨勫瓨鍙栦腑錛屽湪鏍堜笂鐨勬暟緇勬瘮鎸囬拡鎵鎸囧悜鐨勫瓧絎︿覆(渚嬪鍫?蹇?nbsp;
姣斿錛?nbsp;
#include 
void main() 

char a = 1; 
char c[] = "1234567890"; 
char *p ="1234567890"; 
a = c[1]; 
a = p[1]; 
return; 

瀵瑰簲鐨勬眹緙栦唬鐮?nbsp;
10: a = c[1]; 
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 
0040106A 88 4D FC mov byte ptr [ebp-4],cl 
11: a = p[1]; 
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 
00401070 8A 42 01 mov al,byte ptr [edx+1] 
00401073 88 45 FC mov byte ptr [ebp-4],al 
絎竴縐嶅湪璇誨彇鏃剁洿鎺ュ氨鎶婂瓧絎︿覆涓殑鍏冪礌璇誨埌瀵勫瓨鍣╟l涓紝鑰岀浜岀鍒欒鍏堟妸鎸囬拡鍊艱鍒癳dx涓紝鍦ㄦ牴鎹甧dx璇誨彇瀛楃錛屾樉鐒舵參浜嗐?nbsp;


2.7灝忕粨錛?nbsp;
鍫嗗拰鏍堢殑鍖哄埆鍙互鐢ㄥ涓嬬殑姣斿柣鏉ョ湅鍑猴細 
浣跨敤鏍堝氨璞℃垜浠幓楗閲屽悆楗紝鍙鐐硅彍錛堝彂鍑虹敵璇鳳級銆佷粯閽便佸拰鍚冿紙浣跨敤錛夛紝鍚冮ケ浜嗗氨璧幫紝涓嶅繀鐞嗕細鍒囪彍銆佹礂鑿滅瓑鍑嗗宸ヤ綔鍜屾礂紕椼佸埛閿呯瓑鎵熬宸ヤ綔錛屼粬鐨勫ソ澶勬槸蹇嵎錛屼絾鏄嚜鐢卞害灝忋?nbsp;
浣跨敤鍫嗗氨璞℃槸鑷繁鍔ㄦ墜鍋氬枩嬈㈠悆鐨勮彍鑲達紝姣旇緝楹葷儲錛屼絾鏄瘮杈冪鍚堣嚜宸辯殑鍙e懗錛岃屼笖鑷敱搴﹀ぇ銆?nbsp;



windows榪涚▼涓殑鍐呭瓨緇撴瀯


鍦ㄩ槄璇繪湰鏂囦箣鍓嶏紝濡傛灉浣犺繛鍫嗘爤鏄粈涔堝涓嶇煡閬撶殑璇濓紝璇峰厛闃呰鏂囩珷鍚庨潰鐨勫熀紜鐭ヨ瘑銆?nbsp;

鎺ヨЕ榪囩紪紼嬬殑浜洪兘鐭ラ亾錛岄珮綰ц璦閮借兘閫氳繃鍙橀噺鍚嶆潵璁塊棶鍐呭瓨涓殑鏁版嵁銆傞偅涔堣繖浜涘彉閲忓湪鍐呭瓨涓槸濡備綍瀛樻斁鐨勫憿錛熺▼搴忓張鏄浣曚嬌鐢ㄨ繖浜涘彉閲忕殑鍛紵涓嬮潰灝變細瀵規榪涜娣卞叆鐨勮璁恒備笅鏂囦腑鐨凜璇█浠g爜濡傛病鏈夌壒鍒0鏄庯紝榛樿閮戒嬌鐢╒C緙栬瘧鐨剅elease鐗堛?nbsp;

棣栧厛錛屾潵浜嗚В涓涓?nbsp;C 璇█鐨勫彉閲忔槸濡備綍鍦ㄥ唴瀛樺垎閮ㄧ殑銆侰 璇█鏈夊叏灞鍙橀噺(Global)銆佹湰鍦板彉閲?Local)錛岄潤鎬佸彉閲?Static)銆佸瘎瀛樺櫒鍙橀噺(Regeister)銆傛瘡縐嶅彉閲忛兘鏈変笉鍚岀殑鍒嗛厤鏂瑰紡銆傚厛鏉ョ湅涓嬮潰榪欐浠g爜錛?nbsp;

#include <stdio.h> 

int g1=0, g2=0, g3=0; 

int main() 

static int s1=0, s2=0, s3=0; 
int v1=0, v2=0, v3=0; 

//鎵撳嵃鍑哄悇涓彉閲忕殑鍐呭瓨鍦板潃 

printf("0x%08x\n",&v1); //鎵撳嵃鍚勬湰鍦板彉閲忕殑鍐呭瓨鍦板潃 
printf("0x%08x\n",&v2); 
printf("0x%08x\n\n",&v3); 
printf("0x%08x\n",&g1); //鎵撳嵃鍚勫叏灞鍙橀噺鐨勫唴瀛樺湴鍧 
printf("0x%08x\n",&g2); 
printf("0x%08x\n\n",&g3); 
printf("0x%08x\n",&s1); //鎵撳嵃鍚勯潤鎬佸彉閲忕殑鍐呭瓨鍦板潃 
printf("0x%08x\n",&s2); 
printf("0x%08x\n\n",&s3); 
return 0; 

緙栬瘧鍚庣殑鎵ц緇撴灉鏄細 

0x0012ff78 
0x0012ff7c 
0x0012ff80 

0x004068d0 
0x004068d4 
0x004068d8 

0x004068dc 
0x004068e0 
0x004068e4 

杈撳嚭鐨勭粨鏋滃氨鏄彉閲忕殑鍐呭瓨鍦板潃銆傚叾涓璿1,v2,v3鏄湰鍦板彉閲忥紝g1,g2,g3鏄叏灞鍙橀噺錛宻1,s2,s3鏄潤鎬佸彉閲忋備綘鍙互鐪嬪埌榪欎簺鍙橀噺鍦ㄥ唴瀛樻槸榪炵畫鍒嗗竷鐨勶紝浣嗘槸鏈湴鍙橀噺鍜屽叏灞鍙橀噺鍒嗛厤鐨勫唴瀛樺湴鍧宸簡鍗佷竾鍏崈閲岋紝鑰屽叏灞鍙橀噺鍜岄潤鎬佸彉閲忓垎閰嶇殑鍐呭瓨鏄繛緇殑銆傝繖鏄洜涓烘湰鍦板彉閲忓拰鍏ㄥ眬/闈欐佸彉閲忔槸鍒嗛厤鍦ㄤ笉鍚岀被鍨嬬殑鍐呭瓨鍖哄煙涓殑緇撴灉銆傚浜庝竴涓繘紼嬬殑鍐呭瓨絀洪棿鑰岃█錛屽彲浠ュ湪閫昏緫涓婂垎鎴?涓儴浠斤細浠g爜鍖猴紝闈欐佹暟鎹尯鍜屽姩鎬佹暟鎹尯銆傚姩鎬佹暟鎹尯涓鑸氨鏄?#8220;鍫嗘爤”銆?#8220;鏍?stack)”鍜?#8220;鍫?heap)”鏄袱縐嶄笉鍚岀殑鍔ㄦ佹暟鎹尯錛屾爤鏄竴縐嶇嚎鎬х粨鏋勶紝鍫嗘槸涓縐嶉摼寮忕粨鏋勩傝繘紼嬬殑姣忎釜綰跨▼閮芥湁縐佹湁鐨?#8220;鏍?#8221;錛屾墍浠ユ瘡涓嚎紼嬭櫧鐒朵唬鐮佷竴鏍鳳紝浣嗘湰鍦板彉閲忕殑鏁版嵁閮芥槸浜掍笉騫叉壈銆備竴涓爢鏍堝彲浠ラ氳繃“鍩哄湴鍧”鍜?#8220;鏍堥《”鍦板潃鏉ユ弿榪般傚叏灞鍙橀噺鍜岄潤鎬佸彉閲忓垎閰嶅湪闈欐佹暟鎹尯錛屾湰鍦板彉閲忓垎閰嶅湪鍔ㄦ佹暟鎹尯錛屽嵆鍫嗘爤涓傜▼搴忛氳繃鍫嗘爤鐨勫熀鍦板潃鍜屽亸縐婚噺鏉ヨ闂湰鍦板彉閲忋?nbsp;


鈹溾斺斺斺斺斺斺斺敜浣庣鍐呭瓨鍖哄煙 
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;鍔ㄦ佹暟鎹尯 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;浠g爜鍖?nbsp;鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;闈欐佹暟鎹尯 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜楂樼鍐呭瓨鍖哄煙 


鍫嗘爤鏄竴涓厛榪涘悗鍑虹殑鏁版嵁緇撴瀯錛屾爤欏跺湴鍧鎬繪槸灝忎簬絳変簬鏍堢殑鍩哄湴鍧銆傛垜浠彲浠ュ厛浜嗚В涓涓嬪嚱鏁拌皟鐢ㄧ殑榪囩▼錛屼互渚垮鍫嗘爤鍦ㄧ▼搴忎腑鐨勪綔鐢ㄦ湁鏇存繁鍏ョ殑浜嗚В銆備笉鍚岀殑璇█鏈変笉鍚岀殑鍑芥暟璋冪敤瑙勫畾錛岃繖浜涘洜绱犳湁鍙傛暟鐨勫帇鍏ヨ鍒欏拰鍫嗘爤鐨勫鉤琛°倃indows API鐨勮皟鐢ㄨ鍒欏拰ANSI C鐨勫嚱鏁拌皟鐢ㄨ鍒欐槸涓嶄竴鏍風殑錛屽墠鑰呯敱琚皟鍑芥暟璋冩暣鍫嗘爤錛屽悗鑰呯敱璋冪敤鑰呰皟鏁村爢鏍堛備袱鑰呴氳繃“__stdcall”鍜?#8220;__cdecl”鍓嶇紑鍖哄垎銆傚厛鐪嬩笅闈㈣繖孌典唬鐮侊細 

#include <stdio.h> 

void __stdcall func(int param1,int param2,int param3) 

int var1=param1; 
int var2=param2; 
int var3=param3; 
printf("0x%08x\n",¶m1); //鎵撳嵃鍑哄悇涓彉閲忕殑鍐呭瓨鍦板潃 
printf("0x%08x\n",¶m2); 
printf("0x%08x\n\n",¶m3); 
printf("0x%08x\n",&var1); 
printf("0x%08x\n",&var2); 
printf("0x%08x\n\n",&var3); 
return; 

int main() 

func(1,2,3); 
return 0; 

緙栬瘧鍚庣殑鎵ц緇撴灉鏄細 

0x0012ff78 
0x0012ff7c 
0x0012ff80 

0x0012ff68 
0x0012ff6c 
0x0012ff70 


鈹溾斺斺斺斺斺斺斺敜<鈥斿嚱鏁版墽琛屾椂鐨勬爤欏訛紙ESP錛夈佷綆绔唴瀛樺尯鍩?nbsp;
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;var 1 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;var 2 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;var 3 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;RET 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜<鈥?#8220;__cdecl”鍑芥暟榪斿洖鍚庣殑鏍堥《錛圗SP錛?nbsp;
鈹?nbsp;parameter 1 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;parameter 2 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;parameter 3 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜<鈥?#8220;__stdcall”鍑芥暟榪斿洖鍚庣殑鏍堥《錛圗SP錛?nbsp;
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜<鈥旀爤搴曪紙鍩哄湴鍧 EBP錛夈侀珮绔唴瀛樺尯鍩?nbsp;


涓婂浘灝辨槸鍑芥暟璋冪敤榪囩▼涓爢鏍堢殑鏍峰瓙浜嗐傞鍏堬紝涓変釜鍙傛暟浠ヤ粠鍙堝埌宸︾殑嬈″簭鍘嬪叆鍫嗘爤錛屽厛鍘?#8220;param3”錛屽啀鍘?#8220;param2”錛屾渶鍚庡帇鍏?#8220;param1”錛涚劧鍚庡帇鍏ュ嚱鏁扮殑榪斿洖鍦板潃(RET)錛屾帴鐫璺寵漿鍒板嚱鏁板湴鍧鎺ョ潃鎵ц錛堣繖閲岃琛ュ厖涓鐐癸紝浠嬬粛UNIX涓嬬殑緙撳啿婧㈠嚭鍘熺悊鐨勬枃绔犱腑閮芥彁鍒板湪鍘嬪叆RET鍚庯紝緇х畫鍘嬪叆褰撳墠EBP錛岀劧鍚庣敤褰撳墠ESP浠f浛EBP銆傜劧鑰岋紝鏈変竴綃囦粙緇峸indows涓嬪嚱鏁拌皟鐢ㄧ殑鏂囩珷涓錛屽湪windows涓嬬殑鍑芥暟璋冪敤涔熸湁榪欎竴姝ラ錛屼絾鏍規嵁鎴戠殑瀹為檯璋冭瘯錛屽茍鏈彂鐜拌繖涓姝ワ紝榪欒繕鍙互浠巔aram3鍜寁ar1涔嬮棿鍙湁4瀛楄妭鐨勯棿闅欒繖鐐圭湅鍑烘潵錛夛紱絎笁姝ワ紝灝嗘爤欏?ESP)鍑忓幓涓涓暟錛屼負鏈湴鍙橀噺鍒嗛厤鍐呭瓨絀洪棿錛屼笂渚嬩腑鏄噺鍘?2瀛楄妭(ESP=ESP-3*4錛屾瘡涓猧nt鍙橀噺鍗犵敤4涓瓧鑺?錛涙帴鐫灝卞垵濮嬪寲鏈湴鍙橀噺鐨勫唴瀛樼┖闂淬傜敱浜?#8220;__stdcall”璋冪敤鐢辮璋冨嚱鏁拌皟鏁村爢鏍堬紝鎵浠ュ湪鍑芥暟榪斿洖鍓嶈鎭㈠鍫嗘爤錛屽厛鍥炴敹鏈湴鍙橀噺鍗犵敤鐨勫唴瀛?ESP=ESP+3*4)錛岀劧鍚庡彇鍑鴻繑鍥炲湴鍧錛屽~鍏IP瀵勫瓨鍣紝鍥炴敹鍏堝墠鍘嬪叆鍙傛暟鍗犵敤鐨勫唴瀛?ESP=ESP+3*4)錛岀戶緇墽琛岃皟鐢ㄨ呯殑浠g爜銆傚弬瑙佷笅鍒楁眹緙栦唬鐮侊細 

;--------------func 鍑芥暟鐨勬眹緙栦唬鐮?------------------ 

:00401000 83EC0C sub esp, 0000000C //鍒涘緩鏈湴鍙橀噺鐨勫唴瀛樼┖闂?nbsp;
:00401003 8B442410 mov eax, dword ptr [esp+10] 
:00401007 8B4C2414 mov ecx, dword ptr [esp+14] 
:0040100B 8B542418 mov edx, dword ptr [esp+18] 
:0040100F 89442400 mov dword ptr [esp], eax 
:00401013 8D442410 lea eax, dword ptr [esp+10] 
:00401017 894C2404 mov dword ptr [esp+04], ecx 

……………………錛堢渷鐣ヨ嫢騫蹭唬鐮侊級 

:00401075 83C43C add esp, 0000003C ;鎭㈠鍫嗘爤錛屽洖鏀舵湰鍦板彉閲忕殑鍐呭瓨絀洪棿 
:00401078 C3 ret 000C ;鍑芥暟榪斿洖錛屾仮澶嶅弬鏁板崰鐢ㄧ殑鍐呭瓨絀洪棿 
;濡傛灉鏄?#8220;__cdecl”鐨勮瘽錛岃繖閲屾槸“ret”錛屽爢鏍堝皢鐢辮皟鐢ㄨ呮仮澶?nbsp;

;-------------------鍑芥暟緇撴潫------------------------- 


;--------------涓葷▼搴忚皟鐢╢unc鍑芥暟鐨勪唬鐮?------------- 

:00401080 6A03 push 00000003 //鍘嬪叆鍙傛暟param3 
:00401082 6A02 push 00000002 //鍘嬪叆鍙傛暟param2 
:00401084 6A01 push 00000001 //鍘嬪叆鍙傛暟param1 
:00401086 E875FFFFFF call 00401000 //璋冪敤func鍑芥暟 
;濡傛灉鏄?#8220;__cdecl”鐨勮瘽錛屽皢鍦ㄨ繖閲屾仮澶嶅爢鏍堬紝“add esp, 0000000C” 

鑱槑鐨勮鑰呯湅鍒拌繖閲岋紝宸笉澶氬氨鏄庣櫧緙撳啿婧㈠嚭鐨勫師鐞嗕簡銆傚厛鏉ョ湅涓嬮潰鐨勪唬鐮侊細 

#include <stdio.h> 
#include <string.h> 

void __stdcall func() 

char lpBuff[8]="\0"; 
strcat(lpBuff,"AAAAAAAAAAA"); 
return; 

int main() 

func(); 
return 0; 

緙栬瘧鍚庢墽琛屼竴涓嬪洖鎬庝箞鏍鳳紵鍝堬紝“"0x00414141"鎸囦護寮曠敤鐨?0x00000000"鍐呭瓨銆傝鍐呭瓨涓嶈兘涓?read"銆?#8221;錛?#8220;闈炴硶鎿嶄綔”鍠斤紒"41"灝辨槸"A"鐨?6榪涘埗鐨凙SCII鐮佷簡錛岄偅鏄庢樉灝辨槸strcat榪欏彞鍑虹殑闂浜嗐?lpBuff"鐨勫ぇ灝忓彧鏈?瀛楄妭錛岀畻榪涚粨灝劇殑\0錛岄偅strcat鏈澶氬彧鑳藉啓鍏?涓?A"錛屼絾紼嬪簭瀹為檯鍐欏叆浜?1涓?A"澶栧姞1涓猏0銆傚啀鏉ョ湅鐪嬩笂闈㈤偅騫呭浘錛屽鍑烘潵鐨?涓瓧鑺傛濂借鐩栦簡RET鐨勬墍鍦ㄧ殑鍐呭瓨絀洪棿錛屽鑷村嚱鏁拌繑鍥炲埌涓涓敊璇殑鍐呭瓨鍦板潃錛屾墽琛屼簡閿欒鐨勬寚浠ゃ傚鏋滆兘綺懼績鏋勯犺繖涓瓧絎︿覆錛屼嬌瀹冨垎鎴愪笁閮ㄥ垎錛屽墠涓閮ㄤ喚浠呬粎鏄~鍏呯殑鏃犳剰涔夋暟鎹互杈懼埌婧㈠嚭鐨勭洰鐨勶紝鎺ョ潃鏄竴涓鐩朢ET鐨勬暟鎹紝绱ф帴鐫鏄竴孌祍hellcode錛岄偅鍙鐫涓猂ET鍦板潃鑳芥寚鍚戣繖孌祍hellcode鐨勭涓涓寚浠わ紝閭e嚱鏁拌繑鍥炴椂灝辮兘鎵цshellcode浜嗐備絾鏄蔣浠剁殑涓嶅悓鐗堟湰鍜屼笉鍚岀殑榪愯鐜閮藉彲鑳藉獎鍝嶈繖孌祍hellcode鍦ㄥ唴瀛樹腑鐨勪綅緗紝閭d箞瑕佹瀯閫犺繖涓猂ET鏄崄鍒嗗洶闅劇殑銆備竴鑸兘鍦≧ET鍜宻hellcode涔嬮棿濉厖澶ч噺鐨凬OP鎸囦護錛屼嬌寰梕xploit鏈夋洿寮虹殑閫氱敤鎬с?nbsp;


鈹溾斺斺斺斺斺斺斺敜<鈥斾綆绔唴瀛樺尯鍩?nbsp;
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜<鈥旂敱exploit濉叆鏁版嵁鐨勫紑濮?nbsp;
鈹?nbsp;鈹?nbsp;
鈹?nbsp;buffer 鈹?lt;鈥斿~鍏ユ棤鐢ㄧ殑鏁版嵁 
鈹?nbsp;鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;RET 鈹?lt;鈥旀寚鍚憇hellcode錛屾垨NOP鎸囦護鐨勮寖鍥?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;NOP 鈹?nbsp;
鈹?nbsp;…… 鈹?lt;鈥斿~鍏ョ殑NOP鎸囦護錛屾槸RET鍙寚鍚戠殑鑼冨洿 
鈹?nbsp;NOP 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜 
鈹?nbsp;鈹?nbsp;
鈹?nbsp;shellcode 鈹?nbsp;
鈹?nbsp;鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜<鈥旂敱exploit濉叆鏁版嵁鐨勭粨鏉?nbsp;
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜<鈥旈珮绔唴瀛樺尯鍩?nbsp;


windows涓嬬殑鍔ㄦ佹暟鎹櫎浜嗗彲瀛樻斁鍦ㄦ爤涓紝榪樺彲浠ュ瓨鏀懼湪鍫嗕腑銆備簡瑙++鐨勬湅鍙嬮兘鐭ラ亾錛孋++鍙互浣跨敤new鍏抽敭瀛楁潵鍔ㄦ佸垎閰嶅唴瀛樸傛潵鐪嬩笅闈㈢殑C++浠g爜錛?nbsp;

#include <stdio.h> 
#include <iostream.h> 
#include <windows.h> 

void func() 

char *buffer=new char[128]; 
char bufflocal[128]; 
static char buffstatic[128]; 
printf("0x%08x\n",buffer); //鎵撳嵃鍫嗕腑鍙橀噺鐨勫唴瀛樺湴鍧 
printf("0x%08x\n",bufflocal); //鎵撳嵃鏈湴鍙橀噺鐨勫唴瀛樺湴鍧 
printf("0x%08x\n",buffstatic); //鎵撳嵃闈欐佸彉閲忕殑鍐呭瓨鍦板潃 

void main() 

func(); 
return; 

紼嬪簭鎵ц緇撴灉涓猴細 

0x004107d0 
0x0012ff04 
0x004068c0 

鍙互鍙戠幇鐢╪ew鍏抽敭瀛楀垎閰嶇殑鍐呭瓨鍗充笉鍦ㄦ爤涓紝涔熶笉鍦ㄩ潤鎬佹暟鎹尯銆俈C緙栬瘧鍣ㄦ槸閫氳繃windows涓嬬殑“鍫?heap)”鏉ュ疄鐜皀ew鍏抽敭瀛楃殑鍐呭瓨鍔ㄦ佸垎閰嶃傚湪璁?#8220;鍫?#8221;涔嬪墠錛屽厛鏉ヤ簡瑙d竴涓嬪拰“鍫?#8221;鏈夊叧鐨勫嚑涓狝PI鍑芥暟錛?nbsp;

HeapAlloc 鍦ㄥ爢涓敵璇峰唴瀛樼┖闂?nbsp;
HeapCreate 鍒涘緩涓涓柊鐨勫爢瀵硅薄 
HeapDestroy 閿姣佷竴涓爢瀵硅薄 
HeapFree 閲婃斁鐢寵鐨勫唴瀛?nbsp;
HeapWalk 鏋氫婦鍫嗗璞$殑鎵鏈夊唴瀛樺潡 
GetProcessHeap 鍙栧緱榪涚▼鐨勯粯璁ゅ爢瀵硅薄 
GetProcessHeaps 鍙栧緱榪涚▼鎵鏈夌殑鍫嗗璞?nbsp;
LocalAlloc 
GlobalAlloc 

褰撹繘紼嬪垵濮嬪寲鏃訛紝緋葷粺浼氳嚜鍔ㄤ負榪涚▼鍒涘緩涓涓粯璁ゅ爢錛岃繖涓爢榛樿鎵鍗犲唴瀛樼殑澶у皬涓?M銆傚爢瀵硅薄鐢辯郴緇熻繘琛岀鐞嗭紝瀹冨湪鍐呭瓨涓互閾懼紡緇撴瀯瀛樺湪銆傞氳繃涓嬮潰鐨勪唬鐮佸彲浠ラ氳繃鍫嗗姩鎬佺敵璇峰唴瀛樼┖闂達細 

HANDLE hHeap=GetProcessHeap(); 
char *buff=HeapAlloc(hHeap,0,8); 

鍏朵腑hHeap鏄爢瀵硅薄鐨勫彞鏌勶紝buff鏄寚鍚戠敵璇風殑鍐呭瓨絀洪棿鐨勫湴鍧銆傞偅榪欎釜hHeap絀剁珶鏄粈涔堝憿錛熷畠鐨勫兼湁浠涔堟剰涔夊悧錛熺湅鐪嬩笅闈㈣繖孌典唬鐮佸惂錛?nbsp;

#pragma comment(linker,"/entry:main") //瀹氫箟紼嬪簭鐨勫叆鍙?nbsp;
#include <windows.h> 

_CRTIMP int (__cdecl *printf)(const char *, ...); //瀹氫箟STL鍑芥暟printf 
/*--------------------------------------------------------------------------- 
鍐欏埌榪欓噷錛屾垜浠『渚挎潵澶嶄範涓涓嬪墠闈㈡墍璁茬殑鐭ヨ瘑錛?nbsp;
(*娉?printf鍑芥暟鏄疌璇█鐨勬爣鍑嗗嚱鏁板簱涓嚱鏁幫紝VC鐨勬爣鍑嗗嚱鏁板簱鐢眒svcrt.dll妯″潡瀹炵幇銆?nbsp;
鐢卞嚱鏁板畾涔夊彲瑙侊紝printf鐨勫弬鏁頒釜鏁版槸鍙彉鐨勶紝鍑芥暟鍐呴儴鏃犳硶棰勫厛鐭ラ亾璋冪敤鑰呭帇鍏ョ殑鍙傛暟涓暟錛屽嚱鏁板彧鑳介氳繃鍒嗘瀽絎竴涓弬鏁板瓧絎︿覆鐨勬牸寮忔潵鑾峰緱鍘嬪叆鍙傛暟鐨勪俊鎭紝鐢變簬榪欓噷鍙傛暟鐨勪釜鏁版槸鍔ㄦ佺殑錛屾墍浠ュ繀欏葷敱璋冪敤鑰呮潵騫寵 鍫嗘爤錛岃繖閲屼究浣跨敤浜哶_cdecl璋冪敤瑙勫垯銆侭TW錛學indows緋葷粺鐨凙PI鍑芥暟鍩烘湰涓婃槸__stdcall璋冪敤褰㈠紡錛屽彧鏈変竴涓狝PI渚嬪錛岄偅灝辨槸wsprintf錛屽畠浣跨敤__cdecl璋冪敤瑙勫垯錛屽悓printf鍑芥暟涓鏍鳳紝榪欐槸鐢變簬瀹冪殑鍙傛暟涓暟鏄彲鍙樼殑緙樻晠銆?nbsp;
---------------------------------------------------------------------------*/ 
void main() 

HANDLE hHeap=GetProcessHeap(); 
char *buff=HeapAlloc(hHeap,0,0x10); 
char *buff2=HeapAlloc(hHeap,0,0x10); 
HMODULE hMsvcrt=LoadLibrary("msvcrt.dll"); 
printf=(void *)GetProcAddress(hMsvcrt,"printf"); 
printf("0x%08x\n",hHeap); 
printf("0x%08x\n",buff); 
printf("0x%08x\n\n",buff2); 

鎵ц緇撴灉涓猴細 

0x00130000 
0x00133100 
0x00133118 

hHeap鐨勫兼庝箞鍜岄偅涓猙uff鐨勫奸偅涔堟帴榪戝憿錛熷叾瀹瀐Heap榪欎釜鍙ユ焺灝辨槸鎸囧悜HEAP棣栭儴鐨勫湴鍧銆傚湪榪涚▼鐨勭敤鎴峰尯瀛樼潃涓涓彨PEB(榪涚▼鐜鍧?鐨勭粨鏋勶紝榪欎釜緇撴瀯涓瓨鏀劇潃涓浜涙湁鍏寵繘紼嬬殑閲嶈淇℃伅錛屽叾涓湪PEB棣栧湴鍧鍋忕Щ0x18澶勫瓨鏀劇殑ProcessHeap灝辨槸榪涚▼榛樿鍫嗙殑鍦板潃錛岃屽亸縐?x90澶勫瓨鏀句簡鎸囧悜榪涚▼鎵鏈夊爢鐨勫湴鍧鍒楄〃鐨勬寚閽堛倃indows鏈夊緢澶欰PI閮戒嬌鐢ㄨ繘紼嬬殑榛樿鍫嗘潵瀛樻斁鍔ㄦ佹暟鎹紝濡倃indows 2000涓嬬殑鎵鏈堿NSI鐗堟湰鐨勫嚱鏁伴兘鏄湪榛樿鍫嗕腑鐢寵鍐呭瓨鏉ヨ漿鎹NSI瀛楃涓插埌Unicode瀛楃涓茬殑銆傚涓涓爢鐨勮闂槸欏哄簭榪涜鐨勶紝鍚屼竴鏃跺埢鍙兘鏈変竴涓嚎紼嬭闂爢涓殑鏁版嵁錛屽綋澶氫釜綰跨▼鍚屾椂鏈夎闂姹傛椂錛屽彧鑳芥帓闃熺瓑寰咃紝榪欐牱渚塊犳垚紼嬪簭鎵ц鏁堢巼涓嬮檷銆?nbsp;

鏈鍚庢潵璇磋鍐呭瓨涓殑鏁版嵁瀵歸綈銆傛墍浣嶆暟鎹榻愶紝鏄寚鏁版嵁鎵鍦ㄧ殑鍐呭瓨鍦板潃蹇呴』鏄鏁版嵁闀垮害鐨勬暣鏁板嶏紝DWORD鏁版嵁鐨勫唴瀛樿搗濮嬪湴鍧鑳借4闄ゅ敖錛學ORD鏁版嵁鐨勫唴瀛樿搗濮嬪湴鍧鑳借2闄ゅ敖錛寈86 CPU鑳界洿鎺ヨ闂榻愮殑鏁版嵁錛屽綋浠栬瘯鍥捐闂竴涓湭瀵歸綈鐨勬暟鎹椂錛屼細鍦ㄥ唴閮ㄨ繘琛屼竴緋誨垪鐨勮皟鏁達紝榪欎簺璋冩暣瀵逛簬紼嬪簭鏉ヨ鏄忔槑鐨勶紝浣嗘槸浼氶檷浣庤繍琛岄熷害錛屾墍浠ョ紪璇戝櫒鍦ㄧ紪璇戠▼搴忔椂浼氬敖閲忎繚璇佹暟鎹榻愩傚悓鏍蜂竴孌典唬鐮侊紝鎴戜滑鏉ョ湅鐪嬬敤VC銆丏ev-C++鍜宭cc涓変釜涓嶅悓緙栬瘧鍣ㄧ紪璇戝嚭鏉ョ殑紼嬪簭鐨勬墽琛岀粨鏋滐細 

#include <stdio.h> 

int main() 

int a; 
char b; 
int c; 
printf("0x%08x\n",&a); 
printf("0x%08x\n",&b); 
printf("0x%08x\n",&c); 
return 0; 

榪欐槸鐢╒C緙栬瘧鍚庣殑鎵ц緇撴灉錛?nbsp;
0x0012ff7c 
0x0012ff7b 
0x0012ff80 
鍙橀噺鍦ㄥ唴瀛樹腑鐨勯『搴忥細b(1瀛楄妭)-a(4瀛楄妭)-c(4瀛楄妭)銆?nbsp;

榪欐槸鐢―ev-C++緙栬瘧鍚庣殑鎵ц緇撴灉錛?nbsp;
0x0022ff7c 
0x0022ff7b 
0x0022ff74 
鍙橀噺鍦ㄥ唴瀛樹腑鐨勯『搴忥細c(4瀛楄妭)-涓棿鐩擱殧3瀛楄妭-b(鍗?瀛楄妭)-a(4瀛楄妭)銆?nbsp;

榪欐槸鐢╨cc緙栬瘧鍚庣殑鎵ц緇撴灉錛?nbsp;
0x0012ff6c 
0x0012ff6b 
0x0012ff64 
鍙橀噺鍦ㄥ唴瀛樹腑鐨勯『搴忥細鍚屼笂銆?nbsp;

涓変釜緙栬瘧鍣ㄩ兘鍋氬埌浜嗘暟鎹榻愶紝浣嗘槸鍚庝袱涓紪璇戝櫒鏄劇劧娌C“鑱槑”錛岃涓涓猚har鍗犱簡4瀛楄妭錛屾氮璐瑰唴瀛樺摝銆?nbsp;


鍩虹鐭ヨ瘑錛?nbsp;
鍫嗘爤鏄竴縐嶇畝鍗曠殑鏁版嵁緇撴瀯錛屾槸涓縐嶅彧鍏佽鍦ㄥ叾涓绔繘琛屾彃鍏ユ垨鍒犻櫎鐨勭嚎鎬ц〃銆傚厑璁告彃鍏ユ垨鍒犻櫎鎿嶄綔鐨勪竴绔О涓烘爤欏訛紝鍙︿竴绔О涓烘爤搴曪紝瀵瑰爢鏍堢殑鎻掑叆鍜屽垹闄ゆ搷浣滆縐頒負鍏ユ爤鍜屽嚭鏍堛傛湁涓緇凜PU鎸囦護鍙互瀹炵幇瀵硅繘紼嬬殑鍐呭瓨瀹炵幇鍫嗘爤璁塊棶銆傚叾涓紝POP鎸囦護瀹炵幇鍑烘爤鎿嶄綔錛孭USH鎸囦護瀹炵幇鍏ユ爤鎿嶄綔銆侰PU鐨凟SP瀵勫瓨鍣ㄥ瓨鏀懼綋鍓嶇嚎紼嬬殑鏍堥《鎸囬拡錛孍BP瀵勫瓨鍣ㄤ腑淇濆瓨褰撳墠綰跨▼鐨勬爤搴曟寚閽堛侰PU鐨凟IP瀵勫瓨鍣ㄥ瓨鏀句笅涓涓狢PU鎸囦護瀛樻斁鐨勫唴瀛樺湴鍧錛屽綋CPU鎵ц瀹屽綋鍓嶇殑鎸囦護鍚庯紝浠嶦IP瀵勫瓨鍣ㄤ腑璇誨彇涓嬩竴鏉℃寚浠ょ殑鍐呭瓨鍦板潃錛岀劧鍚庣戶緇墽琛屻?nbsp;


鍙傝冿細銆奧indows涓嬬殑HEAP婧㈠嚭鍙婂叾鍒╃敤銆媌y: isno 
銆妛indows鏍稿績緙栫▼銆媌y: Jeffrey Richter 



鎽樿錛?nbsp;璁ㄨ甯歌鐨勫爢鎬ц兘闂浠ュ強濡備綍闃茶寖瀹冧滑銆傦紙鍏?nbsp;9 欏碉級

鍓嶈█
鎮ㄦ槸鍚︽槸鍔ㄦ佸垎閰嶇殑 C/C++ 瀵硅薄蹇犲疄涓斿垢榪愮殑鐢ㄦ埛錛熸偍鏄惁鍦ㄦā鍧楅棿鐨勫線榪旈氫俊涓綣佸湴浣跨敤浜?#8220;鑷姩鍖?#8221;錛熸偍鐨勭▼搴忔槸鍚﹀洜鍫嗗垎閰嶈岃繍琛岃搗鏉ュ緢鎱紵涓嶄粎浠呮偍閬囧埌榪欐牱鐨勯棶棰樸傚嚑涔庢墍鏈夐」鐩繜鏃╅兘浼氶亣鍒板爢闂銆傚ぇ瀹墮兘鎯寵錛?#8220;鎴戠殑浠g爜鐪熸濂斤紝鍙槸鍫嗗お鎱?#8221;銆傞偅鍙槸閮ㄥ垎姝g‘銆傛洿娣卞叆鐞嗚В鍫嗗強鍏剁敤娉曘佷互鍙婁細鍙戠敓浠涔堥棶棰橈紝鏄緢鏈夌敤鐨勩?/p>

浠涔堟槸鍫嗭紵
錛堝鏋滄偍宸茬粡鐭ラ亾浠涔堟槸鍫嗭紝鍙互璺沖埌“浠涔堟槸甯歌鐨勫爢鎬ц兘闂錛?#8221;閮ㄥ垎錛?/p>

鍦ㄧ▼搴忎腑錛屼嬌鐢ㄥ爢鏉ュ姩鎬佸垎閰嶅拰閲婃斁瀵硅薄銆傚湪涓嬪垪鎯呭喌涓嬶紝璋冪敤鍫嗘搷浣滐細 

浜嬪厛涓嶇煡閬撶▼搴忔墍闇瀵硅薄鐨勬暟閲忓拰澶у皬銆?/p>


瀵硅薄澶ぇ鑰屼笉閫傚悎鍫嗘爤鍒嗛厤紼嬪簭銆?br>鍫嗕嬌鐢ㄤ簡鍦ㄨ繍琛屾椂鍒嗛厤緇欎唬鐮佸拰鍫嗘爤鐨勫唴瀛樹箣澶栫殑閮ㄥ垎鍐呭瓨銆備笅鍥劇粰鍑轟簡鍫嗗垎閰嶇▼搴忕殑涓嶅悓灞傘?br>

GlobalAlloc/GlobalFree錛歁icrosoft Win32 鍫嗚皟鐢紝榪欎簺璋冪敤鐩存帴涓庢瘡涓繘紼嬬殑榛樿鍫嗚繘琛屽璇濄?/p>

LocalAlloc/LocalFree錛歐in32 鍫嗚皟鐢紙涓轟簡涓?nbsp;Microsoft Windows NT 鍏煎錛夛紝榪欎簺璋冪敤鐩存帴涓庢瘡涓繘紼嬬殑榛樿鍫嗚繘琛屽璇濄?/p>

COM 鐨?nbsp;IMalloc 鍒嗛厤紼嬪簭錛堟垨 CoTaskMemAlloc / CoTaskMemFree錛夛細鍑芥暟浣跨敤姣忎釜榪涚▼鐨勯粯璁ゅ爢銆傝嚜鍔ㄥ寲紼嬪簭浣跨敤“緇勪歡瀵硅薄妯″瀷 (COM)”鐨勫垎閰嶇▼搴忥紝鑰岀敵璇風殑紼嬪簭浣跨敤姣忎釜榪涚▼鍫嗐?/p>

C/C++ 榪愯鏃?nbsp;(CRT) 鍒嗛厤紼嬪簭錛氭彁渚涗簡 malloc() 鍜?nbsp;free() 浠ュ強 new 鍜?nbsp;delete 鎿嶄綔絎︺傚 Microsoft Visual Basic 鍜?nbsp;Java 絳夎璦涔熸彁渚涗簡鏂扮殑鎿嶄綔絎﹀茍浣跨敤鍨冨溇鏀墮泦鏉ヤ唬鏇垮爢銆侰RT 鍒涘緩鑷繁鐨勭鏈夊爢錛岄┗鐣欏湪 Win32 鍫嗙殑欏墮儴銆?/p>

Windows NT 涓紝Win32 鍫嗘槸 Windows NT 榪愯鏃跺垎閰嶇▼搴忓懆鍥寸殑钖勫眰銆傛墍鏈?nbsp;API 杞彂瀹冧滑鐨勮姹傜粰 NTDLL銆?/p>

Windows NT 榪愯鏃跺垎閰嶇▼搴忔彁渚?nbsp;Windows NT 鍐呯殑鏍稿績鍫嗗垎閰嶇▼搴忋傚畠鐢卞叿鏈?nbsp;128 涓ぇ灝忎粠 8 鍒?nbsp;1,024 瀛楄妭鐨勭┖闂插垪琛ㄧ殑鍓嶇鍒嗛厤紼嬪簭緇勬垚銆傚悗绔垎閰嶇▼搴忎嬌鐢ㄨ櫄鎷熷唴瀛樻潵淇濈暀鍜屾彁浜ら〉銆?/p>

鍦ㄥ浘琛ㄧ殑搴曢儴鏄?#8220;铏氭嫙鍐呭瓨鍒嗛厤紼嬪簭”錛屾搷浣滅郴緇熶嬌鐢ㄥ畠鏉ヤ繚鐣欏拰鎻愪氦欏點傛墍鏈夊垎閰嶇▼搴忎嬌鐢ㄨ櫄鎷熷唴瀛樿繘琛屾暟鎹殑瀛樺彇銆?/p>

鍒嗛厤鍜岄噴鏀懼潡涓嶅氨閭d箞綆鍗曞悧錛熶負浣曡姳璐硅繖涔堥暱鏃墮棿錛?/p>

鍫嗗疄鐜扮殑娉ㄦ剰浜嬮」
浼犵粺涓婏紝鎿嶄綔緋葷粺鍜岃繍琛屾椂搴撴槸涓庡爢鐨勫疄鐜板叡瀛樼殑銆傚湪涓涓繘紼嬬殑寮濮嬶紝鎿嶄綔緋葷粺鍒涘緩涓涓粯璁ゅ爢錛屽彨鍋?#8220;榪涚▼鍫?#8221;銆傚鏋滄病鏈夊叾浠栧爢鍙嬌鐢紝鍒欏潡鐨勫垎閰嶄嬌鐢?#8220;榪涚▼鍫?#8221;銆傝璦榪愯鏃朵篃鑳藉湪榪涚▼鍐呭垱寤哄崟鐙殑鍫嗐傦紙渚嬪錛孋 榪愯鏃跺垱寤哄畠鑷繁鐨勫爢銆傦級闄よ繖浜涗笓鐢ㄧ殑鍫嗗錛屽簲鐢ㄧ▼搴忔垨璁稿宸茶澆鍏ョ殑鍔ㄦ侀摼鎺ュ簱 (DLL) 涔嬩竴鍙互鍒涘緩鍜屼嬌鐢ㄥ崟鐙殑鍫嗐俉in32 鎻愪緵涓鏁村 API 鏉ュ垱寤哄拰浣跨敤縐佹湁鍫嗐傛湁鍏沖爢鍑芥暟錛堣嫳鏂囷級鐨勮灝芥寚瀵鹼紝璇峰弬瑙?nbsp;MSDN銆?/p>

褰撳簲鐢ㄧ▼搴忔垨 DLL 鍒涘緩縐佹湁鍫嗘椂錛岃繖浜涘爢瀛樺湪浜庤繘紼嬬┖闂達紝騫朵笖鍦ㄨ繘紼嬪唴鏄彲璁塊棶鐨勩備粠緇欏畾鍫嗗垎閰嶇殑鏁版嵁灝嗗湪鍚屼竴涓爢涓婇噴鏀俱傦紙涓嶈兘浠庝竴涓爢鍒嗛厤鑰屽湪鍙︿竴涓爢閲婃斁銆傦級

鍦ㄦ墍鏈夎櫄鎷熷唴瀛樼郴緇熶腑錛屽爢椹葷暀鍦ㄦ搷浣滅郴緇熺殑“铏氭嫙鍐呭瓨綆$悊鍣?#8221;鐨勯《閮ㄣ傝璦榪愯鏃跺爢涔熼┗鐣欏湪铏氭嫙鍐呭瓨欏墮儴銆傛煇浜涙儏鍐典笅錛岃繖浜涘爢鏄搷浣滅郴緇熷爢涓殑灞傦紝鑰岃璦榪愯鏃跺爢鍒欓氳繃澶у潡鐨勫垎閰嶆潵鎵ц鑷繁鐨勫唴瀛樼鐞嗐備笉浣跨敤鎿嶄綔緋葷粺鍫嗭紝鑰屼嬌鐢ㄨ櫄鎷熷唴瀛樺嚱鏁版洿鍒╀簬鍫嗙殑鍒嗛厤鍜屽潡鐨勪嬌鐢ㄣ?/p>

鍏稿瀷鐨勫爢瀹炵幇鐢卞墠銆佸悗绔垎閰嶇▼搴忕粍鎴愩傚墠绔垎閰嶇▼搴忕淮鎸佸浐瀹氬ぇ灝忓潡鐨勭┖闂插垪琛ㄣ傚浜庝竴嬈″垎閰嶈皟鐢紝鍫嗗皾璇曚粠鍓嶇鍒楄〃鎵懼埌涓涓嚜鐢卞潡銆傚鏋滃け璐ワ紝鍫嗚榪粠鍚庣錛堜繚鐣欏拰鎻愪氦铏氭嫙鍐呭瓨錛夊垎閰嶄竴涓ぇ鍧楁潵婊¤凍璇鋒眰銆傞氱敤鐨勫疄鐜版湁姣忓潡鍒嗛厤鐨勫紑閿錛岃繖灝嗚楄垂鎵ц鍛ㄦ湡錛屼篃鍑忓皯浜嗗彲浣跨敤鐨勫瓨鍌ㄧ┖闂淬?/p>

Knowledge Base 鏂囩珷 Q10758錛?#8220;鐢?nbsp;calloc() 鍜?nbsp;malloc() 綆$悊鍐呭瓨” 錛堟悳绱㈡枃绔犵紪鍙鳳級, 鍖呭惈浜嗘湁鍏寵繖浜涗富棰樼殑鏇村鑳屾櫙鐭ヨ瘑銆傚彟澶栵紝鏈夊叧鍫嗗疄鐜板拰璁捐鐨勮緇嗚璁轟篃鍙湪涓嬪垪钁椾綔涓壘鍒幫細“Dynamic Storage Allocation: A Survey and Critical Review”錛屼綔鑰?nbsp;Paul R. Wilson銆丮ark S. Johnstone銆丮ichael Neely 鍜?nbsp;David Boles錛?#8220;International Workshop on Memory Management”, 浣滆?nbsp;Kinross, Scotland, UK, 1995 騫?nbsp;9 鏈?http://www.cs.utexas.edu/users/oops/papers.html)錛堣嫳鏂囷級銆?/p>

Windows NT 鐨勫疄鐜幫紙Windows NT 鐗堟湰 4.0 鍜屾洿鏂扮増鏈級 浣跨敤浜?nbsp;127 涓ぇ灝忎粠 8 鍒?nbsp;1,024 瀛楄妭鐨?nbsp;8 瀛楄妭瀵歸綈鍧楃┖闂插垪琛ㄥ拰涓涓?#8220;澶у潡”鍒楄〃銆?#8220;澶у潡”鍒楄〃錛堢┖闂插垪琛╗0]錛?nbsp;淇濆瓨澶т簬 1,024 瀛楄妭鐨勫潡銆傜┖闂插垪琛ㄥ綰充簡鐢ㄥ弻鍚戦摼琛ㄩ摼鎺ュ湪涓璧風殑瀵硅薄銆傞粯璁ゆ儏鍐典笅錛?#8220;榪涚▼鍫?#8221;鎵ц鏀墮泦鎿嶄綔銆傦紙鏀墮泦鏄皢鐩擱偦絀洪棽鍧楀悎騫舵垚涓涓ぇ鍧楃殑鎿嶄綔銆傦級鏀墮泦鑰楄垂浜嗛澶栫殑鍛ㄦ湡錛屼絾鍑忓皯浜嗗爢鍧楃殑鍐呴儴紕庣墖銆?/p>

鍗曚竴鍏ㄥ眬閿佷繚鎶ゅ爢錛岄槻姝㈠綰跨▼寮忕殑浣跨敤銆傦紙璇峰弬瑙?#8220;Server Performance and Scalability Killers”涓殑絎竴涓敞鎰忎簨欏? George Reilly 鎵钁楋紝鍦?nbsp;“MSDN Online Web Workshop”涓婏紙绔欑偣錛?img src="" align=absMiddle border=0>http://msdn.microsoft.com/workshop/server/iis/tencom.asp錛堣嫳鏂囷級銆傦級鍗曚竴鍏ㄥ眬閿佹湰璐ㄤ笂鏄敤鏉ヤ繚鎶ゅ爢鏁版嵁緇撴瀯錛岄槻姝㈣法澶氱嚎紼嬬殑闅忔満瀛樺彇銆傝嫢鍫嗘搷浣滃お棰戠箒錛屽崟涓鍏ㄥ眬閿佷細瀵規ц兘鏈変笉鍒╃殑褰卞搷銆?/p>

浠涔堟槸甯歌鐨勫爢鎬ц兘闂錛?br>浠ヤ笅鏄偍浣跨敤鍫嗘椂浼氶亣鍒扮殑鏈甯歌闂錛?nbsp;

鍒嗛厤鎿嶄綔閫犳垚鐨勯熷害鍑忔參銆傚厜鍒嗛厤灝辮楄垂寰堥暱鏃墮棿銆傛渶鍙兘瀵艱嚧榪愯閫熷害鍑忔參鍘熷洜鏄┖闂插垪琛ㄦ病鏈夊潡錛屾墍浠ヨ繍琛屾椂鍒嗛厤紼嬪簭浠g爜浼氳楄垂鍛ㄦ湡瀵繪壘杈冨ぇ鐨勭┖闂插潡錛屾垨浠庡悗绔垎閰嶇▼搴忓垎閰嶆柊鍧椼?/p>


閲婃斁鎿嶄綔閫犳垚鐨勯熷害鍑忔參銆傞噴鏀炬搷浣滆楄垂杈冨鍛ㄦ湡錛屼富瑕佹槸鍚敤浜嗘敹闆嗘搷浣溿傛敹闆嗘湡闂達紝姣忎釜閲婃斁鎿嶄綔“鏌ユ壘”瀹冪殑鐩擱偦鍧楋紝鍙栧嚭瀹冧滑騫舵瀯閫犳垚杈冨ぇ鍧楋紝鐒跺悗鍐嶆妸姝よ緝澶у潡鎻掑叆絀洪棽鍒楄〃銆傚湪鏌ユ壘鏈熼棿錛屽唴瀛樺彲鑳戒細闅忔満紕板埌錛屼粠鑰屽鑷撮珮閫熺紦瀛樹笉鑳藉懡涓紝鎬ц兘闄嶄綆銆?/p>


鍫嗙珵浜夐犳垚鐨勯熷害鍑忔參銆傚綋涓や釜鎴栧涓嚎紼嬪悓鏃惰闂暟鎹紝鑰屼笖涓涓嚎紼嬬戶緇繘琛屼箣鍓嶅繀欏葷瓑寰呭彟涓涓嚎紼嬪畬鎴愭椂灝卞彂鐢熺珵浜夈傜珵浜夋繪槸瀵艱嚧楹葷儲錛涜繖涔熸槸鐩墠澶氬鐞嗗櫒緋葷粺閬囧埌鐨勬渶澶ч棶棰樸傚綋澶ч噺浣跨敤鍐呭瓨鍧楃殑搴旂敤紼嬪簭鎴?nbsp;DLL 浠ュ綰跨▼鏂瑰紡榪愯錛堟垨榪愯浜庡澶勭悊鍣ㄧ郴緇熶笂錛夋椂灝嗗鑷撮熷害鍑忔參銆傚崟涓閿佸畾鐨勪嬌鐢ㄢ斿父鐢ㄧ殑瑙e喅鏂規鈥旀剰鍛崇潃浣跨敤鍫嗙殑鎵鏈夋搷浣滄槸搴忓垪鍖栫殑銆傚綋絳夊緟閿佸畾鏃跺簭鍒楀寲浼氬紩璧風嚎紼嬪垏鎹笂涓嬫枃銆傚彲浠ユ兂璞′氦鍙夎礬鍙i棯鐑佺殑綰㈢伅澶勮蛋璧板仠鍋滃鑷寸殑閫熷害鍑忔參銆?nbsp;
绔炰簤閫氬父浼氬鑷寸嚎紼嬪拰榪涚▼鐨勪笂涓嬫枃鍒囨崲銆備笂涓嬫枃鍒囨崲鐨勫紑閿鏄緢澶х殑錛屼絾寮閿鏇村ぇ鐨勬槸鏁版嵁浠庡鐞嗗櫒楂橀熺紦瀛樹腑涓㈠け錛屼互鍙婂悗鏉ョ嚎紼嬪媧繪椂鐨勬暟鎹噸寤恒?/p>

鍫嗙牬鍧忛犳垚鐨勯熷害鍑忔參銆傞犳垚鍫嗙牬鍧忕殑鍘熷洜鏄簲鐢ㄧ▼搴忓鍫嗗潡鐨勪笉姝g‘浣跨敤銆傞氬父鎯呭艦鍖呮嫭閲婃斁宸查噴鏀劇殑鍫嗗潡鎴栦嬌鐢ㄥ凡閲婃斁鐨勫爢鍧楋紝浠ュ強鍧楃殑瓚婄晫閲嶅啓絳夋槑鏄鵑棶棰樸傦紙鐮村潖涓嶅湪鏈枃璁ㄨ鑼冨洿涔嬪唴銆傛湁鍏沖唴瀛橀噸鍐欏拰娉勬紡絳夊叾浠栫粏鑺傦紝璇峰弬瑙?nbsp;Microsoft Visual C++(R) 璋冭瘯鏂囨。 銆傦級


棰戠箒鐨勫垎閰嶅拰閲嶅垎閰嶉犳垚鐨勯熷害鍑忔參銆傝繖鏄嬌鐢ㄨ剼鏈璦鏃墮潪甯告櫘閬嶇殑鐜拌薄銆傚瀛楃涓茶鍙嶅鍒嗛厤錛岄殢閲嶅垎閰嶅闀垮拰閲婃斁銆備笉瑕佽繖鏍峰仛錛屽鏋滃彲鑳斤紝灝介噺鍒嗛厤澶у瓧絎︿覆鍜屼嬌鐢ㄧ紦鍐插尯銆傚彟涓縐嶆柟娉曞氨鏄敖閲忓皯鐢ㄨ繛鎺ユ搷浣溿?br>绔炰簤鏄湪鍒嗛厤鍜岄噴鏀炬搷浣滀腑瀵艱嚧閫熷害鍑忔參鐨勯棶棰樸傜悊鎯蟲儏鍐典笅錛屽笇鏈涗嬌鐢ㄦ病鏈夌珵浜夊拰蹇熷垎閰?閲婃斁鐨勫爢銆傚彲鎯滐紝鐜板湪榪樻病鏈夎繖鏍風殑閫氱敤鍫嗭紝涔熻灝嗘潵浼氭湁銆?/p>

鍦ㄦ墍鏈夌殑鏈嶅姟鍣ㄧ郴緇熶腑錛堝 IIS銆丮SProxy銆丏atabaseStacks銆佺綉緇滄湇鍔″櫒銆?nbsp;Exchange 鍜屽叾浠栵級, 鍫嗛攣瀹氬疄鍦ㄦ槸涓ぇ鐡墮銆傚鐞嗗櫒鏁拌秺澶氾紝绔炰簤灝辮秺浼氭伓鍖栥?/p>

灝介噺鍑忓皯鍫嗙殑浣跨敤
鐜板湪鎮ㄦ槑鐧戒嬌鐢ㄥ爢鏃跺瓨鍦ㄧ殑闂浜嗭紝闅鵑亾鎮ㄤ笉鎯蟲嫢鏈夎兘瑙e喅榪欎簺闂鐨勮秴綰ч瓟媯掑悧錛熸垜鍙笇鏈涙湁銆備絾娌℃湁欖旀硶鑳戒嬌鍫嗚繍琛屽姞蹇斿洜姝や笉瑕佹湡鏈涘湪浜у搧鍑鴻揣涔嬪墠鐨勬渶鍚庝竴鏄熸湡鑳藉澶т負鏀硅銆傚鏋滄彁鍓嶈鍒掑爢絳栫暐錛屾儏鍐靛皢浼氬ぇ澶уソ杞傝皟鏁翠嬌鐢ㄥ爢鐨勬柟娉曪紝鍑忓皯瀵瑰爢鐨勬搷浣滄槸鎻愰珮鎬ц兘鐨勮壇鏂廣?/p>

濡備綍鍑忓皯浣跨敤鍫嗘搷浣滐紵閫氳繃鍒╃敤鏁版嵁緇撴瀯鍐呯殑浣嶇疆鍙噺灝戝爢鎿嶄綔鐨勬鏁般傝鑰冭檻涓嬪垪瀹炰緥錛?/p>

struct ObjectA {
   // objectA 鐨勬暟鎹?nbsp;
}

struct ObjectB {
   // objectB 鐨勬暟鎹?nbsp;
}

// 鍚屾椂浣跨敤 objectA 鍜?nbsp;objectB

//
// 浣跨敤鎸囬拡 
//
struct ObjectB {
   struct ObjectA * pObjA;
   // objectB 鐨勬暟鎹?nbsp;
}

//
// 浣跨敤宓屽叆
//
struct ObjectB {
   struct ObjectA pObjA;
   // objectB 鐨勬暟鎹?nbsp;
}

//
// 闆嗗悎 – 鍦ㄥ彟涓瀵硅薄鍐呬嬌鐢?nbsp;objectA 鍜?nbsp;objectB
//

struct ObjectX {
   struct ObjectA  objA;
   struct ObjectB  objB;
}

閬垮厤浣跨敤鎸囬拡鍏寵仈涓や釜鏁版嵁緇撴瀯銆傚鏋滀嬌鐢ㄦ寚閽堝叧鑱斾袱涓暟鎹粨鏋勶紝鍓嶉潰瀹炰緥涓殑瀵硅薄 A 鍜?nbsp;B 灝嗚鍒嗗埆鍒嗛厤鍜岄噴鏀俱傝繖浼氬鍔犻澶栧紑閿鈥旀垜浠閬垮厤榪欑鍋氭硶銆?/p>


鎶婂甫鎸囬拡鐨勫瓙瀵硅薄宓屽叆鐖跺璞°傚綋瀵硅薄涓湁鎸囬拡鏃訛紝鍒欐剰鍛崇潃瀵硅薄涓湁鍔ㄦ佸厓绱狅紙鐧懼垎涔嬪叓鍗侊級鍜屾病鏈夊紩鐢ㄧ殑鏂頒綅緗傚祵鍏ュ鍔犱簡浣嶇疆浠庤屽噺灝戜簡榪涗竴姝ュ垎閰?閲婃斁鐨勯渶姹傘傝繖灝嗘彁楂樺簲鐢ㄧ▼搴忕殑鎬ц兘銆?/p>


鍚堝茍灝忓璞″艦鎴愬ぇ瀵硅薄錛堣仛鍚堬級銆傝仛鍚堝噺灝戝垎閰嶅拰閲婃斁鐨勫潡鐨勬暟閲忋傚鏋滄湁鍑犱釜寮鍙戣咃紝鍚勮嚜寮鍙戣璁$殑涓嶅悓閮ㄥ垎錛屽垯鏈緇堜細鏈夎澶氬皬瀵硅薄闇瑕佸悎騫躲傞泦鎴愮殑鎸戞垬灝辨槸瑕佹壘鍒版紜殑鑱氬悎杈圭晫銆?/p>


鍐呰仈緙撳啿鍖鴻兘澶熸弧瓚崇櫨鍒嗕箣鍏崄鐨勯渶瑕侊紙aka 80-20 瑙勫垯錛夈備釜鍒儏鍐典笅錛岄渶瑕佸唴瀛樼紦鍐插尯鏉ヤ繚瀛樺瓧絎︿覆/浜岃繘鍒舵暟鎹紝浣嗕簨鍏堜笉鐭ラ亾鎬誨瓧鑺傛暟銆備及璁″茍鍐呰仈涓涓ぇ灝忚兘婊¤凍鐧懼垎涔嬪叓鍗侀渶瑕佺殑緙撳啿鍖恒傚鍓╀綑鐨勭櫨鍒嗕箣浜屽崄錛屽彲浠ュ垎閰嶄竴涓柊鐨勭紦鍐插尯鍜屾寚鍚戣繖涓紦鍐插尯鐨勬寚閽堛傝繖鏍鳳紝灝卞噺灝戝垎閰嶅拰閲婃斁璋冪敤騫跺鍔犳暟鎹殑浣嶇疆絀洪棿錛屼粠鏍規湰涓婃彁楂樹唬鐮佺殑鎬ц兘銆?/p>


鍦ㄥ潡涓垎閰嶅璞★紙鍧楀寲錛夈傚潡鍖栨槸浠ョ粍鐨勬柟寮忎竴嬈″垎閰嶅涓璞$殑鏂規硶銆傚鏋滃鍒楄〃鐨勯」榪炵畫璺熻釜錛屼緥濡傚涓涓?nbsp;{鍚嶇О錛屽紏 瀵圭殑鍒楄〃錛屾湁涓ょ閫夋嫨錛氶夋嫨涓鏄負姣忎竴涓?#8220;鍚嶇О-鍊?#8221;瀵瑰垎閰嶄竴涓妭鐐癸紱閫夋嫨浜屾槸鍒嗛厤涓涓兘瀹圭撼錛堝浜斾釜錛?#8220;鍚嶇О-鍊?#8221;瀵圭殑緇撴瀯銆備緥濡傦紝涓鑸儏鍐典笅錛屽鏋滃瓨鍌ㄥ洓瀵癸紝灝卞彲鍑忓皯鑺傜偣鐨勬暟閲忥紝濡傛灉闇瑕侀澶栫殑絀洪棿鏁伴噺錛屽垯浣跨敤闄勫姞鐨勯摼琛ㄦ寚閽堛?nbsp;
鍧楀寲鏄弸濂界殑澶勭悊鍣ㄩ珮閫熺紦瀛橈紝鐗瑰埆鏄浜?nbsp;L1-楂橀熺紦瀛橈紝鍥犱負瀹冩彁渚涗簡澧炲姞鐨勪綅緗?nbsp;鈥斾笉鐢ㄨ瀵逛簬鍧楀垎閰嶏紝寰堝鏁版嵁鍧椾細鍦ㄥ悓涓涓櫄鎷熼〉涓?/p>

姝g‘浣跨敤 _amblksiz銆侰 榪愯鏃?nbsp;(CRT) 鏈夊畠鐨勮嚜瀹氫箟鍓嶇鍒嗛厤紼嬪簭錛岃鍒嗛厤紼嬪簭浠庡悗绔紙Win32 鍫嗭級鍒嗛厤澶у皬涓?nbsp;_amblksiz 鐨勫潡銆傚皢 _amblksiz 璁劇疆涓鴻緝楂樼殑鍊艱兘娼滃湪鍦板噺灝戝鍚庣鐨勮皟鐢ㄦ鏁般傝繖鍙騫挎硾浣跨敤 CRT 鐨勭▼搴忛傜敤銆?br>浣跨敤涓婅堪鎶鏈皢鑾峰緱鐨勫ソ澶勪細鍥犲璞$被鍨嬨佸ぇ灝忓強宸ヤ綔閲忚屾湁鎵涓嶅悓銆備絾鎬昏兘鍦ㄦц兘鍜屽彲鍗囩緝鎬ф柟闈㈡湁鎵鏀惰幏銆傚彟涓鏂歸潰錛屼唬鐮佷細鏈夌偣鐗規畩錛屼絾濡傛灉緇忚繃娣辨濈啛铏戯紝浠g爜榪樻槸寰堝鏄撶鐞嗙殑銆?/p>

鍏朵粬鎻愰珮鎬ц兘鐨勬妧鏈?br>涓嬮潰鏄竴浜涙彁楂橀熷害鐨勬妧鏈細 

浣跨敤 Windows NT5 鍫?nbsp;
鐢變簬鍑犱釜鍚屼簨鐨勫姫鍔涘拰杈涘嫟宸ヤ綔錛?998 騫村垵 Microsoft Windows(R) 2000 涓湁浜嗗嚑涓噸澶ф敼榪涳細

鏀硅繘浜嗗爢浠g爜鍐呯殑閿佸畾銆傚爢浠g爜瀵規瘡鍫嗕竴涓攣銆傚叏灞閿佷繚鎶ゅ爢鏁版嵁緇撴瀯錛岄槻姝㈠綰跨▼寮忕殑浣跨敤銆備絾涓嶅垢鐨勬槸錛屽湪楂橀氫俊閲忕殑鎯呭喌涓嬶紝鍫嗕粛鍙楀洶浜庡叏灞閿侊紝瀵艱嚧楂樼珵浜夊拰浣庢ц兘銆俉indows 2000 涓紝閿佸唴浠g爜鐨勪復鐣屽尯灝嗙珵浜夌殑鍙兘鎬у噺鍒版渶灝?浠庤屾彁楂樹簡鍙幾緙╂с?/p>


浣跨敤 “Lookaside”鍒楄〃銆傚爢鏁版嵁緇撴瀯瀵瑰潡鐨勬墍鏈夌┖闂查」浣跨敤浜嗗ぇ灝忓湪 8 鍒?nbsp;1,024 瀛楄妭錛堜互 8-瀛楄妭閫掑錛夌殑蹇熼珮閫熺紦瀛樸傚揩閫熼珮閫熺紦瀛樻渶鍒濅繚鎶ゅ湪鍏ㄥ眬閿佸唴銆傜幇鍦紝浣跨敤 lookaside 鍒楄〃鏉ヨ闂繖浜涘揩閫熼珮閫熺紦瀛樼┖闂插垪琛ㄣ傝繖浜涘垪琛ㄤ笉瑕佹眰閿佸畾錛岃屾槸浣跨敤 64 浣嶇殑浜掗攣鎿嶄綔錛屽洜姝ゆ彁楂樹簡鎬ц兘銆?/p>


鍐呴儴鏁版嵁緇撴瀯綆楁硶涔熷緱鍒版敼榪涖?br>榪欎簺鏀硅繘閬垮厤浜嗗鍒嗛厤楂橀熺紦瀛樼殑闇姹傦紝浣嗕笉鎺掗櫎鍏朵粬鐨勪紭鍖栥備嬌鐢?nbsp;Windows NT5 鍫嗚瘎浼版偍鐨勪唬鐮侊紱瀹冨灝忎簬 1,024 瀛楄妭 (1 KB) 鐨勫潡錛堟潵鑷墠绔垎閰嶇▼搴忕殑鍧楋級鏄渶浣崇殑銆侴lobalAlloc() 鍜?nbsp;LocalAlloc() 寤虹珛鍦ㄥ悓涓鍫嗕笂錛屾槸瀛樺彇姣忎釜榪涚▼鍫嗙殑閫氱敤鏈哄埗銆傚鏋滃笇鏈涜幏寰楅珮鐨勫眬閮ㄦц兘錛屽垯浣跨敤 Heap(R) API 鏉ュ瓨鍙栨瘡涓繘紼嬪爢錛屾垨涓哄垎閰嶆搷浣滃垱寤鴻嚜宸辯殑鍫嗐傚鏋滈渶瑕佸澶у潡鎿嶄綔錛屼篃鍙互鐩存帴浣跨敤 VirtualAlloc() / VirtualFree() 鎿嶄綔銆?/p>

涓婅堪鏀硅繘宸插湪 Windows 2000 beta 2 鍜?nbsp;Windows NT 4.0 SP4 涓嬌鐢ㄣ傛敼榪涘悗錛屽爢閿佺殑绔炰簤鐜囨樉钁楅檷浣庛傝繖浣挎墍鏈?nbsp;Win32 鍫嗙殑鐩存帴鐢ㄦ埛鍙楃泭銆侰RT 鍫嗗緩绔嬩簬 Win32 鍫嗙殑欏墮儴錛屼絾瀹冧嬌鐢ㄨ嚜宸辯殑灝忓潡鍫嗭紝鍥犺屼笉鑳戒粠 Windows NT 鏀硅繘涓彈鐩娿傦紙Visual C++ 鐗堟湰 6.0 涔熸湁鏀硅繘鐨勫爢鍒嗛厤紼嬪簭銆傦級

浣跨敤鍒嗛厤楂橀熺紦瀛?nbsp;
鍒嗛厤楂橀熺紦瀛樺厑璁擱珮閫熺紦瀛樺垎閰嶇殑鍧楋紝浠ヤ究灝嗘潵閲嶇敤銆傝繖鑳藉鍑忓皯瀵硅繘紼嬪爢錛堟垨鍏ㄥ眬鍫嗭級鐨勫垎閰?閲婃斁璋冪敤鐨勬鏁幫紝涔熷厑璁告渶澶ч檺搴︾殑閲嶇敤鏇劇粡鍒嗛厤鐨勫潡銆傚彟澶栵紝鍒嗛厤楂橀熺紦瀛樺厑璁告敹闆嗙粺璁′俊鎭?浠ヤ究杈冨ソ鍦扮悊瑙e璞″湪杈冮珮灞傛涓婄殑浣跨敤銆?/p>

鍏稿瀷鍦幫紝鑷畾涔夊爢鍒嗛厤紼嬪簭鍦ㄨ繘紼嬪爢鐨勯《閮ㄥ疄鐜般傝嚜瀹氫箟鍫嗗垎閰嶇▼搴忎笌緋葷粺鍫嗙殑琛屼負寰堢浉浼箋備富瑕佺殑宸埆鏄畠鍦ㄨ繘紼嬪爢鐨勯《閮ㄤ負鍒嗛厤鐨勫璞℃彁渚涢珮閫熺紦瀛樸傞珮閫熺紦瀛樿璁℃垚涓濂楀浐瀹氬ぇ灝忥紙濡?nbsp;32 瀛楄妭銆?4 瀛楄妭銆?28 瀛楄妭絳夛級銆傝繖涓涓緢濂界殑絳栫暐錛屼絾榪欑鑷畾涔夊爢鍒嗛厤紼嬪簭涓㈠け涓庡垎閰嶅拰閲婃斁鐨勫璞$浉鍏崇殑“璇箟淇℃伅”銆?nbsp;

涓庤嚜瀹氫箟鍫嗗垎閰嶇▼搴忕浉鍙嶏紝“鍒嗛厤楂橀熺紦瀛?#8221;浣滀負姣忕被鍒嗛厤楂橀熺紦瀛樻潵瀹炵幇銆傞櫎鑳藉鎻愪緵鑷畾涔夊爢鍒嗛厤紼嬪簭鐨勬墍鏈夊ソ澶勪箣澶栵紝瀹冧滑榪樿兘澶熶繚鐣欏ぇ閲忚涔変俊鎭傛瘡涓垎閰嶉珮閫熺紦瀛樺鐞嗙▼搴忎笌涓涓洰鏍囦簩榪涘埗瀵硅薄鍏寵仈銆傚畠鑳藉浣跨敤涓濂楀弬鏁拌繘琛屽垵濮嬪寲錛岃繖浜涘弬鏁拌〃紺哄茍鍙戠駭鍒佸璞″ぇ灝忓拰淇濇寔鍦ㄧ┖闂插垪琛ㄤ腑鐨勫厓绱犵殑鏁伴噺絳夈傚垎閰嶉珮閫熺紦瀛樺鐞嗙▼搴忓璞$淮鎸佽嚜宸辯殑縐佹湁絀洪棽瀹炰綋姹狅紙涓嶈秴榪囨寚瀹氱殑闃鍊鹼級騫朵嬌鐢ㄧ鏈変繚鎶ら攣銆傚悎鍦ㄤ竴璧鳳紝鍒嗛厤楂橀熺紦瀛樺拰縐佹湁閿佸噺灝戜簡涓庝富緋葷粺鍫嗙殑閫氫俊閲忥紝鍥犺屾彁渚涗簡澧炲姞鐨勫茍鍙戙佹渶澶ч檺搴︾殑閲嶇敤鍜岃緝楂樼殑鍙幾緙╂с?/p>

闇瑕佷嬌鐢ㄦ竻鐞嗙▼搴忔潵瀹氭湡媯鏌ユ墍鏈夊垎閰嶉珮閫熺紦瀛樺鐞嗙▼搴忕殑媧誨姩鎯呭喌騫跺洖鏀舵湭鐢ㄧ殑璧勬簮銆傚鏋滃彂鐜版病鏈夋椿鍔紝灝嗛噴鏀懼垎閰嶅璞$殑姹狅紝浠庤屾彁楂樻ц兘銆?/p>

鍙互瀹℃牳姣忎釜鍒嗛厤/閲婃斁媧誨姩銆傜涓綰т俊鎭寘鎷璞°佸垎閰嶅拰閲婃斁璋冪敤鐨勬繪暟銆傞氳繃鏌ョ湅瀹冧滑鐨勭粺璁′俊鎭彲浠ュ緱鍑哄悇涓璞′箣闂寸殑璇箟鍏崇郴銆傚埄鐢ㄤ互涓婁粙緇嶇殑璁稿鎶鏈箣涓錛岃繖縐嶅叧緋誨彲浠ョ敤鏉ュ噺灝戝唴瀛樺垎閰嶃?/p>

鍒嗛厤楂橀熺紦瀛樹篃璧峰埌浜嗚皟璇曞姪鎵嬬殑浣滅敤錛屽府鍔╂偍璺熻釜娌℃湁瀹屽叏娓呴櫎鐨勫璞℃暟閲忋傞氳繃鏌ョ湅鍔ㄦ佸爢鏍堣繑鍥炶釜榪瑰拰闄ゆ病鏈夋竻闄ょ殑瀵硅薄涔嬪鐨勭鍚嶏紝鐢氳嚦鑳藉鎵懼埌紜垏鐨勫け璐ョ殑璋冪敤鑰呫?/p>

MP 鍫?nbsp;
MP 鍫嗘槸瀵瑰澶勭悊鍣ㄥ弸濂界殑鍒嗗竷寮忓垎閰嶇殑紼嬪簭鍖咃紝鍦?nbsp;Win32 SDK錛圵indows NT 4.0 鍜屾洿鏂扮増鏈級涓彲浠ュ緱鍒般傛渶鍒濈敱 JVert 瀹炵幇錛屾澶勫爢鎶借薄寤虹珛鍦?nbsp;Win32 鍫嗙▼搴忓寘鐨勯《閮ㄣ侻P 鍫嗗垱寤哄涓?nbsp;Win32 鍫嗭紝騫惰瘯鍥懼皢鍒嗛厤璋冪敤鍒嗗竷鍒頒笉鍚屽爢錛屼互鍑忓皯鍦ㄦ墍鏈夊崟涓閿佷笂鐨勭珵浜夈?/p>

鏈▼搴忓寘鏄ソ鐨勬楠?nbsp;鈥斾竴縐嶆敼榪涚殑 MP-鍙嬪ソ鐨勮嚜瀹氫箟鍫嗗垎閰嶇▼搴忋備絾鏄紝瀹冧笉鎻愪緵璇箟淇℃伅鍜岀己涔忕粺璁″姛鑳姐傞氬父灝?nbsp;MP 鍫嗕綔涓?nbsp;SDK 搴撴潵浣跨敤銆傚鏋滀嬌鐢ㄨ繖涓?nbsp;SDK 鍒涘緩鍙噸鐢ㄧ粍浠訛紝鎮ㄥ皢澶уぇ鍙楃泭銆備絾鏄紝濡傛灉鍦ㄦ瘡涓?nbsp;DLL 涓緩绔嬭繖涓?nbsp;SDK 搴擄紝灝嗗鍔犲伐浣滆緗?/p>

閲嶆柊鎬濊冪畻娉曞拰鏁版嵁緇撴瀯 
瑕佸湪澶氬鐞嗗櫒鏈哄櫒涓婁幾緙╋紝鍒欑畻娉曘佸疄鐜般佹暟鎹粨鏋勫拰紜歡蹇呴』鍔ㄦ佷幾緙┿傝鐪嬫渶緇忓父鍒嗛厤鍜岄噴鏀劇殑鏁版嵁緇撴瀯銆傝瘯闂紝“鎴戣兘鐢ㄤ笉鍚岀殑鏁版嵁緇撴瀯瀹屾垚姝ゅ伐浣滃悧錛?#8221;渚嬪錛屽鏋滃湪搴旂敤紼嬪簭鍒濆鍖栨椂鍔犺澆浜嗗彧璇婚」鐨勫垪琛紝榪欎釜鍒楄〃涓嶅繀鏄嚎鎬ч摼鎺ョ殑鍒楄〃銆傚鏋滄槸鍔ㄦ佸垎閰嶇殑鏁扮粍灝遍潪甯稿ソ銆傚姩鎬佸垎閰嶇殑鏁扮粍灝嗗噺灝戝唴瀛樹腑鐨勫爢鍧楀拰紕庣墖錛屼粠鑰屽寮烘ц兘銆?/p>

鍑忓皯闇瑕佺殑灝忓璞$殑鏁伴噺鍑忓皯鍫嗗垎閰嶇▼搴忕殑璐熻澆銆備緥濡傦紝鎴戜滑鍦ㄦ湇鍔″櫒鐨勫叧閿鐞嗚礬寰勪笂浣跨敤浜斾釜涓嶅悓鐨勫璞★紝姣忎釜瀵硅薄鍗曠嫭鍒嗛厤鍜岄噴鏀俱備竴璧烽珮閫熺紦瀛樿繖浜涘璞★紝鎶婂爢璋冪敤浠庝簲涓噺灝戝埌涓涓紝鏄捐憲鍑忓皯浜嗗爢鐨勮礋杞斤紝鐗瑰埆褰撴瘡縐掗挓澶勭悊 1,000 涓互涓婄殑璇鋒眰鏃躲?/p>

濡傛灉澶ч噺浣跨敤“Automation”緇撴瀯錛岃鑰冭檻浠庝富綰夸唬鐮佷腑鍒犻櫎“Automation BSTR”錛屾垨鑷沖皯閬垮厤閲嶅鐨?nbsp;BSTR 鎿嶄綔銆傦紙BSTR 榪炴帴瀵艱嚧榪囧鐨勯噸鍒嗛厤鍜屽垎閰?閲婃斁鎿嶄綔銆傦級

鎽樿
瀵規墍鏈夊鉤鍙板線寰閮藉瓨鍦ㄥ爢瀹炵幇錛屽洜姝ゆ湁宸ㄥぇ鐨勫紑閿銆傛瘡涓崟鐙唬鐮侀兘鏈夌壒瀹氱殑瑕佹眰錛屼絾璁捐鑳介噰鐢ㄦ湰鏂囪璁虹殑鍩烘湰鐞嗚鏉ュ噺灝戝爢涔嬮棿鐨勭浉浜掍綔鐢ㄣ?nbsp;

璇勪環鎮ㄧ殑浠g爜涓爢鐨勪嬌鐢ㄣ?/p>


鏀硅繘鎮ㄧ殑浠g爜錛屼互浣跨敤杈冨皯鐨勫爢璋冪敤錛氬垎鏋愬叧閿礬寰勫拰鍥哄畾鏁版嵁緇撴瀯銆?/p>


鍦ㄥ疄鐜拌嚜瀹氫箟鐨勫寘瑁呯▼搴忎箣鍓嶄嬌鐢ㄩ噺鍖栧爢璋冪敤鎴愭湰鐨勬柟娉曘?/p>


濡傛灉瀵規ц兘涓嶆弧鎰忥紝璇瘋姹?nbsp;OS 緇勬敼榪涘爢銆傛洿澶氳繖綾昏姹傛剰鍛崇潃瀵規敼榪涘爢鐨勬洿澶氬叧娉ㄣ?/p>


瑕佹眰 C 榪愯鏃剁粍閽堝 OS 鎵鎻愪緵鐨勫爢鍒朵綔灝忓閥鐨勫垎閰嶅寘瑁呯▼搴忋傞殢鐫 OS 鍫嗙殑鏀硅繘錛孋 榪愯鏃跺爢璋冪敤鐨勬垚鏈皢鍑忓皬銆?/p>


鎿嶄綔緋葷粺錛圵indows NT 瀹舵棌錛夋鍦ㄤ笉鏂敼榪涘爢銆傝闅忔椂鍏蟲敞鍜屽埄鐢ㄨ繖浜涙敼榪涖?br>Murali Krishnan 鏄?nbsp;Internet Information Server (IIS) 緇勭殑棣栧腑杞歡璁捐宸ョ▼甯堛備粠 1.0 鐗堟湰寮濮嬩粬灝辮璁?nbsp;IIS錛屽茍鎴愬姛鍙戣浜?nbsp;1.0 鐗堟湰鍒?nbsp;4.0 鐗堟湰銆侻urali 緇勭粐騫墮瀵?nbsp;IIS 鎬ц兘緇勪笁騫?nbsp;(1995-1998), 浠庝竴寮濮嬪氨褰卞搷 IIS 鎬ц兘銆備粬鎷ユ湁濞佹柉搴鋒槦宸?nbsp;Madison 澶у鐨?nbsp;M.S.鍜屽嵃搴?nbsp;Anna 澶у鐨?nbsp;B.S.銆傚伐浣滀箣澶栵紝浠栧枩嬈㈤槄璇匯佹墦鎺掔悆鍜屽搴児楗?br>


http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=172835
鎴戝湪瀛︿範瀵硅薄鐨勭敓瀛樻柟寮忕殑鏃跺欒鍒頒竴縐嶆槸鍦ㄥ爢鏍?stack)涔嬩腑錛屽涓?nbsp; 
CObject  object;  
榪樻湁涓縐嶆槸鍦ㄥ爢(heap)涓?nbsp; 濡備笅  
CObject*  pobject=new  CObject();  
 
璇烽棶  
錛?錛夎繖涓ょ鏂瑰紡鏈変粈涔堝尯鍒紵  
錛?錛夊爢鏍堜笌鍫嗘湁浠涔堝尯鍒紵錛?nbsp; 
 
 
---------------------------------------------------------------  
 
1)  about  stack,  system  will  allocate  memory  to  the  instance  of  object  automatically,  and  to  the
 heap,  you  must  allocate  memory  to  the  instance  of  object  with  new  or  malloc  manually.  
2)  when  function  ends,  system  will  automatically  free  the  memory  area  of  stack,  but  to  the 
heap,  you  must  free  the  memory  area  manually  with  free  or  delete,  else  it  will  result  in  memory
leak.  
3)鏍堝唴瀛樺垎閰嶈繍綆楀唴緗簬澶勭悊鍣ㄧ殑鎸囦護闆嗕腑錛屾晥鐜囧緢楂橈紝浣嗘槸鍒嗛厤鐨勫唴瀛樺閲忔湁闄愩?nbsp; 
4錛夊爢涓婂垎閰嶇殑鍐呭瓨鍙互鏈夋垜浠嚜宸卞喅瀹氾紝浣跨敤闈炲父鐏墊椿銆?nbsp; 
---------------------------------------------------------------  



]]>
璇﹁В鍑芥暟璋冪敤綰﹀畾http://m.shnenglu.com/zjl-1026-2001/archive/2009/05/15/83062.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Fri, 15 May 2009 09:30:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2009/05/15/83062.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/83062.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2009/05/15/83062.html#Feedback1http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/83062.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/83062.html鍦ㄧ紪鍐檞indows紼嬪簭鏃訛紝鎴戜滑緇忓父鍙戠幇涓浜涘嚱鏁扮殑鍓嶉潰甯︽湁WINAPI絳夌殑鍏抽敭瀛?涓嶇煡閬撹繖鏍鋒弿榪版槸鍚﹀噯紜紝璇鋒槑鐧界殑璇昏呰仈緋繪湰浜烘洿姝?img height=20 src="http://m.shnenglu.com/Emoticons/QQ/13.gif" width=20 border=0>)錛屽windows鐨勬秷鎭搷搴斿嚱鏁板畾涔夊涓嬶細

1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

榪欓噷鐨凩RESULT鍦╳indows涓瀹氫箟涓簂ong鍨嬶紝鑰孋ALLBACK鍒欒瀹氫箟鎴愪簡__stacall錛屼粩緇嗙湅浜嗕竴涓嬶紝鍦╓INDEF.H涓繕鍖呭惈濡備笅瀹氫箟錛?br>
1#define CALLBACK    __stdcall
2#define WINAPI      __stdcall
3#define WINAPIV     __cdecl
4#define APIENTRY    WINAPI
5#define APIPRIVATE  __stdcall
6#define PASCAL      __stdcall

閭d箞錛岃繖閲岀殑__stacall銆乢_cdecl鍒板簳鏄粈涔堟剰鎬濆憿錛屽張鏈変粈涔堜綔鐢ㄥ憿錛熸垜緇忚繃鏌ユ壘鐩稿叧璧勬枡瀵瑰叾鏈変簡浜涜嫻呮樉鐨勪簡瑙o紝榪欓噷涓庡ぇ瀹朵竴璧峰垎浜?br>
鎴戜滑鐭ラ亾錛屽湪C璇█涓亣璁炬垜浠湁榪欐牱涓涓嚱鏁板畾涔夛細
int function_add(int a, int b);
閭d箞鍙鐢?br>
1int x = 3, y = 5;
2int result = function_add(x, y);
榪欐牱鐨勬柟寮忓氨鍙互瀵瑰嚱鏁拌繘琛岃皟鐢ㄤ簡銆備絾鏄紝鍦ㄨ綆楁満涓紝褰撻珮綰ц璦紼嬪簭琚紪璇戞垚璁$畻鏈哄彲浠ヨ瘑鍒殑鏈哄櫒鐮佹椂錛屾湁涓涓棶棰樺氨鍑哥幇鍑烘潵錛氬湪CPU涓紝璁$畻鏈烘病鏈夊姙娉曠煡閬撲竴涓嚱鏁拌皟鐢ㄩ渶瑕佸灝戜釜鍙傛暟銆佽繖浜涘弬鏁版槸浠涔堟牱鐨勶紝涔熸病鏈夌‖浠跺彲浠ヤ繚瀛樿繖浜涘弬鏁般備篃灝辨槸璇達紝璁$畻鏈哄茍涓嶇煡閬撳簲璇ユ庝箞緇欒繖涓嚱鏁頒紶閫掑弬鏁幫紝浼犻掑弬鏁扮殑宸ヤ綔蹇呴』鐢卞嚱鏁拌皟鐢ㄨ呭拰鍑芥暟鏈韓鏉ュ崗璋冦備負姝わ紝璁$畻鏈烘彁渚涗簡涓縐嶈縐頒負鏍堢殑鏁版嵁緇撴瀯鏉ユ敮鎸佸嚱鏁扮殑鍙傛暟浼犻掋?br>
鏍堟槸涓縐嶅厛榪涘悗鍑虹殑鏁版嵁緇撴瀯錛屾爤鏈変竴涓瓨鍌ㄥ尯銆佷竴涓爤欏舵寚閽堛傛爤欏舵寚閽堟寚鍚戝爢鏍堜腑絎竴涓彲鐢ㄧ殑鏁版嵁欏?琚О涓烘爤欏?銆傜敤鎴峰彲浠ュ湪鏍堥《鐨勪笂鏂瑰悜鍫嗘爤涓姞鍏ユ暟鎹紝榪欎釜鎿嶄綔琚О涓哄帇鏍?Push)錛屽帇鏍堜互鍚庯紝鏍堥《鑷姩鍙樻垚鏂板姞鍏ユ暟鎹」鐨勪綅緗紝鏍堥《鎸囬拡涔熼殢涔嬩慨鏀廣傜敤鎴蜂篃鍙互浠庡爢鏍堜腑鍙栧嚭鏍堥《鍏冪礌錛岃繖涓搷浣滆縐頒負寮瑰嚭鏍?pop)錛屽脊鍑烘爤浠ュ悗錛屾爤欏剁殑涓嬩竴涓厓绱犲彉鎴愭爤欏訛紝鏍堥《鎸囬拡闅忎箣淇敼銆?br>
鍑芥暟璋冪敤鏃訛紝璋冪敤鑰呬緷嬈℃妸鍙傛暟鍘嬫爤錛岀劧鍚庤皟鐢ㄥ嚱鏁幫紝鍑芥暟琚皟鐢ㄤ互鍚庯紝鍦ㄥ爢鏍堜腑鍙栧嚭鏁版嵁錛屽茍榪涜璁$畻銆傚嚱鏁拌綆楃粨鏉熶互鍚庯紝鎴栬呰皟鐢ㄨ呫佹垨鑰呭嚱鏁版湰韜慨鏀瑰爢鏍堬紝浣垮爢鏍堟仮澶嶅師鐘躲傞棶棰樼殑鍏抽敭灝卞湪榪欓噷錛屽埌搴曞簲璇ュ浣曟竻闄ゆ爤鍛紵

鍑芥暟璋冪敤闇瑕佽繘琛屽弬鏁頒紶閫掞紝鍦ㄥ弬鏁頒紶閫掕繃紼嬩腑鏈変袱涓緢閲嶈鐨勯棶棰樺繀欏誨緱鍒版槑紜鏄庯細
    1. 褰撳弬鏁頒釜鏁板浜庝竴涓椂錛屾寜鐓т粈涔堟牱鐨勯『搴忔妸鍙傛暟鍘嬪叆鏍堜腑
    2. 鍑芥暟璋冪敤鍚庯紝鐢辮皝鏉ヨ礋璐f妸鍫嗘爤鎭㈠鍘熺姸

鍦ㄩ珮綰ц璦涓紝鍑芥暟璋冪敤綰﹀畾灝辨槸鐢ㄦ潵璇存槑榪欎袱涓棶棰樼殑銆傚父瑙佺殑鍑芥暟璋冪敤綰﹀畾鏈夛細
        stdcall
        cdecl
        fastcall
        thiscall
        naked call

涓嬮潰涓涓榪涜浠嬬粛銆?br>
涓銆乻tdcall璋冪敤綰﹀畾

stdcall錛屼篃鍙啓浣淿_stdcall錛屽緢澶氭椂鍊欒縐頒負pascal璋冪敤綰﹀畾錛屽洜涓簆ascal鏄棭鏈熷緢甯歌鐨勪竴縐嶆暀瀛︾敤璁$畻鏈虹▼搴忚璁¤璦錛屽叾璇硶涓ヨ皚錛屼嬌鐢ㄧ殑鍑芥暟璋冪敤綰﹀畾灝辨槸stdcall銆傚嚑涔庢垜浠啓鐨勬瘡涓涓猈INDOWS API鍑芥暟閮芥槸__stdcall綾誨瀷鐨勩傚湪Microsoft C++緋誨垪鐨凜/C++緙栬瘧鍣ㄤ腑錛屽父甯哥敤PASCAL瀹忔潵澹版槑榪欎釜璋冪敤綰﹀畾錛岀被浼肩殑瀹忚繕鏈塛INAPI鍜孋ALLBACK(濡傛枃绔犲紑澶村紩鐢ㄧ殑鍦╓INDEF.H澶存枃浠朵腑鐨勫畾涔?銆?br>
stdcall璋冪敤綰﹀畾澹版槑鐨勮娉曚負錛堜互鍓嶉潰鐨刦unction_add鍑芥暟涓轟緥錛夛細
int __stdcall function_add(int a,int b);

stdcall璋冪敤綰﹀畾鎰忓懗鐫錛?br>(1) 鍙傛暟浠庡彸鍚戝乏鍘嬪叆鍫嗘爤
(2) 鍑芥暟鑷韓淇敼鍫嗘爤
(3) 鍑芥暟鍚嶈嚜鍔ㄥ姞鍓嶅鐨勪笅鍒掔嚎錛屽悗闈㈢揣璺熶竴涓狜絎﹀彿錛屽叾鍚庣揣璺熺潃鍙傛暟鐨勫ぇ灝?br>
浠ヤ笂榪拌繖涓嚱鏁頒負渚嬶紝鍙傛暟b棣栧厛琚帇鏍堬紝鐒跺悗鏄弬鏁癮錛屽嚱鏁拌皟鐢╢unction_add(1, 2)璋冪敤澶勭炕璇戞垚姹囩紪璇█灝嗗彉鎴愶細

      push       2                      // 絎簩涓弬鏁板叆鏍?br>      push       1                      // 絎竴涓弬鏁板叆鏍?br>      call         function_add    // 璋冪敤鍙傛暟錛屾敞鎰忔鏃惰嚜鍔ㄦ妸cs:eip鍏ユ爤

鑰屽浜庡嚱鏁拌嚜韜紝鍒欏彲緲昏瘧涓猴細
      push       ebp銆銆銆銆銆銆   // 淇濆瓨ebp瀵勫瓨鍣紝璇ュ瘎瀛樺櫒灝嗙敤鏉ヤ繚瀛樺爢鏍堢殑鏍堥《鎸囬拡錛屽彲浠ュ湪鍑芥暟閫鍑烘椂鎭㈠
      mov銆   ebp, esp銆銆銆銆    // 淇濆瓨鍫嗘爤鎸囬拡
      mov銆   eax,[ebp + 8H]銆     // 鍫嗘爤涓璭bp鎸囧悜浣嶇疆涔嬪墠渚濇淇濆瓨鏈塭bp, cs:eip, a, b, ebp +8鎸囧悜a
      add銆    eax,[ebp + 0CH]      // 鍫嗘爤涓璭bp + 12澶勪繚瀛樹簡b
      mov銆   esp, ebp銆銆銆銆   //  鎭㈠esp
      pop銆    ebp
      ret銆      8

鑰屽湪緙栬瘧鏃訛紝榪欎釜鍑芥暟鐨勫悕瀛楄緲昏瘧鎴?a href="mailto:_function@8">_function@8

銆銆娉ㄦ剰涓嶅悓緙栬瘧鍣ㄤ細鎻掑叆鑷繁鐨勬眹緙栦唬鐮佷互鎻愪緵緙栬瘧鐨勯氱敤鎬э紝浣嗘槸澶т綋浠g爜濡傛銆傚叾涓湪鍑芥暟寮濮嬪淇濈暀esp鍒癳bp涓紝鍦ㄥ嚱鏁扮粨鏉熸仮澶嶆槸緙栬瘧鍣ㄥ父鐢ㄧ殑鏂規硶銆?/p>

銆銆浠庡嚱鏁拌皟鐢ㄧ湅錛?鍜?渚濇琚玴ush榪涘爢鏍堬紝鑰屽湪鍑芥暟涓張閫氳繃鐩稿浜巈bp(鍗沖垰榪涘嚱鏁版椂鐨勫爢鏍堟寚閽堬級鐨勫亸縐婚噺瀛樺彇鍙傛暟銆傚嚱鏁扮粨鏉熷悗錛宺et 8琛ㄧず娓呯悊8涓瓧鑺傜殑鍫嗘爤錛屽嚱鏁拌嚜宸辨仮澶嶄簡鍫嗘爤銆?br>
鐢變簬涓嶅悓鐨勭紪璇戝櫒浜х敓鏍堢殑鏂瑰紡涓嶅敖鐩稿悓錛岃皟鐢ㄨ呭氨涓嶄竴瀹氳兘澶熸甯哥殑瀹屾垚鍫嗘爤鐨勬竻闄ゅ伐浣滐紝浣嗗嚱鏁版湰韜嚜宸卞彲浠ヨВ鍐蟲竻闄ゅ伐浣滐紝鎵浠ワ紝鍦ㄨ法騫沖彴鐨勭▼搴忓紑鍙戜腑鐨勫嚱鏁拌皟鐢紝鎴戜滑閫氬父閮戒嬌鐢╛_stdcall綰﹀畾錛寃indows涓嬬殑緇濆ぇ澶氭暟鍑芥暟涔熼兘鏄痵tdcall璋冪敤銆傛棦鐒跺姝わ紝涓轟粈涔堣繕闇瑕乢_cdecl鍛紵鍒潃鎬ワ紝鎺ョ潃寰涓嬬湅銆?br>
浜屻乧decl璋冪敤綰﹀畾

cdecl錛屼篃鍙啓浣淿_cdecl錛屽張縐頒負C璋冪敤綰﹀畾錛屾槸C/C++璇█鍜孧FC紼嬪簭榛樿緙虹渷鐨勮皟鐢ㄧ害瀹氾紝瀹冪殑瀹氫箟璇硶鏄細

    int function (int a ,int b)銆        //涓嶅姞淇グ灝辨槸C璋冪敤綰﹀畾
     int __cdecl function(int a,int b)  //鏄庣‘鎸囧嚭C璋冪敤綰﹀畾


閲囩敤__cdecl綰﹀畾鏃訛紝鍑芥暟鍙傛暟鎸夌収浠庡彸鍒板乏鐨勯『搴忓叆鏍堬紝騫朵笖鐢辮皟鐢ㄥ嚱鏁拌呮妸鍙傛暟寮瑰嚭鏍堜互娓呯悊鍫嗘爤銆傚洜姝わ紝瀹炵幇鍙彉鍙傛暟鐨勫嚱鏁板彧鑳戒嬌鐢ㄨ璋冪敤綰﹀畾銆傜敱浜庤繖縐嶅彉鍖栵紝C璋冪敤綰﹀畾鍏佽鍑芥暟鐨勫弬鏁扮殑涓暟鏄笉鍥哄畾鐨勶紝榪欎篃鏄疌璇█鐨勪竴澶х壒鑹層傚悓鏃訛紝鐢變簬姣忎竴涓嬌鐢╛_cdecl綰﹀畾鐨勫嚱鏁伴兘瑕佸寘鍚竻鐞嗗爢鏍堢殑浠g爜錛屾墍浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細姣旇緝澶с俖_cdecl鍙互鍐欐垚_cdecl銆?

瀵逛簬鍓嶉潰鐨刦unction鍑芥暟錛屼嬌鐢╟decl鍚庣殑姹囩紪鐮佸彉鎴愶細

璋冪敤澶?br>銆銆push   1
銆銆push   2
銆銆call     function
銆銆add銆esp, 8銆銆銆銆銆 // 娉ㄦ剰錛氳繖閲岃皟鐢ㄨ呭湪鎭㈠鍫嗘爤

銆銆琚皟鐢ㄥ嚱鏁癬function澶?br>銆銆push    ebp銆銆銆銆銆銆// 淇濆瓨ebp瀵勫瓨鍣紝璇ュ瘎瀛樺櫒灝嗙敤鏉ヤ繚瀛樺爢鏍堢殑鏍堥《鎸囬拡錛屽彲浠ュ湪鍑芥暟閫鍑烘椂鎭㈠
銆銆mov    ebp,esp銆銆銆銆 // 淇濆瓨鍫嗘爤鎸囬拡
銆銆mov銆eax,[ebp + 8H]銆 // 鍫嗘爤涓璭bp鎸囧悜浣嶇疆涔嬪墠渚濇淇濆瓨鏈塭bp,cs:eip,a,b,ebp +8鎸囧悜a
銆銆add銆eax,[ebp + 0CH]    // 鍫嗘爤涓璭bp + 12澶勪繚瀛樹簡b
銆銆mov銆esp,ebp銆銆銆銆 // 鎭㈠esp
銆銆pop銆ebp
銆銆ret銆銆銆銆銆銆銆銆銆//  娉ㄦ剰錛岃繖閲屾病鏈変慨鏀瑰爢鏍?/p>


涓嶅啓浜嗭紝绱緱鎱岋紝鍛靛懙 杞澆涓ょ瘒鏂囩珷鍚?br>

__stdcall,__cdecl,_cdecl,_stdcall,銆俖_fastcall,_fastcall 鍖哄埆綆浠?nbsp;

1.

浠婂ぉ鍐欑嚎紼嬪嚱鏁版椂錛屽彂鐜癿sdn涓ThreadProc鐨勫畾涔夋湁瑕佹眰錛欴WORD WINAPI ThreadProc(LPVOID lpParameter);

涓嶈В涓轟粈涔堣鐢╓INAPI瀹忓畾涔夛紝鏌ヤ簡鍚庡彂鐜頒笅闈㈢殑瀹氫箟銆備簬鏄箮闇瑕佸尯鍒玙_stdcall鍜宊_cdecl涓よ呯殑鍖哄埆錛?#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#define cdecl _cdecl
#ifndef CDECL
#define CDECL _cdecl
#endif

鍑犱箮鎴戜滑鍐欑殑姣忎竴涓猈INDOWS API鍑芥暟閮芥槸__stdcall綾誨瀷鐨勶紝棣栧厛錛岄渶瑕佷簡瑙d袱鑰呬箣闂寸殑鍖哄埆錛?WINDOWS鐨勫嚱鏁拌皟鐢ㄦ椂闇瑕佺敤鍒版爤錛圫TACK錛屼竴縐嶅厛鍏ュ悗鍑虹殑瀛樺偍緇撴瀯錛夈傚綋鍑芥暟璋冪敤瀹屾垚鍚庯紝鏍堥渶瑕佹竻妤氾紝榪欓噷灝辨槸闂鐨勫叧閿紝濡備綍娓呴櫎錛燂紵 濡傛灉鎴戜滑鐨勫嚱鏁頒嬌鐢ㄤ簡_cdecl錛岄偅涔堟爤鐨勬竻闄ゅ伐浣滄槸鐢辮皟鐢ㄨ咃紝鐢–OM鐨勬湳璇潵璁插氨鏄鎴鋒潵瀹屾垚鐨勩傝繖鏍峰甫鏉ヤ簡涓涓鎵嬬殑闂錛屼笉鍚岀殑緙栬瘧鍣ㄤ駭鐢熸爤鐨勬柟寮忎笉灝界浉鍚岋紝閭d箞璋冪敤鑰呰兘鍚︽甯哥殑瀹屾垚娓呴櫎宸ヤ綔鍛紵絳旀鏄笉鑳姐?濡傛灉浣跨敤__stdcall錛屼笂闈㈢殑闂灝辮В鍐充簡錛屽嚱鏁拌嚜宸辮В鍐蟲竻闄ゅ伐浣溿傛墍浠ワ紝鍦ㄨ法錛堝紑鍙戯級騫沖彴鐨勮皟鐢ㄤ腑錛屾垜浠兘浣跨敤__stdcall錛堣櫧鐒舵湁鏃舵槸浠INAPI鐨勬牱瀛愬嚭鐜幫級銆傞偅涔堜負浠涔堣繕闇瑕乢cdecl鍛紵褰撴垜浠亣鍒拌繖鏍風殑鍑芥暟濡俧printf()瀹冪殑鍙傛暟鏄彲鍙樼殑錛屼笉瀹氶暱鐨勶紝琚皟鐢ㄨ呬簨鍏堟棤娉曠煡閬撳弬鏁扮殑闀垮害錛屼簨鍚庣殑娓呴櫎宸ヤ綔涔熸棤娉曟甯哥殑榪涜錛屽洜姝わ紝榪欑鎯呭喌鎴戜滑鍙兘浣跨敤_cdecl銆傚埌榪欓噷鎴戜滑鏈変竴涓粨璁猴紝濡傛灉浣犵殑紼嬪簭涓病鏈夋秹鍙婂彲鍙樺弬鏁幫紝鏈濂戒嬌鐢╛_stdcall鍏抽敭瀛椼?/p>

2.

__cdecl,__stdcall鏄0鏄庣殑鍑芥暟璋冪敤鍗忚.涓昏鏄紶鍙傚拰寮規爤鏂歸潰鐨勪笉鍚?涓鑸琧++鐢ㄧ殑鏄痏_cdecl,windows閲屽ぇ閮界敤鐨勬槸__stdcall(API)

__cdecl鏄疌/C++鍜孧FC紼嬪簭榛樿浣跨敤鐨勮皟鐢ㄧ害瀹氾紝涔熷彲浠ュ湪鍑芥暟澹版槑鏃跺姞涓奯_cdecl鍏抽敭瀛楁潵鎵嬪伐鎸囧畾銆傞噰鐢╛_cdecl綰﹀畾鏃訛紝鍑芥暟鍙傛暟鎸夌収浠庡彸鍒板乏鐨勯『搴忓叆鏍堬紝騫朵笖鐢辮皟鐢ㄥ嚱鏁拌呮妸鍙傛暟寮瑰嚭鏍堜互娓呯悊鍫嗘爤銆傚洜姝わ紝瀹炵幇鍙彉鍙傛暟鐨勫嚱鏁板彧鑳戒嬌鐢ㄨ璋冪敤綰﹀畾銆傜敱浜庢瘡涓涓嬌鐢╛_cdecl綰﹀畾鐨勫嚱鏁伴兘瑕佸寘鍚竻鐞嗗爢鏍堢殑浠g爜錛屾墍浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細姣旇緝澶с俖_cdecl鍙互鍐欐垚_cdecl銆?
__stdcall璋冪敤綰﹀畾鐢ㄤ簬璋冪敤Win32 API鍑芥暟銆傞噰鐢╛_stdcall綰﹀畾鏃訛紝鍑芥暟鍙傛暟鎸夌収浠庡彸鍒板乏鐨勯『搴忓叆鏍堬紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鏍堬紝鍑芥暟鍙傛暟涓暟鍥哄畾銆傜敱浜庡嚱鏁頒綋鏈韓鐭ラ亾浼犺繘鏉ョ殑鍙傛暟涓暟錛屽洜姝よ璋冪敤鐨勫嚱鏁板彲浠ュ湪榪斿洖鍓嶇敤涓鏉et n鎸囦護鐩存帴娓呯悊浼犻掑弬鏁扮殑鍫嗘爤銆俖_stdcall鍙互鍐欐垚_stdcall銆?
__fastcall綰﹀畾鐢ㄤ簬瀵規ц兘瑕佹眰闈炲父楂樼殑鍦哄悎銆俖_fastcall綰﹀畾灝嗗嚱鏁扮殑浠庡乏杈瑰紑濮嬬殑涓や釜澶у皬涓嶅ぇ浜?涓瓧鑺傦紙DWORD錛夌殑鍙傛暟鍒嗗埆鏀懼湪ECX鍜孍DX瀵勫瓨鍣紝鍏朵綑鐨勫弬鏁頒粛鏃ц嚜鍙沖悜宸﹀帇鏍堜紶閫侊紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍫嗘爤銆俖_fastcall鍙互鍐欐垚_fastcall

3.

__stdcall:

_stdcall 璋冪敤綰﹀畾鐩稿綋浜?6浣嶅姩鎬佸簱涓粡甯鎬嬌鐢ㄧ殑PASCAL璋冪敤綰﹀畾銆?/p>

 
鍦?2浣嶇殑VC++5.0涓璓ASCAL璋冪敤綰﹀畾涓嶅啀琚敮鎸侊紙瀹為檯涓婂畠宸茶瀹氫箟涓篲_stdcall銆傞櫎浜哶_pascal澶栵紝__fortran鍜宊_syscall涔熶笉琚敮鎸侊級錛屽彇鑰屼唬涔嬬殑鏄痏_stdcall璋冪敤綰﹀畾銆備袱鑰呭疄璐ㄤ笂鏄竴鑷寸殑錛屽嵆鍑芥暟鐨勫弬鏁拌嚜鍙沖悜宸﹂氳繃鏍堜紶閫掞紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍐呭瓨鏍堬紝浣嗕笉鍚岀殑鏄嚱鏁板悕鐨勪慨楗伴儴鍒嗭紙鍏充簬鍑芥暟鍚嶇殑淇グ閮ㄥ垎鍦ㄥ悗闈㈠皢璇︾粏璇存槑錛夈?/p>

_stdcall鏄疨ascal紼嬪簭鐨勭己鐪佽皟鐢ㄦ柟寮忥紝閫氬父鐢ㄤ簬Win32 Api涓紝鍑芥暟閲囩敤浠庡彸鍒板乏鐨勫帇鏍堟柟寮忥紝鑷繁鍦ㄩ鍑烘椂娓呯┖鍫嗘爤銆俈C灝嗗嚱鏁扮紪璇戝悗浼氬湪鍑芥暟鍚嶅墠闈㈠姞涓婁笅鍒掔嚎鍓嶇紑錛屽湪鍑芥暟鍚嶅悗鍔犱笂"@"鍜屽弬鏁扮殑瀛楄妭鏁般?/p>

_cdecl:

_cdecl c璋冪敤綰﹀畾, 鎸変粠鍙寵嚦宸︾殑欏哄簭鍘嬪弬鏁板叆鏍堬紝鐢辮皟鐢ㄨ呮妸鍙傛暟寮瑰嚭鏍堛傚浜庝紶閫佸弬鏁扮殑鍐呭瓨鏍堟槸鐢辮皟鐢ㄨ呮潵緇存姢鐨勶紙姝e洜涓哄姝わ紝瀹炵幇鍙彉鍙傛暟鐨勫嚱鏁板彧鑳戒嬌鐢ㄨ璋冪敤綰﹀畾錛夈傚彟澶栵紝鍦ㄥ嚱鏁板悕淇グ綰﹀畾鏂歸潰涔熸湁鎵涓嶅悓銆?/p>

_cdecl鏄疌鍜孋錛嬶紜紼嬪簭鐨勭己鐪佽皟鐢ㄦ柟寮忋傛瘡涓涓皟鐢ㄥ畠鐨勫嚱鏁伴兘鍖呭惈娓呯┖鍫嗘爤鐨勪唬鐮侊紝鎵浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細姣旇皟鐢╛stdcall鍑芥暟鐨勫ぇ銆傚嚱鏁伴噰鐢ㄤ粠鍙沖埌宸︾殑鍘嬫爤鏂瑰紡銆俈C灝嗗嚱鏁扮紪璇戝悗浼氬湪鍑芥暟鍚嶅墠闈㈠姞涓婁笅鍒掔嚎鍓嶇紑銆傛槸MFC緙虹渷璋冪敤綰﹀畾銆?/p>

__fastcall:

__fastcall璋冪敤綰﹀畾鏄?浜?濡傚叾鍚嶏紝瀹冪殑涓昏鐗圭偣灝辨槸蹇紝鍥犱負瀹冩槸閫氳繃瀵勫瓨鍣ㄦ潵浼犻佸弬鏁扮殑錛堝疄闄呬笂錛屽畠鐢‥CX鍜孍DX浼犻佸墠涓や釜鍙屽瓧錛圖WORD錛夋垨鏇村皬鐨勫弬鏁幫紝鍓╀笅鐨勫弬鏁頒粛鏃ц嚜鍙沖悜宸﹀帇鏍堜紶閫侊紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍐呭瓨鏍堬級錛屽湪鍑芥暟鍚嶄慨楗扮害瀹氭柟闈紝瀹冨拰鍓嶄袱鑰呭潎涓嶅悓銆?/p>

_fastcall鏂瑰紡鐨勫嚱鏁伴噰鐢ㄥ瘎瀛樺櫒浼犻掑弬鏁幫紝VC灝嗗嚱鏁扮紪璇戝悗浼氬湪鍑芥暟鍚嶅墠闈㈠姞涓?@"鍓嶇紑錛屽湪鍑芥暟鍚嶅悗鍔犱笂"@"鍜屽弬鏁扮殑瀛楄妭鏁般?/p>

thiscall:

thiscall浠呬粎搴旂敤浜?C++"鎴愬憳鍑芥暟銆倀his鎸囬拡瀛樻斁浜嶤X瀵勫瓨鍣紝鍙傛暟浠庡彸鍒板乏鍘嬨倀hiscall涓嶆槸鍏抽敭璇嶏紝鍥犳涓嶈兘琚▼搴忓憳鎸囧畾銆?/p>

naked call:

閲囩敤1-4鐨勮皟鐢ㄧ害瀹氭椂錛屽鏋滃繀瑕佺殑璇濓紝榪涘叆鍑芥暟鏃剁紪璇戝櫒浼氫駭鐢熶唬鐮佹潵淇濆瓨ESI錛孍DI錛孍BX錛孍BP瀵勫瓨鍣紝閫鍑哄嚱鏁版椂鍒欎駭鐢熶唬鐮佹仮澶嶈繖浜涘瘎瀛樺櫒鐨勫唴瀹廣?/p>

naked call涓嶄駭鐢熻繖鏍風殑浠g爜銆俷aked call涓嶆槸綾誨瀷淇グ絎︼紝鏁呭繀欏誨拰_declspec鍏卞悓浣跨敤銆?/p>

鍙﹂檮:

鍏抽敭瀛?__stdcall銆乢_cdecl鍜宊_fastcall鍙互鐩存帴鍔犲湪瑕佽緭鍑虹殑鍑芥暟鍓嶏紝涔熷彲浠ュ湪緙栬瘧鐜鐨凷etting...\C/C++ \Code Generation欏歸夋嫨銆傚綋鍔犲湪杈撳嚭鍑芥暟鍓嶇殑鍏抽敭瀛椾笌緙栬瘧鐜涓殑閫夋嫨涓嶅悓鏃訛紝鐩存帴鍔犲湪杈撳嚭鍑芥暟鍓嶇殑鍏抽敭瀛楁湁鏁堛傚畠浠搴旂殑鍛戒護琛屽弬鏁板垎鍒負/Gz銆?Gd鍜?Gr銆傜己鐪佺姸鎬佷負/Gd錛屽嵆__cdecl銆?/p>

瑕佸畬鍏ㄦā浠縋ASCAL璋冪敤綰﹀畾棣栧厛蹇呴』浣跨敤__stdcall璋冪敤綰﹀畾錛岃嚦浜庡嚱鏁板悕淇グ綰﹀畾錛屽彲浠ラ氳繃鍏跺畠鏂規硶妯′豢銆傝繕鏈変竴涓煎緱涓鎻愮殑鏄疻INAPI瀹忥紝Windows.h鏀寔璇ュ畯錛屽畠鍙互灝嗗嚭鍑芥暟緲昏瘧鎴愰傚綋鐨勮皟鐢ㄧ害瀹氾紝鍦╓IN32涓紝瀹冭瀹氫箟涓篲_stdcall銆備嬌鐢╓INAPI瀹忓彲浠ュ垱寤鴻嚜宸辯殑APIs銆?/p>

鍚嶅瓧淇グ綰﹀畾

1銆佷慨楗板悕(Decoration name)
“C”鎴栬?#8220;C++”鍑芥暟鍦ㄥ唴閮紙緙栬瘧鍜岄摼鎺ワ級閫氳繃淇グ鍚嶈瘑鍒備慨楗板悕鏄紪璇戝櫒鍦ㄧ紪璇戝嚱鏁板畾涔夋垨鑰呭師鍨嬫椂鐢熸垚鐨勫瓧絎︿覆銆傛湁浜涙儏鍐典笅浣跨敤鍑芥暟鐨勪慨楗板悕鏄繀瑕佺殑錛屽鍦ㄦā鍧楀畾涔夋枃浠墮噷澶存寚瀹氳緭鍑?#8220;C++”閲嶈澆鍑芥暟銆佹瀯閫犲嚱鏁般佹瀽鏋勫嚱鏁幫紝鍙堝鍦ㄦ眹緙栦唬鐮侀噷璋冪敤“C””鎴?#8220;C++”鍑芥暟絳夈?

淇グ鍚嶇敱鍑芥暟鍚嶃佺被鍚嶃佽皟鐢ㄧ害瀹氥佽繑鍥炵被鍨嬨佸弬鏁扮瓑鍏卞悓鍐沖畾銆?

2銆佸悕瀛椾慨楗扮害瀹氶殢璋冪敤綰﹀畾鍜岀紪璇戠綾?C鎴朇++)鐨勪笉鍚岃屽彉鍖栥傚嚱鏁板悕淇グ綰﹀畾闅忕紪璇戠綾誨拰璋冪敤綰﹀畾鐨勪笉鍚岃屼笉鍚岋紝涓嬮潰鍒嗗埆璇存槑銆?

a銆丆緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?

__stdcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓笅鍒掔嚎鍓嶇紑錛屽悗闈㈠姞涓婁竴涓?#8220;@”絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負_functionname@number銆?

__cdecl璋冪敤綰﹀畾浠呭湪杈撳嚭鍑芥暟鍚嶅墠鍔犱笂涓涓笅鍒掔嚎鍓嶇紑錛屾牸寮忎負_functionname銆?/p>

__fastcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓?#8220;@”絎﹀彿錛屽悗闈篃鏄竴涓?#8220;@”絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負@functionname@number銆?

瀹冧滑鍧囦笉鏀瑰彉杈撳嚭鍑芥暟鍚嶄腑鐨勫瓧絎﹀ぇ灝忓啓錛岃繖鍜孭ASCAL璋冪敤綰﹀畾涓嶅悓錛孭ASCAL綰﹀畾杈撳嚭鐨勫嚱鏁板悕鏃犱換浣曚慨楗頒笖鍏ㄩ儴澶у啓銆?

b銆丆++緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?

__stdcall璋冪敤綰﹀畾錛?
1銆佷互“?”鏍囪瘑鍑芥暟鍚嶇殑寮濮嬶紝鍚庤窡鍑芥暟鍚嶏紱
2銆佸嚱鏁板悕鍚庨潰浠?#8220;@@YG”鏍囪瘑鍙傛暟琛ㄧ殑寮濮嬶紝鍚庤窡鍙傛暟琛紱
3銆佸弬鏁拌〃浠ヤ唬鍙瘋〃紺猴細
X--void 錛?
D--char錛?
E--unsigned char錛?
F--short錛?
H--int錛?
I--unsigned int錛?
J--long錛?
K--unsigned long錛?
M--float錛?
N--double錛?
_N--bool錛?
....
PA--琛ㄧず鎸囬拡錛屽悗闈㈢殑浠e彿琛ㄦ槑鎸囬拡綾誨瀷錛屽鏋滅浉鍚岀被鍨嬬殑鎸囬拡榪炵畫鍑虹幇錛屼互“0”浠f浛錛屼竴涓?#8220;0”浠h〃涓嬈¢噸澶嶏紱
4銆佸弬鏁拌〃鐨勭涓欏逛負璇ュ嚱鏁扮殑榪斿洖鍊肩被鍨嬶紝鍏跺悗渚濇涓哄弬鏁扮殑鏁版嵁綾誨瀷,鎸囬拡鏍囪瘑鍦ㄥ叾鎵鎸囨暟鎹被鍨嬪墠錛?
5銆佸弬鏁拌〃鍚庝互“@Z”鏍囪瘑鏁翠釜鍚嶅瓧鐨勭粨鏉燂紝濡傛灉璇ュ嚱鏁版棤鍙傛暟錛屽垯浠?#8220;Z”鏍囪瘑緇撴潫銆?

鍏舵牸寮忎負“?functionname@@YG*****@Z”鎴?#8220;?functionname@@YG*XZ”錛屼緥濡?
int Test1錛坈har *var1,unsigned long錛?----“?Test1@@YGHPADK@Z”
void Test2錛堬級 -----“?Test2@@YGXXZ”

__cdecl璋冪敤綰﹀畾錛?
瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?#8220;@@YG”鍙樹負“@@YA”銆?

__fastcall璋冪敤綰﹀畾錛?
瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?#8220;@@YG”鍙樹負“@@YI”銆?
VC++瀵瑰嚱鏁扮殑鐪佺己澹版槑鏄?#8220;__cedcl“,灝嗗彧鑳借C/C++璋冪敤.

CB鍦ㄨ緭鍑哄嚱鏁板0鏄庢椂浣跨敤4縐嶄慨楗扮鍙?
//__cdecl
cb鐨勯粯璁ゅ鹼紝瀹冧細鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞_錛屽茍淇濈暀姝ゅ嚱鏁板悕涓嶅彉錛屽弬鏁版寜鐓т粠鍙沖埌宸︾殑欏哄簭渚濇浼犻掔粰鏍堬紝涔熷彲浠ュ啓鎴恄cdecl鍜宑decl褰㈠紡銆?
//__fastcall
濂逛慨楗扮殑鍑芥暟鐨勫弬鏁板皢灝借偗鍛㈡劅鍦頒嬌鐢ㄥ瘎瀛樺櫒鏉ュ鐞嗭紝鍏跺嚱鏁板悕鍓嶅姞@錛屽弬鏁版寜鐓т粠宸﹀埌鍙崇殑欏哄簭鍘嬫爤錛?
//__pascal
瀹冭鏄庣殑鍑芥暟鍚嶄嬌鐢≒ascal鏍煎紡鐨勫懡鍚嶇害瀹氥傝繖鏃跺嚱鏁板悕鍏ㄩ儴澶у啓銆傚弬鏁版寜鐓т粠宸﹀埌鍙崇殑欏哄簭鍘嬫爤錛?
//__stdcall
浣跨敤鏍囧噯綰﹀畾鐨勫嚱鏁板悕銆傚嚱鏁板悕涓嶄細鏀瑰彉銆備嬌鐢╛_stdcall淇グ鏃躲傚弬鏁版寜鐓х敱鍙沖埌宸︾殑欏哄簭鍘嬫爤錛屼篃鍙互鏄痏stdcall錛?/p>

VC++瀵瑰嚱鏁扮殑鐪佺己澹版槑鏄?__cedcl",灝嗗彧鑳借C/C++璋冪敤.

 

 

娉ㄦ剰錛?/p>

1銆乢beginthread闇瑕乢_cdecl鐨勭嚎紼嬪嚱鏁板湴鍧錛宊beginthreadex鍜孋reateThread闇瑕乢_stdcall鐨勭嚎紼嬪嚱鏁板湴鍧銆?/p>

2銆佷竴鑸琖IN32鐨勫嚱鏁伴兘鏄痏_stdcall銆傝屼笖鍦╓indef.h涓湁濡備笅鐨勫畾涔夛細

 #define CALLBACK __stdcall

 #define WINAPI銆 __stdcall

3銆乪xtern "C" _declspec(dllexport) int __cdecl Add(int a, int b);

   typedef int (__cdecl*FunPointer)(int a, int b);

   淇グ絎︾殑涔﹀啓欏哄簭濡備笂銆?/p>

4銆乪xtern "C"鐨勪綔鐢細濡傛灉Add(int a, int b)鏄湪c璇█緙栬瘧鍣ㄧ紪璇戯紝鑰屽湪c++鏂囦歡浣跨敤錛屽垯闇瑕佸湪c++鏂囦歡涓0鏄庯細extern "C" Add(int a, int b)錛屽洜涓篶緙栬瘧鍣ㄥ拰c++緙栬瘧鍣ㄥ鍑芥暟鍚嶇殑瑙i噴涓嶄竴鏍鳳紙c++緙栬瘧鍣ㄨВ閲婂嚱鏁板悕鐨勬椂鍊欒鑰冭檻鍑芥暟鍙傛暟錛岃繖鏍鋒槸浜嗘柟渚垮嚱鏁伴噸杞斤紝鑰屽湪c璇█涓笉瀛樺湪鍑芥暟閲嶈澆鐨勯棶棰橈級錛屼嬌鐢╡xtern "C"錛屽疄璐ㄥ氨鏄憡璇塩++緙栬瘧鍣紝璇ュ嚱鏁版槸c搴撻噷闈㈢殑鍑芥暟銆傚鏋滀笉浣跨敤extern "C"鍒欎細鍑虹幇閾炬帴閿欒銆?/p>

涓鑸薄濡備笅浣跨敤錛?/p>

#ifdef _cplusplus

#define EXTERN_C extern "C"

#else

#define EXTERN_C extern

#endif

#ifdef _cplusplus

extern "C"{

#endif

 EXTERN_C int func(int a, int b);

#ifdef _cplusplus

}

#endif

5銆丮FC鎻愪緵浜嗕竴浜涘畯錛屽彲浠ヤ嬌鐢ˋFX_EXT_CLASS鏉ヤ唬鏇縚_declspec(DLLexport)錛屽茍淇グ綾誨悕錛屼粠鑰屽鍑虹被錛孉FX_API_EXPORT鏉ヤ慨楗板嚱鏁幫紝AFX_DATA_EXPORT鏉ヤ慨楗板彉閲?/p>

AFX_CLASS_IMPORT錛歘_declspec(DLLexport)

AFX_API_IMPORT錛歘_declspec(DLLexport)

AFX_DATA_IMPORT錛歘_declspec(DLLexport)

AFX_CLASS_EXPORT錛歘_declspec(DLLexport)

AFX_API_EXPORT錛歘_declspec(DLLexport)

AFX_DATA_EXPORT錛歘_declspec(DLLexport)

AFX_EXT_CLASS錛?ifdef _AFXEXT

   AFX_CLASS_EXPORT

        #else

   AFX_CLASS_IMPORT

6銆丏LLMain璐熻矗鍒濆鍖?Initialization)鍜岀粨鏉?Termination)宸ヤ綔錛屾瘡褰撲竴涓柊鐨勮繘紼嬫垨鑰呰榪涚▼鐨勬柊鐨勭嚎紼嬭闂瓺LL鏃訛紝鎴栬呰闂瓺LL鐨勬瘡涓涓繘紼嬫垨鑰呯嚎紼嬩笉鍐嶄嬌鐢―LL鎴栬呯粨鏉熸椂錛岄兘浼氳皟鐢―LLMain銆備絾鏄紝浣跨敤TerminateProcess鎴朤erminateThread緇撴潫榪涚▼鎴栬呯嚎紼嬶紝涓嶄細璋冪敤DLLMain銆?/p>

7銆佷竴涓狣LL鍦ㄥ唴瀛樹腑鍙湁涓涓疄渚?/p>

DLL紼嬪簭鍜岃皟鐢ㄥ叾杈撳嚭鍑芥暟鐨勭▼搴忕殑鍏崇郴錛?/p>

1)銆丏LL涓庤繘紼嬨佺嚎紼嬩箣闂寸殑鍏崇郴

DLL妯″潡琚槧灝勫埌璋冪敤瀹冪殑榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿銆?/p>

DLL浣跨敤鐨勫唴瀛樹粠璋冪敤榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿鍒嗛厤錛屽彧鑳借璇ヨ繘紼嬬殑綰跨▼鎵璁塊棶銆?/p>

DLL鐨勫彞鏌勫彲浠ヨ璋冪敤榪涚▼浣跨敤錛涜皟鐢ㄨ繘紼嬬殑鍙ユ焺鍙互琚獶LL浣跨敤銆?/p>

DLLDLL鍙互鏈夎嚜宸辯殑鏁版嵁孌碉紝浣嗘病鏈夎嚜宸辯殑鍫嗘爤錛屼嬌鐢ㄨ皟鐢ㄨ繘紼嬬殑鏍堬紝涓庤皟鐢ㄥ畠鐨勫簲鐢ㄧ▼搴忕浉鍚岀殑鍫嗘爤妯″紡銆?/p>

2)銆佸叧浜庡叡浜暟鎹

DLL瀹氫箟鐨勫叏灞鍙橀噺鍙互琚皟鐢ㄨ繘紼嬭闂紱DLL鍙互璁塊棶璋冪敤榪涚▼鐨勫叏灞鏁版嵁銆備嬌鐢ㄥ悓涓DLL鐨勬瘡涓涓繘紼嬮兘鏈夎嚜宸辯殑DLL鍏ㄥ眬鍙橀噺瀹炰緥銆傚鏋滃涓嚎紼嬪茍鍙戣闂悓涓鍙橀噺錛屽垯闇瑕佷嬌鐢ㄥ悓姝ユ満鍒訛紱瀵逛竴涓狣LL鐨勫彉閲忥紝濡傛灉甯屾湜姣忎釜浣跨敤DLL鐨勭嚎紼嬮兘鏈夎嚜宸辯殑鍊鹼紝鍒欏簲璇ヤ嬌鐢ㄧ嚎紼嬪眬閮ㄥ瓨鍌?TLS錛孴hread Local Strorage)銆?br>



璁哄嚱鏁拌皟鐢ㄧ害瀹?/strong>


鍦–璇█涓紝鍋囪鎴戜滑鏈夎繖鏍風殑涓涓嚱鏁幫細
銆銆
銆銆int function(int a,int b)
銆銆
銆銆璋冪敤鏃跺彧瑕佺敤result = function(1,2)榪欐牱鐨勬柟寮忓氨鍙互浣跨敤榪欎釜鍑芥暟銆備絾鏄紝褰撻珮綰ц璦琚紪璇戞垚璁$畻鏈哄彲浠ヨ瘑鍒殑鏈哄櫒鐮佹椂錛屾湁涓涓棶棰樺氨鍑哥幇鍑烘潵錛氬湪CPU涓紝璁$畻鏈烘病鏈夊姙娉曠煡閬撲竴涓嚱鏁拌皟鐢ㄩ渶瑕佸灝戜釜銆佷粈涔堟牱鐨勫弬鏁幫紝涔熸病鏈夌‖浠跺彲浠ヤ繚瀛樿繖浜涘弬鏁般備篃灝辨槸璇達紝璁$畻鏈轟笉鐭ラ亾鎬庝箞緇欒繖涓嚱鏁頒紶閫掑弬鏁幫紝浼犻掑弬鏁扮殑宸ヤ綔蹇呴』鐢卞嚱鏁拌皟鐢ㄨ呭拰鍑芥暟鏈韓鏉ュ崗璋冦備負姝わ紝璁$畻鏈烘彁渚涗簡涓縐嶈縐頒負鏍堢殑鏁版嵁緇撴瀯鏉ユ敮鎸佸弬鏁頒紶閫掋?/p>

銆銆鏍堟槸涓縐嶅厛榪涘悗鍑虹殑鏁版嵁緇撴瀯錛屾爤鏈変竴涓瓨鍌ㄥ尯銆佷竴涓爤欏舵寚閽堛傛爤欏舵寚閽堟寚鍚戝爢鏍堜腑絎竴涓彲鐢ㄧ殑鏁版嵁欏癸紙琚О涓烘爤欏訛級銆傜敤鎴峰彲浠ュ湪鏍堥《涓婃柟鍚戞爤涓姞鍏ユ暟鎹紝榪欎釜鎿嶄綔琚О涓哄帇鏍?Push)錛屽帇鏍堜互鍚庯紝鏍堥《鑷姩鍙樻垚鏂板姞鍏ユ暟鎹」鐨勪綅緗紝鏍堥《鎸囬拡涔熼殢涔嬩慨鏀廣傜敤鎴蜂篃鍙互浠庡爢鏍堜腑鍙栬蛋鏍堥《錛岀О涓哄脊鍑烘爤(pop)錛屽脊鍑烘爤鍚庯紝鏍堥《涓嬬殑涓涓厓绱犲彉鎴愭爤欏訛紝鏍堥《鎸囬拡闅忎箣淇敼銆?/p>

銆銆鍑芥暟璋冪敤鏃訛紝璋冪敤鑰呬緷嬈℃妸鍙傛暟鍘嬫爤錛岀劧鍚庤皟鐢ㄥ嚱鏁幫紝鍑芥暟琚皟鐢ㄤ互鍚庯紝鍦ㄥ爢鏍堜腑鍙栧緱鏁版嵁錛屽茍榪涜璁$畻銆傚嚱鏁拌綆楃粨鏉熶互鍚庯紝鎴栬呰皟鐢ㄨ呫佹垨鑰呭嚱鏁版湰韜慨鏀瑰爢鏍堬紝浣垮爢鏍堟仮澶嶅師瑁呫?/p>

銆銆鍦ㄥ弬鏁頒紶閫掍腑錛屾湁涓や釜寰堥噸瑕佺殑闂蹇呴』寰楀埌鏄庣‘璇存槑錛?br>銆銆
銆銆褰撳弬鏁頒釜鏁板浜庝竴涓椂錛屾寜鐓т粈涔堥『搴忔妸鍙傛暟鍘嬪叆鍫嗘爤
銆銆鍑芥暟璋冪敤鍚庯紝鐢辮皝鏉ユ妸鍫嗘爤鎭㈠鍘熻
銆銆鍦ㄩ珮綰ц璦涓紝閫氳繃鍑芥暟璋冪敤綰﹀畾鏉ヨ鏄庤繖涓や釜闂銆傚父瑙佺殑璋冪敤綰﹀畾鏈夛細

銆銆stdcall
銆銆cdecl
銆銆fastcall
銆銆thiscall
銆銆naked call

 

銆銆stdcall璋冪敤綰﹀畾
銆銆stdcall寰堝鏃跺欒縐頒負pascal璋冪敤綰﹀畾錛屽洜涓簆ascal鏄棭鏈熷緢甯歌鐨勪竴縐嶆暀瀛︾敤璁$畻鏈虹▼搴忚璁¤璦錛屽叾璇硶涓ヨ皚錛屼嬌鐢ㄧ殑鍑芥暟璋冪敤綰﹀畾灝辨槸stdcall銆傚湪Microsoft C++緋誨垪鐨凜/C++緙栬瘧鍣ㄤ腑錛屽父甯哥敤PASCAL瀹忔潵澹版槑榪欎釜璋冪敤綰﹀畾錛岀被浼肩殑瀹忚繕鏈塛INAPI鍜孋ALLBACK銆?/p>

銆銆stdcall璋冪敤綰﹀畾澹版槑鐨勮娉曚負(浠ュ墠鏂囩殑閭d釜鍑芥暟涓轟緥錛夛細
銆銆
銆銆int __stdcall function(int a,int b)
銆銆
銆銆stdcall鐨勮皟鐢ㄧ害瀹氭剰鍛崇潃錛?錛夊弬鏁頒粠鍙沖悜宸﹀帇鍏ュ爢鏍堬紝2錛夊嚱鏁拌嚜韜慨鏀瑰爢鏍?3)鍑芥暟鍚嶈嚜鍔ㄥ姞鍓嶅鐨勪笅鍒掔嚎錛屽悗闈㈢揣璺熶竴涓狜絎﹀彿錛屽叾鍚庣揣璺熺潃鍙傛暟鐨勫昂瀵?/p>

銆銆浠ヤ笂榪拌繖涓嚱鏁頒負渚嬶紝鍙傛暟b棣栧厛琚帇鏍堬紝鐒跺悗鏄弬鏁癮錛屽嚱鏁拌皟鐢╢unction(1,2)璋冪敤澶勭炕璇戞垚姹囩紪璇█灝嗗彉鎴愶細

銆銆push 2銆銆銆銆銆銆銆 絎簩涓弬鏁板叆鏍?br>銆銆push 1銆銆銆銆銆銆銆 絎竴涓弬鏁板叆鏍?br>銆銆call function銆銆銆銆璋冪敤鍙傛暟錛屾敞鎰忔鏃惰嚜鍔ㄦ妸cs:eip鍏ユ爤

銆銆鑰屽浜庡嚱鏁拌嚜韜紝鍒欏彲浠ョ炕璇戜負錛?
銆銆push ebp銆銆銆銆銆銆 淇濆瓨ebp瀵勫瓨鍣紝璇ュ瘎瀛樺櫒灝嗙敤鏉ヤ繚瀛樺爢鏍堢殑鏍堥《鎸囬拡錛屽彲浠ュ湪鍑芥暟閫鍑烘椂鎭㈠
銆銆mov銆ebp, esp銆銆銆銆淇濆瓨鍫嗘爤鎸囬拡
銆銆mov銆eax,[ebp + 8H]銆鍫嗘爤涓璭bp鎸囧悜浣嶇疆涔嬪墠渚濇淇濆瓨鏈塭bp, cs:eip, a, b, ebp +8鎸囧悜a
銆銆add銆eax,[ebp + 0CH] 鍫嗘爤涓璭bp + 12澶勪繚瀛樹簡b
銆銆mov銆esp, ebp銆銆銆銆鎭㈠esp
銆銆pop銆ebp
銆銆ret銆8

銆銆鑰屽湪緙栬瘧鏃訛紝榪欎釜鍑芥暟鐨勫悕瀛楄緲昏瘧鎴?a href="mailto:_function@8">_function@8

銆銆娉ㄦ剰涓嶅悓緙栬瘧鍣ㄤ細鎻掑叆鑷繁鐨勬眹緙栦唬鐮佷互鎻愪緵緙栬瘧鐨勯氱敤鎬э紝浣嗘槸澶т綋浠g爜濡傛銆傚叾涓湪鍑芥暟寮濮嬪淇濈暀esp鍒癳bp涓紝鍦ㄥ嚱鏁扮粨鏉熸仮澶嶆槸緙栬瘧鍣ㄥ父鐢ㄧ殑鏂規硶銆?/p>

銆銆浠庡嚱鏁拌皟鐢ㄧ湅錛?鍜?渚濇琚玴ush榪涘爢鏍堬紝鑰屽湪鍑芥暟涓張閫氳繃鐩稿浜巈bp(鍗沖垰榪涘嚱鏁版椂鐨勫爢鏍堟寚閽堬級鐨勫亸縐婚噺瀛樺彇鍙傛暟銆傚嚱鏁扮粨鏉熷悗錛宺et 8琛ㄧず娓呯悊8涓瓧鑺傜殑鍫嗘爤錛屽嚱鏁拌嚜宸辨仮澶嶄簡鍫嗘爤銆?/p>

銆銆
銆銆cdecl璋冪敤綰﹀畾
銆銆cdecl璋冪敤綰﹀畾鍙堢О涓篊璋冪敤綰﹀畾錛屾槸C璇█緙虹渷鐨勮皟鐢ㄧ害瀹氾紝瀹冪殑瀹氫箟璇硶鏄細

銆銆int function (int a ,int b)銆//涓嶅姞淇グ灝辨槸C璋冪敤綰﹀畾
銆銆int __cdecl function(int a,int b)//鏄庣‘鎸囧嚭C璋冪敤綰﹀畾

銆銆鍦ㄥ啓鏈枃鏃訛紝鍑轟箮鎴戠殑鎰忔枡錛屽彂鐜癱decl璋冪敤綰﹀畾鐨勫弬鏁板帇鏍堥『搴忔槸鍜宻tdcall鏄竴鏍風殑錛屽弬鏁伴鍏堢敱鍙沖悜宸﹀帇鍏ュ爢鏍堛傛墍涓嶅悓鐨勬槸錛屽嚱鏁版湰韜笉娓呯悊鍫嗘爤錛岃皟鐢ㄨ呰礋璐f竻鐞嗗爢鏍堛傜敱浜庤繖縐嶅彉鍖栵紝C璋冪敤綰﹀畾鍏佽鍑芥暟鐨勫弬鏁扮殑涓暟鏄笉鍥哄畾鐨勶紝榪欎篃鏄疌璇█鐨勪竴澶х壒鑹層傚浜庡墠闈㈢殑function鍑芥暟錛屼嬌鐢╟decl鍚庣殑姹囩紪鐮佸彉鎴愶細

銆銆璋冪敤澶?br>銆銆push 1
銆銆push 2
銆銆call function
銆銆add銆esp, 8銆銆銆銆銆娉ㄦ剰錛氳繖閲岃皟鐢ㄨ呭湪鎭㈠鍫嗘爤

銆銆琚皟鐢ㄥ嚱鏁癬function澶?br>銆銆push ebp銆銆銆銆銆銆 淇濆瓨ebp瀵勫瓨鍣紝璇ュ瘎瀛樺櫒灝嗙敤鏉ヤ繚瀛樺爢鏍堢殑鏍堥《鎸囬拡錛屽彲浠ュ湪鍑芥暟閫鍑烘椂鎭㈠
銆銆mov銆ebp,esp銆銆銆銆 淇濆瓨鍫嗘爤鎸囬拡
銆銆mov銆eax,[ebp + 8H]銆鍫嗘爤涓璭bp鎸囧悜浣嶇疆涔嬪墠渚濇淇濆瓨鏈塭bp,cs:eip,a,b,ebp +8鎸囧悜a
銆銆add銆eax,[ebp + 0CH] 鍫嗘爤涓璭bp + 12澶勪繚瀛樹簡b
銆銆mov銆esp,ebp銆銆銆銆 鎭㈠esp
銆銆pop銆ebp
銆銆ret銆銆銆銆銆銆銆銆銆娉ㄦ剰錛岃繖閲屾病鏈変慨鏀瑰爢鏍?/p>

銆銆MSDN涓錛岃淇グ鑷姩鍦ㄥ嚱鏁板悕鍓嶅姞鍓嶅鐨勪笅鍒掔嚎錛屽洜姝ゅ嚱鏁板悕鍦ㄧ鍙瘋〃涓璁板綍涓篲function錛屼絾鏄垜鍦ㄧ紪璇戞椂浼間箮娌℃湁鐪嬪埌榪欑鍙樺寲銆?/p>

銆銆鐢變簬鍙傛暟鎸夌収浠庡彸鍚戝乏欏哄簭鍘嬫爤錛屽洜姝ゆ渶寮濮嬬殑鍙傛暟鍦ㄦ渶鎺ヨ繎鏍堥《鐨勪綅緗紝鍥犳褰撻噰鐢ㄤ笉瀹氫釜鏁板弬鏁版椂錛岀涓涓弬鏁板湪鏍堜腑鐨勪綅緗偗瀹氳兘鐭ラ亾錛屽彧瑕佷笉瀹氱殑鍙傛暟涓暟鑳藉鏍規嵁絎竴涓悗鑰呭悗緇殑鏄庣‘鐨勫弬鏁扮‘瀹氫笅鏉ワ紝灝卞彲浠ヤ嬌鐢ㄤ笉瀹氬弬鏁幫紝渚嬪瀵逛簬CRT涓殑sprintf鍑芥暟錛屽畾涔変負錛?
銆銆int sprintf(char* buffer,const char* format,...)
銆銆鐢變簬鎵鏈夌殑涓嶅畾鍙傛暟閮藉彲浠ラ氳繃format紜畾錛屽洜姝や嬌鐢ㄤ笉瀹氫釜鏁扮殑鍙傛暟鏄病鏈夐棶棰樼殑銆?/p>

銆銆fastcall
銆銆fastcall璋冪敤綰﹀畾鍜宻tdcall綾諱技錛屽畠鎰忓懗鐫錛?
銆銆
銆銆鍑芥暟鐨勭涓涓拰絎簩涓狣WORD鍙傛暟錛堟垨鑰呭昂瀵告洿灝忕殑錛夐氳繃ecx鍜宔dx浼犻掞紝鍏朵粬鍙傛暟閫氳繃浠庡彸鍚戝乏鐨勯『搴忓帇鏍?
銆銆琚皟鐢ㄥ嚱鏁版竻鐞嗗爢鏍?
銆銆鍑芥暟鍚嶄慨鏀硅鍒欏悓stdcall
銆銆鍏跺0鏄庤娉曚負錛歩nt fastcall function(int a, int b)

銆銆thiscall
銆銆thiscall鏄敮涓涓涓笉鑳芥槑紜寚鏄庣殑鍑芥暟淇グ錛屽洜涓簍hiscall涓嶆槸鍏抽敭瀛椼傚畠鏄疌++綾繪垚鍛樺嚱鏁扮己鐪佺殑璋冪敤綰﹀畾銆傜敱浜庢垚鍛樺嚱鏁拌皟鐢ㄨ繕鏈変竴涓猼his鎸囬拡錛屽洜姝ゅ繀欏葷壒孌婂鐞嗭紝thiscall鎰忓懗鐫錛?

銆銆鍙傛暟浠庡彸鍚戝乏鍏ユ爤
銆銆濡傛灉鍙傛暟涓暟紜畾錛宼his鎸囬拡閫氳繃ecx浼犻掔粰琚皟鐢ㄨ咃紱濡傛灉鍙傛暟涓暟涓嶇‘瀹氾紝this鎸囬拡鍦ㄦ墍鏈夊弬鏁板帇鏍堝悗琚帇鍏ュ爢鏍堛傚鍙傛暟涓暟涓嶅畾鐨勶紝璋冪敤鑰呮竻鐞嗗爢鏍堬紝鍚﹀垯鍑芥暟鑷繁娓呯悊鍫嗘爤涓轟簡璇存槑榪欎釜璋冪敤綰﹀畾錛屽畾涔夊涓嬬被鍜屼嬌鐢ㄤ唬鐮侊細

銆銆class A
銆銆{
銆銆public:
銆銆銆 int function1(int a,int b);
銆銆銆 int function2(int a,...);
銆銆};

銆銆int A::function1 (int a,int b)
銆銆{
銆銆銆 return a+b;
銆銆}

銆銆#include <stdarg.h>
銆銆int A::function2(int a,...)
銆銆{
銆銆銆 va_list ap;
銆銆銆 va_start(ap,a);
銆銆銆 int i;
銆銆銆 int result = 0;
銆銆銆 for(i = 0 ; i < a ; i ++)
銆銆銆 {
銆銆銆銆銆result += va_arg(ap,int);
銆銆銆 }
銆銆銆 return result;
銆銆}

銆銆void callee()
銆銆{
銆銆銆 A a;
銆銆銆 a.function1(1, 2);
銆銆銆 a.function2(3, 1, 2, 3);
銆銆}

callee鍑芥暟琚炕璇戞垚姹囩紪鍚庡氨鍙樻垚錛?
銆銆//鍑芥暟function1璋冪敤
銆銆00401C1D銆 push銆銆銆銆2
銆銆00401C1F銆 push銆銆銆銆1
銆銆00401C21銆 lea銆銆銆銆 ecx,[ebp-8]
銆銆00401C24銆 call銆銆銆銆function1銆銆銆銆銆娉ㄦ剰錛岃繖閲宼his娌℃湁琚叆鏍?/p>

銆銆//鍑芥暟function2璋冪敤
銆銆00401C29銆 push銆銆銆銆3
銆銆00401C2B銆 push銆銆銆銆2
銆銆00401C2D銆 push銆銆銆銆1
銆銆00401C2F銆 push銆銆銆銆3
銆銆00401C31銆 lea銆銆銆銆 eax, [ebp-8]銆銆銆 榪欓噷寮曞叆this鎸囬拡
銆銆00401C34銆 push銆銆銆銆eax
銆銆00401C35銆 call銆銆銆銆function2
銆銆00401C3A銆 add銆銆銆銆 esp, 14h
銆銆
銆銆鍙錛屽浜庡弬鏁頒釜鏁板浐瀹氭儏鍐典笅錛屽畠綾諱技浜巗tdcall錛屼笉瀹氭椂鍒欑被浼糲decl

銆銆naked call
銆銆榪欐槸涓涓緢灝戣鐨勮皟鐢ㄧ害瀹氾紝涓鑸▼搴忚璁¤呭緩璁笉瑕佷嬌鐢ㄣ傜紪璇戝櫒涓嶄細緇欒繖縐嶅嚱鏁板鍔犲垵濮嬪寲鍜屾竻鐞嗕唬鐮侊紝鏇寸壒孌婄殑鏄紝浣犱笉鑳界敤return榪斿洖榪斿洖鍊鹼紝鍙兘鐢ㄦ彃鍏ユ眹緙栬繑鍥炵粨鏋溿傝繖涓鑸敤浜庡疄妯″紡椹卞姩紼嬪簭璁捐錛屽亣璁懼畾涔変竴涓眰鍜岀殑鍔犳硶紼嬪簭錛屽彲浠ュ畾涔変負錛?

銆銆__declspec(naked) int銆add(int a,int b)
銆銆{
銆銆銆 __asm mov eax,a
銆銆銆 __asm add eax,b
銆銆銆 __asm ret
銆銆}

銆銆娉ㄦ剰錛岃繖涓嚱鏁版病鏈夋樉寮忕殑return榪斿洖鍊鹼紝榪斿洖閫氳繃淇敼eax瀵勫瓨鍣ㄥ疄鐜幫紝鑰屼笖榪為鍑哄嚱鏁扮殑ret鎸囦護閮藉繀欏繪樉寮忔彃鍏ャ備笂闈唬鐮佽緲昏瘧鎴愭眹緙栦互鍚庡彉鎴愶細

銆銆mov eax,[ebp+8]
銆銆add eax,[ebp+12]
銆銆ret 8

銆 娉ㄦ剰榪欎釜淇グ鏄拰__stdcall鍙奵decl緇撳悎浣跨敤鐨勶紝鍓嶉潰鏄畠鍜宑decl緇撳悎浣跨敤鐨勪唬鐮侊紝瀵逛簬鍜宻tdcall緇撳悎鐨勪唬鐮侊紝鍒欏彉鎴愶細

銆銆__declspec(naked) int __stdcall function(int a,int b)
銆 {
銆銆銆銆__asm mov eax,a
銆銆銆銆__asm add eax,b
銆銆銆銆__asm ret 8銆銆銆銆//娉ㄦ剰鍚庨潰鐨?
銆銆}

銆銆鑷充簬榪欑鍑芥暟琚皟鐢紝鍒欏拰鏅氱殑cdecl鍙妔tdcall璋冪敤鍑芥暟涓鑷淬?/p>

銆銆鍑芥暟璋冪敤綰﹀畾瀵艱嚧鐨勫父瑙侀棶棰?br>銆銆濡傛灉瀹氫箟鐨勭害瀹氬拰浣跨敤鐨勭害瀹氫笉涓鑷達紝鍒欏皢瀵艱嚧鍫嗘爤琚牬鍧忥紝瀵艱嚧涓ラ噸闂錛屼笅闈㈡槸涓ょ甯歌鐨勯棶棰橈細

銆銆鍑芥暟鍘熷瀷澹版槑鍜屽嚱鏁頒綋瀹氫箟涓嶄竴鑷?
銆銆DLL瀵煎叆鍑芥暟鏃跺0鏄庝簡涓嶅悓鐨勫嚱鏁扮害瀹?
銆銆浠ュ悗鑰呬負渚嬶紝鍋囪鎴戜滑鍦╠ll縐嶅0鏄庝簡涓縐嶅嚱鏁頒負錛?

銆銆__declspec(dllexport) int func(int a,int b);//娉ㄦ剰錛岃繖閲屾病鏈塻tdcall錛屼嬌鐢ㄧ殑鏄痗decl
銆銆浣跨敤鏃朵唬鐮佷負錛?

銆銆typedef int (*WINAPI DLLFUNC)func(int a,int b);
銆銆hLib = LoadLibrary(...);

銆銆DLLFUNC func = (DLLFUNC)GetProcAddress(...)//榪欓噷淇敼浜嗚皟鐢ㄧ害瀹?br>銆銆result = func(1,2);//瀵艱嚧閿欒

銆銆鐢變簬璋冪敤鑰呮病鏈夌悊瑙INAPI鐨勫惈涔夐敊璇殑澧炲姞浜嗚繖涓慨楗幫紝涓婅堪浠g爜蹇呯劧瀵艱嚧鍫嗘爤琚牬鍧忥紝MFC鍦ㄧ紪璇戞椂鎻掑叆鐨刢heckesp鍑芥暟灝嗗憡璇変綘錛屽爢鏍堣鐮村潖









 



]]>
濡備綍鍒涘緩鑷繁鐨刣llhttp://m.shnenglu.com/zjl-1026-2001/archive/2009/04/28/81304.html娌欐紶閲岀殑嫻瘋睔娌欐紶閲岀殑嫻瘋睔Tue, 28 Apr 2009 04:10:00 GMThttp://m.shnenglu.com/zjl-1026-2001/archive/2009/04/28/81304.htmlhttp://m.shnenglu.com/zjl-1026-2001/comments/81304.htmlhttp://m.shnenglu.com/zjl-1026-2001/archive/2009/04/28/81304.html#Feedback0http://m.shnenglu.com/zjl-1026-2001/comments/commentRss/81304.htmlhttp://m.shnenglu.com/zjl-1026-2001/services/trackbacks/81304.html鍓嶅嚑澶╂湁涓湅鍙嬮棶閬撹繖涓棶棰橈紝緇撴灉鍥犱負浠ュ墠浠庢病鎼炶繃榪欎釜錛屽vs2005涔熶笉鐔熸倝錛岀珶鑺變簡2涓皬鏃舵墠鎼炲畾錛?img height=20 src="http://m.shnenglu.com/Emoticons/QQ/07.gif" width=20 border=0>銆?/pre>
鐗瑰湴鎷挎潵涓庡ぇ瀹跺垎浜紝甯屾湜鑳界粰鍍忔垜榪欐牱鐨勮彍楦熶滑涓浜涘府鍔╋紝O(∩_∩)O
銆愮涓姝ャ戝垱寤鴻嚜宸辯殑dll
1.鎵撳紑vs2005錛岄夋嫨鑿滃崟銆怓ile-New-Project銆戯紝鍦ㄥ脊鍑哄璇濇涓夋嫨[Visual C++]涓嬬殑[Win32]-[Win32 Console Application]錛岃緭鍏ュ伐紼嬪悕鍚庣‘璁ゃ?/pre>
2.鍦ㄥ脊鍑虹殑瀵硅瘽妗嗕腑閫夋嫨[next]錛屽湪Application Settiongs涓夋嫨Application type涓篋ll錛孉dditional options閫夋嫨Empty project錛岀劧鍚庣偣Finish銆?/pre>
榪欐椂灝卞垱寤轟簡涓涓┖鐨勫彲浠ョ敓鎴恉ll鏂囦歡鐨勫伐紼嬨?/pre>
3.鍦ㄥ伐紼嬩腑娣誨姞涓涓ご鏂囦歡(榪欓噷涓篸ll_test.h)錛屽湪澶存枃浠朵腑鍐欏叆濡備笅鍐呭錛?/pre>
 1 #ifndef _DLL_TUTORIAL_H
 2 #define _DLL-TUTORIAL_H
 3 
 4 #include<iostream>
 5 
 6 #if defined DLL_EXPORT
 7   #define DECLDIR _declspec(dllexport)
 8 #else
 9   #define DECLDIR _declspec(dllimport)
10 #endif
11 
12 extern "C"
13 {
14   DECLDIR int Add(int a, int b);
15   DECLDIR void Function(void);
16 }
17
18 #endif
榪欓噷瑕佽鏄庣殑鏄細
鍦╒C涓湁涓や釜鏂規硶鏉ュ鍑篸ll涓畾涔夌殑鍑芥暟錛?/pre>
  (1) 浣跨敤__declspec,榪欐槸涓涓狹icrosoft瀹氫箟鐨勫叧閿瓧銆?/pre>
  (2) 鍒涘緩涓涓ā鏉垮畾涔夋枃浠?Module-Definition File錛屽嵆.DEF)銆?/pre>
  絎竴縐嶆柟娉曠◢紼嶆瘮絎簩縐嶆柟娉曠畝鍗曪紝鍦ㄨ繖閲屾垜浠嬌鐢ㄧ殑鏄涓縐嶆柟娉曘?/pre>
    __declspec(dllexport)鍑芥暟鐨勪綔鐢ㄦ槸瀵煎嚭鍑芥暟絎﹀彿鍒板湪浣犵殑Dll涓殑涓涓瓨鍌ㄧ被閲屽幓銆?/pre>
褰撲笅闈竴琛岃瀹氫箟鏃舵垜瀹氫箟DECLDIR瀹忔潵榪愯榪欎釜鍑芥暟銆?/pre>
    #define DLL_EXPORT
鍦ㄦ鎯呭喌涓嬩綘灝嗗鍑哄嚱鏁癆dd(int a,int b)鍜孎unction().
4.鍒涘緩涓涓簮鏂囦歡(鍚嶅瓧涓篸ll_test.cpp)錛屽唴瀹瑰涓嬶細
 
 1 #include <iostream>
 2 #define DLL_EXPORT
 3 #include "dll_test.h"
 4 
 5 extern "C"
 6 {
 7         // 瀹氫箟浜嗭紙DLL涓殑錛夋墍鏈夊嚱鏁?/span>
 8     DECLDIR int Add( int a, int b )
 9     {
10         return( a + b );
11     }
12     
13     DECLDIR void Function( void )
14     {
15         std::cout << "DLL Called!" << std::endl;
16     }
17 }
18 
銆愮浜屾銆戜嬌鐢ㄥ垱寤哄ソ鐨凞LL
鐜板湪宸茬粡鍒涘緩浜咲LL錛岄偅涔堝浣曞湪涓涓簲鐢ㄧ▼搴忎腑浣跨敤瀹冨憿錛?/pre>
褰揇LL琚敓鎴愬悗錛屽畠鍒涘緩浜嗕竴涓?dll鏂囦歡鍜屼竴涓?lib錛岃繖涓や釜閮芥槸浣跨敤dll鏃墮渶瑕佺敤鍒扮殑銆?/pre>
鍦ㄥ叿浣撲粙緇嶄箣鍓嶅厛鐪嬩竴涓媎ll鐨勯摼鎺ユ柟寮忋?/pre>
(1)闅愬紡榪炴帴
榪欓噷鏈変袱涓柟娉曟潵杞藉叆涓涓狣LL錛屼竴涓柟娉曟槸鍙摼鎺ュ埌.lib鏂囦歡錛屽茍灝?dll鏂囦歡鏀懼埌瑕佷嬌鐢ㄨ繖涓狣LL鐨勯」鐩礬寰勪腑銆?/pre>
鍥犳錛屽垱寤轟竴涓柊鐨勭┖鐨刉in32鎺у埗鍙伴」鐩茍娣誨姞涓涓簮鏂囦歡銆傚皢鎴戜滑鍒涘緩濂界殑DLL鏀懼叆涓庢柊欏圭洰鐩稿悓鐨勭洰褰曚笅銆傚悓鏃舵垜浠繕蹇呴』閾炬帴鍒癲ll_test.lib鏂囦歡銆?/pre>
鍙互鍦ㄩ」鐩睘鎬т腑璁劇疆錛屼篃鍙互鍦ㄦ簮紼嬪簭涓敤涓嬮潰鐨勮鍙ユ潵閾炬帴錛?
#pragma comment(lib, "dll_test.lib")
鏈鍚庯紝鎴戜滑榪樿鍦ㄦ柊鐨剋in32鎺у埗鍙伴」鐩腑鍖呭惈鍓嶉潰鐨刣ll_test.h澶存枃浠躲傚彲浠ユ妸榪欎釜澶存枃浠舵斁鍒版柊寤簑in32鎺у埗鍙伴」鐩殑鐩綍涓劧鍚庡湪紼嬪簭涓姞鍏ヨ鍙ワ細
#include "dll_test.h"
鏂伴」鐩唬鐮佸涓嬶細
#include<iostream>
#include "DLLTutorial.h"
int main()
{
  Function();
  std::cout<< Add(32, 56)<< endl;
  return 0;
}
(2)鏄劇ず閾炬帴
紼嶅井澶嶆潅涓鐐圭殑鍔犺澆DLL鐨勬柟娉曢渶瑕佺敤鍒板嚱鏁版寚閽堝拰涓浜沇indows鍑芥暟銆備絾鏄紝閫氳繃榪欑杞藉叆DLL鐨勬柟娉曪紝涓嶉渶瑕丏LL鐨?lib鏂囦歡鎴栧ご鏂囦歡錛岃屽彧闇瑕丏LL鍗沖彲銆?/pre>
涓嬮潰鍒楀嚭涓浜涗唬鐮侊細
/****************************************************************/
#include <iostream>
#include <windows.h>
typedef int (*AddFunc)(int,int);
typedef void (*FunctionFunc)();
int main()
{
AddFunc _AddFunc;
   FunctionFunc _FunctionFunc;
   HINSTANCE hInstLibrary = LoadLibrary("DLL_Tutorial.dll");
   if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
   _AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
   _FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary, "Function");
   if ((_AddFunc == NULL) || (_FunctionFunc == NULL))
{
FreeLibrary(hInstLibrary);
}
   std::cout << _AddFunc(23, 43) << std::endl;
   _FunctionFunc();
   std::cin.get();
   FreeLibrary(hInstLibrary);
   return(1);
}
/*******************************************************************/
棣栧厛鍙互鐪嬪埌錛岃繖閲屽寘鎷繘浜唚indows.h澶存枃浠訛紝鍚屾椂鍘繪帀浜嗗dll_test.h澶存枃浠剁殑鍖呭惈銆傚師鍥犲緢綆鍗曪細鍥犱負windows.h鍖呭惈浜嗕竴浜沇indows鍑芥暟錛?/pre>
瀹冧篃鍖呭惈浜嗕竴浜涘皢浼氱敤鍒扮殑Windows鐗瑰畾鍙橀噺銆傚彲浠ュ幓鎺塂LL鐨勫ご鏂囦歡錛屽洜涓哄綋浣跨敤榪欎釜鏂規硶杞藉叆DLL鏃跺茍涓嶉渶瑕佸叾澶存枃浠躲?/pre>
涓嬮潰浣犱細鐪嬪埌錛氫互涓嬮潰褰㈠紡鐨勪竴灝忓潡鍙ょ伒綺炬殑浠g爜:
    typedef int (*AddFunc)(int,int);
typedef void (*FunctionFunc)();
    榪欐槸鍑芥暟鎸囬拡銆傚洜涓鴻繖鏄竴涓叧浜嶥LL鐨勮嚜瀛︽寚鍗楋紝娣卞叆鎺㈢┒鍑芥暟鎸囬拡瓚呭嚭浜嗘湰鎸囧崡鐨勮寖鍥達紱鍥犳錛岀幇鍦ㄦ垜浠彧鎶婂畠浠綋浣淒LL鍖呭惈鐨勫嚱鏁扮殑鍒悕銆?/pre>
    鎴戝枩嬈㈠湪灝鵑儴鐢?#8220;Func”鍛藉悕涔嬨?int,int)閮ㄥ垎鏄繖涓嚱鏁扮殑鍙傛暟閮ㄥ垎錛屾瘮濡傦紝Add鍑芥暟瑕佽幏寰椾袱涓暣鏁幫紱鍥犳錛屼綘闇瑕佸畠浠?/pre>
錛堣瘧娉細鎸?int,int)閮ㄥ垎錛変綔涓哄嚱鏁版寚閽堢殑鍙傛暟銆侳unction鍑芥暟娌℃湁鍙傛暟錛屽洜姝や綘璁╁畠涓虹┖銆俶ain()閮ㄥ垎涓殑鍓嶉潰涓よ鏄0鏄庡嚱鏁版寚閽堜互浣垮緱浣犲彲
浠ヨ涓哄畠浠瓑鍚屼簬DLL鍐呴儴鐨勫嚱鏁般傛垜鍙槸鍠滄棰勫厛瀹氫箟瀹冧滑銆?/pre>
      涓涓狧INSTANCE鏄竴涓猈indows鏁版嵁綾誨瀷錛氭槸涓涓疄渚嬬殑鍙ユ焺錛涘湪姝ゆ儏鍐典笅錛岃繖涓疄渚嬪皢鏄繖涓狣LL銆備綘鍙互閫氳繃浣跨敤鍑芥暟LoadLibrary()鑾峰緱DLL鐨?/pre>
瀹炰緥錛屽畠鑾峰緱涓涓悕縐頒綔涓哄弬鏁般?/pre>
     鍦ㄨ皟鐢↙oadLibrary鍑芥暟鍚庯紝浣犲繀闇鏌ョ湅涓涓嬪嚱鏁拌繑鍥炴槸鍚︽垚鍔熴備綘鍙互閫氳繃媯鏌INSTANCE鏄惁絳変簬NULL錛堝湪Windows.h涓畾涔変負0鎴朩indows.h鍖?/pre>
鍚殑涓涓ご鏂囦歡錛夋潵鏌ョ湅鍏舵槸鍚︽垚鍔熴傚鏋滃叾絳変簬NULL錛岃鍙ユ焺灝嗘槸鏃犳晥鐨勶紝騫朵笖浣犲繀闇閲婃斁榪欎釜搴撱傛崲鍙ヨ瘽璇達紝浣犲繀闇閲婃斁DLL鑾峰緱鐨勫唴瀛樸?/pre>
      濡傛灉鍑芥暟榪斿洖鎴愬姛錛屼綘鐨凥INSTANCE灝卞寘鍚簡鎸囧悜DLL鐨勫彞鏌勩備竴鏃︿綘鑾峰緱浜嗘寚鍚慏LL鐨勫彞鏌勶紝浣犵幇鍦ㄥ彲浠ヤ粠DLL涓噸鏂拌幏寰楀嚱鏁般?/pre>
     涓轟簡榪欐牱浣滐紝浣犲繀欏諱嬌鐢ㄥ嚱鏁癎etProcAddress()錛屽畠灝咲LL鐨勫彞鏌勶紙浣犲彲浠ヤ嬌鐢℉INSTANCE錛夊拰鍑芥暟鐨勫悕縐頒綔涓哄弬鏁般備綘鍙互璁╁嚱鏁版寚閽堣幏寰楃敱
GetProcAddress()榪斿洖鐨勫鹼紝鍚屾椂浣犲繀闇灝咷etProcAddress()杞崲涓洪偅涓嚱鏁板畾涔夌殑鍑芥暟鎸囬拡銆備婦涓緥瀛愶紝瀵逛簬Add()鍑芥暟錛屼綘蹇呴渶灝咷etProcAddress()
杞崲涓篈ddFunc錛涜繖灝辨槸瀹冪煡閬撳弬鏁板強榪斿洖鍊肩殑鍘熷洜銆傜幇鍦紝鏈濂藉厛紜畾鍑芥暟鎸囬拡鏄惁絳変簬NULL浠ュ強瀹冧滑鎷ユ湁DLL鐨勫嚱鏁般?/pre>
     榪欏彧鏄竴涓畝鍗曠殑if璇彞錛涘鏋滃叾涓竴涓瓑浜嶯ULL錛屼綘蹇呴渶濡傚墠鎵榪伴噴鏀懼簱銆備竴鏃﹀嚱鏁版寚閽堟嫢鏈塂LL鐨勫嚱鏁幫紝浣犵幇鍦ㄥ氨鍙互浣跨敤瀹冧滑浜嗭紝浣嗘槸榪欓噷鏈変竴涓?/pre>
闇瑕佹敞鎰忕殑鍦版柟錛氫綘涓嶈兘浣跨敤鍑芥暟鐨勫疄闄呭悕縐幫紱浣犲繀闇浣跨敤鍑芥暟鎸囬拡鏉ヨ皟鐢ㄥ畠浠傚湪閭d互鍚庯紝鎵鏈変綘闇瑕佸仛鐨勬槸閲婃斁搴撳姝よ屽凡銆?/pre>
     鐜板湪浣犵煡閬撲簡DLL鐨勪竴浜涘熀鏈煡璇嗐備綘鐭ラ亾濡備綍鍒涘緩瀹冧滑錛屼綘涔熺煡閬撳浣曠敤涓ょ涓嶅悓鐨勬柟娉曢摼鎺ュ畠浠傝繖閲屼粛鐒舵湁鏇村鐨勪笢瑗塊渶瑕佹垜浠涔狅紝浣嗘垜鎶婂畠浠暀緇欎綘浠嚜宸辨帰绱簡鍜屾洿媯掔殑浣滆呮潵鍐欎簡銆?


]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              正在播放亚洲一区| 亚洲已满18点击进入久久| 亚洲精品美女91| 亚洲视频免费在线| 亚洲免费精品| 夜夜精品视频| 亚洲另类一区二区| 亚洲欧洲视频在线| 亚洲看片网站| 中文网丁香综合网| 亚洲免费视频中文字幕| 欧美一区二区高清| 久久久天天操| 91久久午夜| 亚洲天堂视频在线观看| 午夜精品婷婷| 乱中年女人伦av一区二区| 欧美国产国产综合| 国产精品毛片在线看| 国内外成人免费激情在线视频网站 | 欧美激情女人20p| 欧美精品亚洲| 国产啪精品视频| 国产色综合久久| 日韩亚洲在线观看| 久久精品免费| av成人免费观看| 美女免费视频一区| 国产美女精品视频| 宅男精品导航| 亚洲高清在线精品| 欧美在线关看| 国产精品欧美久久| 亚洲精品一区在线| 久久久综合网站| 亚洲一区久久| 欧美日韩午夜剧场| 亚洲国产成人高清精品| 欧美一区二区视频在线观看2020| 欧美大片在线观看一区| 午夜伦欧美伦电影理论片| 欧美日韩精品久久久| 亚洲精品1区2区| 久久久久**毛片大全| 亚洲一级影院| 欧美网站在线| 亚洲一区日本| 一区二区欧美日韩| 欧美日韩p片| 亚洲成人影音| 久久久久国产精品一区| 亚洲天堂av在线免费| 欧美日韩视频一区二区| 亚洲精选中文字幕| 亚洲国产日韩欧美综合久久 | 亚洲一区日韩在线| 久久综合色播五月| 国产永久精品大片wwwapp| 亚洲免费影视| 在线亚洲欧美| 国产精品久久99| 午夜精品免费| 午夜在线观看欧美| 国产午夜精品美女毛片视频| 欧美一区二区三区免费在线看| 亚洲深夜福利视频| 国产精品专区一| 久久久精彩视频| 卡通动漫国产精品| 亚洲免费成人av| 99国产精品视频免费观看| 欧美日韩国产限制| 亚洲男人的天堂在线aⅴ视频| 亚洲淫片在线视频| 一区在线影院| 欧美激情一区二区在线 | 亚洲黄色在线| 亚洲久久视频| 国产精品素人视频| 久久综合久久综合久久综合| 欧美freesex8一10精品| 亚洲少妇自拍| 欧美一区二区三区视频| 亚洲国产精品一区二区www| 91久久在线视频| 国产精品一区二区在线观看| 久久久噜噜噜久久狠狠50岁| 免费一区二区三区| 亚洲综合色激情五月| 亚欧成人在线| 亚洲免费观看| 欧美在线免费观看视频| 亚洲欧洲一二三| 亚洲欧美一级二级三级| 亚洲电影在线播放| 亚洲永久免费精品| 亚洲另类在线视频| 欧美在线看片| 午夜精品福利在线观看| 狼狼综合久久久久综合网| 亚洲男女毛片无遮挡| 另类激情亚洲| 久久经典综合| 欧美网站大全在线观看| 欧美电影在线观看完整版| 国产精品激情电影| 亚洲国产精品一区二区第四页av| 国产精品日韩一区二区| 欧美激情1区2区3区| 国产日韩在线看片| 99re6这里只有精品| 亚洲大片在线| 久久国产精品99久久久久久老狼| 韩国一区电影| 国产精品福利久久久| 免费观看日韩| 国产欧美日韩视频| 妖精视频成人观看www| 亚洲黄色av一区| 久久久久国产精品www| 亚洲一区二区三区激情| 欧美 日韩 国产在线| 久久久久久网| 国产日韩成人精品| 亚洲一区国产一区| 午夜精品久久久久| 国产精品久久影院| 在线视频亚洲欧美| 国产精品99久久久久久www| 欧美成人69av| 亚洲国内欧美| 亚洲精品视频免费| 欧美二区视频| 亚洲精品男同| 亚洲制服av| 国产欧美 在线欧美| 亚洲综合欧美| 久久精品成人| 一区二区在线视频播放| 久久久一区二区| 亚洲成人在线视频播放| 国产欧美日韩视频一区二区| 午夜精品久久久久| 久久免费少妇高潮久久精品99| 国产精品区免费视频| 亚洲一区国产精品| 久久久久久午夜| 在线观看日韩av先锋影音电影院| 久久久国际精品| 亚洲第一中文字幕| 亚洲图片在线| 国产视频精品网| 久久综合久久88| 亚洲免费成人av| 欧美一区二区三区精品电影| 国产无一区二区| 欧美aⅴ一区二区三区视频| 亚洲精品国产精品国自产观看浪潮| 日韩亚洲欧美成人一区| 国产精品成人在线观看| 欧美中日韩免费视频| 亚洲大片免费看| 亚洲线精品一区二区三区八戒| 国产日韩欧美亚洲一区| 免费成人av资源网| 亚洲一区二区三区精品在线| 你懂的国产精品| 亚洲网站视频| 激情视频一区二区三区| 欧美日本簧片| 久久精品一区二区国产| 亚洲美女黄色片| 久久久女女女女999久久| 9久草视频在线视频精品| 国产日韩精品入口| 欧美日韩123| 老牛嫩草一区二区三区日本| 亚洲色图综合久久| 亚洲国产精品一区二区第一页| 性久久久久久久| 一片黄亚洲嫩模| 在线日本欧美| 国产婷婷色一区二区三区| 欧美日韩不卡| 欧美成人一品| 欧美国产一区在线| 美女主播一区| 亚洲综合色网站| 日韩视频在线观看一区二区| 久久免费99精品久久久久久| 在线视频日韩| 亚洲日本视频| 黄色亚洲网站| 国产欧美日本| 国产精品豆花视频| 欧美高清在线一区二区| 久久综合伊人77777尤物| 午夜精品久久久久久久久久久久久| 亚洲人成人99网站| 欧美电影在线免费观看网站|