锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍋氭硶錛?br>1銆佸皢鐗涜倝媧楀噣鍒囧潡鍏ラ攨錛岄攨閲屽姞姘淬傜叜寮浠ュ悗錛屾拠鍘繪誕娌紝杞皬鐏參鐐栦袱涓皬鏃跺乏鍙熾?br>
2銆佸湡璞嗐佹磱钁卞垏鍧楋紝鑳¤悵鍗滃幓鐨垏鍧楋紝鑺硅彍鏂滅潃鍒囨錛屽渾鐧借彍鍒囧ぇ鐗囥?br>
3銆佸皢鎵鏈夌殑钄彍閮芥斁鍏ラ攨閲岋紝澶х伀鐑у紑鍚庤漿灝忕伀鎺ョ潃鐐栥?br>
4銆佽タ綰㈡熆鍒囦竵錛屽彟璧蜂竴閿呯儹娌癸紝鍊掑叆瑗跨孩鏌夸竵鍜岃タ綰㈡熆閰辯炕鐐掕嚦瑗跨孩鏌夸竵鐔熺儌浠ュ悗錛屽掑叆
姹ら攨閲岋紝鍔犵洂璋冨懗錛屽啀鐐栦竴涓皬鏃跺乏鍙沖嵆鍙?
]]>
澹版槑錛氭湰鏂囧彲浠ヤ笉緇忎綔鑰呭悓鎰忎換鎰忚漿杞斤紝浣嗕換浣曞鏈枃鐨勫紩鐢ㄩ兘欏繪敞鏄庝綔鑰呫佸嚭澶勫強(qiáng)姝ゅ0鏄庝俊鎭傝阿璋紒錛?br>
銆銆瑕佷簡(jiǎn)瑙f綃囨枃绔犱腑寮曠敤鐨勬湰浜哄啓鐨勫彟涓綃囨枃绔狅紝璇峰埌浠ヤ笅鍦板潃錛?br>http://m.shnenglu.com/zjl-1026-2001/archive/2009/08/15/93427.html
浠ヤ笂鐨勮繖綃囨枃绔犳槸鏃╁湪鍘誨勾鐨勬椂鍊欏啓鐨勪簡(jiǎn)錛屽綋鏃舵鍦ㄤ綔浼戦棽騫沖彴錛屼竴鐩村湪鎯崇潃濡備綍瀹炵幇涓涓彲鎵╁厖鐨勬敮鎸佺櫨涓囦漢鍦ㄧ嚎鐨勬父鎴忓鉤鍙幫紝鍚庢潵鎬濊礬鏈変簡(jiǎn)錛屽氨鍐欎簡(jiǎn)閭g瘒鎬葷粨銆傛枃绔犵殑鎰忔濓紝閲嶇偣鍦ㄤ簬闃愯堪涓涓櫨涓囩駭鍦ㄧ嚎鐨勭郴緇熸槸濡備綍瀹炴柦鐨勶紝鍊掓病鐪熸璁ょ湡鍦拌冨療榪嘠Q娓告垙鍒板簳鏄笉鏄偅鏍峰疄鐜扮殑銆?br>
銆銆榪戞棩鍦ㄤ笌涓氬唴浜哄+璁ㄨ鏃訛紝鎻愬埌QQ娓告垙鐨勫疄鐜版柟寮忓茍涓嶆槸鎴戝師鏉ユ墍鎯崇殑閭f牱錛屼簬鏄紝浠婂ぉ鍙堣鐪熸姄浜?jiǎn)涓涓婹Q娓告垙鐨勫寘錛岀粨鏋滅‘濡傝繖浣嶅厔寮熸墍璦錛孮Q娓告垙鐨勬灦鏋勪笌鎴戝綋鍒濇墍璁炬兂鐨勯偅涓灦鏋勭浉宸‘瀹炰笉灝忋備笅闈紝鎴戦噸鏂扮粰鍑篞Q鐧句竾綰у湪綰跨殑鎶鏈疄鐜版柟妗堬紝騫朵互姝ゅ睍寮錛岃皥璋堝ぇ鍨嬪湪綰跨郴緇熶腑鐨勮礋杞藉潎琛℃満鍒剁殑璁捐銆?br>
銆銆浠嶲Q娓告垙鐨勭櫥褰曞強(qiáng)娓告垙榪囩▼鏉ョ湅錛孮Q娓告垙涓紝涔熻嚦灝戝垎涓轟笁綾?a class=mykeyword title=http://www.doserver.net/tag.php?tag=%E6%9C%8D%E5%8A%A1%E5%99%A8 target=_blank>鏈嶅姟鍣?/font>銆傚畠浠槸錛?br>銆銆絎竴灞傦細(xì)鐧婚檰/璐﹀彿鏈嶅姟鍣?Login Server)錛岃礋璐i獙璇佺敤鎴瘋韓浠姐佸悜瀹㈡埛绔紶閫佸垵濮嬩俊鎭紝浠嶲Q鑱婂ぉ杞歡鐨勫皝鍖呭父璇嗘潵鐪嬶紝榪欎簺鍒濆淇℃伅鍙兘鍖呮嫭“浼?xì)璇濆瘑閽?#8221;姝ょ被鐨勪俊鎭紝浠ュ悗瀹㈡埛绔笌鍚庣畫鏈嶅姟鍣ㄧ殑閫氫俊灝變嬌鐢ㄦ浼?xì)璇濆瘑閽q涜韜喚楠岃瘉鍜屼俊鎭姞瀵嗭紱
銆銆絎簩灞傦細(xì)澶у巺鏈嶅姟鍣?浼頒笖榪欎箞鍙惂, Game Hall Server)錛岃礋璐e悜瀹㈡埛绔紶閫掑綋鍓嶆父鎴忎腑鐨勬墍鏈夋埧闂翠俊鎭紝榪欎簺鎴塊棿淇℃伅鍖呮嫭錛氬悇鎴塊棿鐨勮繛鎺P錛孭ORT錛屽悇鎴塊棿鐨勫綋鍓嶅湪綰夸漢鏁幫紝鎴塊棿鍚嶇О絳夌瓑銆?br>銆銆絎笁灞傦細(xì)娓告垙閫昏緫鏈嶅姟鍣?Game Logic Server)錛岃礋璐e鐞嗘埧闂撮昏緫鍙?qiáng)鎴块棿鍐呯殑妗屽瓙閫昏緫銆?br>
銆銆浠庨潤(rùn)鎬佺殑琛ㄨ堪鏉ョ湅錛屼互涓婄殑涓夊眰緇撴瀯浼間箮涓庢垜浠ュ墠鍐欑殑閭g瘒鏂囩珷鐩告瘮騫舵病鏈夊お澶х殑鍖哄埆錛屼簨瀹炰笂錛岄噸鐐規(guī)槸瀹冪殑宸ヤ綔嫻佺▼錛孮Q娓告垙鐨勯氫俊嫻佺▼涓庢垜浠ュ墠鐨勮鎯沖彲璋撳ぇ鐩稿緞搴紝鍏惰璁℃濇兂鍜屾妧鏈按騫崇‘瀹為潪甯鎬紭縐銆傚叿浣撴潵璇達(dá)紝QQ娓告垙鐨勯氫俊榪囩▼鏄繖鏍風(fēng)殑錛?br>
銆銆1.鐢盋lient鍚慙ogin Server鍙戦佽處鍙峰強(qiáng)瀵嗙爜絳夌櫥褰曟秷鎭紝Login Server鏍規(guī)嵁鏍¢獙緇撴灉榪斿洖鐩稿簲淇℃伅銆傚彲浠ヨ鎯崇殑鏄紝濡傛灉Login Server閫氳繃浜?jiǎn)Client鐨勯獙璇侊紝閭d箞瀹冧細(xì)閫氱煡鍏跺畠Game Hall Server鎴栧皢閫氳繃楠岃瘉鐨勬秷鎭互鍙?qiáng)浼?xì)璇濆瘑閽ユ斁鍦℅ame Hall Server涔熷彲浠ュ彇鍒扮殑鍦版柟銆傛諱箣錛孡ogin Server涓嶨ame Hall Server涔嬮棿鏄彲浠ュ叡浜繖涓牎楠屾垚鍔熸秷鎭殑銆備竴鏃lient鏀跺埌浜?jiǎn)Login Server榪斿洖鎴愬姛鏍¢獙鐨勬秷鎭悗錛孡ogin Server浼?xì)涓诲姩鏂紑涓嶤lient鐨勮繛鎺ワ紝浠ヨ吘鍑簊ocket璧勬簮銆侺ogin Server鐨処P淇℃伅錛屾槸瀛樻斁鍦≦QGame\config\QQSvrInfo.ini閲岀殑銆?br>
銆銆2.Client鏀跺埌Login Server鐨勬牎楠屾垚鍔熺瓑娑堟伅鍚庯紝寮濮嬫牴鎹簨鍏堥夊畾鐨勬父鎴忓ぇ鍘呭叆鍙g櫥褰曟父鎴忓ぇ鍘咃紝鍚勪釜娓告垙澶у巺Game Hall Server鐨処P鍙?qiáng)Port淇℃伅錛屾槸瀛樻斁鍦≦QGame\Dirconfig.ini閲岀殑銆侴ame Hall Server鏀跺埌瀹㈡埛绔疌lient鐨勭櫥褰曟秷鎭悗錛屼細(xì)鏍規(guī)嵁涓瀹氱殑絳栫暐鍐沖畾鏄惁鎺ュ彈Client鐨勭櫥褰曪紝濡傛灉褰撳墠鐨凣ame Hall Server宸茬粡鍒頒簡(jiǎn)涓婇檺鎴栨殏鏃朵笉鑳藉鐞嗗綋鍓嶇帺瀹剁櫥褰曟秷鎭紝鍒欑敱Game Hall Server鍙戞秷鎭粰C(jī)lient錛屼互璁〤lient閲嶅畾鍚戝埌鍙﹀鐨凣ame Hall Server鐧誨綍銆傞噸瀹氬悜鐨処P鍙?qiáng)绔彛淇℃伅锛屾湰鍦版病鏈変繚瀛樺Q屾槸閫氳繃鏁版嵁鍖呮垨涓瀹氱殑綆楁硶寰楀埌鐨勩傚鏋滃綋鍓嶇殑Game Hall Server鎺ュ彈浜?jiǎn)璇ョ帺瀹剁殑鐧诲綍娑堟伅鍚庡Q屼細(xì)鍚戣Client鍙戦佹埧闂寸洰褰曚俊鎭紝榪欎簺淇℃伅鐨勫唴瀹規(guī)垜涓婇潰宸茬粡鎻愬埌銆傜洰褰曠瓑娑堟伅鍙戦佸畬姣曞悗錛孏ame Hall Server鍗蟲(chóng)柇寮涓嶤lient鐨勮繛鎺ワ紝浠ヨ吘鍑簊ocket璧勬簮銆傚湪姝ゅ悗鐨勬椂闂撮噷錛孋lient姣忛殧30鍒嗛挓浼?xì)閲嶆柊杩炴帴Game Hall Server騫跺悜鍏剁儲(chǔ)瑕佹渶鏂扮殑鎴塊棿鐩綍淇℃伅鍙?qiáng)鍦ňU夸漢鏁頒俊鎭?br>
銆銆3.Client鏍規(guī)嵁鍒楀嚭鐨勬埧闂村垪琛紝閫夋嫨鏌愪釜鎴塊棿榪涘叆娓告垙銆傛牴鎹垜鐨勬姄鍖呯粨鏋滃垎鏋愶紝QQ娓告垙錛屽茍涓嶆槸緇欐瘡涓涓父鎴忔埧闂撮兘鍒嗛厤浜?jiǎn)涓涓崟鐙殑绔彛榪涜澶勭悊銆傚湪QQ娓告垙閲岋紝鏈夊緢澶氭埧闂存槸鍏辯敤鐨勫悓涓涓狪P鍜屽悓涓涓鍙c傛瘮濡傦紝鍦ㄦ枟鍦頒富涓鍖猴紝鍓?0涓埧闂達(dá)紝鐢ㄧ殑閮芥槸鍚屼竴涓狪P鍜孭ort淇℃伅銆傝繖鎰忓懗鐫錛岃繖浜涙埧闂達(dá)紝鍦≦Q娓告垙鐨勬湇鍔″櫒涓婏紝浜嬪疄涓婏紝鍙兘鏄悓涓涓▼搴忓湪澶勭悊錛侊紒錛丵Q娓告垙鎴塊棿鐨勪漢鏁頒笂闄愭槸400浜猴紝涓嶉毦鎺ㄧ畻錛孮Q娓告垙鍗曚釜鏈嶅姟鍣ㄧ▼搴忕殑鐢ㄦ埛鎵胯澆閲忔槸2涓囷紝鍗砆Q鐨勪竴涓父鎴忛昏緫鏈嶅姟鍣ㄧ▼搴忔渶澶氬彲鍚屾椂涓?涓囦釜鐜╁淇濇寔TCP榪炴帴騫朵繚璇佹父鎴忔晥鐜囧拰鍝佽川錛屾洿閲嶈鐨勬槸錛岃繖鏍峰彲浠ヤ負(fù)鑵捐鐪佸灝憁oney鍛錛侊紒錛佸搰鍝︼紒QQ紜疄寰堢墰銆備互2涓囩殑鍦ㄧ嚎鏁拌繕鑳戒繚鎸佽繖涔堝ソ鐨勬父鎴忓搧璐紝紜疄涓嶅鏄擄紒QQ娓告垙鐨勫崟涓湇鍔″櫒紼嬪簭錛岀鐞嗙殑涓嶅啀鍙槸閫昏緫鎰忎箟涓婄殑鍗曚釜鎴塊棿錛岃屽彲鑳芥槸璁稿閫昏緫鎰忎箟涓婄殑鎴塊棿銆傚叾瀹烇紝瀵逛簬鏈嶅姟鍣ㄨ岃█錛屽畠?yōu)鏄竴涓ぇ鍖烘湇鍔″櫒鎴栧ぇ鍖烘湇鍔″櫒鐨勪竴閮ㄥ垎錛屾垜浠彲浠ユ妸瀹冪悊瑙d負(fù)涓涓簽澶х殑娓告垙鍦板浘錛屽畠瀹炵幇鐨勪篃鏄垎鍧楀鐞嗐傝屽浜庢瘡涓寮犳瀛愪笂鐨勬墦鐗岄昏緫錛屽垯鏄湁涓涓粺涓鐨勫鐞嗘祦紼嬶紝50涓埧闂寸殑50錛?00寮犳瀛愬叏鐢辮繖涓涓湇鍔″櫒紼嬪簭榪涜澶勭悊(鎴戜笉鐭ラ亾QQ娓告垙鐨勫叿浣撴墦鐗岄昏緫鏄浣曡璁$殑錛屾垜鎯沖緢鏈夊彲鑳戒篃鏄垎鍖哄煙鐨勶紝鍒嗗潡鐨?銆傚綋鐒?dòng)灱屼互涓姌q欎簺鍙槸鏈嶅姟鍣ㄤ綔鐨勪簨錛岄拡瀵逛簬瀹㈡埛绔岃█錛屽鎴風(fēng)鍙槸鍦ㄨ〃鐜頒笂錛屽皢涓涓釜鎴塊棿鍗曠嫭緗楀垪浜?jiǎn)鍑烘潵锛寴q欐牱浣滐紝鏄負(fù)渚夸簬鐜╁榪涜娓告垙浠ュ強(qiáng)鍑忓皯鏈嶅姟鍣ㄧ殑寮閿錛屾妸榪欎釜澶у尯涓殑姣?00浜烘斁鍦ㄤ竴涓泦鍚堝唴榪涜澶勭悊錛堟瘮濡傝亰澶╀俊鎭紝“鍚?00浜哄箍鎾?#8221;鍜?#8220;鍚?涓囦漢騫挎挱”錛岃繖鏄畬鍏ㄤ笉鍚岀殑涓や釜姒傚康錛夈?br>
銆銆4.闇瑕佺壒鍒鏄庣殑涓鐐廣傝繘鍏Q娓告垙鎴塊棿鍚庯紝鐩村埌鐐瑰嚮鏌愪釜浣嶇疆鍧愪笅鎵撳紑鍙︿竴涓▼搴忕晫闈紝瀹㈡埛绔殑紼嬪簭錛屾病鏈夊啀鍒涘緩鏂扮殑socket錛岃屼粛鐒朵嬌鐢ㄥ師鏉ュぇ鍘呮埧闂村鎴風(fēng)璺熸父鎴忛昏緫鏈嶅姟鍣ㄤ氦浜掔敤鐨剆ocket銆備篃灝辨槸璇達(dá)紝榪欐槸涓や釜榪涚▼鍏辯敤鐨勫悓涓涓猻ocket錛佷笉瑕佸皬鐪嬭繖涓鐐廣傚鏋滀綘鍦ㄥ垱寤烘瀛愬鎴風(fēng)紼嬪簭鍚庡張鏂板緩浜?jiǎn)涓涓柊鐨剆ocket涓庢父鎴忛昏緫鏈嶅姟鍣ㄨ繘琛岄氫俊錛岄偅涔堢敱姝ゅ甫鏉ョ殑鐜╁榪涘叆銆侀鍑恒侀冭窇絳夋秷鎭細(xì)甯︽潵闈炲父楹葷儲(chǔ)鐨勬暟鎹悓姝ラ棶棰橈紝淇哄湪鍒氬紑濮嬬殑鏃跺欏氨娣卞彈鍏跺銆傝屼竴鏃﹀叡鐢ㄤ簡(jiǎn)鍚屼竴涓猻ocket鍚庯紝浣犲鏋滈鍑烘瀛愶紝鏈嶅姟鍣ㄤ笉娑夊強(qiáng)閲婃斁socket鐨勯棶棰橈紝鎵浠ワ紝榪欓噷灝卞皯浜?jiǎn)寰堝鐨勬暟鎹悓姝ラ棶棰樸傚叧浜庡涓繘紼嬪浣曞叡浜悓涓涓猻ocket鐨勯棶棰橈紝璇峰幓google浠ヤ笅鍐呭錛歐SADuplicateSocket銆?br>
銆銆浠ヤ笂渚挎槸鎴戞牴鎹渶鏂扮殑QQ娓告垙鎶撳寘緇撴灉鍒嗘瀽寰楀埌鐨凲Q娓告垙鐨勯氫俊嫻佺▼錛屽綋鐒?dòng)灱寴q欎釜嫻佺▼鏇村鐨勬槸瀹㈡埛绔浣曚笌鏈嶅姟鍣ㄤ箣闂翠氦浜掔殑錛屽嵈娌℃湁娑夊強(qiáng)鍒版湇鍔″櫒褰兼涔嬮棿鏄浣曢氫俊鍜屼綔鏁版嵁鍚屾鐨勩傚叧浜庢湇鍔″櫒涔嬮棿鐨勯氫俊嫻佺▼錛屾垜浠彧鑳藉熀浜庤嚜宸辯殑緇忛獙鍜岀寽鎯籌紝寰楀嚭浠ヤ笅鎯蟲(chóng)硶錛?br>
銆銆1.Login Server涓嶨ame Hall Server涔嬪墠鐨勯氫俊闂銆侺ogin Server鏄礋璐g敤鎴烽獙璇佺殑錛屼竴鏃﹂獙璇侀氳繃涔嬪悗錛屽畠瑕佽娉曡Game Hall Server鐭ラ亾榪欎釜娑堟伅銆傚畠浠箣鍓嶅疄鐜頒俊鎭氦嫻佺殑閫斿緞錛屾垜鎯沖彲鑳芥湁榪欐牱鍑犳潯錛歛. Login Server灝嗛氳繃楠岃瘉鐨勭敤鎴峰瓨鏀懼埌涓存椂鏁版嵁搴撲腑錛沚.銆Login Server灝嗛獙璇侀氳繃鐨勭敤鎴峰瓨鏀懼湪鍐呭瓨?shù)腑锛屽綋鐒跺Q岃繖涓俊鎭紝搴旇鏄叏灞鍙闂殑錛屽氨鏄鎵鏈塓Q鐨凣ame Hall Server閮藉彲浠ラ氳繃鏈嶅姟鍣ㄤ箣闂寸殑鏁版嵁鍖呴氫俊鍘昏幏寰楄繖鏍風(fēng)殑淇℃伅銆?br>
銆銆2.Game Hall Server鐨勬渶鏂版埧闂寸洰褰曚俊鎭殑鍙栧緱銆傝繖涓俊鎭紝鏄叏灞鐨勶紝涔熷氨鏄暣涓父鎴忎腑錛屽彧淇濈暀涓涓洰褰曘傚畠鐨勪俊鎭潵婧愶紝鍙互鐢卞簳灞傜殑鎴塊棿鏈嶅姟鍣ㄩ愮駭鎶ヤ笂鏉ワ紝鎶ョ粰璋侊紵鎴戣涓哄氨濡備繚瀛樼殑鍏ㄥ眬鐧誨綍鍒楄〃涓鏍鳳紝瀹冩姤緇欎繚瀛樺叏灞鐧誨綍鍒楄〃鐨勯偅涓湇鍔″櫒鎴栨暟鎹簱銆?br>
銆銆3.鍦≦Q娓告垙涓紝鍚屼竴綾誨瀷鐨勬父鎴忥紝鏃犳硶鎵撳紑涓や笂浠ヤ笂鐨勬父鎴忔埧闂淬傝繖涓俊鎭殑鍒ゅ畾錛屽彲浠ユ牴鎹叏灞淇℃伅鏉ュ垽瀹氥?br>
銆銆浠ヤ笂鍏充簬鏈嶅姟鍣ㄤ箣闂村浣曢氫俊鐨勫唴瀹癸紝鍧囧睘浜庝釜浜虹寽鎯籌紝QQ鍒板簳鎬庝箞浣滅殑錛屾亹鎬曞彧鏈夌瓑澶у涓殑鏌愪竴浣嶈繘浜?jiǎn)鑵捐涔嬪悗鎵嶇煡閬撲簡(jiǎn)銆傚懙鍛點(diǎn)備笉榪囷紝鏈変竴鐐規(guī)槸鍙互鑲畾鐨勶紝鍦ㄦ暣涓湇鍔″櫒鏋舵瀯涓紝搴旇鏈変竴涓湴鏂規(guī)槸涓撻棬淇濆瓨?shù)簡(jiǎn)鍏ㄥ眬鐨勭櫥褰曠帺瀹跺垪琛紝鍙湁榪欐牱鎵嶈兘淇濊瘉鐜╁涓嶄細(xì)閲嶅鐧誨綍浠ュ強(qiáng)榪涘叆澶氫釜鐩稿悓綾誨瀷鐨勬埧闂淬?br>
銆銆鍦ㄥ墠闈㈢殑鎻忚堪涓紝鎴戞浘緇忔彁鍒拌繃涓涓棶棰橈細(xì)褰撶櫥褰曞綋鍓岹ame Hall Server涓嶆垚鍔熸椂錛孮Q娓告垙鏈嶅姟鍣ㄤ細(xì)閫夋嫨璁╁鎴風(fēng)閲嶅畾鍚戝埌鍙︿綅鐨勬湇鍔″櫒鍘葷?rùn)诲綍锛屼簨瀹炰笂锛孮Q鑱婂ぉ鏈嶅姟鍣ㄥ拰MSN鏈嶅姟鍣ㄧ殑鐧誨綍涔熸槸綾諱技鐨勶紝瀹冧篃瀛樺湪鐧誨綍閲嶅畾鍚戦棶棰樸?br>
銆銆閭d箞錛岃繖灝卞紩鍑轟簡(jiǎn)鍙﹀鐨勯棶棰橈紝鐢辮皝鏉ヤ綔榪欎釜絳栫暐閫夋嫨錛熶互鍙?qiáng)鐢辫皝鏉ユ彁渚洏q欐牱鐨勯夋嫨璧勬簮錛熻繖鏍風(fēng)殑澶勭悊錛屼究鏄礋璐h礋杞藉潎琛$殑鏈嶅姟鍣ㄧ殑澶勭悊鑼冨洿浜?jiǎn)銆傜敱QQ娓告垙鐨勯氫俊榪囩▼鍒嗘瀽媧劇敓鍑烘潵鐨勯拡瀵硅礋璐e潎琛″強(qiáng)鐧句竾綰у湪綰跨郴緇熺殑鏇磋繘涓姝ヨ璁猴紝灝嗗湪涓嬬瘒鏂囩珷涓戶緇?br>
銆銆鍦ㄦ錛岀壒鍒劅璋㈢綉鍙媡illy鍙?qiáng)鏌愪綅涓嶄緣K忛湶濮撳悕鐨勭綉鍙嬬殑璁ㄨ錛屾槸浣犱滑璁╂垜鍐沖畾璁ょ湡鍐嶆姄涓嬈″寘鎺釜絀剁珶銆?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>
鍦ㄧ數(shù)淇℃湇鍔℃彁渚涘晢绔紝闇瑕佸皢姣忔潯寮閫欰DSL涓氬姟鐨勭數(shù)璇濈嚎璺繛鎺ュ湪鏁板瓧鐢ㄦ埛綰胯礬璁塊棶澶氳礬澶嶇敤鍣?/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;錛夋潵榪炴帴鐢?shù)璇澗U胯礬銆傜敱浜嶢DSL浣跨敤楂橀淇″彿錛屾墍浠ュ湪涓ょ榪橀兘瑕佷嬌鐢?em>ADSL淇″彿鍒嗙鍣?/em>灝咥DSL鏁版嵁淇″彿鍜屾櫘閫氶煶棰戠數(shù)璇濅俊鍙峰垎紱誨嚭鏉ワ紝閬垮厤鎵撶數(shù)璇濈殑鏃跺欏嚭鐜板櫔闊沖共鎵般?/p>
閫氬父鐨凙DSL緇堢鏈変竴涓數(shù)璇滾ine-In錛屼竴涓?a title=浠ュお緗?href="http://m.shnenglu.com/zh-cn/%E4%BB%A5%E5%A4%AA%E7%BD%91">浠ュお緗?/font>鍙o紝鏈変簺緇堢闆嗘垚浜?jiǎn)ADSL淇″彿鍒嗙鍣紝榪樻彁渚涗竴涓繛鎺ョ殑Phone鎺ュ彛銆?/p>
鏌愪簺ADSL璋冨埗瑙h皟鍣ㄤ嬌鐢║SB鎺ュ彛涓庣數(shù)鑴戠浉榪烇紝闇瑕佸湪鐢?shù)鑴戜笂瀹夎鎸囧畾鐨勮蒋錃g浠ユ坊鍔犺櫄鎷熺綉鍗℃潵榪涜閫氫俊銆?/p>
鐢變簬鍙楀埌浼犺緭楂橀淇″彿鐨勯檺鍒訛紝ADSL闇瑕佺數(shù)淇℃湇鍔℃彁渚涘晢绔帴鍏ヨ澶囧拰鐢ㄦ埛緇堢涔嬮棿鐨勮窛紱諱笉鑳借秴榪?鍗冪背錛屼篃灝辨槸鐢ㄦ埛鐨勭數(shù)璇濈嚎榪炲埌鐢?shù)璇濆眬鐨勮窛紱諱笉鑳借秴榪?鍗冪背銆?/p>
ADSL璁懼鍦ㄤ紶杈撲腑闇瑕侀伒寰互涓嬫爣鍑嗕箣涓錛?/p>
榪樻湁涓浜涙洿蹇洿鏂扮殑鏍囧噯錛屼絾鏄洰鍓嶈繕寰堝皯鏈夌數(shù)淇℃湇鍔℃彁渚涘晢浣跨敤錛?/p>
褰撶數(shù)淇℃湇鍔℃彁渚涘晢鐨勮澶囩鍜岀敤鎴風(fēng)粓绔箣闂磋窛紱誨皬浜?.3鍗冪背鐨勬椂鍊欙紝榪樺彲浠ヤ嬌鐢ㄩ熺巼鏇撮珮鐨?a title=VDSL href="http://m.shnenglu.com/zh-cn/VDSL">VDSL錛屽畠鐨勯熺巼鍙互杈懼埌涓嬭55.2Mbps錛屼笂琛?9.2Mbps銆?/p>
ADSL閫氬父鎻愪緵涓夌緗戠粶鐧誨綍鏂瑰紡錛?/p>
鍚庝袱縐嶉氬父涓嶆彁渚涢潤(rùn)鎬両P錛岃屾槸鍔ㄦ佺殑緇欑敤鎴峰垎閰嶇綉緇滃湴鍧銆?/p>
鍦?涓婁竴綃囨枃绔?/font>緇撴潫鏃訛紝鎴戞弿榪頒簡(jiǎn)涓涓瘮杈冪壒孌婄殑闅鵑錛氬鏋滅嚎紼嬫鍦ㄧ瓑寰呮煇涓壒瀹氭潯浠跺彂鐢燂紝瀹冨簲璇ュ浣曞鐞嗚繖縐嶆儏鍐碉紵瀹冨彲浠ラ噸澶嶅浜掓枼瀵硅薄閿佸畾鍜岃В閿侊紝姣忔閮戒細(xì)媯(gè)鏌ュ叡浜暟鎹粨鏋勶紝浠ユ煡鎵炬煇涓箋備絾榪欐槸鍦ㄦ氮璐規(guī)椂闂村拰璧勬簮錛岃屼笖榪欑綣佸繖鏌ヨ鐨勬晥鐜囬潪甯鎬綆銆傝В鍐寵繖涓棶棰樼殑鏈浣蟲(chóng)柟娉曟槸浣跨敤 pthread_cond_wait() 璋冪敤鏉ョ瓑寰呯壒孌婃潯浠跺彂鐢熴? 浜?jiǎn)瑙?pthread_cond_wait() 鐨勪綔鐢ㄩ潪甯擱噸瑕?-- 瀹冩槸 POSIX 綰跨▼淇″彿鍙戦佺郴緇熺殑鏍稿績(jī)錛屼篃鏄渶闅句互鐞嗚В鐨勯儴鍒嗐?/p>
棣栧厛錛岃鎴戜滑鑰冭檻浠ヤ笅鎯呭喌錛氱嚎紼嬩負(fù)鏌ョ湅宸查摼鎺ュ垪琛ㄨ岄攣瀹氫簡(jiǎn)浜掓枼瀵硅薄錛岀劧鑰岃鍒楄〃鎭板閥鏄┖鐨勩傝繖涓鐗瑰畾綰跨▼浠涔堜篃騫蹭笉浜?-- 鍏惰璁℃剰鍥炬槸浠庡垪琛ㄤ腑闄ゅ幓鑺傜偣錛屼絾鏄幇鍦ㄥ嵈娌℃湁鑺傜偣銆傚洜姝わ紝瀹冨彧鑳斤細(xì) 閿佸畾浜掓枼瀵硅薄鏃訛紝綰跨▼灝嗚皟鐢?pthread_cond_wait(&mycond,&mymutex)銆俻thread_cond_wait() 璋冪敤鐩稿綋澶嶆潅錛屽洜姝ゆ垜浠瘡嬈″彧鎵ц瀹冪殑涓涓搷浣溿?/p>
pthread_cond_wait() 鎵鍋氱殑絎竴浠朵簨灝辨槸鍚屾椂瀵逛簰鏂ュ璞¤В閿侊紙浜庢槸鍏跺畠綰跨▼鍙互淇敼宸查摼鎺ュ垪琛級(jí)錛屽茍絳夊緟鏉′歡 mycond 鍙戠敓錛堣繖鏍峰綋 pthread_cond_wait() 鎺ユ敹鍒板彟涓涓嚎紼嬬殑“淇″彿”鏃訛紝瀹冨皢鑻忛啋錛夈傜幇鍦ㄤ簰鏂ュ璞″凡琚В閿侊紝鍏跺畠綰跨▼鍙互璁塊棶鍜屼慨鏀瑰凡閾炬帴鍒楄〃錛屽彲鑳借繕?shù)細(xì)娣诲姞椤广?/p>
姝ゆ椂錛宲thread_cond_wait() 璋冪敤榪樻湭榪斿洖銆傚浜掓枼瀵硅薄瑙i攣浼?xì)绔嬪崨_彂鐢燂紝浣嗙瓑寰呮潯浠?mycond 閫氬父鏄竴涓樆濉炴搷浣滐紝榪欐剰鍛崇潃綰跨▼灝嗙潯鐪狅紝鍦ㄥ畠鑻忛啋涔嬪墠涓嶄細(xì)娑堣?CPU 鍛ㄦ湡銆傝繖姝f槸鎴戜滑鏈熷緟鍙戠敓鐨勬儏鍐點(diǎn)傜嚎紼嬪皢涓鐩寸潯鐪狅紝鐩村埌鐗瑰畾鏉′歡鍙戠敓錛屽湪榪欐湡闂翠笉浼?xì)鍙戠敓鋼Q浣曟氮璐?CPU 鏃墮棿鐨勭箒蹇欐煡璇€備粠綰跨▼鐨勮搴︽潵鐪嬶紝瀹冨彧鏄湪絳夊緟 pthread_cond_wait() 璋冪敤榪斿洖銆?/p>
鐜板湪緇х畫璇存槑錛屽亣璁懼彟涓涓嚎紼嬶紙縐頒綔“2 鍙風(fēng)嚎紼?#8221;錛夐攣瀹氫簡(jiǎn) mymutex 騫跺宸查摼鎺ュ垪琛ㄦ坊鍔犱簡(jiǎn)涓欏廣傚湪瀵逛簰鏂ュ璞¤В閿佷箣鍚庯紝2 鍙風(fēng)嚎紼嬩細(xì)绔嬪嵆璋冪敤鍑芥暟 pthread_cond_broadcast(&mycond)銆傛鎿嶄綔涔嬪悗錛? 鍙風(fēng)嚎紼嬪皢浣挎墍鏈夌瓑寰?mycond 鏉′歡鍙橀噺鐨勭嚎紼嬬珛鍗寵嫃閱掋傝繖鎰忓懗鐫絎竴涓嚎紼嬶紙浠嶅浜?pthread_cond_wait() 璋冪敤涓級(jí)鐜板湪灝嗚嫃閱掋?/p>
鐜板湪錛岀湅涓涓嬬涓涓嚎紼嬪彂鐢熶簡(jiǎn)浠涔堛傛?zhèn)ㄥ彲鑳戒細(xì)璁や负鍦?2 鍙風(fēng)嚎紼嬭皟鐢?pthread_cond_broadcast(&mymutex) 涔嬪悗錛? 鍙風(fēng)嚎紼嬬殑 pthread_cond_wait() 浼?xì)绔嬪崒櫩斿洖銆備笉鏄偅鏍鳳紒瀹為檯涓婏紝pthread_cond_wait() 灝嗘墽琛屾渶鍚庝竴涓搷浣滐細(xì)閲嶆柊閿佸畾 mymutex銆備竴鏃?pthread_cond_wait() 閿佸畾浜?jiǎn)浜掓枼瀵硅薄锛岄偅涔堝畠灏啒q斿洖騫跺厑璁?1 鍙風(fēng)嚎紼嬬戶緇墽琛屻傞偅鏃訛紝瀹冨彲浠ラ┈涓婃鏌ュ垪琛紝鏌ョ湅瀹冩墍鎰熷叴瓚g殑鏇存敼銆?/p>
閭d釜榪囩▼闈炲父澶嶆潅錛屽洜姝よ鎴戜滑鍏堟潵鍥為【涓涓嬨傜涓涓嚎紼嬮鍏堣皟鐢細(xì) 鐒跺悗錛屽畠媯(gè)鏌ヤ簡(jiǎn)鍒楄〃銆傛病鏈夋壘鍒版劅鍏磋叮鐨勪笢瑗匡紝浜庢槸瀹冭皟鐢細(xì) 鐒跺悗錛宲thread_cond_wait() 璋冪敤鍦ㄨ繑鍥炲墠鎵ц璁稿鎿嶄綔錛?/p>
瀹冨 mymutex 瑙i攣錛岀劧鍚庤繘鍏ョ潯鐪犵姸鎬侊紝絳夊緟 mycond 浠ユ帴鏀?POSIX 綰跨▼“淇″彿”銆備竴鏃︽帴鏀跺埌“淇″彿”錛堝姞寮曞彿鏄洜涓烘垜浠茍涓嶆槸鍦ㄨ璁轟紶緇熺殑 UNIX 淇″彿錛岃屾槸鏉ヨ嚜 pthread_cond_signal() 鎴?pthread_cond_broadcast() 璋冪敤鐨勪俊鍙鳳級(jí)錛屽畠?yōu)兗?xì)鑻忛啋銆備絾 pthread_cond_wait() 娌℃湁绔嬪嵆榪斿洖 -- 瀹冭繕瑕佸仛涓浠朵簨錛氶噸鏂伴攣瀹?mutex錛?/p>
pthread_cond_wait() 鐭ラ亾鎴戜滑鍦ㄦ煡鎵?mymutex “鑳屽悗”鐨勫彉鍖栵紝鍥犳瀹冪戶緇搷浣滐紝涓烘垜浠攣瀹氫簰鏂ュ璞★紝鐒跺悗鎵嶈繑鍥炪?/p>
pthread_cond_wait() 灝忔祴楠?/span> 鐜板湪宸插洖欏句簡(jiǎn) pthread_cond_wait() 璋冪敤錛屾?zhèn)ㄥ簲璇ヤ簡(jiǎn)瑙d簡(jiǎn)瀹冪殑宸ヤ綔鏂瑰紡銆傚簲璇ヨ兘澶熷彊榪?pthread_cond_wait() 渚濇鎵ц鐨勬墍鏈夋搷浣溿傚皾璇曚竴涓嬨傚鏋滅悊瑙d簡(jiǎn) pthread_cond_wait()錛屽叾浣欓儴鍒嗗氨鐩稿綋瀹規(guī)槗錛屽洜姝よ閲嶆柊闃呰浠ヤ笂閮ㄥ垎錛岀洿鍒拌浣忎負(fù)姝€傚ソ錛岃瀹屼箣鍚庯紝鑳藉惁鍛婅瘔鎴戝湪璋冪敤 pthread_cond_wait() 涔?鍓?/em>錛屼簰鏂ュ璞″繀欏誨浜庝粈涔堢姸鎬侊紵pthread_cond_wait() 璋冪敤榪斿洖涔嬪悗錛屼簰鏂ュ璞″浜庝粈涔堢姸鎬侊紵榪欎袱涓棶棰樼殑絳旀閮芥槸“閿佸畾”銆傛棦鐒跺凡緇忓畬鍏ㄧ悊瑙d簡(jiǎn) pthread_cond_wait() 璋冪敤錛岀幇鍦ㄦ潵緇х畫鐮旂┒鏇寸畝鍗曠殑涓滆タ -- 鍒濆鍖栧拰鐪熸鐨勫彂閫佷俊鍙峰拰騫挎挱榪涚▼銆傚埌閭f椂錛屾垜浠皢浼?xì)瀵瑰寘鍚簡(jiǎn)澶毦U跨▼宸ヤ綔闃熷垪鐨?C 浠g爜浜?jiǎn)濡傛寚鎺屻? 鏉′歡鍙橀噺鏄竴涓渶瑕佸垵濮嬪寲鐨勭湡瀹炴暟鎹粨鏋勩備互涓嬪氨鍒濆鍖栫殑鏂規(guī)硶銆傞鍏堬紝瀹氫箟鎴栧垎閰嶄竴涓潯浠跺彉閲忥紝濡備笅鎵紺猴細(xì) 鐒跺悗錛岃皟鐢ㄤ互涓嬪嚱鏁拌繘琛屽垵濮嬪寲錛?/p>
鐬э紝鍒濆鍖栧畬鎴愪簡(jiǎn)錛佸湪閲婃斁鎴栧簾寮冩潯浠跺彉閲忎箣鍓嶏紝闇瑕佹瘉鍧忓畠錛屽涓嬫墍紺猴細(xì) 寰堢畝鍗曞惂銆傛帴鐫璁ㄨ pthread_cond_wait() 璋冪敤銆?/p>
涓鏃﹀垵濮嬪寲浜?jiǎn)浜掓枼瀵硅薄鍜屾潯錃g鍙橀噺錛屽氨鍙互絳夊緟鏌愪釜鏉′歡錛屽涓嬫墍紺猴細(xì) 璇鋒敞鎰忥紝浠g爜鍦ㄩ昏緫涓婂簲璇ュ寘鍚?mycond 鍜?mymutex銆備竴涓壒瀹氭潯浠跺彧鑳芥湁涓涓簰鏂ュ璞★紝鑰屼笖鏉′歡鍙橀噺搴旇琛ㄧず浜掓枼鏁版嵁“鍐呴儴”鐨勪竴縐嶇壒孌婄殑鏉′歡鏇存敼銆備竴涓簰鏂ュ璞″彲浠ョ敤璁稿鏉′歡鍙橀噺錛堜緥濡傦紝cond_empty銆乧ond_full銆乧ond_cleanup錛夛紝浣嗘瘡涓潯浠跺彉閲忓彧鑳芥湁涓涓簰鏂ュ璞°?/p>
瀵逛簬鍙戦佷俊鍙峰拰騫挎挱錛岄渶瑕佹敞鎰忎竴鐐廣傚鏋滅嚎紼嬫洿鏀規(guī)煇浜涘叡浜暟鎹紝鑰屼笖瀹冩兂瑕佸敜閱掓墍鏈夋鍦ㄧ瓑寰呯殑綰跨▼錛屽垯搴斾嬌鐢?pthread_cond_broadcast 璋冪敤錛屽涓嬫墍紺猴細(xì) 鍦ㄦ煇浜涙儏鍐典笅錛屾椿鍔ㄧ嚎紼嬪彧闇瑕佸敜閱掔涓涓鍦ㄧ潯鐪犵殑綰跨▼銆傚亣璁炬?zhèn)ㄥ彧瀵归槦鍒楁氛d姞浜?jiǎn)涓涓伐浣滀綔涓氥傞偅涔堝彧闇瑕佸敜閱掍竴涓伐浣滅▼搴忕嚎紼嬶紙鍐嶅敜閱掑叾瀹冪嚎紼嬫槸涓嶇ぜ璨岀殑錛侊級(jí)錛?/p>
姝ゅ嚱鏁板彧鍞ら啋涓涓嚎紼嬨傚鏋?POSIX 綰跨▼鏍囧噯鍏佽鎸囧畾涓涓暣鏁幫紝鍙互璁╂?zhèn)ㄥ敜閱掍竴瀹氭暟閲忕殑姝e湪鐫$湢鐨勭嚎紼嬶紝閭e氨鏇村畬緹庝簡(jiǎn)銆備絾鏄緢鍙儨錛屾垜娌℃湁琚個(gè)璇峰弬鍔犱細(xì)璁?/p>
鎴戝皢婕旂ず濡備綍鍒涘緩澶氱嚎紼嬪伐浣滅粍銆傚湪榪欎釜鏂規(guī)涓紝鎴戜滑鍒涘緩浜?jiǎn)璁稿宸ヤ綔绋嬪簭绾拷E嬨傛瘡涓嚎紼嬮兘浼?xì)妫鏌?wq錛?#8220;宸ヤ綔闃熷垪”錛夛紝鏌ョ湅鏄惁鏈夐渶瑕佸畬鎴愮殑宸ヤ綔銆傚鏋滄湁闇瑕佸畬鎴愮殑宸ヤ綔錛岄偅涔堢嚎紼嬪皢浠庨槦鍒椾腑闄ゅ幓涓涓妭鐐癸紝鎵ц榪欎簺鐗瑰畾宸ヤ綔錛岀劧鍚庣瓑寰呮柊鐨勫伐浣滃埌杈俱?/p>
涓庢鍚屾椂錛屼富綰跨▼璐熻矗鍒涘緩榪欎簺宸ヤ綔紼嬪簭綰跨▼銆佸皢宸ヤ綔娣誨姞鍒伴槦鍒楋紝鐒跺悗鍦ㄥ畠閫鍑烘椂鏀墮泦鎵鏈夊伐浣滅▼搴忕嚎紼嬨傛?zhèn)畣浼?xì)閬囧埌璁稿 C 浠g爜錛屽ソ濂藉噯澶囧惂錛?/p>
闇瑕侀槦鍒楁槸鍑轟簬涓や釜鍘熷洜銆傞鍏堬紝闇瑕侀槦鍒楁潵淇濆瓨宸ヤ綔浣滀笟銆傝繕闇瑕佸彲鐢ㄤ簬璺熻釜宸茬粓姝㈢嚎紼嬬殑鏁版嵁緇撴瀯銆傝繕璁板緱鍓嶅嚑綃囨枃绔狅紙璇峰弬闃呮湰鏂囩粨灝懼鐨?鍙傝冭祫鏂?/font>錛変腑錛屾垜鏇炬彁鍒拌繃闇瑕佷嬌鐢ㄥ甫鏈夌壒瀹氳繘紼嬫爣璇嗙殑 pthread_join 鍚楋紵浣跨敤“娓呴櫎闃熷垪”錛堢О浣?"cq"錛夊彲浠ヨВ鍐蟲(chóng)棤娉曠瓑寰?浠諱綍宸茬粓姝㈢嚎紼嬬殑闂錛堢◢鍚庡皢璇︾粏璁ㄨ榪欎釜闂錛夈備互涓嬫槸鏍囧噯闃熷垪浠g爜銆傚皢姝や唬鐮佷繚瀛樺埌鏂囦歡 queue.h 鍜?queue.c錛? 鎴戠紪鍐欑殑騫朵笉鏄嚎紼嬪畨鍏ㄧ殑闃熷垪渚嬬▼錛屼簨瀹炰笂鎴戝垱寤轟簡(jiǎn)涓涓?#8220;鏁版嵁鍖呰”鎴?#8220;鎺у埗”緇撴瀯錛屽畠鍙互鏄換浣曠嚎紼嬫敮鎸佺殑鏁版嵁緇撴瀯銆傜湅涓涓?control.h錛?/p>
鐜板湪鎮(zhèn)ㄧ湅鍒頒簡(jiǎn) data_control 緇撴瀯瀹氫箟錛屼互涓嬫槸瀹冪殑瑙嗚琛ㄧず錛?/p>
鍥懼儚涓殑閿佷唬琛ㄤ簰鏂ュ璞★紝瀹冨厑璁稿鏁版嵁緇撴瀯榪涜浜掓枼璁塊棶銆傞粍鑹茬殑鏄熶唬琛ㄦ潯浠跺彉閲忥紝瀹冨彲浠ョ潯鐪狅紝鐩村埌鎵璁ㄨ鐨勬暟鎹粨鏋勬敼鍙樹(shù)負(fù)姝€俹n/off 寮鍏寵〃紺烘暣鏁?"active"錛屽畠鍛婅瘔綰跨▼姝ゆ暟鎹槸鍚︽槸媧誨姩鐨勩傚湪浠g爜涓紝鎴戜嬌鐢ㄦ暣鏁?active 浣滀負(fù)鏍囧織錛屽憡璇夊伐浣滈槦鍒椾綍鏃跺簲璇ュ叧闂備互涓嬫槸 control.c錛?/p>
鍦ㄥ紑濮嬭皟璇曚箣鍓嶏紝榪橀渶瑕佷竴涓枃浠躲備互涓嬫槸 dbug.h錛?/p>
姝や唬鐮佺敤浜庡鐞嗗伐浣滅粍浠g爜涓殑涓嶅彲綰犳閿欒銆?/p>
璇村埌宸ヤ綔緇勪唬鐮侊紝浠ヤ笅灝辨槸錛?/p>
鐜板湪鏉ュ揩閫熷垵鎺掍唬鐮併傚畾涔夌殑絎竴涓粨鏋勭О浣?"wq"錛屽畠鍖呭惈浜?data_control 鍜岄槦鍒楀ご銆俤ata_control 緇撴瀯鐢ㄤ簬浠茶瀵規(guī)暣涓槦鍒楃殑璁塊棶錛屽寘鎷槦鍒椾腑鐨勮妭鐐廣備笅涓姝ュ伐浣滄槸瀹氫箟瀹為檯鐨勫伐浣滆妭鐐廣傝浣夸唬鐮佺鍚堟湰鏂囦腑鐨勭ず渚嬶紝姝ゅ鎵鍖呭惈鐨勯兘鏄綔涓氬彿銆?/p>
鎺ョ潃錛屽垱寤烘竻闄ら槦鍒椼傛敞閲婅鏄庝簡(jiǎn)瀹冪殑宸ヤ綔鏂瑰紡銆傚ソ錛岀幇鍦ㄨ鎴戜滑璺寵繃 threadfunc()銆乯oin_threads()銆乧reate_threads() 鍜?initialize_structs() 璋冪敤錛岀洿鎺ヨ煩鍒?main()銆傛墍鍋氱殑絎竴浠朵簨灝辨槸鍒濆鍖栫粨鏋?-- 榪欏寘鎷垵濮嬪寲 data_controls 鍜岄槦鍒楋紝浠ュ強(qiáng)嬋媧誨伐浣滈槦鍒椼?/p>
鐜板湪鍒濆鍖栫嚎紼嬨傚鏋滅湅涓涓?create_threads() 璋冪敤錛屼技涔庝竴鍒囨甯?-- 闄や簡(jiǎn)涓浠朵簨銆傝娉ㄦ剰錛屾垜浠鍦ㄥ垎閰嶆竻闄よ妭鐐癸紝浠ュ強(qiáng)鍒濆鍖栧畠鐨勭嚎紼嬪彿鍜?TID 緇勪歡銆傛垜浠繕灝嗘竻闄よ妭鐐逛綔涓哄垵濮嬭嚜鍙橀噺浼犻掔粰姣忎竴涓柊鐨勫伐浣滅▼搴忕嚎紼嬨備負(fù)浠涔堣繖鏍峰仛錛?/p>
鍥犱負(fù)褰撴煇涓伐浣滅▼搴忕嚎紼嬮鍑烘椂錛屽畠浼?xì)灏嗗叾娓呴櫎鑺傜偣杩炴帴鍒版竻闄ら槦鍒楀Q岀劧鍚庣粓姝€傞偅鏃訛紝涓葷嚎紼嬩細(xì)鍦ㄦ竻闄ら槦鍒椾腑媯(gè)嫻嬪埌榪欎釜鑺傜偣錛堝埄鐢ㄦ潯浠跺彉閲忥級(jí)錛屽茍灝嗚繖涓妭鐐圭Щ鍑洪槦鍒椼傚洜涓?TID錛堢嚎紼嬫爣璇嗭級(jí)瀛樺偍鍦ㄦ竻闄よ妭鐐逛腑錛屾墍浠ヤ富綰跨▼鍙互紜垏鐭ラ亾鍝釜綰跨▼宸茬粓姝簡(jiǎn)銆傜劧鍚庯紝涓葷嚎紼嬪皢璋冪敤 pthread_join(tid)錛屽茍鑱旀帴閫傚綋鐨勫伐浣滅▼搴忕嚎紼嬨傚鏋滄病鏈夊仛璁板綍錛岄偅涔堜富綰跨▼灝遍渶瑕佹寜浠繪剰欏哄簭鑱旀帴宸ヤ綔紼嬪簭綰跨▼錛屽彲鑳芥槸鎸夊畠浠殑鍒涘緩欏哄簭銆傜敱浜庣嚎紼嬩笉涓瀹氭寜姝ら『搴忕粓姝紝閭d箞涓葷嚎紼嬪彲鑳戒細(xì)鍦ㄥ凡緇忚仈鎺ヤ簡(jiǎn)鍗佷釜綰跨▼鏃訛紝絳夊緟鑱旀帴鍙︿竴涓嚎紼嬨傛?zhèn)ㄨ兘鐞嗚В杩櫩U嶈璁″喅絳栨槸濡備綍浣垮叧闂唬鐮佸姞閫熺殑鍚楋紙灝ゅ叾鍦ㄤ嬌鐢ㄥ嚑鐧句釜宸ヤ綔紼嬪簭綰跨▼鐨勬儏鍐典笅錛夛紵 鎴戜滑宸插惎鍔ㄤ簡(jiǎn)宸ヤ綔紼嬪簭綰跨▼錛堝畠浠凡緇忓畬鎴愪簡(jiǎn)鎵ц threadfunc()錛岀◢鍚庡皢璁ㄨ姝ゅ嚱鏁幫級(jí)錛岀幇鍦ㄤ富綰跨▼寮濮嬪皢宸ヤ綔鑺傜偣鎻掑叆宸ヤ綔闃熷垪銆傞鍏堬紝瀹冮攣瀹?wq 鐨勬帶鍒朵簰鏂ュ璞★紝鐒跺悗鍒嗛厤 16000 涓伐浣滃寘錛屽皢瀹冧滑閫愪釜鎻掑叆闃熷垪銆傚畬鎴愪箣鍚庯紝灝嗚皟鐢?pthread_cond_broadcast()錛屼簬鏄墍鏈夋鍦ㄧ潯鐪犵殑綰跨▼浼?xì)琚敜閱掑Q屽茍寮濮嬫墽琛屽伐浣溿傛鏃訛紝涓葷嚎紼嬪皢鐫$湢涓ょ閽燂紝鐒跺悗閲婃斁宸ヤ綔闃熷垪錛屽茍閫氱煡宸ヤ綔紼嬪簭綰跨▼緇堟媧誨姩銆傛帴鐫錛屼富綰跨▼浼?xì)璋冪?join_threads() 鍑芥暟鏉ユ竻闄ゆ墍鏈夊伐浣滅▼搴忕嚎紼嬨?/p>
鐜板湪鏉ヨ璁?threadfunc()錛岃繖鏄墍鏈夊伐浣滅▼搴忕嚎紼嬮兘瑕佹墽琛岀殑浠g爜銆傚綋宸ヤ綔紼嬪簭綰跨▼鍚姩鏃訛紝瀹冧細(xì)绔嬪嵆閿佸畾宸ヤ綔闃熷垪浜掓枼瀵硅薄錛岃幏鍙栦竴涓伐浣滆妭鐐癸紙濡傛灉鏈夌殑璇濓級(jí)錛岀劧鍚庡瀹冭繘琛屽鐞嗐傚鏋滄病鏈夊伐浣滐紝鍒欒皟鐢?pthread_cond_wait()銆傛?zhèn)ㄤ細(xì)娉ㄦ剰鍒皹q欎釜璋冪敤鍦ㄤ竴涓潪甯哥揣鍑戠殑 while() 寰幆涓紝榪欐槸闈炲父閲嶈鐨勩傚綋浠?pthread_cond_wait() 璋冪敤涓嫃閱掓椂錛屽喅涓嶈兘璁や負(fù)鏉′歡鑲畾鍙戠敓浜?-- 瀹?鍙兘鍙戠敓浜?jiǎn)锛屼篃鍙兘娌℃湁鍙戠敓銆傚鏋滃彂鐢熶簡(jiǎn)榪欑鎯呭喌錛屽嵆閿欒鍦板敜閱掍簡(jiǎn)綰跨▼錛岃屽垪琛ㄦ槸絀虹殑錛岄偅涔?while 寰幆灝嗗啀嬈¤皟鐢?pthread_cond_wait()銆? 濡傛灉鏈変竴涓伐浣滆妭鐐癸紝閭d箞鎴戜滑鍙墦鍗板畠鐨勪綔涓氬彿錛岄噴鏀懼畠騫墮鍑恒傜劧鑰岋紝瀹為檯浠g爜浼?xì)鎵ц涓浜涙洿瀹炶川鎬х殑鎿嶄綔銆傚湪 while() 寰幆緇撳熬錛屾垜浠攣瀹氫簡(jiǎn)浜掓枼瀵硅薄錛屼互渚挎鏌?active 鍙橀噺錛屼互鍙?qiáng)鍦ㄥ惊鐜瘷鍓檭▼個(gè)鏌ユ柊鐨勫伐浣滆妭鐐廣傚鏋滄墽琛屽畬姝や唬鐮侊紝灝變細(xì)鍙戠幇濡傛灉 wq.control.active 鏄?0錛寃hile 寰幆灝變細(xì)緇堟錛屽茍浼?xì)鎵ц?threadfunc() 緇撳熬澶勭殑娓呴櫎浠g爜銆?/p>
宸ヤ綔紼嬪簭綰跨▼鐨勬竻闄や唬鐮侀儴浠墮潪甯告湁瓚c傞鍏堬紝鐢變簬 pthread_cond_wait() 榪斿洖浜?jiǎn)閿佸畾鐨勪簰鏂ュ璞″Q屽畠浼?xì)瀵?work_queue 瑙i攣銆傜劧鍚庯紝瀹冮攣瀹氭竻闄ら槦鍒楋紝娣誨姞娓呴櫎浠g爜錛堝寘鍚簡(jiǎn) TID錛屼富綰跨▼灝嗕嬌鐢ㄦ TID 鏉ヨ皟鐢?pthread_join()錛夛紝鐒跺悗鍐嶅娓呴櫎闃熷垪瑙i攣銆傛鍚庯紝瀹冨彂淇″彿緇欐墍鏈?cq 絳夊緟鑰?(pthread_cond_signal(&cq.control.cond))錛屼簬鏄富綰跨▼灝辯煡閬撴湁涓涓緟澶勭悊鐨勬柊鑺傜偣銆傛垜浠笉浣跨敤 pthread_cond_broadcast()錛屽洜涓烘病鏈夎繖涓繀瑕?-- 鍙湁涓涓嚎紼嬶紙涓葷嚎紼嬶級(jí)鍦ㄧ瓑寰呮竻闄ら槦鍒椾腑鐨勬柊鑺傜偣銆傚綋瀹冭皟鐢?join_threads() 鏃訛紝宸ヤ綔紼嬪簭綰跨▼灝嗘墦鍗板叧闂秷鎭紝鐒跺悗緇堟錛岀瓑寰呬富綰跨▼鍙戝嚭鐨?pthread_join() 璋冪敤銆?/p>
濡傛灉瑕佹煡鐪嬪叧浜庡浣曚嬌鐢ㄦ潯浠跺彉閲忕殑綆鍗曠ず渚嬶紝璇峰弬鑰?join_threads() 鍑芥暟銆傚鏋滆繕鏈夊伐浣滅▼搴忕嚎紼嬶紝join_threads() 浼?xì)涓鐩存墽琛岋紝絳夊緟娓呴櫎闃熷垪涓柊鐨勬竻闄よ妭鐐廣傚鏋滄湁鏂拌妭鐐癸紝鎴戜滑浼?xì)灏嗘鑺傜偣绉诲嚭闃熷垪銆佸娓呴櫎闃熷垪瑙i攣錛堜粠鑰屼嬌宸ヤ綔紼嬪簭鍙互娣誨姞娓呴櫎鑺傜偣錛夈佽仈鎺ユ柊鐨勫伐浣滅▼搴忕嚎紼嬶紙浣跨敤瀛樺偍鍦ㄦ竻闄よ妭鐐逛腑鐨?TID錛夈侀噴鏀炬竻闄よ妭鐐廣佸噺灝?#8220;鐜版湁”綰跨▼鐨勬暟閲忥紝鐒跺悗緇х畫銆?/p>
鐜板湪宸茬粡鍒頒簡(jiǎn)“POSIX 綰跨▼璇﹁В”緋誨垪鐨勫熬澹幫紝甯屾湜鎮(zhèn)ㄥ凡緇忓噯澶囧ソ寮濮嬪皢澶氱嚎紼嬩唬鐮佹坊鍔犲埌鎮(zhèn)ㄨ嚜宸辯殑搴旂敤紼嬪簭涓傛湁鍏寵緇嗕俊鎭紝璇峰弬闃?鍙傝冭祫鏂?/font>閮ㄥ垎錛岃繖閮ㄥ垎鍐呭榪樺寘鍚簡(jiǎn)鏈枃涓嬌鐢ㄧ殑鎵鏈夋簮鐮佺殑 tar 鏂囦歡銆備笅涓涓郴鍒椾腑鍐嶈錛? Daniel Robbins 灞呬綇鍦ㄦ柊澧ㄨタ鍝ュ窞鐨?Albuquerque銆備粬鏄?Gentoo Technologies, Inc. 鐨勬昏鍏?CEO錛孏entoo 欏圭洰鐨勬昏璁″笀錛孧acMillan 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細(xì) 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 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細(xì) 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 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細(xì) 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 鍑虹増涔︾睄鐨勬挵紼夸綔鑰咃紝浠栫殑钁椾綔鏈夛細(xì) Caldera OpenLinux Unleashed, SuSE Linux Unleashed, 鍜?Samba Unleashed銆侱aniel 鑷簩騫寸駭璧峰氨涓庤綆楁満鏌愪簺棰嗗煙緇撲笅涓嶈В涔嬬紭錛岄偅鏃朵粬棣栧厛鎺ヨЕ鐨勬槸 Logo 紼嬪簭璇█錛屽茍娌夋漢浜?Pac-Man 娓告垙涓傝繖涔熻灝辨槸浠栬嚦浠婁粛鎷呬換 SONY Electronic Publishing/Psygnosis 鐨勯甯浘褰㈣璁″笀鐨勫師鍥犳墍鍦ㄣ侱aniel 鍠滄涓庡瀛?Mary 鍜屾柊鍑虹敓鐨勫コ鍎?Hadassah 涓璧峰叡搴︽椂鍏夈傚彲閫氳繃 drobbins@gentoo.org涓?Daniel 鑱旂郴銆? 鍦?鍓嶄竴綃囨枃绔犱腑 錛岃皥鍒頒簡(jiǎn)浼?xì)瀵艰嚧寮傚父缁撴灉鐨劸U跨▼浠g爜銆備袱涓嚎紼嬪垎鍒鍚屼竴涓叏灞鍙橀噺榪涜浜?jiǎn)浜屽崄娆″姞涓銆傚彉閲忕殑鍊兼渶鍚庡簲璇ユ槸 40錛屼絾鏈緇堝煎嵈鏄?21銆傝繖鏄庝箞鍥炰簨鍛紵鍥犱負(fù)涓涓嚎紼嬩笉鍋滃湴“鍙栨秷”浜?jiǎn)鍙︿竴涓嚎紼嬫墽琛岀殑鍔犱竴鎿嶄綔錛屾墍浠ヤ駭鐢熻繖涓棶棰樸傜幇鍦ㄨ鎴戜滑鏉ユ煡鐪嬫敼姝e悗鐨勪唬鐮侊紝瀹冧嬌鐢?浜掓枼瀵硅薄(mutex)鏉ヨВ鍐寵闂錛? 濡傛灉灝嗚繖孌典唬鐮佷笌 鍓嶄竴綃囨枃绔?/font> 涓粰鍑虹殑鐗堟湰浣滀竴涓瘮杈冿紝灝變細(xì)娉ㄦ剰鍒板鍔犱簡(jiǎn) pthread_mutex_lock() 鍜?pthread_mutex_unlock() 鍑芥暟璋冪敤銆傚湪綰跨▼紼嬪簭涓繖浜涜皟鐢ㄦ墽琛屼簡(jiǎn)涓嶅彲鎴栫己鐨勫姛鑳姐備粬浠彁渚涗簡(jiǎn)涓縐?鐩鎬簰鎺掓枼鐨勬柟娉曪紙浜掓枼瀵硅薄鍗崇敱姝ゅ緱鍚嶏級(jí)銆備袱涓嚎紼嬩笉鑳藉悓鏃跺鍚屼竴涓簰鏂ュ璞″姞閿併? 浜掓枼瀵硅薄鏄繖鏍峰伐浣滅殑銆傚鏋滅嚎紼?a 璇曞浘閿佸畾涓涓簰鏂ュ璞★紝鑰屾鏃剁嚎紼?b 宸查攣瀹氫簡(jiǎn)鍚屼竴涓簰鏂ュ璞℃椂錛岀嚎紼?a 灝卞皢榪涘叆鐫$湢鐘舵併備竴鏃︾嚎紼?b 閲婃斁浜?jiǎn)浜掓枼瀵硅薄锛堥氳繃 pthread_mutex_unlock() 璋冪敤錛夛紝綰跨▼ a 灝辮兘澶熼攣瀹氳繖涓簰鏂ュ璞★紙鎹㈠彞璇濊錛岀嚎紼?a 灝卞皢浠?pthread_mutex_lock() 鍑芥暟璋冪敤涓繑鍥烇紝鍚屾椂浜掓枼瀵硅薄琚攣瀹氾級(jí)銆傚悓鏍峰湴錛屽綋綰跨▼ a 姝i攣瀹氫簰鏂ュ璞℃椂錛屽鏋滅嚎紼?c 璇曞浘閿佸畾浜掓枼瀵硅薄鐨勮瘽錛岀嚎紼?c 涔熷皢涓存椂榪涘叆鐫$湢鐘舵併傚宸查攣瀹氱殑浜掓枼瀵硅薄涓婅皟鐢?pthread_mutex_lock() 鐨勬墍鏈夌嚎紼嬮兘灝嗚繘鍏ョ潯鐪犵姸鎬侊紝榪欎簺鐫$湢鐨勭嚎紼嬪皢“鎺掗槦”璁塊棶榪欎釜浜掓枼瀵硅薄銆?/p>
閫氬父浣跨敤 pthread_mutex_lock() 鍜?pthread_mutex_unlock() 鏉ヤ繚鎶ゆ暟鎹粨鏋勩傝繖灝辨槸璇達(dá)紝閫氳繃綰跨▼鐨勯攣瀹氬拰瑙i攣錛屽浜庢煇涓鏁版嵁緇撴瀯錛岀‘淇濇煇涓鏃跺埢鍙兘鏈変竴涓嚎紼嬭兘澶熻闂畠銆傚彲浠ユ帹嫻嬪埌錛屽綋綰跨▼璇曞浘閿佸畾涓涓湭鍔犻攣鐨勪簰鏂ュ璞℃椂錛孭OSIX 綰跨▼搴撳皢鍚屾剰閿佸畾錛岃屼笉浼?xì)鋴删U跨▼榪涘叆鐫$湢鐘舵併?/p>
鍥句腑錛岄攣瀹氫簡(jiǎn)浜掓枼瀵硅薄鐨勭嚎紼嬭兘澶熷瓨鍙栧鏉傜殑鏁版嵁緇撴瀯錛岃屼笉蹇呮媴蹇?jī)鍚屾椂浼?xì)鏈夊叾瀹冪嚎紼嬪共鎵般傞偅涓暟鎹粨鏋勫疄闄呬笂鏄?#8220;鍐葷粨”浜?jiǎn)锛岀洿鍒颁簰鏂ュ璞¤瑙i攣湄?fù)姝€俻thread_mutex_lock() 鍜?pthread_mutex_unlock() 鍑芥暟璋冪敤錛屽鍚?#8220;鍦ㄦ柦宸ヤ腑”鏍囧織涓鏍鳳紝灝嗘鍦ㄤ慨鏀瑰拰璇誨彇鐨勬煇涓鐗瑰畾鍏變韓鏁版嵁鍖呭洿璧鋒潵銆傝繖涓や釜鍑芥暟璋冪敤鐨勪綔鐢ㄥ氨鏄鍛婂叾瀹冪嚎紼嬶紝瑕佸畠浠戶緇潯鐪犲茍絳夊緟杞埌瀹冧滑瀵逛簰鏂ュ璞″姞閿併傚綋鐒?dòng)灱岄櫎闈炲?姣忎釜 瀵圭壒瀹氭暟鎹粨鏋勮繘琛岃鍐欐搷浣滅殑璇彞鍓嶅悗錛岄兘鍒嗗埆鏀句笂 pthread_mutex_lock() 鍜?pthread_mutext_unlock() 璋冪敤錛屾墠浼?xì)鍑虹幇杩櫩U嶆儏鍐點(diǎn)?br> 鍚笂鍘誨緢鏈夎叮錛屼絾絀剁珶涓轟粈涔堣璁╃嚎紼嬬潯鐪犲憿錛熻鐭ラ亾錛岀嚎紼嬬殑涓昏浼樼偣涓嶅氨鏄叾鍏鋒湁鐙珛宸ヤ綔銆佹洿澶氱殑鏃跺欐槸鍚屾椂宸ヤ綔鐨勮兘鍔涘悧錛熸槸鐨勶紝紜疄鏄繖鏍楓傜劧鑰岋紝姣忎釜閲嶈鐨勭嚎紼嬬▼搴忛兘闇瑕佷嬌鐢ㄦ煇浜涗簰鏂ュ璞°傝鎴戜滑鍐嶇湅涓涓嬬ず渚嬬▼搴忎互渚跨悊瑙e師鍥犳墍鍦ㄣ?/p>
璇風(fēng)湅 thread_function()錛屽驚鐜腑涓寮濮嬪氨閿佸畾浜?jiǎn)浜掓枼瀵硅薄锛屾渶鍚庢墠灝嗗畠瑙i攣銆傚湪榪欎釜紺轟緥紼嬪簭涓紝mymutex 鐢ㄦ潵淇濇姢 myglobal 鐨勫箋備粩緇嗘煡鐪?thread_function()錛屽姞涓浠g爜鎶?myglobal 澶嶅埗鍒頒竴涓眬閮ㄥ彉閲忥紝瀵瑰眬閮ㄥ彉閲忓姞涓錛岀潯鐪犱竴縐掗挓錛屽湪榪欎箣鍚庢墠鎶婂眬閮ㄥ彉閲忕殑鍊間紶鍥炵粰 myglobal銆備笉浣跨敤浜掓枼瀵硅薄鏃訛紝鍗充嬌涓葷嚎紼嬪湪 thread_function() 綰跨▼鐫$湢涓縐掗挓鏈熼棿鍐呭 myglobal 鍔犱竴錛宼hread_function() 鑻忛啋鍚庝篃浼?xì)瑕嗙洊涓痪U跨▼鎵鍔犵殑鍊箋備嬌鐢ㄤ簰鏂ュ璞¤兘澶熶繚璇佽繖縐嶆儏褰笉浼?xì)鍙戠敓銆傦紙鎮(zhèn)ㄤ篃璁鎬細(xì)鎯沖埌錛屾垜澧炲姞浜?jiǎn)涓縐掗挓寤惰繜浠ヨЕ鍙戜笉姝g‘鐨勭粨鏋溿傛妸灞閮ㄥ彉閲忕殑鍊艱祴緇?myglobal 涔嬪墠錛屽疄闄呬笂娌℃湁浠涔堢湡姝g悊鐢辮姹?thread_function() 鐫$湢涓縐掗挓銆傦級(jí)浣跨敤浜掓枼瀵硅薄鐨勬柊紼嬪簭浜х敓浜?jiǎn)鏈熸湜鐨劸l撴灉錛?/p>
涓轟簡(jiǎn)榪涗竴姝ユ帰绱㈣繖涓瀬涓洪噸瑕佺殑姒傚康錛岃鎴戜滑鐪嬩竴鐪嬬▼搴忎腑榪涜鍔犱竴鎿嶄綔鐨勪唬鐮侊細(xì)
鏍囧噯錛?br>
浼犺緭鏍囧噯
緗戠粶鐧誨綍鏍囧噯
]]>
鏈枃鏄?POSIX 綰跨▼涓夐儴鏇茬郴鍒楃殑鏈鍚庝竴閮ㄥ垎錛孌aniel 灝嗚緇嗚璁哄浣曚嬌鐢ㄦ潯浠跺彉閲忋傛潯浠跺彉閲忔槸 POSIX 綰跨▼緇撴瀯錛屽彲浠ヨ鎮(zhèn)ㄥ湪閬囧埌鏌愪簺鏉′歡鏃?#8220;鍞ら啋”綰跨▼銆傚彲浠ュ皢瀹冧滑鐪嬩綔鏄竴縐嶇嚎紼嬪畨鍏ㄧ殑淇″彿鍙戦併侱aniel 浣跨敤鐩墠鎮(zhèn)ㄦ墍瀛﹀埌鐨勭煡璇嗗疄鐜頒簡(jiǎn)涓涓綰跨▼宸ヤ綔緇勫簲鐢ㄧ▼搴忥紝鏈枃灝嗗洿緇曠潃榪欎竴紺轟緥鑰岃繘琛岃璁恒?/blockquote>
pthread_mutex_lock(&mymutex);
pthread_cond_wait(&mycond, &mymutex);
pthread_mutex_unlock(&mymutex);
pthread_mutex_lock(&mymutex);
pthread_cond_t mycond;
pthread_cond_init(&mycond,NULL);
pthread_cond_destroy(&mycond);
pthread_cond_wait(&mycond, &mymutex);
pthread_cond_broadcast(&mycond);
pthread_cond_signal(&mycond);
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;
}
control.h
#include
typedef struct data_control {
pthread_mutex_t mutex;
pthread_cond_t cond;
int active;
} data_control;
鎵浣跨敤鐨?data_control 緇撴瀯
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
#define dabort() \
{ printf("Aborting at line %d in source file %s\n",__LINE__,__FILE__); abort(); }
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();
}
![]()
![]()
![]()
![]()
]]>
POSIX 綰跨▼鏄彁楂樹(shù)唬鐮佸搷搴斿拰鎬ц兘鐨勬湁鍔涙墜孌點(diǎn)傚湪姝や笁閮ㄥ垎緋誨垪鏂囩珷鐨勭浜岀瘒涓紝Daniel Robbins 灝嗚鏄庯紝濡備綍浣跨敤琚О涓轟簰鏂ュ璞$殑鐏靛閥灝忕帺鎰忥紝鏉ヤ繚鎶ょ嚎紼嬩唬鐮佷腑鍏變韓鏁版嵁緇撴瀯鐨勫畬鏁存с?/blockquote>
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);
}
璇風(fēng)湅榪欏箙杞繪澗鐨勬極鐢伙紝鍥涗釜灝忕簿鐏甸噸鐜頒簡(jiǎn)鏈榪戜竴嬈?pthread_mutex_lock() 璋冪敤鐨勪竴涓満闈€?/strong>
$ ./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爜灝嗗畬鏁存墽琛屻傛帴涓嬫潵鎵嶄細(xì)鎵ц涓葷嚎紼嬩唬鐮侊紙鎴栬呮槸浠ョ浉鍙嶇殑欏哄簭鎵ц錛夈傚湪涓嶄嬌鐢ㄤ簰鏂ュ璞$殑綰跨▼紼嬪簭涓紝浠g爜鍙兘錛堝嚑涔庢槸錛岀敱浜庤皟鐢ㄤ簡(jiǎn) sleep() 鐨勭紭鏁咃級(jí)浠ュ涓嬬殑欏哄簭鎵ц錛?/p>
thread_function() 綰跨▼ 涓葷嚎紼?
j=myglobal;
j=j+1;
printf(".");
fflush(stdout);
sleep(1); myglobal=myglobal+1;
myglobal=j;
|
褰撲唬鐮佷互姝ょ壒瀹氶『搴忔墽琛屾椂錛屽皢瑕嗙洊涓葷嚎紼嬪 myglobal 鐨勪慨鏀廣傜▼搴忕粨鏉熷悗錛屽氨灝嗗緱鍒頒笉姝g‘鐨勫箋傚鏋滄槸鍦ㄦ搷綰墊寚閽堢殑璇濓紝灝卞彲鑳戒駭鐢熸閿欒銆傛敞鎰忓埌 thread_function() 綰跨▼鎸夐『搴忔墽琛屼簡(jiǎn)瀹冪殑鎵鏈夋寚浠ゃ傜湅鏉ヤ笉璞℃槸 thread_function() 鏈変粈涔堟搴忛鍊掋傞棶棰樻槸錛屽悓涓鏃墮棿鍐咃紝鍙︿竴涓嚎紼嬪鍚屼竴鏁版嵁緇撴瀯榪涜浜?jiǎn)鍙︿竴涓慨鏀廣?/p>
鍦ㄨВ閲婂浣曠‘瀹氬湪浣曞浣跨敤浜掓枼瀵硅薄涔嬪墠錛屽厛鏉ユ繁鍏ヤ簡(jiǎn)瑙d竴涓嬬嚎紼嬬殑鍐呴儴宸ヤ綔鏈哄埗銆傝鐪嬬涓涓緥瀛愶細(xì)
鍋囪涓葷嚎紼嬪皢鍒涘緩涓変釜鏂扮嚎紼嬶細(xì)綰跨▼ 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 瀛樺湪錛堟垨宸插仠姝級(jí)銆?/p>
鐒惰岋紝灝卞湪絎簩涓?create() 璋冪敤榪斿洖鍚庯紝涓葷嚎紼嬫棤娉曞亣瀹氭槸鍝竴涓嚎紼嬶紙a 鎴?b錛変細(xì)棣栧厛寮濮嬭繍琛屻傝櫧鐒朵袱涓嚎紼嬮兘宸插瓨鍦紝綰跨▼ CPU 鏃墮棿鐗囩殑鍒嗛厤鍙栧喅浜庡唴鏍稿拰綰跨▼搴撱傝嚦浜庤皝灝嗛鍏堣繍琛岋紝騫舵病鏈変弗鏍肩殑瑙勫垯銆傚敖綆$嚎紼?a 鏇存湁鍙兘鍦ㄧ嚎紼?b 涔嬪墠寮濮嬫墽琛岋紝浣嗚繖騫舵棤淇濊瘉銆傚浜庡澶勭悊鍣ㄧ郴緇燂紝鎯呭喌鏇存槸濡傛銆傚鏋滅紪鍐欑殑浠g爜鍋囧畾鍦ㄧ嚎紼?b 寮濮嬫墽琛屼箣鍓嶅疄闄呬笂鎵ц綰跨▼ a 鐨勪唬鐮侊紝閭d箞錛岀▼搴忔渶緇堟紜繍琛岀殑姒傜巼鏄?99%銆傛垨鑰呮洿緋熺硶錛岀▼搴忓湪鎮(zhèn)ㄧ殑鏈哄櫒涓?100% 鍦版紜繍琛岋紝鑰屽湪鎮(zhèn)ㄥ鎴風(fēng)殑鍥涘鐞嗗櫒鏈嶅姟鍣ㄤ笂姝g‘榪愯鐨勬鐜囧嵈鏄浂銆?/p>
浠庤繖涓緥瀛愯繕鍙互寰楃煡錛岀嚎紼嬪簱淇濈暀浜?jiǎn)姣忎釜鍗曠嫭绾拷E嬬殑浠g爜鎵ц欏哄簭銆傛崲鍙ヨ瘽璇達(dá)紝瀹為檯涓婇偅涓変釜 pthread_create() 璋冪敤灝嗘寜瀹冧滑鍑虹幇鐨勯『搴忔墽琛屻備粠涓葷嚎紼嬩笂鏉ョ湅錛屾墍鏈変唬鐮侀兘鏄緷嬈℃墽琛岀殑銆傛湁鏃訛紝鍙互鍒╃敤榪欎竴鐐規(guī)潵浼樺寲閮ㄥ垎綰跨▼紼嬪簭銆備緥濡傦紝鍦ㄤ笂渚嬩腑錛岀嚎紼?c 灝卞彲浠ュ亣瀹氱嚎紼?a 鍜岀嚎紼?b 涓嶆槸姝e湪榪愯灝辨槸宸茬粡緇堟銆傚畠涓嶅繀鎷呭績(jī)瀛樺湪榪樻病鏈夊垱寤虹嚎紼?a 鍜岀嚎紼?b 鐨勫彲鑳芥с傚彲浠ヤ嬌鐢ㄨ繖涓閫昏緫鏉ヤ紭鍖栫嚎紼嬬▼搴忋?/p>
鐜板湪鏉ョ湅鍙︿竴涓亣鎯崇殑渚嬪瓙銆傚亣璁炬湁璁稿綰跨▼錛屼粬浠兘姝e湪鎵ц涓嬪垪浠g爜錛?/p>
myglobal=myglobal+1;
|
閭d箞錛屾槸鍚﹂渶瑕佸湪鍔犱竴鎿嶄綔璇彞鍓嶅悗鍒嗗埆閿佸畾鍜岃В閿佷簰鏂ュ璞″憿錛熶篃璁告湁浜轟細(xì)璇?#8220;涓?#8221;銆傜紪璇戝櫒鏋佹湁鍙兘鎶婁笂榪拌祴鍊艱鍙ョ紪璇戞垚涓鏉℃満鍣ㄦ寚浠ゃ傚ぇ瀹墮兘鐭ラ亾錛屼笉鍙兘"鍗婇?涓柇涓鏉℃満鍣ㄦ寚浠ゃ傚嵆浣挎槸紜歡涓柇涔熶笉浼?xì)鐮村潖鏈哄櫒鎸囦护鐨勫畬鏁存с傚熀浜庝互涓婅冭檻錛屽緢鍙兘鍊懼悜浜庡畬鍏ㄧ渷鐣?pthread_mutex_lock() 鍜?pthread_mutex_unlock() 璋冪敤銆備笉瑕佽繖鏍峰仛銆?/p>
鎴戝湪璇村簾璇濆悧錛熶笉瀹屽叏鏄繖鏍楓傞鍏堬紝涓嶅簲璇ュ亣瀹氫笂榪拌祴鍊艱鍙ヤ竴瀹氫細(xì)琚紪璇戞垚涓鏉℃満鍣ㄦ寚浠わ紝闄ら潪浜茶嚜楠岃瘉浜?jiǎn)鏈哄櫒浠g爜銆傚嵆浣挎彃鍏ユ煇浜涘唴宓屾眹緙栬鍙ヤ互紜繚鍔犱竴鎿嶄綔鐨勫畬鏁存墽琛屸曗曠敋鑷籌紝鍗充嬌鏄嚜宸卞姩鎵嬪啓緙栬瘧鍣紒-- 浠嶇劧鍙兘鏈夐棶棰樸?/p>
絳旀鍦ㄨ繖閲屻備嬌鐢ㄥ崟鏉″唴宓屾眹緙栨搷浣滅爜鍦ㄥ崟澶勭悊鍣ㄧ郴緇熶笂鍙兘涓嶄細(xì)鏈変粈涔堥棶棰樸傛瘡涓姞涓鎿嶄綔閮藉皢瀹屾暣鍦拌繘琛岋紝騫朵笖澶氬崐浼?xì)寰楀埌鏈熸湜鐨劸l撴灉銆備絾鏄澶勭悊鍣ㄧ郴緇熷垯鎴劧涓嶅悓銆傚湪澶?CPU 鏈哄櫒涓婏紝涓や釜鍗曠嫭鐨勫鐞嗗櫒鍙兘浼?xì)鍦ㄥ嚑涔庡悓涓鏃跺埢錛堟垨鑰咃紝灝卞湪鍚屼竴鏃跺埢錛夋墽琛屼笂榪拌祴鍊艱鍙ャ備笉瑕佸繕?shù)簡(jiǎn)锛寴q欐椂瀵瑰唴瀛樼殑淇敼闇瑕佸厛浠?L1 鍐欏叆 L2 楂橀熺紦瀛樸佺劧鍚庢墠鍐欏叆涓誨瓨銆傦紙SMP 鏈哄櫒騫朵笉鍙槸澧炲姞浜?jiǎn)澶勭悊鍣ㄨ屽凡錛涘畠榪樻湁鐢ㄦ潵浠茶瀵?RAM 瀛樺彇鐨勭壒孌婄‖浠躲傦級(jí)鏈緇堬紝鏍規(guī)湰鏃犳硶鎼炴竻鍦ㄥ啓鍏ヤ富瀛樼殑绔炰簤涓紝鍝釜 CPU 灝嗕細(xì)"鑳滃嚭"銆傝浜х敓鍙嫻嬬殑浠g爜錛屽簲浣跨敤浜掓枼瀵硅薄銆備簰鏂ュ璞″皢鎻掑叆涓閬?鍐呭瓨鍏沖崱"錛岀敱瀹冩潵紜繚瀵逛富瀛樼殑鍐欏叆鎸夌収綰跨▼閿佸畾浜掓枼瀵硅薄鐨勯『搴忚繘琛屻?/p>
鑰冭檻涓縐嶄互 32 浣嶅潡涓哄崟浣嶆洿鏂頒富瀛樼殑 SMP 浣撶郴緇撴瀯銆傚鏋滄湭浣跨敤浜掓枼瀵硅薄灝卞涓涓?64 浣嶆暣鏁拌繘琛屽姞涓鎿嶄綔錛屾暣鏁扮殑鏈楂?4 浣嶅瓧鑺傚彲鑳芥潵鑷竴涓?CPU錛岃屽叾瀹?4 涓瓧鑺傚嵈鏉ヨ嚜鍙︿竴 CPU銆傜碂緋曞惂錛佹渶緋熺硶鐨勬槸錛屼嬌鐢ㄥ樊鍔茬殑鎶鏈紝鎮(zhèn)ㄧ殑紼嬪簭鍦ㄩ噸瑕佸鎴風(fēng)殑緋葷粺涓婃湁鍙兘涓嶆槸寰堥暱鏃墮棿鎵嶅穿婧冧竴嬈★紝灝辨槸鏃╀笂涓夌偣閽熷氨宕╂簝銆侱avid R. Butenhof 鍦ㄤ粬鐨勩奝OSIX 綰跨▼緙栫▼銆嬶紙璇峰弬闃呮湰鏂囨湯灝劇殑 鍙傝冭祫鏂?/font>閮ㄥ垎錛変竴涔︿腑錛岃璁轟簡(jiǎn)鐢變簬鏈嬌鐢ㄤ簰鏂ュ璞¤屽皢浜х敓鐨勭縐嶆儏鍐點(diǎn)?
濡傛灉鏀劇疆浜?jiǎn)杩囧鐨勪簰鏂ュ璞″Q屼唬鐮佸氨娌℃湁浠涔堝茍鍙戞у彲璦錛岃繍琛岃搗鏉ヤ篃姣斿崟綰跨▼瑙e喅鏂規(guī)鎱€傚鏋滄斁緗簡(jiǎn)榪囧皯鐨勪簰鏂ュ璞★紝浠g爜灝嗗嚭鐜板鎬拰浠や漢灝村艾鐨勯敊璇傚垢榪愮殑鏄紝鏈変竴涓腑闂寸珛鍦恒傞鍏堬紝浜掓枼瀵硅薄鏄敤浜庝覆琛屽寲瀛樺彇*鍏變韓鏁版嵁*銆備笉瑕佸闈炲叡浜暟鎹嬌鐢ㄤ簰鏂ュ璞★紝騫朵笖錛屽鏋滅▼搴忛昏緫紜繚浠諱綍鏃跺欓兘鍙湁涓涓嚎紼嬭兘瀛樺彇鐗瑰畾鏁版嵁緇撴瀯錛岄偅涔堜篃涓嶈浣跨敤浜掓枼瀵硅薄銆?/p>
鍏舵錛屽鏋滆浣跨敤鍏變韓鏁版嵁錛岄偅涔堝湪璇匯佸啓鍏變韓鏁版嵁鏃墮兘搴斾嬌鐢ㄤ簰鏂ュ璞°傜敤 pthread_mutex_lock() 鍜?pthread_mutex_unlock() 鎶婅鍐欓儴鍒嗕繚鎶よ搗鏉ワ紝鎴栬呭湪紼嬪簭涓笉鍥哄畾鐨勫湴鏂歸殢鏈轟嬌鐢ㄥ畠浠傚浼?xì)浠庝竴涓嚎紼嬬殑瑙掑害鏉ュ瑙嗕唬鐮侊紝騫剁‘淇濈▼搴忎腑姣忎竴涓嚎紼嬪鍐呭瓨鐨勮鐐歸兘鏄竴鑷村拰鍚堥傜殑銆備負(fù)浜?jiǎn)鐔熸?zhèn)変簰鏂ュ璞$殑鐢ㄦ硶錛屾渶鍒濆彲鑳借鑺卞ソ鍑犱釜灝忔椂鏉ョ紪鍐欎唬鐮侊紝浣嗘槸寰堝揩灝變細(xì)涔?fàn)鎯q朵笖*涔?涓嶅繀澶氭兂灝辮兘澶熸紜嬌鐢ㄥ畠浠?/p>
鐜板湪璇ユ潵鐪嬬湅浣跨敤浜掓枼瀵硅薄鐨勫悇縐嶄笉鍚屾柟娉曚簡(jiǎn)銆傝鎴戜滑浠庡垵濮嬪寲寮濮嬨傚湪 thread3.c 紺轟緥 涓紝鎴戜滑浣跨敤浜?jiǎn)闈?rùn)鎬佸垵濮嬪寲鏂規(guī)硶銆傝繖闇瑕佸0鏄庝竴涓?pthread_mutex_t 鍙橀噺錛屽茍璧嬬粰瀹冨父鏁?PTHREAD_MUTEX_INITIALIZER錛?
pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;
|
寰堢畝鍗曞惂銆備絾鏄繕鍙互鍔ㄦ佸湴鍒涘緩浜掓枼瀵硅薄銆傚綋浠g爜浣跨敤 malloc() 鍒嗛厤涓涓柊鐨勪簰鏂ュ璞℃椂錛屼嬌鐢ㄨ繖縐嶅姩鎬佹柟娉曘傛鏃訛紝闈?rùn)鎬佸垵濮嬪寲鏂規(guī)硶鏄涓嶉氱殑錛屽茍涓斿簲褰撲嬌鐢ㄤ緥紼?pthread_mutex_init()錛?/p>
int pthread_mutex_init( pthread_mutex_t *mymutex, const pthread_mutexattr_t *attr)
|
姝e鎵紺猴紝pthread_mutex_init 鎺ュ彈涓涓寚閽堜綔涓哄弬鏁頒互鍒濆鍖栦負(fù)浜掓枼瀵硅薄錛岃鎸囬拡鎸囧悜涓鍧楀凡鍒嗛厤濂界殑鍐呭瓨鍖恒傜浜屼釜鍙傛暟錛屽彲浠ユ帴鍙椾竴涓彲閫夌殑 pthread_mutexattr_t 鎸囬拡銆傝繖涓粨鏋勫彲鐢ㄦ潵璁劇疆鍚勭浜掓枼瀵硅薄灞炴с備絾鏄氬父騫朵笉闇瑕佽繖浜涘睘鎬э紝鎵浠ユ甯稿仛娉曟槸鎸囧畾 NULL銆?/p>
涓鏃︿嬌鐢?pthread_mutex_init() 鍒濆鍖栦簡(jiǎn)浜掓枼瀵硅薄錛屽氨搴斾嬌鐢?pthread_mutex_destroy() 娑堥櫎瀹冦俻thread_mutex_destroy() 鎺ュ彈涓涓寚鍚?pthread_mutext_t 鐨勬寚閽堜綔涓哄弬鏁幫紝騫墮噴鏀懼垱寤轟簰鏂ュ璞℃椂鍒嗛厤緇欏畠鐨勪換浣曡祫婧愩傝娉ㄦ剰錛?pthread_mutex_destroy() 涓嶄細(xì) 閲婃斁鐢ㄦ潵瀛樺偍 pthread_mutex_t 鐨勫唴瀛樸傞噴鏀捐嚜宸辯殑鍐呭瓨瀹屽叏鍙栧喅浜庢?zhèn)ㄣ傝繕蹇呴』娉ㄦ剰涓鐐癸紝pthread_mutex_init() 鍜?pthread_mutex_destroy() 鎴愬姛鏃墮兘榪斿洖闆躲?
pthread_mutex_lock(pthread_mutex_t *mutex)
|
pthread_mutex_lock() 鎺ュ彈涓涓寚鍚戜簰鏂ュ璞$殑鎸囬拡浣滀負(fù)鍙傛暟浠ュ皢鍏墮攣瀹氥傚鏋滅宸у凡緇忛攣瀹氫簡(jiǎn)浜掓枼瀵硅薄錛岃皟鐢ㄨ呭皢榪涘叆鐫$湢鐘舵併傚嚱鏁拌繑鍥炴椂錛屽皢鍞ら啋璋冪敤鑰咃紙鏄劇劧錛夊茍涓旇皟鐢ㄨ呰繕灝嗕繚鐣欒閿併傚嚱鏁拌皟鐢ㄦ垚鍔熸椂榪斿洖闆訛紝澶辮觸鏃惰繑鍥為潪闆剁殑閿欒浠g爜銆?/p>
pthread_mutex_unlock(pthread_mutex_t *mutex)
|
pthread_mutex_unlock() 涓?pthread_mutex_lock() 鐩擱厤鍚堬紝瀹冩妸綰跨▼宸茬粡鍔犻攣鐨勪簰鏂ュ璞¤В閿併傚緇堝簲璇ュ敖蹇宸插姞閿佺殑浜掓枼瀵硅薄榪涜瑙i攣錛堜互鎻愰珮鎬ц兘錛夈傚茍涓旂粷瀵逛笉瑕佸鎮(zhèn)ㄦ湭淇濇寔閿佺殑浜掓枼瀵硅薄榪涜瑙i攣鎿嶄綔錛堝惁鍒欙紝pthread_mutex_unlock() 璋冪敤灝嗗け璐ュ茍甯︿竴涓潪闆剁殑 EPERM 榪斿洖鍊鹼級(jí)銆?/p>
pthread_mutex_trylock(pthread_mutex_t *mutex)
|
褰撶嚎紼嬫鍦ㄥ仛鍏跺畠浜嬫儏鐨勬椂鍊欙紙鐢變簬浜掓枼瀵硅薄褰撳墠鏄攣瀹氱殑錛夛紝濡傛灉甯屾湜閿佸畾浜掓枼瀵硅薄錛岃繖涓皟鐢ㄥ氨鐩稿綋鏂逛究銆傝皟鐢?pthread_mutex_trylock() 鏃跺皢灝濊瘯閿佸畾浜掓枼瀵硅薄銆傚鏋滀簰鏂ュ璞″綋鍓嶅浜庤В閿佺姸鎬侊紝閭d箞鎮(zhèn)ㄥ皢鑾峰緱璇ラ攣騫朵笖鍑芥暟灝嗚繑鍥為浂銆傜劧鑰岋紝濡傛灉浜掓枼瀵硅薄宸查攣瀹氾紝榪欎釜璋冪敤涔熶笉浼?xì)闃诲銆傚綋鐒?dòng)灱屽畠浼?xì)榪斿洖闈為浂鐨?EBUSY 閿欒鍊箋傜劧鍚庡彲浠ョ戶緇仛鍏跺畠浜嬫儏錛岀◢鍚庡啀灝濊瘯閿佸畾銆?/p>
浜掓枼瀵硅薄鏄嚎紼嬬▼搴忓繀闇鐨勫伐鍏鳳紝浣嗗畠浠茍闈炰竾鑳界殑銆備緥濡傦紝濡傛灉綰跨▼姝e湪絳夊緟鍏變韓鏁版嵁鍐呮煇涓潯浠跺嚭鐜幫紝閭d細(xì)鍙戠敓浠涔堝憿錛熶唬鐮佸彲浠ュ弽澶嶅浜掓枼瀵硅薄閿佸畾鍜岃В閿侊紝浠ユ鏌ュ肩殑浠諱綍鍙樺寲銆傚悓鏃訛紝榪樿蹇熷皢浜掓枼瀵硅薄瑙i攣錛屼互渚垮叾瀹冪嚎紼嬭兘澶熻繘琛屼換浣曞繀闇鐨勬洿鏀廣傝繖鏄竴縐嶉潪甯稿彲鎬曠殑鏂規(guī)硶錛屽洜涓虹嚎紼嬮渶瑕佸湪鍚堢悊鐨勬椂闂磋寖鍥村唴棰戠箒鍦板驚鐜嫻嬪彉鍖栥?/p>
鍦ㄦ瘡嬈℃鏌ヤ箣闂達(dá)紝鍙互璁╄皟鐢ㄧ嚎紼嬬煭鏆傚湴榪涘叆鐫$湢錛屾瘮濡傜潯鐪犱笁縐掗挓錛屼絾鏄洜姝ょ嚎紼嬩唬鐮佸氨鏃犳硶鏈蹇綔鍑哄搷搴斻傜湡姝i渶瑕佺殑鏄繖鏍蜂竴縐嶆柟娉曪紝褰撶嚎紼嬪湪絳夊緟婊¤凍鏌愪簺鏉′歡鏃朵嬌綰跨▼榪涘叆鐫$湢鐘舵併備竴鏃︽潯浠舵弧瓚籌紝榪橀渶瑕佷竴縐嶆柟娉曚互鍞ら啋鍥犵瓑寰呮弧瓚崇壒瀹氭潯浠惰岀潯鐪犵殑綰跨▼銆傚鏋滆兘澶熷仛鍒拌繖涓鐐癸紝綰跨▼浠g爜灝嗘槸闈炲父楂樻晥鐨勶紝騫朵笖涓嶄細(xì)鍗犵敤瀹濊吹鐨勪簰鏂ュ璞¢攣銆傝繖姝f槸 POSIX 鏉′歡鍙橀噺鑳藉仛鐨勪簨錛?/p>
鑰?POSIX 鏉′歡鍙橀噺灝嗘槸鎴戜笅涓綃囨枃绔犵殑涓婚錛屽叾涓皢璇存槑濡備綍姝g‘浣跨敤鏉′歡鍙橀噺銆傚埌閭f椂錛屾?zhèn)畣鎷ユ湁浜?jiǎn)鍒涘緩澶嶆潅綰跨▼紼嬪簭鎵闇鐨勫叏閮ㄨ祫婧愶紝閭d簺綰跨▼紼嬪簭鍙互妯℃嫙宸ヤ綔浜哄憳銆佽閰嶇嚎絳夌瓑銆傛棦鐒舵?zhèn)ㄥ凡缁彮憡鏉キ憡鐔熸?zhèn)夌嚎紼嬶紝鎴戝皢鍦ㄤ笅涓綃囨枃绔犱腑鍔犲揩榪涘害銆傝繖鏍鳳紝鍦ㄤ笅涓綃囨枃绔犵殑緇撳熬灝辮兘鏀句笂涓涓浉瀵瑰鏉傜殑綰跨▼紼嬪簭銆傝鍒扮瓑鍒版潯浠朵駭鐢燂紝涓嬫鍐嶈錛?/p>
|
|
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 鍙栧緱鑱旂郴銆?
[鍘熸枃鍦板潃]http://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/
POSIX錛堝彲縐繪鎿嶄綔緋葷粺鎺ュ彛錛夌嚎紼嬫槸鎻愰珮?shù)唬鐮佸搷搴斿拰鎬ц兘鐨勬湁鍔涙墜孌點(diǎn)傚湪鏈郴鍒椾腑錛孌aniel Robbins 鍚戞?zhèn)ň_劇‘鍦板睍紺哄湪緙栫▼涓浣曚嬌鐢ㄧ嚎紼嬨傚叾涓繕娑夊強(qiáng)澶ч噺騫曞悗緇嗚妭錛岃瀹屾湰緋誨垪鏂囩珷錛屾?zhèn)ㄥ畬鍏ㄥ彲浠q愮敤 POSIX 綰跨▼鍒涘緩澶氱嚎紼嬬▼搴忋?/p>
浜?jiǎn)瑙e浣曟纭畼q愮敤綰跨▼鏄瘡涓涓紭縐紼嬪簭鍛樺繀澶囩殑绱犺川銆傜嚎紼嬬被浼間簬榪涚▼銆傚鍚岃繘紼嬶紝綰跨▼鐢卞唴鏍告寜鏃墮棿鍒嗙墖榪涜綆$悊銆傚湪鍗曞鐞嗗櫒緋葷粺涓紝鍐呮牳浣跨敤鏃墮棿鍒嗙墖鏉ユā鎷熺嚎紼嬬殑騫跺彂鎵ц錛岃繖縐嶆柟寮忓拰榪涚▼鐨勭浉鍚屻傝屽湪澶氬鐞嗗櫒緋葷粺涓紝濡傚悓澶氫釜榪涚▼錛岀嚎紼嬪疄闄呬笂涓鏍峰彲浠ュ茍鍙戞墽琛屻?/p>
閭d箞涓轟粈涔堝浜庡ぇ澶氭暟鍚堜綔鎬т換鍔★紝澶氱嚎紼嬫瘮澶氫釜鐙珛鐨勮繘紼嬫洿浼樿秺鍛紵榪欐槸鍥犱負(fù)錛岀嚎紼嬪叡浜浉鍚岀殑鍐呭瓨絀洪棿銆備笉鍚岀殑綰跨▼鍙互瀛樺彇鍐呭瓨?shù)腑鐨勫悓涓涓彉閲忋傛墍浠ワ紝紼嬪簭涓殑鎵鏈夌嚎紼嬮兘鍙互璇繪垨鍐欏0鏄庤繃鐨勫叏灞鍙橀噺銆傚鏋滄浘鐢?fork() 緙栧啓榪囬噸瑕佷唬鐮侊紝灝變細(xì)璁よ瘑鍒拌繖涓伐鍏風(fēng)殑閲嶈鎬с備負(fù)浠涔堝憿錛熻櫧鐒?fork() 鍏佽鍒涘緩澶氫釜榪涚▼錛屼絾瀹冭繕?shù)細(xì)甯︽潵浠ヤ笅閫氫俊闂: 濡備綍璁╁涓繘紼嬬浉浜掗氫俊錛岃繖閲屾瘡涓繘紼嬮兘鏈夊悇鑷嫭绔嬬殑鍐呭瓨絀洪棿銆傚榪欎釜闂娌℃湁涓涓畝鍗曠殑絳旀銆傝櫧鐒舵湁璁稿涓嶅悓縐嶇被鐨勬湰鍦?IPC (榪涚▼闂撮氫俊錛夛紝浣嗗畠浠兘閬囧埌涓や釜閲嶈闅滅錛?/p>
鍙岄噸鍧忎簨: 寮閿鍜屽鏉傛ч兘闈炲ソ浜嬨傚鏋滄浘緇忎負(fù)浜?jiǎn)鏀?IPC 鑰屽紼嬪簭澶у姩騫叉垐榪囷紝閭d箞鎮(zhèn)ㄥ氨浼?xì)鐪熸娆h祻绾拷E嬫彁渚涚殑綆鍗曞叡浜唴瀛樻満鍒躲傜敱浜庢墍鏈夌殑綰跨▼閮介┗鐣欏湪鍚屼竴鍐呭瓨絀洪棿錛孭OSIX 綰跨▼鏃犻渶榪涜寮閿澶ц屽鏉傜殑闀胯窛紱昏皟鐢ㄣ傚彧瑕佸埄鐢ㄧ畝鍗曠殑鍚屾鏈哄埗錛岀▼搴忎腑鎵鏈夌殑綰跨▼閮藉彲浠ヨ鍙栧拰淇敼宸叉湁鐨勬暟鎹粨鏋勩傝屾棤闇灝嗘暟鎹粡鐢辨枃浠舵弿榪扮杞偍鎴栨尋鍏ョ揣紿勭殑鍏變韓鍐呭瓨絀洪棿銆備粎姝や竴涓師鍥狅紝灝辮凍浠ヨ鎮(zhèn)ㄨ冭檻搴旇閲囩敤鍗曡繘紼?澶氱嚎紼嬫ā寮忚岄潪澶氳繘紼?鍗曠嚎紼嬫ā寮忋?/p>
涓嶄粎濡傛銆傜嚎紼嬪悓鏍瘋繕鏄潪甯稿揩鎹風(fēng)殑銆備笌鏍囧噯 fork() 鐩告瘮錛岀嚎紼嬪甫鏉ョ殑寮閿寰堝皬銆傚唴鏍告棤闇鍗曠嫭澶嶅埗榪涚▼鐨勫唴瀛樼┖闂存垨鏂囦歡鎻忚堪絎︾瓑絳夈傝繖灝辮妭鐪佷簡(jiǎn)澶ч噺鐨?CPU 鏃墮棿錛屼嬌寰楃嚎紼嬪垱寤烘瘮鏂拌繘紼嬪垱寤哄揩涓婂崄鍒頒竴鐧懼嶃傚洜涓鴻繖涓鐐癸紝鍙互澶ч噺浣跨敤綰跨▼鑰屾棤闇澶繃浜庢媴蹇?jī)甯︽潵鐨?CPU 鎴栧唴瀛樹(shù)笉瓚熾備嬌鐢?fork() 鏃跺鑷寸殑澶ч噺 CPU 鍗犵敤涔熶笉澶嶅瓨鍦ㄣ傝繖琛ㄧず鍙鍦ㄧ▼搴忎腑鏈夋剰涔夛紝閫氬父灝卞彲浠ュ垱寤虹嚎紼嬨?/p>
褰撶劧錛屽拰榪涚▼涓鏍鳳紝綰跨▼灝嗗埄鐢ㄥ CPU銆傚鏋滆蔣浠舵槸閽堝澶氬鐞嗗櫒緋葷粺璁捐鐨勶紝榪欏氨鐪熺殑鏄竴澶х壒鎬э紙濡傛灉杞歡鏄紑鏀炬簮鐮侊紝鍒欐渶緇堝彲鑳藉湪涓嶅皯騫沖彴涓婅繍琛岋級(jí)銆傜壒瀹氱被鍨嬬嚎紼嬬▼搴忥紙灝ゅ叾鏄?CPU 瀵嗛泦鍨嬬▼搴忥級(jí)鐨勬ц兘灝嗛殢緋葷粺涓鐞嗗櫒鐨勬暟鐩嚑涔庣嚎鎬у湴鎻愰珮銆傚鏋滄鍦ㄧ紪鍐?CPU 闈炲父瀵嗛泦鍨嬬殑紼嬪簭錛屽垯緇濆鎯寵娉曞湪浠g爜涓嬌鐢ㄥ綰跨▼銆備竴鏃︽帉鎻′簡(jiǎn)綰跨▼緙栫爜錛屾棤闇浣跨敤綣佺悙鐨?IPC 鍜屽叾瀹冨鏉傜殑閫氫俊鏈哄埗錛屽氨鑳藉浠ュ叏鏂板拰鍒涢犳х殑鏂規(guī)硶瑙e喅緙栫爜闅鵑銆傛墍鏈夎繖浜涚壒鎬ч厤鍚堝湪涓璧蜂嬌寰楀綰跨▼緙栫▼鏇存湁瓚c佸揩閫熷拰鐏墊椿銆?/p>
濡傛灉鐔熸?zhèn)?Linux 緙栫▼錛屽氨鏈夊彲鑳界煡閬?__clone() 緋葷粺璋冪敤銆俖_clone() 綾諱技浜?fork()錛屽悓鏃朵篃鏈夎澶氱嚎紼嬬殑鐗規(guī)с備緥濡傦紝浣跨敤 __clone()錛屾柊鐨勫瓙榪涚▼鍙互鏈夐夋嫨鍦板叡浜埗榪涚▼鐨勬墽琛岀幆澧冿紙鍐呭瓨絀洪棿錛屾枃浠舵弿榪扮絳夛級(jí)銆傝繖鏄ソ鐨勪竴闈€備絾 __clone() 涔熸湁涓嶈凍涔嬪銆傛濡俖_clone() 鍦ㄧ嚎甯姪鎸囧嚭錛?/p>
“__clone 璋冪敤鏄壒瀹氫簬 Linux 騫沖彴鐨勶紝涓嶉傜敤浜庡疄鐜板彲縐繪鐨勭▼搴忋傛緙栧啓綰跨▼鍖栧簲鐢ㄧ▼搴忥紙澶氱嚎紼嬫帶鍒跺悓涓鍐呭瓨絀洪棿錛夛紝鏈濂戒嬌鐢ㄥ疄鐜?POSIX 1003.1c 綰跨▼ API 鐨勫簱錛屼緥濡?Linux-Threads 搴撱傚弬闃?pthread_create(3thr)銆?#8221;
铏界劧 __clone() 鏈夌嚎紼嬬殑璁稿鐗規(guī)э紝浣嗗畠鏄笉鍙Щ妞嶇殑銆傚綋鐒惰繖騫朵笉鎰忓懗鐫浠g爜涓笉鑳戒嬌鐢ㄥ畠銆備絾鍦ㄨ蔣浠朵腑鑰冭檻浣跨敤 __clone() 鏃跺簲褰撴潈琛¤繖涓浜嬪疄銆傚煎緱搴?jiǎn)骞哥殑鏄Q屾濡?__clone() 鍦ㄧ嚎甯姪鎸囧嚭錛屾湁涓縐嶆洿濂界殑鏇夸唬鏂規(guī)錛歅OSIX 綰跨▼銆傚鏋滄兂緙栧啓 鍙Щ妞嶇殑 澶氱嚎紼嬩唬鐮侊紝浠g爜鍙繍琛屼簬 Solaris銆丗reeBSD銆丩inux 鍜屽叾瀹冨鉤鍙幫紝POSIX 綰跨▼鏄竴縐嶅綋鐒朵箣閫夈?/p>
涓嬮潰鏄竴涓?POSIX 綰跨▼鐨勭畝鍗曠ず渚嬬▼搴忥細(xì)
#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);
}
|
瑕佺紪璇戣繖涓▼搴忥紝鍙渶鍏堝皢紼嬪簭瀛樹(shù)負(fù) thread1.c錛岀劧鍚庤緭鍏ワ細(xì)
$ gcc thread1.c -o thread1 -lpthread
|
榪愯鍒欒緭鍏ワ細(xì)
$ ./thread1
|
thread1.c 鏄竴涓潪甯哥畝鍗曠殑綰跨▼紼嬪簭銆傝櫧鐒跺畠娌℃湁瀹炵幇浠涔堟湁鐢ㄧ殑鍔熻兘錛屼絾鍙互甯姪鐞嗚В綰跨▼鐨勮繍琛屾満鍒躲備笅闈紝鎴戜滑涓姝ヤ竴姝ュ湴浜?jiǎn)瑙q欎釜紼嬪簭鏄共浠涔堢殑銆俶ain() 涓0鏄庝簡(jiǎn)鍙橀噺 mythread錛岀被鍨嬫槸 pthread_t銆俻thread_t 綾誨瀷鍦?pthread.h 涓畾涔夛紝閫氬父縐頒負(fù)“綰跨▼ id”錛堢緝鍐欎負(fù) "tid"錛夈傚彲浠ヨ涓哄畠鏄竴縐嶇嚎紼嬪彞鏌勩?/p>
mythread 澹版槑鍚庯紙璁頒綇 mythread 鍙槸涓涓?"tid"錛屾垨鏄皢瑕佸垱寤虹殑綰跨▼鐨勫彞鏌勶級(jí)錛岃皟鐢?pthread_create 鍑芥暟鍒涘緩涓涓湡瀹炴椿鍔ㄧ殑綰跨▼銆備笉瑕佸洜涓?pthread_create() 鍦?"if" 璇彞鍐呰屽彈鍏惰糠鎯戙傜敱浜?pthread_create() 鎵ц鎴愬姛鏃惰繑鍥為浂鑰屽け璐ユ椂鍒欒繑鍥為潪闆跺鹼紝灝?pthread_create() 鍑芥暟璋冪敤鏀懼湪 if() 璇彞涓彧鏄負(fù)浜?jiǎn)鏂逛究鍦皨個(gè)嫻嬪け璐ョ殑璋冪敤銆傝鎴戜滑鏌ョ湅涓涓?pthread_create 鍙傛暟銆傜涓涓弬鏁?&mythread 鏄寚鍚?mythread 鐨勬寚閽堛傜浜屼釜鍙傛暟褰撳墠涓?NULL錛屽彲鐢ㄦ潵瀹氫箟綰跨▼鐨勬煇浜涘睘鎬с傜敱浜庣己鐪佺殑綰跨▼灞炴ф槸閫傜敤鐨勶紝鍙渶灝嗚鍙傛暟璁句負(fù) NULL銆?/p>
絎笁涓弬鏁版槸鏂扮嚎紼嬪惎鍔ㄦ椂璋冪敤鐨勫嚱鏁板悕銆傛湰渚嬩腑錛屽嚱鏁板悕涓?thread_function()銆傚綋 thread_function() 榪斿洖鏃訛紝鏂扮嚎紼嬪皢緇堟銆傛湰渚嬩腑錛岀嚎紼嬪嚱鏁版病鏈夊疄鐜板ぇ鐨勫姛鑳姐傚畠浠呭皢 "Thread says hi!" 杈撳嚭 20 嬈$劧鍚庨鍑恒傛敞鎰?thread_function() 鎺ュ彈 void * 浣滀負(fù)鍙傛暟錛屽悓鏃惰繑鍥炲肩殑綾誨瀷涔熸槸 void *銆傝繖琛ㄦ槑鍙互鐢?void * 鍚戞柊綰跨▼浼犻掍換鎰忕被鍨嬬殑鏁版嵁錛屾柊綰跨▼瀹屾垚鏃朵篃鍙繑鍥炰換鎰忕被鍨嬬殑鏁版嵁銆傞偅濡備綍鍚戠嚎紼嬩紶閫掍竴涓換鎰忓弬鏁幫紵寰堢畝鍗曘傚彧瑕佸埄鐢?pthread_create() 涓殑絎洓涓弬鏁般傛湰渚嬩腑錛屽洜涓烘病鏈夊繀瑕佸皢浠諱綍鏁版嵁浼犵粰寰笉瓚抽亾鐨?thread_function()錛屾墍浠ュ皢絎洓涓弬鏁拌涓?NULL銆?/p>
鎮(zhèn)ㄤ篃璁稿凡鎺ㄦ祴鍒幫紝鍦?pthread_create() 鎴愬姛榪斿洖涔嬪悗錛岀▼搴忓皢鍖呭惈涓や釜綰跨▼銆傜瓑涓絳夛紝 涓や釜 綰跨▼錛熸垜浠笉鏄彧鍒涘緩浜?jiǎn)涓涓嚎紼嬪悧錛熶笉閿欙紝鎴戜滑鍙垱寤轟簡(jiǎn)涓涓繘紼嬨備絾鏄富紼嬪簭鍚屾牱涔熸槸涓涓嚎紼嬨傚彲浠ヨ繖鏍風(fēng)悊瑙o細(xì)濡傛灉緙栧啓鐨勭▼搴忔牴鏈病鏈変嬌鐢?POSIX 綰跨▼錛屽垯璇ョ▼搴忔槸鍗曠嚎紼嬬殑錛堣繖涓崟綰跨▼縐頒負(fù)“涓?#8221;綰跨▼錛夈傚垱寤轟竴涓柊綰跨▼涔嬪悗紼嬪簭鎬誨叡灝辨湁涓や釜綰跨▼浜?jiǎn)銆?
鎴戞兂姝ゆ椂鎮(zhèn)ㄨ嚦灝戞湁涓や釜閲嶈闂銆傜涓涓棶棰橈紝鏂扮嚎紼嬪垱寤轟箣鍚庝富綰跨▼濡備綍榪愯銆傜瓟妗堬紝涓葷嚎紼嬫寜欏哄簭緇х畫鎵ц涓嬩竴琛岀▼搴忥紙鏈緥涓墽琛?"if (pthread_join(...))"錛夈傜浜屼釜闂錛屾柊綰跨▼緇撴潫鏃跺浣曞鐞嗐傜瓟妗堬紝鏂扮嚎紼嬪厛鍋滄錛岀劧鍚庝綔涓哄叾娓呯悊榪囩▼鐨勪竴閮ㄥ垎錛岀瓑寰呬笌鍙︿竴涓嚎紼嬪悎騫舵垨“榪炴帴”銆?/p>
鐜板湪錛屾潵鐪嬩竴涓?pthread_join()銆傛濡?pthread_create() 灝嗕竴涓嚎紼嬫媶鍒嗕負(fù)涓や釜錛?pthread_join() 灝嗕袱涓嚎紼嬪悎騫朵負(fù)涓涓嚎紼嬨俻thread_join() 鐨勭涓涓弬鏁版槸 tid mythread銆傜浜屼釜鍙傛暟鏄寚鍚?void 鎸囬拡鐨勬寚閽堛傚鏋?void 鎸囬拡涓嶄負(fù) NULL錛宲thread_join 灝嗙嚎紼嬬殑 void * 榪斿洖鍊兼斁緗湪鎸囧畾鐨勪綅緗笂銆傜敱浜庢垜浠笉蹇呯悊浼?thread_function() 鐨勮繑鍥炲鹼紝鎵浠ュ皢鍏惰涓?NULL.
鎮(zhèn)ㄤ細(xì)娉ㄦ剰鍒?thread_function() 鑺變簡(jiǎn) 20 縐掓墠瀹屾垚銆傚湪 thread_function() 緇撴潫寰堜箙涔嬪墠錛屼富綰跨▼灝卞凡緇忚皟鐢ㄤ簡(jiǎn) pthread_join()銆傚鏋滃彂鐢熻繖縐嶆儏鍐碉紝涓葷嚎紼嬪皢涓柇錛堣漿鍚戠潯鐪狅級(jí)鐒跺悗絳夊緟 thread_function() 瀹屾垚銆傚綋 thread_function() 瀹屾垚鍚? pthread_join() 灝嗚繑鍥炪傝繖鏃剁▼搴忓張鍙湁涓涓富綰跨▼銆傚綋紼嬪簭閫鍑烘椂錛屾墍鏈夋柊綰跨▼宸茬粡浣跨敤 pthread_join() 鍚堝茍浜?jiǎn)銆傝繖灝辨槸搴旇濡備綍澶勭悊鍦ㄧ▼搴忎腑鍒涘緩鐨勬瘡涓柊綰跨▼鐨勮繃紼嬨傚鏋滄病鏈夊悎騫朵竴涓柊綰跨▼錛屽垯瀹冧粛鐒跺緋葷粺鐨勬渶澶х嚎紼嬫暟闄愬埗涓嶅埄銆傝繖鎰忓懗鐫濡傛灉鏈綰跨▼鍋氭紜殑娓呯悊錛屾渶緇堜細(xì)瀵艱嚧 pthread_create() 璋冪敤澶辮觸銆?/p>
濡傛灉浣跨敤榪?fork() 緋葷粺璋冪敤錛屽彲鑳界啛鎮(zhèn)夌埗榪涚▼鍜屽瓙榪涚▼鐨勬蹇點(diǎn)傚綋鐢?fork() 鍒涘緩鍙︿竴涓柊榪涚▼鏃訛紝鏂拌繘紼嬫槸瀛愯繘紼嬶紝鍘熷榪涚▼鏄埗榪涚▼銆傝繖鍒涘緩浜?jiǎn)鍙兘闈炲父鏈夌敤鐨勫眰娆″叧绯诲Q屽挨鍏舵槸絳夊緟瀛愯繘紼嬬粓姝㈡椂銆備緥濡傦紝waitpid() 鍑芥暟璁╁綋鍓嶈繘紼嬬瓑寰呮墍鏈夊瓙榪涚▼緇堟銆倃aitpid() 鐢ㄦ潵鍦ㄧ埗榪涚▼涓疄鐜扮畝鍗曠殑娓呯悊榪囩▼銆?/p>
鑰?POSIX 綰跨▼灝辨洿鏈夋剰鎬濄傛?zhèn)ㄥ彲鑳藉凡缁忔敞鎰忓埌鎴戜竴鐩存湁鎰忛伩鍏嶄嬌鐢?#8220;鐖剁嚎紼?#8221;鍜?#8220;瀛愮嚎紼?#8221;鐨勮娉曘傝繖鏄洜涓?POSIX 綰跨▼涓笉瀛樺湪榪欑灞傛鍏崇郴銆傝櫧鐒朵富綰跨▼鍙互鍒涘緩涓涓柊綰跨▼錛屾柊綰跨▼鍙互鍒涘緩鍙︿竴涓柊綰跨▼錛孭OSIX 綰跨▼鏍囧噯灝嗗畠浠涓虹瓑鍚岀殑灞傛銆傛墍浠ョ瓑寰呭瓙綰跨▼閫鍑虹殑姒傚康鍦ㄨ繖閲屾病鏈夋剰涔夈侾OSIX 綰跨▼鏍囧噯涓嶈褰曚換浣?#8220;瀹舵棌”淇℃伅銆傜己灝戝鏃忎俊鎭湁涓涓富瑕佸惈鎰忥細(xì)濡傛灉瑕佺瓑寰呬竴涓嚎紼嬬粓姝紝灝卞繀欏誨皢綰跨▼鐨?tid 浼犻掔粰 pthread_join()銆傜嚎紼嬪簱鏃犳硶涓烘?zhèn)ㄦ柇瀹?tid銆?/p>
瀵瑰ぇ澶氭暟寮鍙戣呮潵璇磋繖涓嶆槸涓ソ娑堟伅錛屽洜涓鴻繖浼?xì)鋴涉湁澶氫釜绾拷E嬬殑紼嬪簭澶嶆潅鍖栥備笉榪囦笉瑕佷負(fù)姝ゆ媴蹇с侾OSIX 綰跨▼鏍囧噯鎻愪緵浜?jiǎn)鏈夋晥鍦敖帯鐞嗗涓U跨▼鎵闇瑕佺殑鎵鏈夊伐鍏楓傚疄闄呬笂錛屾病鏈夌埗/瀛愬叧緋昏繖涓浜嬪疄鍗翠負(fù)鍦ㄧ▼搴忎腑浣跨敤綰跨▼寮杈熶簡(jiǎn)鏇村垱閫犳х殑鏂規(guī)硶銆備緥濡傦紝濡傛灉鏈変竴涓嚎紼嬬О涓虹嚎紼?1錛岀嚎紼?1 鍒涘緩浜?jiǎn)绉颁负绾拷E?2 鐨勭嚎紼嬶紝鍒欑嚎紼?1 鑷繁娌℃湁蹇呰璋冪敤 pthread_join() 鏉ュ悎騫剁嚎紼?2錛岀▼搴忎腑鍏跺畠浠諱竴綰跨▼閮藉彲浠ュ仛鍒般傚綋緙栧啓澶ч噺浣跨敤綰跨▼鐨勪唬鐮佹椂錛岃繖灝卞彲鑳藉厑璁稿彂鐢熸湁瓚g殑浜嬫儏銆備緥濡傦紝鍙互鍒涘緩涓涓寘鍚墍鏈夊凡鍋滄綰跨▼鐨勫叏灞“姝葷嚎紼嬪垪琛?#8221;錛岀劧鍚庤涓涓笓闂ㄧ殑娓呯悊綰跨▼涓撶瓑鍋滄鐨勭嚎紼嬪姞鍒板垪琛ㄤ腑銆傝繖涓竻鐞嗙嚎紼嬭皟鐢?pthread_join() 灝嗗垰鍋滄鐨勭嚎紼嬩笌鑷繁鍚堝茍銆傜幇鍦紝浠呯敤涓涓嚎紼嬪氨宸у鍜屾湁鏁堝湴澶勭悊浜?jiǎn)鍏ㄩ儴娓呯悊銆?br>
鐜板湪鎴戜滑鏉ョ湅涓浜涗唬鐮侊紝榪欎簺浠g爜鍋氫簡(jiǎn)涓浜涙剰鎯充笉鍒扮殑浜嬫儏銆倀hread2.c 鐨勪唬鐮佸涓嬶細(xì)
#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);
}
|
濡傚悓絎竴涓▼搴忥紝榪欎釜紼嬪簭鍒涘緩涓涓柊綰跨▼銆備富綰跨▼鍜屾柊綰跨▼閮藉皢鍏ㄥ眬鍙橀噺 myglobal 鍔犱竴 20 嬈°備絾鏄▼搴忔湰韜駭鐢熶簡(jiǎn)鏌愪簺鎰忔兂涓嶅埌鐨勭粨鏋溿傜紪璇戜唬鐮佽杈撳叆錛?/p>
$ gcc thread2.c -o thread2 -lpthread
|
榪愯璇瘋緭鍏ワ細(xì)
$ ./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
|
闈炲父鎰忓鍚э紒鍥犱負(fù) myglobal 浠庨浂寮濮嬶紝涓葷嚎紼嬪拰鏂扮嚎紼嬪悇鑷鍏惰繘琛屼簡(jiǎn) 20 嬈″姞涓, 紼嬪簭緇撴潫鏃?myglobal 鍊煎簲褰撶瓑浜?40銆傜敱浜?myglobal 杈撳嚭緇撴灉涓?21錛岃繖鍏朵腑鑲畾鏈夐棶棰樸備絾鏄┒绔熸槸浠涔堝憿錛?/p>
鏀懼純鍚楋紵濂斤紝璁╂垜鏉ヨВ閲婃槸鎬庝箞涓鍥炰簨銆傞鍏堟煡鐪嬪嚱鏁?thread_function()銆傛敞鎰忓浣曞皢 myglobal 澶嶅埗鍒板眬閮ㄥ彉閲?"j" 浜?jiǎn)鍚? 鎺ョ潃灝?j 鍔犱竴, 鍐嶇潯鐪犱竴縐掞紝鐒跺悗鍒拌繖鏃舵墠灝嗘柊鐨?j 鍊煎鍒跺埌 myglobal錛熻繖灝辨槸鍏抽敭鎵鍦ㄣ傝鎯充竴涓嬶紝濡傛灉涓葷嚎紼嬪氨鍦ㄦ柊綰跨▼灝?myglobal 鍊煎鍒剁粰 j 鍚?/strong> 绔嬪嵆灝?myglobal 鍔犱竴錛屼細(xì)鍙戠敓浠涔堬紵褰?thread_function() 灝?j 鐨勫煎啓鍥?myglobal 鏃訛紝灝辮鐩栦簡(jiǎn)涓葷嚎紼嬫墍鍋氱殑淇敼銆?
褰撶紪鍐欑嚎紼嬬▼搴忔椂錛屽簲閬垮厤浜х敓榪欑鏃犵敤鐨勫壇浣滅敤錛屽惁鍒欏彧浼?xì)娴匆?guī)椂闂達(dá)紙褰撶劧錛岄櫎浜?jiǎn)缂栧啓鍏充?POSIX 綰跨▼鐨勬枃绔犳椂鏈夌敤錛夈傞偅涔堬紝濡備綍鎵嶈兘鎺掗櫎榪欑闂鍛紵
鐢變簬鏄皢 myglobal 澶嶅埗緇?j 騫朵笖絳変簡(jiǎn)涓縐掍箣鍚庢墠鍐欏洖鏃朵駭鐢熼棶棰橈紝鍙互灝濊瘯閬垮厤浣跨敤涓存椂灞閮ㄥ彉閲忓茍鐩存帴灝?myglobal 鍔犱竴銆傝櫧鐒惰繖縐嶈В鍐蟲(chóng)柟妗堝榪欎釜鐗瑰畾渚嬪瓙閫傜敤錛屼絾瀹冭繕鏄笉姝g‘銆傚鏋滄垜浠 myglobal 榪涜鐩稿澶嶆潅鐨勬暟瀛﹁繍綆楋紝鑰屼笉鏄畝鍗曠殑鍔犱竴錛岃繖縐嶆柟娉曞氨浼?xì)澶辨晥銆備絾鏄負(fù)浠涔堝憿錛?/p>
瑕佺悊瑙h繖涓棶棰橈紝蹇呴』璁頒綇綰跨▼鏄茍鍙戣繍琛岀殑銆傚嵆浣垮湪鍗曞鐞嗗櫒緋葷粺涓婅繍琛岋紙鍐呮牳鍒╃敤鏃墮棿鍒嗙墖妯℃嫙澶氫換鍔★級(jí)涔熸槸鍙互鐨勶紝浠庣▼搴忓憳鐨勮搴︼紝鎯沖儚涓や釜綰跨▼鏄悓鏃舵墽琛岀殑銆倀hread2.c 鍑虹幇闂鏄洜涓?thread_function() 渚濊禆浠ヤ笅璁烘嵁錛氬湪 myglobal 鍔犱竴涔嬪墠鐨勫ぇ綰︿竴縐掗挓鏈熼棿涓嶄細(xì)淇敼 myglobal銆傞渶瑕佹湁浜涢斿緞璁╀竴涓嚎紼嬪湪瀵?myglobal 鍋氭洿鏀規(guī)椂閫氱煡鍏跺畠綰跨▼“涓嶈闈犺繎”銆傛垜灝嗗湪涓嬩竴綃囨枃绔犱腑璁茶В濡備綍鍋氬埌榪欎竴鐐廣傚埌鏃跺欒銆?/p>
|
|
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 鍙栧緱鑱旂郴銆? |
|
闆嗙兢騫朵笉鏄竴涓叏鏂扮殑姒傚康錛屽叾瀹炴棭鍦ㄤ竷鍗佸勾浠h綆楁満鍘傚晢鍜岀爺絀舵満鏋勫氨寮濮嬩簡(jiǎn)瀵歸泦緹ょ郴緇熺殑鐮旂┒鍜屽紑鍙戙傜敱浜庝富瑕佺敤浜庣瀛﹀伐紼嬭綆楋紝鎵浠ヨ繖浜涚郴緇熷茍涓嶄負(fù)澶у鎵鐔熺煡銆傜洿鍒癓inux闆嗙兢鐨勫嚭鐜幫紝闆嗙兢鐨勬蹇墊墠寰椾互騫夸負(fù)浼犳挱銆傞泦緹ょ郴緇熶富瑕佸垎涓洪珮鍙敤(High Availability)闆嗙兢,綆縐?HA 闆嗙兢錛屽拰楂樻ц兘璁$畻(High Perfermance Computing)闆嗙兢錛岀畝縐?HPC 闆嗙兢銆?/p>
閫氳繃涓嬮潰榪欑瘒鏂囩珷鎴戜滑鍙互鏂規(guī)柟闈㈤潰浜?jiǎn)瑙?Linux 闆嗙兢娑夊強(qiáng)鐨勭‖浠跺拰杞歡銆?br>
鍝緹ら泦閫傚悎鎮(zhèn)紵
2000 騫?5 鏈?01 鏃?/p>
Rawn Shah 浣滀負(fù)涓撳錛屽湪 Linux 鐜版湁鐨勫紑鏀炬簮鐮佸拰灝侀棴婧愮爜闆嗙兢瑙e喅鏂規(guī)鏂歸潰涓烘?zhèn)ㄦ寚鐐箻q鋒觸銆?/blockquote>璁$畻 Linux 涓泦緹ら」鐩殑鏁伴噺灝辮薄璁$畻紜呰胺涓垱涓氬叕鍙哥殑鏁伴噺涓鏍楓備笉璞?Windows NT 宸茬粡鍙楀叾鑷韓鐨勫皝闂幆澧冮樆紕嶏紝Linux 鏈夊ぇ閲忕殑闆嗙兢緋葷粺鍙緵閫夋嫨錛岄傚悎浜庝笉鍚岀殑鐢ㄩ斿拰闇瑕併備絾紜畾搴旇浣跨敤鍝竴涓泦緹ょ殑宸ヤ綔鍗存病鏈夊洜姝ゅ彉寰楃畝鍗曘?/p>
闂鐨勯儴鍒嗗師鍥犲湪浜庢湳璇泦緹ょ敤浜庝笉鍚屽満鍚堛侷T 緇忕悊鍙兘鍏沖績(jī)濡備綍浣挎湇鍔″櫒榪愯鏃墮棿鏇撮暱錛屾垨浣垮簲鐢ㄧ▼搴忚繍琛屽緱鏇村揩錛岃屾暟瀛﹀鍙兘鏇村叧蹇?jī)鍦ㄦ湇鍔″櫒涓姌q涜澶ц妯℃暟鍊艱綆椼備袱鑰呴兘闇瑕佺兢闆嗭紝浣嗘槸鍚勮嚜闇瑕佷笉鍚岀壒鎬х殑緹ら泦銆?/p>
鏈枃璋冩煡浜?jiǎn)涓嶅悓迮炲紡鐨勯泦缇や互鍙?qiáng)璁稿瀹炵幇涓殑涓閮ㄥ垎錛岃繖浜涘疄鐜板彲浠ヤ拱鍒幫紝涔熷彲浠ュ厤璐硅蔣浠跺艦寮忚幏寰椼傚敖綆″垪鍑虹殑鎵鏈夎В鍐蟲(chóng)柟妗堝茍涓嶉兘鏄紑鏀炬簮鐮侊紝浣嗘槸澶у鏁拌蔣浠墮兘閬靛驚鍒嗗彂 Linux 婧愮爜鐨勫叕鍏辨儻渚嬶紝鐗瑰埆鏄敱浜庨偅浜涘疄鐜伴泦緹ょ殑浜鴻繕甯稿父甯屾湜璋冩暣緋葷粺鎬ц兘錛屼互婊¤凍闇瑕併?/p>
闆嗙兢鎬繪槸娑夊強(qiáng)鍒版満鍣ㄤ箣闂寸殑紜歡榪炴帴銆傚湪鐜頒粖澶у鏁版儏鍐典笅錛岃繖鍙槸鎸?#8220;蹇熶互澶綉”緗戝崱鍜岄泦綰垮櫒銆備絾鍦ㄥ皷绔瀛﹂鍩熶腑錛屾湁璁稿涓撲負(fù)闆嗙兢璁捐鐨勭綉緇滄帴鍙e崱銆?/p>
瀹冧滑鍖呮嫭 Myricom 鐨?Myrinet銆丟iganet 鐨?cLAN 鍜?IEEE 1596 鏍囧噯鍙幾緙╀竴鑷存帴鍙?(SCI)銆傞偅浜涘崱鐨勫姛鑳戒笉浣嗗湪緹ら泦鐨勮妭鐐逛箣闂存彁渚涢珮甯﹀錛岃屼笖榪樺噺灝戝歡榪燂紙鍙戦佹秷鎭墍鐢ㄧ殑鏃墮棿錛夈傚浜庡湪鑺傜偣闂翠氦鎹㈢姸鎬佷俊鎭互浣垮叾鎿嶄綔淇濇寔鍚屾鎯呭喌錛岄偅浜涘歡榪熸槸鑷沖叧閲嶈鐨勩?/p>
Myricom 鎻愪緵緗戝崱鍜屼氦鎹㈡満錛屽叾鍗曞悜浜掕繛閫熷害鏈楂樺彲杈懼埌 1.28 Gbps銆傜綉鍗℃湁涓ょ褰㈠紡錛岄摐綰垮瀷鍜屽厜綰ゅ瀷銆傞摐綰垮瀷 LAN 鍙互鍦?10 鑻卞昂璺濈鍐呬互鍏ㄩ熻繘琛岄氫俊錛岃屽湪闀胯揪 60 鑻卞昂璺濈鍐呬互鍗婇熻繘琛屾搷浣溿傚厜綰ゅ瀷 Myrinet 鍙互鍦?6.25 鑻遍噷闀跨殑鍗曟ā鍏夌氦鎴栬?340 鑻卞昂闀跨殑澶氭ā鍏夌氦涓婂叏閫熻繍琛屻侻yrinet 鍙彁渚涚洿鎺ョ偣鍒扮偣銆佸熀浜庨泦綰垮櫒鎴栧熀浜庝氦鎹㈡満鐨勭綉緇滈厤緗紝浣嗗湪鍙互榪炴帴鍒頒竴璧風(fēng)殑浜ゆ崲鍏夌氦鏁伴噺鏂歸潰娌℃湁闄愬埗銆傛坊鍔犱氦鎹㈠厜綰ゅ彧浼?xì)澧炲姞鑺傜倸w棿鐨勫歡榪熴備袱涓洿鎺ヨ繛鎺ョ殑鑺傜偣涔嬮棿鐨勫鉤鍧囧歡榪熸槸 5 鍒?18 寰錛屾瘮浠ュお緗戝揩寰楀銆?/p>
鏈甯歌鐨勪笁縐嶇兢闆嗙被鍨嬪寘鎷珮鎬ц兘縐戝緹ら泦銆佽礋杞藉潎琛$兢闆嗗拰楂樺彲鐢ㄦх兢闆嗐?/p>
閫氬父錛岀涓縐嶆秹鍙?qiáng)湄?fù)緹ら泦寮鍙戝茍琛岀紪紼嬪簲鐢ㄧ▼搴忥紝浠ヨВ鍐沖鏉傜殑縐戝闂銆傝繖鏄茍琛岃綆楃殑鍩虹錛屽敖綆″畠涓嶄嬌鐢ㄤ笓闂ㄧ殑騫惰瓚呯駭璁$畻鏈猴紝榪欑瓚呯駭璁$畻鏈哄唴閮ㄧ敱鍗佽嚦涓婁竾涓嫭绔嬪鐞嗗櫒緇勬垚銆備絾瀹冨嵈浣跨敤鍟嗕笟緋葷粺錛屽閫氳繃楂橀熻繛鎺ユ潵閾炬帴鐨勪竴緇勫崟澶勭悊鍣ㄦ垨鍙屽鐞嗗櫒 PC錛屽茍涓斿湪鍏叡娑堟伅浼犻掑眰涓婅繘琛岄氫俊浠ヨ繍琛屽茍琛屽簲鐢ㄧ▼搴忋傚洜姝わ紝鎮(zhèn)ㄤ細(xì)甯稿父鍚鍙堟湁涓縐嶄究瀹滅殑 Linux 瓚呯駭璁$畻鏈洪棶涓栦簡(jiǎn)銆備絾瀹冨疄闄呮槸涓涓綆楁満緹ら泦錛屽叾澶勭悊鑳藉姏涓庣湡鐨勮秴綰ц綆楁満鐩哥瓑錛岄氬父涓濂楄薄鏍風(fēng)殑緹ら泦閰嶇疆寮閿瑕佽秴榪?$100,000銆傝繖瀵逛竴鑸漢鏉ヨ浼間箮鏄お璐典簡(jiǎn)錛屼絾涓庝環(huán)鍊間笂鐧句竾緹庡厓鐨勪笓鐢ㄨ秴綰ц綆楁満鐩告瘮榪樼畻鏄究瀹滅殑銆?/p>
璐熻澆鍧囪 緹ら泦涓轟紒涓氶渶姹傛彁渚涗簡(jiǎn)鏇村疄鐢ㄧ殑緋葷粺銆傚鍚嶇О鎵鏆楃ず鐨勶紝璇ョ郴緇熶嬌璐熻澆鍙互鍦ㄨ綆楁満緹ら泦涓敖鍙兘騫沖潎鍦板垎鎽婂鐞嗐傝璐熻澆鍙兘鏄渶瑕佸潎琛$殑搴旂敤紼嬪簭澶勭悊璐熻澆鎴栫綉緇滄祦閲忚礋杞姐傝繖鏍風(fēng)殑緋葷粺闈炲父閫傚悎浜庤繍琛屽悓涓緇勫簲鐢ㄧ▼搴忕殑澶ч噺鐢ㄦ埛銆傛瘡涓妭鐐歸兘鍙互澶勭悊涓閮ㄥ垎璐熻澆錛屽茍涓斿彲浠ュ湪鑺傜偣涔嬮棿鍔ㄦ佸垎閰嶈礋杞斤紝浠ュ疄鐜板鉤琛°傚浜庣綉緇滄祦閲忎篃鏄姝ゃ傞氬父錛岀綉緇滄湇鍔″櫒搴旂敤紼嬪簭鎺ュ彈浜?jiǎn)澶鍏ゾ|戞祦閲忥紝浠ヨ嚧鏃犳硶榪呴熷鐞嗭紝榪欏氨闇瑕佸皢嫻侀噺鍙戦佺粰鍦ㄥ叾瀹冭妭鐐逛笂榪愯鐨勭綉緇滄湇鍔″櫒搴旂敤銆傝繕鍙互鏍規(guī)嵁姣忎釜鑺傜偣涓婁笉鍚岀殑鍙敤璧勬簮鎴栫綉緇滅殑鐗規(guī)畩鐜鏉ヨ繘琛屼紭鍖栥?/p>
楂樺彲鐢ㄦх兢闆嗙殑鍑虹幇鏄負(fù)浜?jiǎn)鋴删煠闆嗙殑鏁翠綋鏈嶅姟灏藉彲鑳藉彲鐢ㄥQ屼互渚胯冭檻璁$畻紜歡鍜岃蔣浠剁殑鏄撻敊鎬с傚鏋滈珮鍙敤鎬х兢闆嗕腑鐨勪富鑺傜偣鍙戠敓浜?jiǎn)鏁呴殰锛岄偅涔垬q欐鏃墮棿鍐呭皢鐢辨鑺傜偣浠f浛瀹冦傛鑺傜偣閫氬父鏄富鑺傜偣鐨勯暅鍍忥紝鎵浠ュ綋瀹冧唬鏇夸富鑺傜偣鏃訛紝瀹冨彲浠ュ畬鍏ㄦ帴綆″叾韜喚錛屽茍涓斿洜姝や嬌緋葷粺鐜瀵逛簬鐢ㄦ埛鏄竴鑷寸殑銆?/p>
鍦ㄧ兢闆嗙殑榪欎笁縐嶅熀鏈被鍨嬩箣闂達(dá)紝緇忓父浼?xì)鍙戠敓尕滃悎涓庝氦鏉傘備簬鏄紝鍙互鍙戠幇楂樺彲鐢ㄦх兢闆嗕篃鍙互鍦ㄥ叾鑺傜偣涔嬮棿鍧囪 鐢ㄦ埛璐熻澆錛屽悓鏃朵粛璇曞浘緇存寔楂樺彲鐢ㄦх▼搴︺傚悓鏍鳳紝鍙互浠庤緙栧叆搴旂敤紼嬪簭鐨勭兢闆嗕腑鎵懼埌涓涓茍琛岀兢闆嗭紝瀹冨彲浠ュ湪鑺傜偣涔嬮棿鎵ц璐熻澆鍧囪 銆傚敖綆¢泦緹ょ郴緇熸湰韜嫭绔嬩簬瀹冨湪浣跨敤鐨勮蔣浠舵垨紜歡錛屼絾瑕佹湁鏁堣繍琛岀郴緇熸椂錛岀‖浠惰繛鎺ュ皢璧峰叧閿綔鐢ㄣ?/p>
Giganet 鏄敤浜?Linux 騫沖彴鐨勮櫄鎷熸帴鍙?(VI) 浣撶郴緇撴瀯鍗$殑絎竴瀹朵緵搴斿晢錛屾彁渚?cLAN 鍗″拰浜ゆ崲鏈恒俈I 浣撶郴緇撴瀯鏄嫭绔嬩簬騫沖彴鐨勮蔣浠跺拰紜歡緋葷粺錛屽畠鐢?Intel 寮鍙戯紝鐢ㄤ簬鍒涘緩緹ら泦銆傚畠浣跨敤鑷繁鐨勭綉緇滈氫俊鍗忚鍦ㄦ湇鍔″櫒涔嬮棿鐩存帴浜ゆ崲鏁版嵁錛岃屼笉鏄嬌鐢?IP錛屽茍涓斿畠騫朵笉鎵撶畻鎴愪負(fù) WAN 鍙礬鐢辯殑緋葷粺銆傜幇鍦紝VI 鐨勬湭鏉ュ彇鍐充簬姝e湪榪涜鐨?#8220;緋葷粺 I/O 緇?#8221;鐨勫伐浣滐紝榪欎釜灝忕粍鏈槸 Intel 棰嗗鐨?#8220;涓嬩竴浠?I/O”灝忕粍涓?IBM 鍜?Compaq 棰嗗鐨?#8220;鏈潵 I/O 灝忕粍”鐨勫悎騫躲侴iganet 浜у搧褰撳墠鍙互鍦ㄨ妭鐐逛箣闂存彁渚?1 Gbps 鍗曞悜閫氫俊錛屾渶灝忓歡榪熶負(fù) 7 寰銆?/p>
IEEE 鏍囧噯 SCI 鐨勫歡榪熸洿灝戯紙浣庝簬 2.5 寰錛夛紝騫朵笖鍏跺崟鍚戦熷害鍙揪鍒?400 MB錛忕 (3.2 Gbps)銆係CI 鏄熀浜庣幆鎷撴墤鐨勭綉緇滅郴緇燂紝涓嶅儚浠ュお緗戞槸鏄熷艦鎷撴墤銆傝繖灝嗕嬌鍦ㄨ緝澶ц妯$殑鑺傜偣涔嬮棿閫氫俊閫熷害鏇村揩銆傛洿鏈夌敤鐨勬槸鐜潰鎷撴墤緗戠粶錛屽畠鍦ㄨ妭鐐逛箣闂存湁璁稿鐜艦緇撴瀯銆備袱緇寸幆闈㈠彲浠ョ敤 n 涔?m 鐨勭綉鏍艱〃紺猴紝鍏朵腑鍦ㄦ瘡涓琛屽拰姣忎竴鍒楅兘鏈変竴涓幆褰㈢綉緇溿備笁緇寸幆闈篃綾諱技錛屽彲浠ョ敤涓夌淮绔嬩綋鑺傜偣緗戞牸琛ㄧず錛屾瘡涓灞備笂鏈変竴涓幆褰㈢綉緇溿傚瘑闆嗚秴綰ц綆楀茍琛岀郴緇熶嬌鐢ㄧ幆闈㈡嫇鎵戠綉緇滐紝涓烘垚鐧句笂鍗冧釜鑺傜偣涔嬮棿鐨勯氫俊鎻愪緵鐩稿鏈蹇殑璺緞銆?/p>
澶у鏁版搷浣滅郴緇熺殑闄愬埗鍥犵礌涓嶆槸鎿嶄綔緋葷粺鎴栫綉緇滄帴鍙o紝鑰屾槸鏈嶅姟鍣ㄧ殑鍐呴儴 PCI 鎬葷嚎緋葷粺銆傚嚑涔庢墍鏈夊彴寮?PC 閫氬父鏈夊熀鏈?32-浣嶏紝33-MHz PCI錛屽茍涓斿ぇ澶氭暟浣庣鏈嶅姟鍣ㄥ彧鎻愪緵 133 MB錛忕 (1 Gbps)錛岃繖闄愬埗浜?jiǎn)閭d簺缃戝崱鐨勮兘鍔涖備竴浜涙槀璐電殑楂樼鏈嶅姟鍣紝濡?Compaq Proliant 6500 鍜?IBM Netfinity 7000 緋誨垪錛岄兘鏈?64-浣嶏紝 66-MHz 緗戝崱錛屽畠浠兘澶熶互鍥涘嶉熷害榪愯銆備笉騫稿湴鏄紝鐭涚浘鏄洿澶氬叕鍙鎬嬌鐢ㄤ綆绔殑緋葷粺錛屽洜姝ゅぇ澶氭暟渚涘簲鍟嗘渶緇堢敓浜у拰閿鍞洿澶氫綆绔?PCI 緗戝崱銆備篃鏈変笓闂ㄧ殑 64-浣嶏紝66-MHz PCI 緗戝崱錛屼絾浠鋒牸瑕佽吹璁稿銆備緥濡傦紝Intel 鎻愪緵浜?jiǎn)杩櫩U嶇被鍨嬬殑“蹇熶互澶綉”緗戝崱錛屼環(huán)鏍肩害 $400 鍒?$500錛屽嚑涔庢槸鏅?PCI 鐗堟湰浠鋒牸鐨?5 鍊嶃?/p>
鏌愪簺騫惰緹ら泦緋葷粺鍙互杈懼埌濡傛楂樼殑甯﹀鍜屼綆寤惰繜錛屽叾鍘熷洜鏄畠浠氬父緇曡繃浣跨敤緗戠粶鍗忚錛屽 TCP/IP銆傝櫧鐒剁綉闄呭崗璁浜庡箍鍩熺綉寰堥噸瑕侊紝浣嗗畠鍖呭惈浜?jiǎn)澶鐨勫紑閿錛岃岃繖浜涘紑閿鍦ㄨ妭鐐圭浉浜掑凡鐭ョ殑灝侀棴緗戠粶緹ら泦涓槸涓嶅繀瑕佺殑銆傚叾瀹烇紝閭d簺緋葷粺涓湁涓閮ㄥ垎鍙互鍦ㄨ妭鐐逛箣闂翠嬌鐢ㄧ洿鎺ュ唴瀛樿闂?(DMA)錛屽畠綾諱技浜庡浘褰㈠崱鍜屽叾瀹冨鍥磋澶囧湪涓鍙版満鍣ㄤ腑鐨勫伐浣滄柟寮忋傚洜姝ゆí璺ㄧ兢闆嗭紝鍙互閫氳繃浠諱綍鑺傜偣涓婄殑浠諱綍澶勭悊鍣ㄧ洿鎺ヨ闂竴縐嶅艦寮忕殑鍒嗗竷寮忓叡浜唴瀛樸傚畠浠篃鍙互浣跨敤浣庡紑閿鐨勬秷鎭紶閫掔郴緇燂紝鍦ㄨ妭鐐逛箣闂磋繘琛岄氫俊銆?/p>
娑堟伅浼犻掓帴鍙?(MPI) 鏄茍琛岀兢闆嗙郴緇熼棿娑堟伅浼犻掑眰鐨勬渶甯歌瀹炵幇銆侻PI 瀛樺湪鍑犵琛嶇敓鐗堟湰錛屼絾鍦ㄦ墍鏈夋儏鍐典笅錛屽畠涓哄紑鍙戣呰闂茍琛屽簲鐢ㄧ▼搴忔彁渚涗簡(jiǎn)涓涓叕鍏?API錛岃繖鏍峰紑鍙戣呭氨涓嶅繀鎵嬪伐瑙e喅濡備綍鍦ㄧ兢闆嗙殑鑺傜偣涔嬮棿鍒嗗彂浠g爜孌點(diǎn)傚叾涓竴涓紝Beowulf 緋葷粺棣栧厛灝?MPI 鐢ㄤ綔鍏叡緙栫▼鎺ュ彛銆?/p>
寰堥毦鍐沖畾浣跨敤鍝楂樻ц兘闆嗙兢鍖呫傝澶氶兘鎻愪緵綾諱技鏈嶅姟錛屼絾璁$畻鐨勫叿浣撹姹傛墠鏄喅瀹氭у洜绱犮傚緢澶氭儏鍐典笅錛屽湪閭d簺緋葷粺涓殑鐮旂┒宸ヤ綔鍙槸瑙e喅闇姹傜殑涓鍗婏紝鑰屼笖浣跨敤閭d簺杞歡闇瑕侀泦緹ゅ寘寮鍙戣呯殑鐗規(guī)畩甯姪鍜屽悎浣溿?/p>
褰撹皥鍒?Linux 闆嗙兢鏃訛紝璁稿浜虹殑絎竴鍙嶆槧鏄?Beowulf銆傞偅鏄渶钁楀悕鐨?Linux 縐戝杞歡闆嗙兢緋葷粺銆傛病鏈変竴涓寘鍙仛 Beowulf銆傚疄闄呬笂錛屽畠鏄竴涓湳璇紝閫傜敤浜庡湪 Linux 鍐呮牳涓婅繍琛岀殑涓緇勫叕鍏辮蔣浠跺伐鍏楓傚叾涓寘鎷祦琛岀殑杞歡娑堟伅浼犻?API錛屽“娑堟伅浼犻佹帴鍙?#8221;(MPI) 鎴?#8220;騫惰铏氭嫙鏈?#8221;(PVM)錛屽 Linux 鍐呮牳鐨勪慨鏀癸紝浠ュ厑璁哥粨鍚堝嚑涓互澶綉鎺ュ彛銆侀珮鎬ц兘緗戠粶椹卞姩鍣紝瀵硅櫄鎷熷唴瀛樼鐞嗗櫒鐨勬洿鏀癸紝浠ュ強(qiáng)鍒嗗竷寮忚繘紼嬮棿閫氫俊 (DIPC) 鏈嶅姟銆傚叕鍏卞叏灞榪涚▼鏍囪瘑絀洪棿鍏佽浣跨敤 DIPC 鏈哄埗浠庝換浣曡妭鐐硅闂換浣曡繘紼嬨侭eowulf 榪樺湪鑺傜偣闂存敮鎸佷竴緋誨垪紜歡榪為氭ч変歡銆?/p>
Beowulf 鍙兘鏄冭檻 Linux 鏃舵敞鎰忓埌鐨勭涓涓珮鎬ц兘闆嗙兢緋葷粺錛岃繖鍙槸鍥犱負(fù)瀹冪殑騫挎硾浣跨敤鍜屾敮鎸併傚叧浜庤繖涓富棰橈紝鏈夎澶氭枃妗e拰涔︾睄銆侭eowulf 涓庝互涓嬩竴浜涚瀛﹂泦緹ょ郴緇熶箣闂寸殑宸紓鍙互鏄疄闄呯殑錛屾垨鑰呭彧鏄湪浜у搧鍚嶇О涓湁宸紓銆備緥濡傦紝灝界鍚嶇О涓嶅悓錛孉lta Technologies 鐨?AltaCluster 灝辨槸涓涓?Beowulf 緋葷粺銆傛煇浜涗緵搴斿晢錛屽 ParTec AG錛屼竴瀹跺痙鍥藉叕鍙革紝鎻愪緵浜?Beowulf 妯″瀷鐨勮鐢熺増鏈紝浠ュ寘鎷叾瀹冪鐞嗘帴鍙e拰閫氫俊鍗忚銆?/p>
Giganet 鎻愪緵浜?jiǎn)涓縐嶅畾鍒剁殑鍩轟簬紜歡鐨勮В鍐蟲(chóng)柟妗堬紝瀹冧嬌鐢ㄩ潪 IP 鍗忚鍦ㄤ竴涓瀛︾兢闆嗙殑鑺傜偣闂磋繘琛岄氫俊銆傚鍓嶆墍榪幫紝“铏氭嫙鎺ュ彛”鍗忚閫氳繃闄ゅ幓涓嶅皯鍗忚鐨勫紑閿錛屽 IP錛屼互鏀寔鏈嶅姟鍣ㄩ棿鏇村揩鐨勯氫俊銆傚彟澶栵紝紜歡緋葷粺鍙寜鍗冨厗姣旂壒閫熷害榪愯錛屽茍涓斿歡榪熷緢鐭紝浣垮畠闈炲父閫傚悎鏋勫緩鏈澶氳揪 256 涓妭鐐圭殑縐戝緹ら泦銆傝渚涘簲鍟嗘敮鎸?MPI錛岃繖鏍瘋澶氬茍琛屽簲鐢ㄧ▼搴忓氨鍙互鍦ㄧ被浼肩殑緋葷粺錛堝 Beowulf錛変笂榪愯銆?/p>
瀹冧篃鏈?Beowulf 鐨勭己鐐癸紝鍗充笉鑳界敤浣滅綉緇滆礋杞藉叡浜郴緇燂紝闄ら潪鎯寵緙栧啓搴旂敤紼嬪簭鏉ョ洃鎺у拰鍒嗗彂鍦ㄦ湇鍔″櫒闂翠紶閫佺殑緗戠粶鍖呫?br>
Legion 璇曞浘鏋勫緩涓涓湡姝g殑澶氳綆楁満緋葷粺銆傝繖鏄竴涓兢闆嗭紝鍏朵腑姣忎釜鑺傜偣閮芥槸涓涓嫭绔嬬郴緇燂紝浣嗗湪鐢ㄦ埛鐪嬫潵錛屾暣涓郴緇熷彧鏄竴鍙拌綆楁満銆侺egion 璁捐鎴愭敮鎸佷竴鍙頒笘鐣岃寖鍥寸殑璁$畻鏈猴紝鐢變笂鐧句竾涓富鏈轟互鍙?qiáng)鏁颁互涓囦嚎璁$殑枋Y浠跺璞$粍鎴愩傚湪 Legion 涓紝鐢ㄦ埛鍙互鍒涚珛浠栦滑鑷繁鐨勫悎浣滃皬緇勩?/p>
Legion 鎻愪緵浜?jiǎn)楂樻ц兘騫惰銆佽礋杞藉潎琛°佸垎甯冨紡鏁版嵁綆$悊鍜屽閿欐с?/p>
Legion 鎻愪緵浜?jiǎn)楂樻ц兘騫惰銆佽礋杞藉潎琛°佸垎甯冨紡鏁版嵁綆$悊鍜屽閿欐с傚畠閫氳繃鍏跺閿欑鐞嗗拰鎴愬憳鑺傜偣闂寸殑鍔ㄦ侀噸鏂伴厤緗潵鏀寔楂樺彲鐢ㄦс傚畠榪樻湁涓涓彲鎵╁厖鏍稿績(jī)錛岃鏍稿績(jī)鍙互鍦ㄥ嚭鐜版柊鐨勬敼榪涘拰榪涘睍鏃跺姩鎬佹浛鎹㈡垨鍗囩駭銆傜郴緇熷茍涓嶆槸鍙帴鍙楀崟涓鎺у埗錛岃屾槸鍙互鐢變換鎰忔暟閲忕殑緇勭粐綆$悊錛岃屾瘡涓粍緇囬兘鏀寔鏁翠綋鐨勮嚜娌婚儴鍒嗐侺egion API 閫氳繃鍏跺唴緗殑騫惰鎬ф彁渚涗簡(jiǎn)楂樻ц兘璁$畻銆?/p>
Legion 闇瑕佷嬌鐢ㄧ壒鍒紪鍐欑殑杞歡錛屼互浣垮畠鍙互浣跨敤鍏?API 搴撱傚畠浣嶄簬鐢ㄦ埛璁$畻鏈烘搷浣滅郴緇熶箣涓婏紝鍗忚皟鏈湴璧勬簮鍜屽垎甯冨紡璧勬簮銆傚畠鑷姩澶勭悊璧勬簮璋冨害鍜屽畨鍏ㄦэ紝榪樼鐞嗕笂涓嬫枃絀洪棿浠ユ弿榪板拰璁塊棶鏁翠釜緋葷粺涓笂浜跨鍙兘涔嬪鐨勫璞°傜劧鑰岋紝鍦ㄦ瘡涓妭鐐逛笂榪愯鏃訛紝涓嶉渶瑕佷嬌鐢ㄧ郴緇熺鐞嗗憳鐗規(guī)潈錛屽茍涓斿彲浠ヤ嬌鐢ㄦ棤鐗規(guī)潈鐨勭敤鎴峰笎鍙瘋繘琛屽伐浣溿傝繖灝嗗鍔犲姞鍏?Legion 鐨勮妭鐐瑰拰鐢ㄦ埛鐨勭伒媧繪с?/p>
Sandia National Lab 涓殑 Computational Plant 鏄竴涓ぇ瑙勬ā鏁翠綋騫惰緹ら泦錛岀敤浜庡疄鐜?TeraFLOP錛堜竾浜挎嫻偣榪愮畻錛夎綆楀茍鏋勫緩鍦ㄥ晢涓氱粍浠朵笂銆傛暣涓郴緇熺敱“鍙幾緙╁崟鍏?#8221;緇勬垚錛岃繖浜?#8220;鍙幾緙╁崟鍏?#8221;鍙互鍒掑垎鎴愰傚悎涓嶅悓鐩殑錛堣綆椼佺鐩?I/O銆佺綉緇?I/O銆佹湇鍔$鐞嗭級(jí)銆傜兢闆嗕腑鐨勬瘡涓妭鐐歸兘鏄竴涓?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喅紼鐤忕嚎鎬х郴緇熴佹祦浣撳姏瀛﹀拰緇撴瀯鍔涘涓綆楃郴緇熺殑浼樺寲銆佸垎瀛愬姏瀛︾殑妯℃嫙銆佺嚎鎬х粨鏋勫姏瀛︾殑鏈夐檺鍏冨垎鏋愶紝浠ュ強(qiáng)騫惰搴旂敤紼嬪簭鐨勫姩鎬佽礋杞藉潎琛″簱銆?/p>
棣欐腐澶у鐨勭郴緇熺爺絀跺皬緇勬湁涓涓熀浜?Java 鐨勭兢闆嗭紝鍙仛鏀寔 Java 鐨勫崟緋葷粺鏄犲儚璁$畻浣撶郴緇撴瀯 (JESSICA)錛屽畠浣滀負(fù)涓涓腑闂翠歡灞備互瀹屾垚鍗曠郴緇熸槧鍍忕殑騫繪兂銆傝灞傛槸姣忎釜浣跨敤鍒嗗竷寮忓叡浜唴瀛?(DSM) 緋葷粺榪涜閫氫俊鐨勮妭鐐逛笂榪愯鐨勬墍鏈夌嚎紼嬬殑涓涓叏灞綰跨▼絀洪棿銆傝欏圭洰浣跨敤 ThreadMark DSM錛屼絾鏈緇堝皢鐢ㄤ粬浠嚜宸卞垱寤虹殑 JiaJia Using Migrating-home Protocol (JUMP)銆備粬浠嬌鐢ㄥ畾鍒剁殑鍩轟簬 Java 鐨?ClusterProbe 杞歡鏉ョ鐞嗙兢闆嗙殑 50 涓妭鐐廣?/p>
娉曞浗鐨?IRISA 鐮旂┒鎵鐨?#8220;澶ц妯℃暟瀛楁ā鎷熷簲鐢ㄧ▼搴忕殑緙栫▼騫惰鍜屽垎甯冨紡緋葷粺”(PARIS) 欏圭洰鎻愪緵浜?jiǎn)鍑牽U嶇敤浜庡垱寤?Linux 鏈嶅姟鍣ㄧ兢闆嗙殑宸ュ叿銆傝欏圭洰鐢變笁閮ㄥ垎緇勬垚錛氱兢闆嗙殑璧勬簮綆$悊杞歡銆佸茍琛岀紪紼嬭璦鐨勮繍琛屾椂鐜錛屼互鍙?qiáng)鍒嗗竷寮忔暟瀛楁ā鎷熺殑枋Y浠跺伐鍏楓?/p>
璧勬簮綆$悊杞歡鍖呮嫭鐢ㄤ簬鍏變韓鍐呭瓨銆佺鐩樺拰澶勭悊鍣ㄨ祫婧愮殑 Globelins 鍒嗗竷寮忕郴緇燂紝鍙?qiáng)鍏?Dupleix 鍜?Mome 鍒嗗竷寮忓叡浜唴瀛樼郴緇熴?/p>
璐熻澆鍧囪 緹ら泦鍦ㄥ鑺傜偣涔嬮棿鍒嗗彂緗戠粶鎴栬綆楀鐞嗚礋杞姐傚湪榪欑鎯呭喌涓嬶紝鍖哄埆鍦ㄤ簬緙哄皯璺ㄨ妭鐐硅繍琛岀殑鍗曞茍琛岀▼搴忋傚ぇ澶氭暟鎯呭喌涓嬶紝閭g緹ら泦涓殑姣忎釜鑺傜偣閮芥槸榪愯鍗曠嫭杞歡鐨勭嫭绔嬬郴緇熴備絾鏄紝涓嶇鏄湪鑺傜偣涔嬮棿榪涜鐩存帴閫氫俊錛岃繕鏄氳繃涓ぎ璐熻澆鍧囪 鏈嶅姟鍣ㄦ潵鎺у埗姣忎釜鑺傜偣鐨勮礋杞斤紝鍦ㄨ妭鐐逛箣闂撮兘鏈変竴縐嶅叕鍏卞叧緋匯傞氬父錛屼嬌鐢ㄧ壒瀹氱殑綆楁硶鏉ュ垎鍙戣璐熻澆銆?/p>
緗戠粶嫻侀噺璐熻澆鍧囪 鏄竴涓繃紼嬶紝瀹冩鏌ュ埌鏌愪釜緹ら泦鐨勫叆緗戞祦閲忥紝鐒跺悗灝嗘祦閲忓垎鍙戝埌鍚勪釜鑺傜偣浠ヨ繘琛岄傚綋澶勭悊銆傚畠鏈閫傚悎澶у瀷緗戠粶搴旂敤紼嬪簭錛屽 Web 鎴?FTP 鏈嶅姟鍣ㄣ傝礋杞藉潎琛$綉緇滃簲鐢ㄦ湇鍔¤姹傜兢闆嗚蔣浠舵鏌ユ瘡涓妭鐐圭殑褰撳墠璐熻澆錛屽茍紜畾鍝簺鑺傜偣鍙互鎺ュ彈鏂扮殑浣滀笟銆傝繖鏈閫傚悎榪愯濡傛暟鎹垎鏋愮瓑涓茶鍜屾壒澶勭悊浣滀笟銆傞偅浜涚郴緇熻繕鍙互閰嶇疆鎴愬叧娉ㄦ煇鐗瑰畾鑺傜偣鐨勭‖浠舵垨鎿嶄綔緋葷粺鍔熻兘錛氳繖鏍鳳紝緹ら泦涓殑鑺傜偣灝辨病鏈夊繀瑕佹槸涓鑷寸殑銆?/p>
“Linux 铏氭嫙鏈嶅姟鍣?#8221;欏圭洰宸茬粡瀹炵幇浜?jiǎn)璁稿鍐呮牳琛ヤ竵锛屽畠浠负鍏ゾ|?TCP/IP 嫻侀噺鍒涘緩浜?jiǎn)璐熻浇鍧囪 绯痪l熴侺VS 杞歡媯(gè)鏌ュ叆緗戞祦閲忥紝鐒跺悗鏍規(guī)嵁璐熻澆鍧囪 綆楁硶錛屽皢嫻侀噺閲嶅畾鍚戝埌涓緇勫厖褰撶兢闆嗙殑鏈嶅姟鍣ㄣ傝繖鍏佽緗戠粶搴旂敤紼嬪簭錛屽 Web 鏈嶅姟鍣紝鍦ㄨ妭鐐圭兢闆嗕笂榪愯浠ユ敮鎸佸ぇ閲忕敤鎴楓?/p>
LVS 鏀寔浣滀負(fù)璐熻澆鍧囪 鏈嶅姟鍣ㄧ洿鎺ヨ繛鎺ュ埌鍚屼竴涓?LAN 鐨勭兢闆嗚妭鐐癸紝浣嗗畠榪樿兘澶熶互閫氶亾浼犻?IP 鍖呯殑鏂瑰紡榪炴帴鍒拌繙紼嬫湇鍔″櫒銆傚悗涓縐嶆柟娉曞寘鎷帇緙?IP 鍖呬腑鐨勫潎琛¤姹傦紝榪欎簺 IP 淇℃伅鍖呬粠璐熻澆鍧囪 鏈嶅姟鍣ㄧ洿鎺ュ彂閫佸埌榪滅▼緹ら泦鑺傜偣銆傚敖綆?LVS 鍙互榪滅▼鏀寔緗戠珯鐨勮礋杞藉潎琛★紝浣嗗畠浣跨敤鐨勮礋杞藉潎琛$畻娉曠幇鍦ㄥ浜庤櫄鎷熺兢闆嗕腑鐨勫箍鍩?Web 鏈嶅姟鍣ㄤ粛鏃犳晥銆傚洜姝わ紝濡傛灉 Web 鏈嶅姟鍣ㄩ兘鍦ㄥ悓涓涓?LAN 涓紝LVS 鏈濂藉綋浣滆礋杞藉潎琛℃湇鍔″櫒浣跨敤銆?/p>
璐熻澆鍧囪 緋葷粺鐨勫嚑縐嶇‖浠跺疄鐜版瘮鍦ㄩ氱敤鎿嶄綔緋葷粺錛屽 Linux錛屼笂榪愯寰楁洿蹇傚畠浠寘鎷潵鑷?Alteon 鍜?Foundry 鐨勭‖浠訛紝鍏剁‖浠墮昏緫鍜屾渶灝戞搷浣滅郴緇熷彲浠ュ湪紜歡涓墽琛屾祦閲忕鐞嗭紝騫朵笖閫熷害姣旂函杞歡蹇傚畠浠殑浠鋒牸涔熷緢楂橈紝閫氬父閮藉湪 $10,000 浠ヤ笂銆傚鏋滈渶瑕佺畝鍗曞拰渚垮疁鐨勮В鍐蟲(chóng)柟妗堬紝涓涓湁寰堝鍐呭瓨 (256 MB) 鐨勪腑絳?Linux 緋葷粺灝嗕細(xì)鏄竴涓ソ鐨勮礋杞藉潎琛$郴緇熴?br>
TurboLinux TurboCluster 鍜?enFuzion
TurboLinux 鏈変竴涓駭鍝佸彨 TurboCluster錛屽畠鏈鍒濅互“Linux 铏氭嫙鏈嶅姟鍣?#8221;欏圭洰寮鍙戠殑鍐呮牳琛ヤ竵涓哄熀紜銆傚洜姝わ紝瀹冨彲浠ュ緱鍒板ぇ閮ㄥ垎浼樼偣錛屼絾瀹冪殑緙虹偣涔熶笌鍘熸潵鐨勯」鐩竴鏍楓俆urboLinux 涓烘榪樺紑鍙戜簡(jiǎn)涓浜涘伐鍏鳳紝鐢ㄤ簬鐩戞帶澧炲姞浜у搧瀹炵敤鎬х殑緹ら泦琛屼負(fù)銆備竴瀹朵富瑕佷緵搴斿晢鐨勫晢涓氭敮鎸佷篃浣垮畠瀵逛簬澶у瀷緗戠珯鏇村叿鍚稿紩鍔涖?/p>
EnFuzion 鏀寔鍦ㄨ妭鐐逛箣闂村疄鐜拌嚜鍔ㄨ礋杞藉潎琛″拰璧勬簮鍏變韓錛岃屼笖鍙互鑷姩閲嶆柊瀹夋帓澶辮觸鐨勪綔涓氥?/p>
EnFuzion 鏄?TurboLinux 鍗沖皢鎺ㄥ嚭鐨勭瀛︾兢闆嗕駭鍝侊紝瀹冨茍涓嶅熀浜?Beowulf銆備絾鏄紝瀹冨彲浠ユ敮鎸佷笂鐧句釜鑺傜偣浠ュ強(qiáng)璁稿涓嶅悓鐨勯潪 Linux 騫沖彴錛屽寘鎷?Solaris銆乄indows NT銆丠P-UX銆両BM AIX銆丼GI Irix 鍜?Tru64銆侲nFuzion 闈炲父鏈夎叮錛屽洜涓哄畠榪愯鎵鏈夌幇鏈夎蔣浠訛紝騫朵笖涓嶉渶瑕佷負(fù)鐜緙栧啓瀹氬埗鐨勫茍琛屽簲鐢ㄧ▼搴忋傚畠鏀寔鍦ㄨ妭鐐歸棿瀹炵幇鑷姩璐熻澆鍧囪 鍜岃祫婧愬叡浜紝鑰屼笖鍙互鑷姩閲嶆柊瀹夋帓澶辮觸鐨勪綔涓氥?/p>
Platform Computing 鐨?LSF 鎵瑰鐞?/span>
Platform Computing 鏄兢闆嗚綆楅鍩熺殑鑰佹墜錛岀幇鍦ㄦ彁渚涗簡(jiǎn) Linux 騫沖彴涓婄殑“璐熻澆鍧囪 璁炬柦 (LSF) 鎵瑰鐞?#8221;杞歡銆侺SF 鎵瑰鐞嗗厑璁鎬腑澶帶鍒跺櫒瀹夋帓浣滀笟鍦ㄧ兢闆嗕腑浠繪剰鏁伴噺鐨勮妭鐐逛笂榪愯銆傚湪姒傚康涓婏紝瀹冪被浼間簬 TurboLinux enFuzion 杞歡錛屽茍涓旀敮鎸佸湪鑺傜偣涓婅繍琛屼換浣曠被鍨嬬殑搴旂敤紼嬪簭銆?/p>
榪欑鏂規(guī)硶瀵逛簬緹ら泦澶у皬鏄潪甯哥伒媧葷殑錛屽洜涓哄彲浠ユ槑紜夋嫨鑺傜偣鐨勬暟閲忥紝鐢氳嚦鏄繍琛屽簲鐢ㄧ▼搴忕殑鑺傜偣銆備簬鏄紝鍙互灝?64 涓妭鐐圭殑緹ら泦鍒嗘垚鏇村皬鐨勯昏緫緹ら泦錛屾瘡涓昏緫緹ら泦閮借繍琛岃嚜宸辯殑鎵瑰鐞嗗簲鐢ㄧ▼搴忋傝屼笖錛屽鏋滃簲鐢ㄧ▼搴忔垨鑺傜偣澶辮觸錛屽畠鍙互鍦ㄥ叾瀹冩湇鍔″櫒涓婇噸鏂板畨鎺掍綔涓氥?/p>
Platform 鐨勪駭鍝佸湪涓昏 Unix 緋葷粺鍜?Windows NT 涓婅繍琛屻傜洰鍓嶏紝鍙湁瀹冧滑鐨?LSF 鎵瑰鐞嗕駭鍝佸凡緇忕Щ妞嶅埌 Linux 涓娿傛渶緇堬紝LSF Suite 緇勪歡鐨勫叾浣欓儴鍒嗕篃灝嗙揣闅忓叾鍚庣Щ妞嶅埌 Linux 涓娿?br>
Resonate 鏈変竴縐嶅熀浜庤蔣浠剁殑璐熻澆鍧囪 鏂規(guī)硶錛岀被浼間簬 Linux 铏氭嫙鏈嶅姟鍣ㄣ備絾鏄紝瀹冩敮鎸佹洿澶氱壒鎬э紝浠ュ強(qiáng)涓浜涙洿濂界殑璐熻澆鍧囪 綆楁硶銆備緥濡傦紝浣跨敤 Resonate錛屽彲浠ュ湪姣忎釜緹ら泦鑺傜偣瑁呭叆涓涓唬鐞嗭紝浠ョ‘瀹氳鑺傜偣褰撳墠鐨勭郴緇熻礋杞姐傜劧鍚庯紝璐熻澆鍧囪 鏈嶅姟鍣ㄦ鏌ユ瘡涓妭鐐圭殑浠g悊錛屼互紜畾鍝釜鑺傜偣鐨勮礋杞芥渶灝戯紝騫朵笖灝嗘柊鐨勬祦閲忓彂閫佺粰瀹冦傚彟澶栵紝Resonate 榪樺彲浠ヤ嬌鐢ㄥ畠鐨?Global Dispatch 浜у搧鏇存湁鏁堝湴鏀寔鍦板尯鎬у垎甯冨紡鏈嶅姟鍣ㄣ?/p>
Resonate 宸茬粡鍦?Red Hat Linux 涓婂交搴曟祴璇曚簡(jiǎn)璇ヨ蔣浠訛紝鐩鎬俊瀹冧篃鍙互鍦ㄥ叾瀹冨彂琛岀増涓婅繍琛屻俁esonate 鐨勮蔣浠惰繕鍙互鍦ㄥ叾瀹冨悇縐嶅鉤鍙頒笂榪愯錛屽寘鎷?Solaris銆丄IX銆乄indows NT錛屽茍涓斿畠榪樺彲浠ュ湪娣峰悎鐜涓繘琛岃礋杞藉潎琛°?/p>
MOSIX 浣跨敤 Linux 鍐呮牳鏂扮増鏈潵瀹炵幇榪涚▼璐熻澆鍧囪 闆嗙兢緋葷粺銆傝緹ら泦涓紝浠諱綍鏈嶅姟鍣ㄦ垨宸ヤ綔绔欏彲浠ユ寜鎸囧畾鍔犲叆鎴栫寮錛屽嵆娣誨姞鍒扮兢闆嗙殑鎬誨鐞嗚兘鍔涳紝鎴栦粠涓櫎鍘匯傛牴鎹叾鏂囨。錛孧OSIX 浣跨敤鑷傚簲榪涚▼璐熻澆鍧囪 鍜屽唴瀛樺紩瀵肩畻娉曚嬌鏁翠綋鎬ц兘鏈澶у寲銆傚簲鐢ㄧ▼搴忚繘紼嬪彲浠ュ湪鑺傜偣涔嬮棿鎶㈠厛榪佺Щ錛屼互鍒╃敤鏈濂界殑璧勬簮錛岃繖綾諱技浜庡縐板澶勭悊鍣ㄧ郴緇熷彲浠ュ湪鍚勪釜澶勭悊鍣ㄤ箣闂村垏鎹㈠簲鐢ㄧ▼搴忋?/p>
MOSIX 鍦ㄥ簲鐢ㄥ眰鏄畬鍏ㄩ忔槑鐨勶紝騫朵笖涓嶉渶瑕侀噸鏂扮紪璇戞垨鑰呴噸鏂伴摼鎺ュ埌鏂扮殑搴擄紝鍥犱負(fù)鎵鏈変竴鍒囬兘鍙戠敓鍦ㄥ唴鏍哥駭涓娿傚彲浠ユ湁鍑犵鏂規(guī)硶灝嗗畠閰嶇疆鎴愬鐢ㄦ埛鍏變韓鐜緹ら泦銆傛墍鏈夋湇鍔″櫒鍙互鍏變韓涓涓睜錛岀郴緇熷彲浠ユ槸緹ら泦鐨勪竴閮ㄥ垎錛屾垨鑰呯兢闆嗗彲浠ュ姩鎬佸湴鍒嗘垚鍑犱釜瀛愮兢闆嗭紝姣忕鏂規(guī)硶閮芥湁涓嶅悓鐨勭敤閫斻侺inux 宸ヤ綔绔欒繕鍙互鏄兢闆嗙殑涓閮ㄥ垎錛屽彲浠ユ槸鍥哄畾鐨勶紝涔熷彲浠ユ槸涓存椂鐨勶紝鎴栬呭彧鏄綔涓烘壒澶勭悊浣滀笟鎻愪氦鑰呫備綔涓轟復(fù)鏃剁兢闆嗚妭鐐癸紝宸ヤ綔绔欏彲浠ュ湪鍏剁┖闂叉椂鐢ㄤ簬澧炲姞緹ら泦澶勭悊鑳藉姏銆備篃鍏佽鍙互鎵瑰鐞嗘柟寮忎嬌鐢ㄧ兢闆嗭紝鍦ㄨ繖縐嶆柟寮忎腑錛岀兢闆嗚閰嶇疆鎴愰氳繃闃熷垪鎺ュ彈鎵瑰鐞嗕綔涓氥傜劧鍚庯紝瀹堟姢紼嬪簭鍙栬蛋浣滀笟騫跺皢瀹冧滑鍙戦佸埌緹ら泦鑺傜偣榪涜澶勭悊銆?/p>
MOSIX 鐨勪笉鍒╀箣澶勬槸瀹冩洿鏀?Linux 鍐呮牳琛屼負(fù)鐨勪竴浜涙牳蹇?jī)閮ㄥ垎锛屼簬鏄p葷粺綰у簲鐢ㄧ▼搴忓皢涓嶄細(xì)鎸夋湡鏈涜繍琛屻?/p>
闄や簡(jiǎn)楂樻ц兘縐戝璁$畻錛孧OSIX 鎻愪緵浜?jiǎn)涓涓湁瓚g殑閫夐」錛岀敤浜庝互鍏卞悓璁劇疆鍒涘緩闆嗙兢鐜銆傞氳繃浣跨敤鏈嶅姟鍣ㄥ拰宸ヤ綔绔欎笂鐨勯棽緗祫婧愶紝瀹冨彲浠ユ洿蹇洿鏈夋晥鍦板垱寤哄拰榪愯搴旂敤紼嬪簭銆傜敱浜庤闂簡(jiǎn)澶氬彴鏈嶅姟鍣紝騫朵笖鍙互鍔ㄦ佽皟鏁寸兢闆嗗ぇ灝忓拰鏇存敼璐熻澆鍧囪 瑙勫垯錛屽畠榪樺彲浠ユ彁渚涢珮搴︾殑鏈嶅姟鍣ㄥ彲鐢ㄦс侻OSIX 鐨勪笉鍒╀箣澶勬槸瀹冩洿鏀?Linux 鍐呮牳琛屼負(fù)鐨勪竴浜涙牳蹇?jī)閮ㄥ垎锛屼簬鏄p葷粺綰у簲鐢ㄧ▼搴忓皢涓嶄細(xì)鎸夋湡鏈涜繍琛屻傝浣跨敤緗戠粶搴旂敤紼嬪簭鏃訛紝鑰岃紼嬪簭浣跨敤鍩轟簬鍗曚釜鏈嶅姟鍣ㄥ湴鍧鐨勫鎺ュ瓧榪炴帴錛孧OSIX 閫氬父涔熶細(xì)鍙楀埌闄愬埗銆傝繖鎰忓懗鐫緗戠粶搴旂敤紼嬪簭鍦ㄤ竴涓湇鍔″櫒鑺傜偣涓婂紑濮嬭繍琛屾椂錛屽鏋?IP 鍦板潃涓庡鎺ュ瓧緇戝畾錛岄偅涔堝畠蹇呴』緇х畫鍦ㄨ鑺傜偣涓婅繍琛屻傛樉鐒?dòng)灱孧OSIX 榪樻鍦ㄥ紑濮嬭縼縐誨鎺ュ瓧錛屽洜姝よ繖寰堝揩灝卞彉鎴愪簡(jiǎn)浜夎鐨勭劍鐐廣?/p>
楂樺彲鐢ㄦ?(HA) 緹ら泦鑷村姏浜庝嬌鏈嶅姟鍣ㄧ郴緇熺殑榪愯閫熷害鍜屽搷搴旈熷害灝藉彲鑳藉揩銆傚畠浠粡甯鎬嬌鐢ㄥ湪澶氬彴鏈哄櫒涓婅繍琛岀殑鍐椾綑鑺傜偣鍜屾湇鍔★紝鐢ㄦ潵鐩鎬簰璺熻釜銆傚鏋滄煇涓妭鐐瑰け璐ワ紝瀹冪殑鏇胯ˉ灝嗗湪鍑犵閽熸垨鏇寸煭鏃墮棿鍐呮帴綆″畠鐨勮亴璐c傚洜姝わ紝瀵逛簬鐢ㄦ埛鑰岃█錛岀兢闆嗘案榪滀笉浼?xì)鍋滄満銆?/p>
鏌愪簺 HA 緹ら泦涔熷彲浠ョ淮鎶よ妭鐐歸棿鍐椾綑搴旂敤紼嬪簭銆傚洜姝わ紝鐢ㄦ埛鐨勫簲鐢ㄧ▼搴忓皢緇х畫榪愯錛屽嵆浣夸粬鎴栧ス浣跨敤鐨勮妭鐐瑰嚭浜?jiǎn)鏁呴殰銆傛鍦ㄨ繍琛岀殑搴旂敤紼嬪簭浼?xì)鍦ㄥ嚑绉掍箣鍐厴q佺Щ鍒板彟涓涓妭鐐癸紝鑰屾墍鏈夌敤鎴峰彧浼?xì)瀵熻鍒板搷搴斀E嶅井鎱簡(jiǎn)涓鐐廣備絾鏄紝榪欑搴旂敤紼嬪簭綰у啑浣欒姹傚皢杞歡璁捐鎴愬叿鏈夌兢闆嗘剰璇嗙殑錛屽茍涓旂煡閬撹妭鐐瑰け璐ユ椂搴旇鍋氫粈涔堛備絾瀵逛簬 Linux錛屽ぇ澶氭暟鐜板湪榪樺仛涓嶅埌銆傚洜涓?Linux 緋葷粺娌℃湁 HA 闆嗙兢鏍囧噯錛屽茍涓斾篃娌℃湁鍏叡 API 鍙緵搴旂敤紼嬪簭寮鍙戣呮瀯寤烘湁緹ら泦鎰忚瘑鐨勮蔣浠躲?/p>
HA 緹ら泦鍙互鎵ц璐熻澆鍧囪 錛屼絾閫氬父涓繪湇鍔″櫒榪愯浣滀笟錛岃岀郴緇熶嬌杈呭姪鏈嶅姟鍣ㄤ繚鎸侀棽緗傝緟鍔╂湇鍔″櫒閫氬父鏄富鏈嶅姟鍣ㄦ搷浣滅郴緇熻緗殑闀滃儚錛屽敖綆$‖浠舵湰韜◢鏈変笉鍚屻傝緟鍔╄妭鐐瑰涓繪湇鍔″櫒榪涜媧誨姩鐩戞帶鎴栧績(jī)璺寵瀵燂紝浠ユ煡鐪嬪畠鏄惁浠嶅湪榪愯銆傚鏋滃績(jī)璺寵鏃跺櫒娌℃湁鎺ユ敹鍒頒富鏈嶅姟鍣ㄧ殑鍝嶅簲錛屽垯杈呭姪鑺傜偣灝嗘帴綆$綉緇滃拰緋葷粺韜喚錛堝鏋滄槸 Linux 緋葷粺錛屽垯鏄?IP 涓繪満鍚嶅拰鍦板潃錛夈?/p>
浣嗘槸錛孡inux 鍦ㄨ繖涓棰嗗煙浠嶆湁涓鐐瑰拷鐣ャ傚ソ娑堟伅鏄湁涓瀹惰憲鍚嶇殑渚涘簲鍟嗘鍦ㄥ姫鍔涘敖蹇爺鍒墮珮鍙敤鎬х兢闆嗭紝鍥犱負(fù)瀹冩槸浼佷笟綰ф湇鍔″櫒閮藉繀闇鐨勫姛鑳姐?/p>
楂樺彲鐢ㄦ?Linux 欏圭洰錛屾牴鎹叾鐩爣澹版槑錛屾棬鍦ㄤ負(fù) Linux 鎻愪緵楂樺彲鐢ㄦцВ鍐蟲(chóng)柟妗堬紝浠ラ氳繃紺懼尯寮鍙戞垚鏋滄彁楂樺彲闈犳с佸彲鐢ㄦу拰鏈嶅姟鑳藉姏銆侺inux 杈懼埌楂樺彲鐢ㄦч泦緹ゆ椂錛岃繖鏄竴縐嶈瘯鍥劇粰浜?Linux 涓庡厛榪涚殑 Unix 緋葷粺錛屽 Solaris銆丄IX 鍜?HP/UX錛屼竴鏍峰叿鏈夌珵浜夊姏鐨勭壒鎬с傚洜姝わ紝欏圭洰鐨勭洰鏍囨槸鍦?2001 騫翠箣鍓嶈揪鍒?Unix 闆嗙兢姣旇緝鎶ュ憡 ( http://www.sun.com/clusters/dh.brown.pdf) 涓垎鏋愪笓瀹剁粍 D. H. Brown 鐗瑰畾鍔熻兘鎬х駭鍒?
欏圭洰涓湁鍙互緇存姢鑺傜偣闂村績(jī)璺沖茍鎺ョ澶辮觸鑺傜偣鐨?IP 鍦板潃鐨勮蔣浠躲傚鏋滀竴涓妭鐐瑰け璐ワ紝瀹冧嬌鐢?#8220;浼犲啑浣?IP”杞歡鍖呭皢澶辮觸鑺傜偣鐨勫湴鍧娣誨姞鍒板伐浣滆妭鐐逛互鎵挎媴瀹冪殑鑱岃矗銆備簬鏄紝鍙互鍦ㄥ嚑姣鏃墮棿鍐呰嚜鍔ㄦ浛鎹㈠け璐ョ殑鑺傜偣銆傚疄闄呬嬌鐢ㄤ腑錛屽績(jī)璺抽氬父鍦ㄥ嚑縐掕寖鍥村唴錛岄櫎闈炲湪鑺傜偣涔嬮棿鏈変笓鐢ㄧ綉緇滈摼鎺ャ傚洜姝わ紝澶辮觸緋葷粺涓殑鐢ㄦ埛搴旂敤紼嬪簭浠嶉渶瑕佸湪鏂扮殑鑺傜偣涓婇噸鏂板惎鍔ㄣ?/p>
瀵逛簬 Linux錛屾湁璁稿闆嗙兢緋葷粺鍙緵閫夌敤銆傚悓鏃訛紝閭d簺欏圭洰涓湁鍑犱釜鏄潪鍟嗕笟鎬х殑錛岀敋鑷蟲(chóng)槸瀹為獙鎬ц川鐨勩傝櫧鐒跺瀛︽湳鐣屽拰鏌愪簺緇勭粐榪欎篃娌℃湁褰㈡垚闂錛屼絾澶у叕鍙擱氬父棣栭夎憲鍚嶄緵搴斿晢鐨勫晢涓氭敮鎸佸鉤鍙般備緵搴斿晢錛屽 IBM銆丼GI銆丠P 鍜?Sun錛屾彁渚涗簡(jiǎn)鐢ㄤ簬鍦?Linux 涓瀯寤虹瀛︾兢闆嗙殑浜у搧鍜屾湇鍔★紝鍥犱負(fù)緹ら泦寰堟祦琛岋紝騫朵笖鍙互閿鍞ぇ閲忕殑鏈嶅姟鍣ㄨ澶囥備竴鏃﹀晢涓氭満鏋勮涓哄叾瀹冨艦寮忕殑闆嗙兢鏄彲闈犵殑錛岄偅浜涚浉鍚岀殑鏈嶅姟鍣ㄤ緵搴斿晢鎴栬浼?xì)鍥淳l曠潃寮鏀炬簮鐮侀泦緹よВ鍐蟲(chóng)柟妗堝垱寤鴻嚜宸辯殑浜у搧銆?/p>
Linux 浣滀負(fù)鏈嶅姟鍣ㄥ鉤鍙扮殑閲嶈鎬т緷璧栦簬鏀寔澶у瀷鏈嶅姟鍣ㄥ拰鏈嶅姟鍣ㄧ兢闆嗙殑鑳藉姏銆傝繖灝變嬌瀹冨彲浠ヤ笌 Sun銆丠P銆両BM 鍜屽叾瀹冨叕鍙哥殑 UNIX 鏈嶅姟鍣ㄥ湪鏇撮珮灞傞潰涓婄珵浜夈傝櫧鐒?Windows NT 鍜?2000 涓嶆敮鎸?Linux 鑳藉鏀寔鐨勯泦緹よ寖鍥達(dá)紝浣嗘槸 HA 闆嗙兢姝h鏂規(guī)硶鐨勫彲鐢ㄦт互鍙?qiáng)鐢ㄤ簬鏋勫缓鏈壘煠闆嗘剰璇嗙?API 涔熶嬌瀹冭兘澶熷弬涓庣珵浜夈?/p>
濡傛灉姝e湪鑰冭檻鏋勫緩涓涓兢闆嗭紝閭d箞鎮(zhèn)ㄥ簲褰撲粩緇嗘鏌ラ偅浜涘彲鑳芥э紝騫跺皢瀹冧滑涓庢?zhèn)ㄧ殑闇姹傚仛姣旇緝銆傛?zhèn)ㄤ篃璁镐細(xì)鍙戠幇鎯宠瀹炵幇鐨勭洰鏍嚇q樹(shù)笉鑳芥垚涓轟竴涓畬鏁寸殑瑙e喅鏂規(guī)錛屾垨璁鎬細(xì)鍙戠幇宸茬粡鏈変簡(jiǎn)鐜版垚鐨勮В鍐蟲(chóng)柟妗堛備笉綆℃槸鍝鎯呭喌錛岃鐩鎬俊璁稿鐜版湁鍏徃灝嗕粬浠殑搴旂敤紼嬪簭鎵樹(shù)粯緇欒繘琛屾繁搴﹁綆楀茍鎻愪緵澶ч噺緗戦〉鐨?Linux 緋葷粺緹ら泦銆傞泦緹ゆ槸涓縐嶄紒涓氱郴緇熸湇鍔★紝宸茬粡鍦?Linux 涓嬫垚鍔熸祴璇曡繃銆傚敖綆℃柊鐨勯泦緹ゅ皢鍑虹幇錛屼絾閫夋嫨鐨勫鏍鋒ф鏄?Linux 瓚呰繃鍏跺畠緋葷粺錛屽 Windows NT錛岀殑浼樺娍銆?/p>
Rawn Shah 鏄眳浣忓湪浜氬埄妗戦偅宸炲浘媯競(jìng)鐨勪竴浣嶇嫭绔嬮【闂備粬澶氬勾鏉ヤ笌澶氬鉤鍙伴棶棰樻墦浜ら亾騫舵挵鍐欑浉鍏蟲(chóng)枃绔狅紝浣嗗父甯鎬護(hù)浠栦笉瑙g殑鏄緢灝戞湁浜虹煡閬撴湁鐢ㄧ殑緋葷粺宸ュ叿銆?/p>
]]>
bool msg_recv_thread(void)

{
int max = 0;
fd_set readfds; // 緇撴灉闆?/span>
struct timeval RevTimeOut;
RevTimeOut.tv_sec = 1; // 璁懼畾select鐨勮秴鏃舵椂闂翠負(fù)1s
RevtimeOut.tv_usec = 0;
while(1)
{
FD_SET(conn_socket, &readfds);
max = (max > conn_socket) ? max : conn_socket;
int ret = select(max+1, &readfds, NULL, NULL, &RevTimeOut);
if (ret <= 0)
{
continue;
}
if (FD_ISSET(conn_socket, &readfds) != 0)
{
// 鎺ュ彈榪炴帴璇鋒眰澶勭悊……
}
// 鍏朵粬澶勭悊……
}闈炴湰浜轟綔涔?鍥犻潪甯哥粡鍏?鎵浠ユ敹褰掓棗涓?涓庝紬浜洪槄涔?鍘熶綔鑰呬笉紲?
浜屻佸爢鍜屾爤鐨勭悊璁虹煡璇?nbsp;
2.1鐢寵鏂瑰紡
stack:
鐢辯郴緇熻嚜鍔ㄥ垎閰嶃?nbsp;渚嬪錛屽0鏄庡湪鍑芥暟涓竴涓眬閮ㄥ彉閲?nbsp;int b; 緋葷粺鑷姩鍦ㄦ爤涓負(fù)b寮杈熺┖闂?nbsp;
heap:
闇瑕佺▼搴忓憳鑷繁鐢寵錛屽茍鎸囨槑澶у皬錛屽湪c涓璵alloc鍑芥暟
濡俻1 = (char *)malloc(10);
鍦–++涓敤new榪愮畻絎?nbsp;
濡俻2 = (char *)malloc(10);
浣嗘槸娉ㄦ剰p1銆乸2鏈韓鏄湪鏍堜腑鐨勩?nbsp;
2.2
鐢寵鍚庣郴緇熺殑鍝嶅簲
鏍堬細(xì)鍙鏍堢殑鍓╀綑絀洪棿澶т簬鎵鐢寵絀洪棿錛岀郴緇熷皢涓虹▼搴忔彁渚涘唴瀛橈紝鍚﹀垯灝嗘姤寮傚父鎻愮ず鏍堟孩鍑恒?nbsp;
鍫嗭細(xì)棣栧厛搴旇鐭ラ亾鎿嶄綔緋葷粺鏈変竴涓褰曠┖闂插唴瀛樺湴鍧鐨勯摼琛紝褰撶郴緇熸敹鍒扮▼搴忕殑鐢寵鏃訛紝
浼?xì)閬嶅巻璇ラ摼琛ㄥQ屽鎵劇涓涓┖闂村ぇ浜庢墍鐢寵絀洪棿鐨勫爢緇撶偣錛岀劧鍚庡皢璇ョ粨鐐逛粠絀洪棽緇撶偣閾捐〃涓垹闄わ紝騫跺皢璇ョ粨鐐圭殑絀洪棿鍒嗛厤緇欑▼搴忥紝鍙﹀錛屽浜庡ぇ澶氭暟緋葷粺錛屼細(xì)鍦ㄨ繖鍧楀唴瀛樼┖闂翠腑鐨勯鍦板潃澶勮褰曟湰嬈″垎閰嶇殑澶у皬錛岃繖鏍鳳紝浠g爜涓殑delete璇彞鎵嶈兘姝g‘鐨勯噴鏀炬湰鍐呭瓨絀洪棿銆傚彟澶栵紝鐢變簬鎵懼埌鐨勫爢緇撶偣鐨勫ぇ灝忎笉涓瀹氭濂界瓑浜庣敵璇風(fēng)殑澶у皬錛岀郴緇熶細(xì)鑷姩鐨勫皢澶氫綑鐨勯偅閮ㄥ垎閲嶆柊鏀懼叆絀洪棽閾捐〃涓?nbsp;
2.3鐢寵澶у皬鐨勯檺鍒?nbsp;
鏍堬細(xì)鍦╓indows涓?鏍堟槸鍚戜綆鍦板潃鎵╁睍鐨勬暟鎹粨鏋勶紝鏄竴鍧楄繛緇殑鍐呭瓨鐨勫尯鍩熴傝繖鍙ヨ瘽鐨勬剰鎬濇槸鏍堥《鐨勫湴鍧鍜屾爤鐨勬渶澶у閲忔槸緋葷粺棰勫厛瑙勫畾濂界殑錛屽湪WINDOWS涓嬶紝鏍堢殑澶у皬鏄?M錛堜篃鏈夌殑璇存槸1M錛屾諱箣鏄竴涓紪璇戞椂灝辯‘瀹氱殑甯告暟錛夛紝濡傛灉鐢寵鐨勭┖闂磋秴榪囨爤鐨勫墿浣欑┖闂存椂錛屽皢鎻愮ずoverflow銆傚洜姝わ紝鑳戒粠鏍堣幏寰楃殑絀洪棿杈冨皬銆?nbsp;
鍫嗭細(xì)鍫嗘槸鍚戦珮鍦板潃鎵╁睍鐨勬暟鎹粨鏋勶紝鏄笉榪炵畫鐨勫唴瀛樺尯鍩熴傝繖鏄敱浜庣郴緇熸槸鐢ㄩ摼琛ㄦ潵瀛樺偍鐨勭┖闂插唴瀛樺湴鍧鐨勶紝鑷劧鏄笉榪炵畫鐨勶紝鑰岄摼琛ㄧ殑閬嶅巻鏂瑰悜鏄敱浣庡湴鍧鍚戦珮鍦板潃銆傚爢鐨勫ぇ灝忓彈闄愪簬璁$畻鏈虹郴緇熶腑鏈夋晥鐨勮櫄鎷熷唴瀛樸傜敱姝ゅ彲瑙侊紝鍫嗚幏寰楃殑絀洪棿姣旇緝鐏墊椿錛屼篃姣旇緝澶с?nbsp;
2.4鐢寵鏁堢巼鐨勬瘮杈冿細(xì)
鏍堢敱緋葷粺鑷姩鍒嗛厤錛岄熷害杈冨揩銆備絾紼嬪簭鍛樻槸鏃犳硶鎺у埗鐨勩?nbsp;
鍫嗘槸鐢眓ew鍒嗛厤鐨勫唴瀛橈紝涓鑸熷害姣旇緝鎱紝鑰屼笖瀹規(guī)槗浜х敓鍐呭瓨紕庣墖,涓嶈繃鐢ㄨ搗鏉ユ渶鏂逛究.
鍙﹀錛屽湪WINDOWS涓嬶紝鏈濂界殑鏂瑰紡鏄敤VirtualAlloc鍒嗛厤鍐呭瓨錛屼粬涓嶆槸鍦ㄥ爢錛屼篃涓嶆槸鍦ㄦ爤鏄洿鎺ュ湪榪涚▼鐨勫湴鍧絀洪棿涓繚鐣欎竴蹇唴瀛橈紝铏界劧鐢ㄨ搗鏉ユ渶涓嶆柟渚褲備絾鏄熷害蹇紝涔熸渶鐏墊椿銆?nbsp;
2.5鍫嗗拰鏍堜腑鐨勫瓨鍌ㄥ唴瀹?nbsp;
鏍堬細(xì) 鍦ㄥ嚱鏁拌皟鐢ㄦ椂錛岀涓涓繘鏍堢殑鏄富鍑芥暟涓悗鐨勪笅涓鏉℃寚浠わ紙鍑芥暟璋冪敤璇彞鐨勪笅涓鏉″彲鎵ц璇彞錛夌殑鍦板潃錛岀劧鍚庢槸鍑芥暟鐨勫悇涓弬鏁幫紝鍦ㄥぇ澶氭暟鐨凜緙栬瘧鍣ㄤ腑錛屽弬鏁版槸鐢卞彸寰宸﹀叆鏍堢殑錛岀劧鍚庢槸鍑芥暟涓殑灞閮ㄥ彉閲忋傛敞鎰忛潤(rùn)鎬佸彉閲忔槸涓嶅叆鏍堢殑銆?nbsp;
褰撴湰嬈″嚱鏁拌皟鐢ㄧ粨鏉熷悗錛屽眬閮ㄥ彉閲忓厛鍑烘爤錛岀劧鍚庢槸鍙傛暟錛屾渶鍚庢爤欏舵寚閽堟寚鍚戞渶寮濮嬪瓨鐨勫湴鍧錛屼篃灝辨槸涓誨嚱鏁頒腑鐨勪笅涓鏉℃寚浠わ紝紼嬪簭鐢辮鐐圭戶緇繍琛屻?nbsp;
鍫嗭細(xì)涓鑸槸鍦ㄥ爢鐨勫ご閮ㄧ敤涓涓瓧鑺傚瓨鏀懼爢鐨勫ぇ灝忋傚爢涓殑鍏蜂綋鍐呭鏈夌▼搴忓憳瀹夋帓銆?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璇誨彇瀛楃錛屾樉鐒舵參浜?jiǎn)銆?nbsp;
2.7灝忕粨錛?nbsp;
鍫嗗拰鏍堢殑鍖哄埆鍙互鐢ㄥ涓嬬殑姣斿柣鏉ョ湅鍑猴細(xì)
浣跨敤鏍堝氨璞℃垜浠幓楗閲屽悆楗紝鍙鐐硅彍錛堝彂鍑虹敵璇鳳級(jí)銆佷粯閽便佸拰鍚冿紙浣跨敤錛夛紝鍚冮ケ浜?jiǎn)灏辫祹图屼笉蹇呯悊浼?xì)鍒囪彍銆佹礂鑿滅瓑鍑嗗宸ヤ綔鍜屾礂紕椼佸埛閿呯瓑鎵熬宸ヤ綔錛屼粬鐨勫ソ澶勬槸蹇嵎錛屼絾鏄嚜鐢卞害灝忋?nbsp;
浣跨敤鍫嗗氨璞℃槸鑷繁鍔ㄦ墜鍋氬枩嬈㈠悆鐨勮彍鑲達(dá)紝姣旇緝楹葷儲(chǔ)錛屼絾鏄瘮杈冪鍚堣嚜宸辯殑鍙e懗錛岃屼笖鑷敱搴﹀ぇ銆?nbsp;
windows榪涚▼涓殑鍐呭瓨緇撴瀯
鍦ㄩ槄璇繪湰鏂囦箣鍓嶏紝濡傛灉浣犺繛鍫嗘爤鏄粈涔堝涓嶇煡閬撶殑璇濓紝璇峰厛闃呰鏂囩珷鍚庨潰鐨勫熀紜鐭ヨ瘑銆?nbsp;
鎺ヨЕ榪囩紪紼嬬殑浜洪兘鐭ラ亾錛岄珮綰ц璦閮借兘閫氳繃鍙橀噺鍚嶆潵璁塊棶鍐呭瓨?shù)腑鐨勬暟鎹傞偅涔堣繖浜涘彉閲忓湪鍐呭瓨?shù)腑鏄浣曞瓨鏀剧殑鍛㈠Q熺▼搴忓張鏄浣曚嬌鐢ㄨ繖浜涘彉閲忕殑鍛紵涓嬮潰灝變細(xì)瀵規(guī)榪涜娣卞叆鐨勮璁恒備笅鏂囦腑鐨凜璇█浠g爜濡傛病鏈夌壒鍒0鏄庯紝榛樿閮戒嬌鐢╒C緙栬瘧鐨剅elease鐗堛?nbsp;
棣栧厛錛屾潵浜?jiǎn)瑙d竴涓?nbsp;C 璇█鐨勫彉閲忔槸濡備綍鍦ㄥ唴瀛樺垎閮ㄧ殑銆侰 璇█鏈夊叏灞鍙橀噺(Global)銆佹湰鍦板彉閲?Local)錛岄潤(rùn)鎬佸彉閲?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); //鎵撳嵃鍚勯潤(rùn)鎬佸彉閲忕殑鍐呭瓨鍦板潃
printf("0x%08x\n",&s2);
printf("0x%08x\n\n",&s3);
return 0;
}
緙栬瘧鍚庣殑鎵ц緇撴灉鏄細(xì)
0x0012ff78
0x0012ff7c
0x0012ff80
0x004068d0
0x004068d4
0x004068d8
0x004068dc
0x004068e0
0x004068e4
杈撳嚭鐨勭粨鏋滃氨鏄彉閲忕殑鍐呭瓨鍦板潃銆傚叾涓璿1,v2,v3鏄湰鍦板彉閲忥紝g1,g2,g3鏄叏灞鍙橀噺錛宻1,s2,s3鏄潤(rùn)鎬佸彉閲忋備綘鍙互鐪嬪埌榪欎簺鍙橀噺鍦ㄥ唴瀛樻槸榪炵畫鍒嗗竷鐨勶紝浣嗘槸鏈湴鍙橀噺鍜屽叏灞鍙橀噺鍒嗛厤鐨勫唴瀛樺湴鍧宸簡(jiǎn)鍗佷竾鍏崈閲岋紝鑰屽叏灞鍙橀噺鍜岄潤(rùn)鎬佸彉閲忓垎閰嶇殑鍐呭瓨鏄繛緇殑銆傝繖鏄洜涓烘湰鍦板彉閲忓拰鍏ㄥ眬/闈?rùn)鎬佸彉閲忔槸鍒嗛厤鍦ㄤ笉鍚岀被鍨嬬殑鍐呭瓨鍖哄煙涓殑緇撴灉銆傚浜庝竴涓繘紼嬬殑鍐呭瓨絀洪棿鑰岃█錛屽彲浠ュ湪閫昏緫涓婂垎鎴?涓儴浠斤細(xì)浠g爜鍖猴紝闈?rùn)鎬佹暟鎹尯鍜屽姩鎬佹暟鎹尯銆傚姩鎬佹暟鎹尯涓鑸氨鏄?#8220;鍫嗘爤”銆?#8220;鏍?stack)”鍜?#8220;鍫?heap)”鏄袱縐嶄笉鍚岀殑鍔ㄦ佹暟鎹尯錛屾爤鏄竴縐嶇嚎鎬х粨鏋勶紝鍫嗘槸涓縐嶉摼寮忕粨鏋勩傝繘紼嬬殑姣忎釜綰跨▼閮芥湁縐佹湁鐨?#8220;鏍?#8221;錛屾墍浠ユ瘡涓嚎紼嬭櫧鐒朵唬鐮佷竴鏍鳳紝浣嗘湰鍦板彉閲忕殑鏁版嵁閮芥槸浜掍笉騫叉壈銆備竴涓爢鏍堝彲浠ラ氳繃“鍩哄湴鍧”鍜?#8220;鏍堥《”鍦板潃鏉ユ弿榪般傚叏灞鍙橀噺鍜岄潤(rùn)鎬佸彉閲忓垎閰嶅湪闈?rùn)鎬佹暟鎹尯錛屾湰鍦板彉閲忓垎閰嶅湪鍔ㄦ佹暟鎹尯錛屽嵆鍫嗘爤涓傜▼搴忛氳繃鍫嗘爤鐨勫熀鍦板潃鍜屽亸縐婚噺鏉ヨ闂湰鍦板彉閲忋?nbsp;
鈹溾斺斺斺斺斺斺斺敜浣庣鍐呭瓨鍖哄煙
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜
鈹?nbsp;鍔ㄦ佹暟鎹尯 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜
鈹?nbsp;浠g爜鍖?nbsp;鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜
鈹?nbsp;闈?rùn)鎬佹暟鎹尯 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜楂樼鍐呭瓨鍖哄煙
鍫嗘爤鏄竴涓厛榪涘悗鍑虹殑鏁版嵁緇撴瀯錛屾爤欏跺湴鍧鎬繪槸灝忎簬絳変簬鏍堢殑鍩哄湴鍧銆傛垜浠彲浠ュ厛浜?jiǎn)瑙d竴涓嬪嚱鏁拌皟鐢ㄧ殑榪囩▼錛屼互渚垮鍫嗘爤鍦ㄧ▼搴忎腑鐨勪綔鐢ㄦ湁鏇存繁鍏ョ殑浜?jiǎn)瑙c備笉鍚岀殑璇█鏈変笉鍚岀殑鍑芥暟璋冪敤瑙勫畾錛岃繖浜涘洜绱犳湁鍙傛暟鐨勫帇鍏ヨ鍒欏拰鍫嗘爤鐨勫鉤琛°倃indows API鐨勮皟鐢ㄨ鍒欏拰ANSI C鐨勫嚱鏁拌皟鐢ㄨ鍒欐槸涓嶄竴鏍風(fēng)殑錛屽墠鑰呯敱琚皟鍑芥暟璋冩暣鍫嗘爤錛屽悗鑰呯敱璋冪敤鑰呰皟鏁村爢鏍堛備袱鑰呴氳繃“__stdcall”鍜?#8220;__cdecl”鍓嶇紑鍖哄垎銆傚厛鐪嬩笅闈㈣繖孌典唬鐮侊細(xì)
#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;
}
緙栬瘧鍚庣殑鎵ц緇撴灉鏄細(xì)
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;
涓婂浘灝辨槸鍑芥暟璋冪敤榪囩▼涓爢鏍堢殑鏍峰瓙浜?jiǎn)銆傞鍏堬紝涓変釜鍙傛暟浠ヤ粠鍙堝埌宸︾殑嬈″簭鍘嬪叆鍫嗘爤錛屽厛鍘?#8220;param3”錛屽啀鍘?#8220;param2”錛屾渶鍚庡帇鍏?#8220;param1”錛涚劧鍚庡帇鍏ュ嚱鏁扮殑榪斿洖鍦板潃(RET)錛屾帴鐫璺寵漿鍒板嚱鏁板湴鍧鎺ョ潃鎵ц錛堣繖閲岃琛ュ厖涓鐐癸紝浠嬬粛UNIX涓嬬殑緙撳啿婧㈠嚭鍘熺悊鐨勬枃绔犱腑閮芥彁鍒板湪鍘嬪叆RET鍚庯紝緇х畫鍘嬪叆褰撳墠EBP錛岀劧鍚庣敤褰撳墠ESP浠f浛EBP銆傜劧鑰岋紝鏈変竴綃囦粙緇峸indows涓嬪嚱鏁拌皟鐢ㄧ殑鏂囩珷涓錛屽湪windows涓嬬殑鍑芥暟璋冪敤涔熸湁榪欎竴姝ラ錛屼絾鏍規(guī)嵁鎴戠殑瀹為檯璋冭瘯錛屽茍鏈彂鐜拌繖涓姝ワ紝榪欒繕鍙互浠巔aram3鍜寁ar1涔嬮棿鍙湁4瀛楄妭鐨勯棿闅欒繖鐐圭湅鍑烘潵錛夛紱絎笁姝ワ紝灝嗘爤欏?ESP)鍑忓幓涓涓暟錛屼負(fù)鏈湴鍙橀噺鍒嗛厤鍐呭瓨絀洪棿錛屼笂渚嬩腑鏄噺鍘?2瀛楄妭(ESP=ESP-3*4錛屾瘡涓猧nt鍙橀噺鍗犵敤4涓瓧鑺?錛涙帴鐫灝卞垵濮嬪寲鏈湴鍙橀噺鐨勫唴瀛樼┖闂淬傜敱浜?#8220;__stdcall”璋冪敤鐢辮璋冨嚱鏁拌皟鏁村爢鏍堬紝鎵浠ュ湪鍑芥暟榪斿洖鍓嶈鎭㈠鍫嗘爤錛屽厛鍥炴敹鏈湴鍙橀噺鍗犵敤鐨勫唴瀛?ESP=ESP+3*4)錛岀劧鍚庡彇鍑?guó)櫩斿洖鍦板潃錛屽~鍏IP瀵勫瓨鍣紝鍥炴敹鍏堝墠鍘嬪叆鍙傛暟鍗犵敤鐨勫唴瀛?ESP=ESP+3*4)錛岀戶緇墽琛岃皟鐢ㄨ呯殑浠g爜銆傚弬瑙佷笅鍒楁眹緙栦唬鐮侊細(xì)
;--------------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
……………………錛堢渷鐣ヨ嫢騫蹭唬鐮侊級(jí)
: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”
鑱槑鐨勮鑰呯湅鍒拌繖閲岋紝宸笉澶氬氨鏄庣櫧緙撳啿婧㈠嚭鐨勫師鐞嗕簡(jiǎn)銆傚厛鏉ョ湅涓嬮潰鐨勪唬鐮侊細(xì)
#include <stdio.h>
#include <string.h>
void __stdcall func()
{
char lpBuff[8]="\0";
strcat(lpBuff,"AAAAAAAAAAA");
return;
}
int main()
{
func();
return 0;
}
緙栬瘧鍚庢墽琛屼竴涓嬪洖鎬庝箞鏍鳳紵鍝堬紝“"0x00414141"鎸囦護(hù)寮曠敤鐨?0x00000000"鍐呭瓨銆傝鍐呭瓨?shù)笉鑳戒?read"銆?#8221;錛?#8220;闈炴硶鎿嶄綔”鍠斤紒"41"灝辨槸"A"鐨?6榪涘埗鐨凙SCII鐮佷簡(jiǎn)錛岄偅鏄庢樉灝辨槸strcat榪欏彞鍑虹殑闂?shù)簡(jiǎn)銆?lpBuff"鐨勫ぇ灝忓彧鏈?瀛楄妭錛岀畻榪涚粨灝劇殑\0錛岄偅strcat鏈澶氬彧鑳藉啓鍏?涓?A"錛屼絾紼嬪簭瀹為檯鍐欏叆浜?1涓?A"澶栧姞1涓猏0銆傚啀鏉ョ湅鐪嬩笂闈㈤偅騫呭浘錛屽鍑烘潵鐨?涓瓧鑺傛濂借鐩栦簡(jiǎn)RET鐨勬墍鍦ㄧ殑鍐呭瓨絀洪棿錛屽鑷村嚱鏁拌繑鍥炲埌涓涓敊璇殑鍐呭瓨鍦板潃錛屾墽琛屼簡(jiǎn)閿欒鐨勬寚浠ゃ傚鏋滆兘綺懼績(jī)鏋勯犺繖涓瓧絎︿覆錛屼嬌瀹冨垎鎴愪笁閮ㄥ垎錛屽墠涓閮ㄤ喚浠呬粎鏄~鍏呯殑鏃犳剰涔夋暟鎹互杈懼埌婧㈠嚭鐨勭洰鐨勶紝鎺ョ潃鏄竴涓鐩朢ET鐨勬暟鎹紝绱ф帴鐫鏄竴孌祍hellcode錛岄偅鍙鐫涓猂ET鍦板潃鑳芥寚鍚戣繖孌祍hellcode鐨勭涓涓寚浠わ紝閭e嚱鏁拌繑鍥炴椂灝辮兘鎵цshellcode浜?jiǎn)銆備絾鏄蔣浠剁殑涓嶅悓鐗堟湰鍜屼笉鍚岀殑榪愯鐜閮藉彲鑳藉獎(jiǎng)鍝嶈繖孌祍hellcode鍦ㄥ唴瀛樹(shù)腑鐨勪綅緗紝閭d箞瑕佹瀯閫犺繖涓猂ET鏄崄鍒嗗洶闅劇殑銆備竴鑸兘鍦≧ET鍜宻hellcode涔嬮棿濉厖澶ч噺鐨凬OP鎸囦護(hù)錛屼嬌寰梕xploit鏈夋洿寮虹殑閫氱敤鎬с?nbsp;
鈹溾斺斺斺斺斺斺斺敜<鈥斾綆绔唴瀛樺尯鍩?nbsp;
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜<鈥旂敱exploit濉叆鏁版嵁鐨勫紑濮?nbsp;
鈹?nbsp;鈹?nbsp;
鈹?nbsp;buffer 鈹?lt;鈥斿~鍏ユ棤鐢ㄧ殑鏁版嵁
鈹?nbsp;鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜
鈹?nbsp;RET 鈹?lt;鈥旀寚鍚憇hellcode錛屾垨NOP鎸囦護(hù)鐨勮寖鍥?nbsp;
鈹溾斺斺斺斺斺斺斺敜
鈹?nbsp;NOP 鈹?nbsp;
鈹?nbsp;…… 鈹?lt;鈥斿~鍏ョ殑NOP鎸囦護(hù)錛屾槸RET鍙寚鍚戠殑鑼冨洿
鈹?nbsp;NOP 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜
鈹?nbsp;鈹?nbsp;
鈹?nbsp;shellcode 鈹?nbsp;
鈹?nbsp;鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜<鈥旂敱exploit濉叆鏁版嵁鐨勭粨鏉?nbsp;
鈹?nbsp;…… 鈹?nbsp;
鈹溾斺斺斺斺斺斺斺敜<鈥旈珮绔唴瀛樺尯鍩?nbsp;
windows涓嬬殑鍔ㄦ佹暟鎹櫎浜?jiǎn)鍙瓨鏀惧湪鏍堜腑锛寴q樺彲浠ュ瓨鏀懼湪鍫嗕腑銆備簡(jiǎn)瑙++鐨勬湅鍙嬮兘鐭ラ亾錛孋++鍙互浣跨敤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); //鎵撳嵃闈?rùn)鎬佸彉閲忕殑鍐呭瓨鍦板潃
}
void main()
{
func();
return;
}
紼嬪簭鎵ц緇撴灉涓猴細(xì)
0x004107d0
0x0012ff04
0x004068c0
鍙互鍙戠幇鐢╪ew鍏抽敭瀛楀垎閰嶇殑鍐呭瓨鍗充笉鍦ㄦ爤涓紝涔熶笉鍦ㄩ潤(rùn)鎬佹暟鎹尯銆俈C緙栬瘧鍣ㄦ槸閫氳繃windows涓嬬殑“鍫?heap)”鏉ュ疄鐜皀ew鍏抽敭瀛楃殑鍐呭瓨鍔ㄦ佸垎閰嶃傚湪璁?#8220;鍫?#8221;涔嬪墠錛屽厛鏉ヤ簡(jiǎn)瑙d竴涓嬪拰“鍫?#8221;鏈夊叧鐨勫嚑涓狝PI鍑芥暟錛?nbsp;
HeapAlloc 鍦ㄥ爢涓敵璇峰唴瀛樼┖闂?nbsp;
HeapCreate 鍒涘緩涓涓柊鐨勫爢瀵硅薄
HeapDestroy 閿姣佷竴涓爢瀵硅薄
HeapFree 閲婃斁鐢寵鐨勫唴瀛?nbsp;
HeapWalk 鏋氫婦鍫嗗璞$殑鎵鏈夊唴瀛樺潡
GetProcessHeap 鍙栧緱榪涚▼鐨勯粯璁ゅ爢瀵硅薄
GetProcessHeaps 鍙栧緱榪涚▼鎵鏈夌殑鍫嗗璞?nbsp;
LocalAlloc
GlobalAlloc
褰撹繘紼嬪垵濮嬪寲鏃訛紝緋葷粺浼?xì)鑷姩湄?fù)榪涚▼鍒涘緩涓涓粯璁ゅ爢錛岃繖涓爢榛樿鎵鍗犲唴瀛樼殑澶у皬涓?M銆傚爢瀵硅薄鐢辯郴緇熻繘琛岀鐞嗭紝瀹冨湪鍐呭瓨?shù)腑浠ラ搼旨従l撴瀯瀛樺湪銆傞氳繃涓嬮潰鐨勪唬鐮佸彲浠ラ氳繃鍫嗗姩鎬佺敵璇峰唴瀛樼┖闂達(dá)細(xì)
HANDLE hHeap=GetProcessHeap();
char *buff=HeapAlloc(hHeap,0,8);
鍏朵腑h(huán)Heap鏄爢瀵硅薄鐨勫彞鏌勶紝buff鏄寚鍚戠敵璇風(fēng)殑鍐呭瓨絀洪棿鐨勫湴鍧銆傞偅榪欎釜hHeap絀剁珶鏄粈涔堝憿錛熷畠鐨勫兼湁浠涔堟剰涔夊悧錛熺湅鐪嬩笅闈㈣繖孌典唬鐮佸惂錛?nbsp;
#pragma comment(linker,"/entry:main") //瀹氫箟紼嬪簭鐨勫叆鍙?nbsp;
#include <windows.h>
_CRTIMP int (__cdecl *printf)(const char *, ...); //瀹氫箟STL鍑芥暟printf
/*---------------------------------------------------------------------------
鍐欏埌榪欓噷錛屾垜浠『渚挎潵澶嶄範(fàn)涓涓嬪墠闈㈡墍璁茬殑鐭ヨ瘑錛?nbsp;
(*娉?printf鍑芥暟鏄疌璇█鐨勬爣鍑嗗嚱鏁板簱涓嚱鏁幫紝VC鐨勬爣鍑嗗嚱鏁板簱鐢眒svcrt.dll妯″潡瀹炵幇銆?nbsp;
鐢卞嚱鏁板畾涔夊彲瑙侊紝printf鐨勫弬鏁頒釜鏁版槸鍙彉鐨勶紝鍑芥暟鍐呴儴鏃犳硶棰勫厛鐭ラ亾璋冪敤鑰呭帇鍏ョ殑鍙傛暟涓暟錛屽嚱鏁板彧鑳介氳繃鍒嗘瀽絎竴涓弬鏁板瓧絎︿覆鐨勬牸寮忔潵鑾峰緱鍘嬪叆鍙傛暟鐨勪俊鎭紝鐢變簬榪欓噷鍙傛暟鐨勪釜鏁版槸鍔ㄦ佺殑錛屾墍浠ュ繀欏葷敱璋冪敤鑰呮潵騫寵 鍫嗘爤錛岃繖閲屼究浣跨敤浜?jiǎn)__cdecl璋冪敤瑙勫垯銆侭TW錛學(xué)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);
}
鎵ц緇撴灉涓猴細(xì)
0x00130000
0x00133100
0x00133118
hHeap鐨勫兼庝箞鍜岄偅涓猙uff鐨勫奸偅涔堟帴榪戝憿錛熷叾瀹瀐Heap榪欎釜鍙ユ焺灝辨槸鎸囧悜HEAP棣栭儴鐨勫湴鍧銆傚湪榪涚▼鐨勭敤鎴峰尯瀛樼潃涓涓彨PEB(榪涚▼鐜鍧?鐨勭粨鏋勶紝榪欎釜緇撴瀯涓瓨鏀劇潃涓浜涙湁鍏寵繘紼嬬殑閲嶈淇℃伅錛屽叾涓湪PEB棣栧湴鍧鍋忕Щ0x18澶勫瓨鏀劇殑ProcessHeap灝辨槸榪涚▼榛樿鍫嗙殑鍦板潃錛岃屽亸縐?x90澶勫瓨鏀句簡(jiǎn)鎸囧悜榪涚▼鎵鏈夊爢鐨勫湴鍧鍒楄〃鐨勬寚閽堛倃indows鏈夊緢澶欰PI閮戒嬌鐢ㄨ繘紼嬬殑榛樿鍫嗘潵瀛樻斁鍔ㄦ佹暟鎹紝濡倃indows 2000涓嬬殑鎵鏈堿NSI鐗堟湰鐨勫嚱鏁伴兘鏄湪榛樿鍫嗕腑鐢寵鍐呭瓨鏉ヨ漿鎹NSI瀛楃涓插埌Unicode瀛楃涓茬殑銆傚涓涓爢鐨勮闂槸欏哄簭榪涜鐨勶紝鍚屼竴鏃跺埢鍙兘鏈変竴涓嚎紼嬭闂爢涓殑鏁版嵁錛屽綋澶氫釜綰跨▼鍚屾椂鏈夎闂姹傛椂錛屽彧鑳芥帓闃熺瓑寰咃紝榪欐牱渚塊犳垚紼嬪簭鎵ц鏁堢巼涓嬮檷銆?nbsp;
鏈鍚庢潵璇磋鍐呭瓨?shù)腑鐨勬暟鎹瘹w綈銆傛墍浣嶆暟鎹榻愶紝鏄寚鏁版嵁鎵鍦ㄧ殑鍐呭瓨鍦板潃蹇呴』鏄鏁版嵁闀垮害鐨勬暣鏁板嶏紝DWORD鏁版嵁鐨勫唴瀛樿搗濮嬪湴鍧鑳借4闄ゅ敖錛學(xué)ORD鏁版嵁鐨勫唴瀛樿搗濮嬪湴鍧鑳借2闄ゅ敖錛寈86 CPU鑳界洿鎺ヨ闂榻愮殑鏁版嵁錛屽綋浠栬瘯鍥捐闂竴涓湭瀵歸綈鐨勬暟鎹椂錛屼細(xì)鍦ㄥ唴閮ㄨ繘琛屼竴緋誨垪鐨勮皟鏁達(dá)紝榪欎簺璋冩暣瀵逛簬紼嬪簭鏉ヨ鏄忔槑鐨勶紝浣嗘槸浼?xì)闄嶄綆杩愯閫熷害錛屾墍浠ョ紪璇戝櫒鍦ㄧ紪璇戠▼搴忔椂浼?xì)灏介噺淇濊瘉鏁版嵁瀵归綈銆傚悓鏍蜂竴孌典唬鐮侊紝鎴戜滑鏉ョ湅鐪嬬敤VC銆丏ev-C++鍜宭cc涓変釜涓嶅悓緙栬瘧鍣ㄧ紪璇戝嚭鏉ョ殑紼嬪簭鐨勬墽琛岀粨鏋滐細(xì)
#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
鍙橀噺鍦ㄥ唴瀛樹(shù)腑鐨勯『搴忥細(xì)b(1瀛楄妭)-a(4瀛楄妭)-c(4瀛楄妭)銆?nbsp;
榪欐槸鐢―ev-C++緙栬瘧鍚庣殑鎵ц緇撴灉錛?nbsp;
0x0022ff7c
0x0022ff7b
0x0022ff74
鍙橀噺鍦ㄥ唴瀛樹(shù)腑鐨勯『搴忥細(xì)c(4瀛楄妭)-涓棿鐩擱殧3瀛楄妭-b(鍗?瀛楄妭)-a(4瀛楄妭)銆?nbsp;
榪欐槸鐢╨cc緙栬瘧鍚庣殑鎵ц緇撴灉錛?nbsp;
0x0012ff6c
0x0012ff6b
0x0012ff64
鍙橀噺鍦ㄥ唴瀛樹(shù)腑鐨勯『搴忥細(xì)鍚屼笂銆?nbsp;
涓変釜緙栬瘧鍣ㄩ兘鍋氬埌浜?jiǎn)鏁版嵁瀵归綈锛屼絾鏄悗涓や釜缂栬瘧鍣ㄦ槃舵病VC“鑱槑”錛岃涓涓猚har鍗犱簡(jiǎn)4瀛楄妭錛屾氮璐瑰唴瀛樺摝銆?nbsp;
鍩虹鐭ヨ瘑錛?nbsp;
鍫嗘爤鏄竴縐嶇畝鍗曠殑鏁版嵁緇撴瀯錛屾槸涓縐嶅彧鍏佽鍦ㄥ叾涓绔繘琛屾彃鍏ユ垨鍒犻櫎鐨勭嚎鎬ц〃銆傚厑璁告彃鍏ユ垨鍒犻櫎鎿嶄綔鐨勪竴绔О涓烘爤欏訛紝鍙︿竴绔О涓烘爤搴曪紝瀵瑰爢鏍堢殑鎻掑叆鍜屽垹闄ゆ搷浣滆縐頒負(fù)鍏ユ爤鍜屽嚭鏍堛傛湁涓緇凜PU鎸囦護(hù)鍙互瀹炵幇瀵硅繘紼嬬殑鍐呭瓨瀹炵幇鍫嗘爤璁塊棶銆傚叾涓紝POP鎸囦護(hù)瀹炵幇鍑烘爤鎿嶄綔錛孭USH鎸囦護(hù)瀹炵幇鍏ユ爤鎿嶄綔銆侰PU鐨凟SP瀵勫瓨鍣ㄥ瓨鏀懼綋鍓嶇嚎紼嬬殑鏍堥《鎸囬拡錛孍BP瀵勫瓨鍣ㄤ腑淇濆瓨褰撳墠綰跨▼鐨勬爤搴曟寚閽堛侰PU鐨凟IP瀵勫瓨鍣ㄥ瓨鏀句笅涓涓狢PU鎸囦護(hù)瀛樻斁鐨勫唴瀛樺湴鍧錛屽綋CPU鎵ц瀹屽綋鍓嶇殑鎸囦護(hù)鍚庯紝浠嶦IP瀵勫瓨鍣ㄤ腑璇誨彇涓嬩竴鏉℃寚浠ょ殑鍐呭瓨鍦板潃錛岀劧鍚庣戶緇墽琛屻?nbsp;
鍙傝冿細(xì)銆奧indows涓嬬殑HEAP婧㈠嚭鍙?qiáng)鍏跺埄鐢ㄣ媌y: isno
銆妛indows鏍稿績(jī)緙栫▼銆媌y: Jeffrey Richter
鎽樿錛?nbsp;璁ㄨ甯歌鐨勫爢鎬ц兘闂?shù)互鍙?qiáng)濡備綍闃茶寖瀹冧滑銆傦紙鍏?nbsp;9 欏碉級(jí)
鍓嶈█
鎮(zhèn)ㄦ槸鍚︽槸鍔ㄦ佸垎閰嶇殑 C/C++ 瀵硅薄蹇犲疄涓斿垢榪愮殑鐢ㄦ埛錛熸?zhèn)ㄦ槸鍚﹀湪妯″潡闂寸殑寰榪旈氫俊涓綣佸湴浣跨敤浜?#8220;鑷姩鍖?#8221;錛熸?zhèn)ㄧ殑绋嬪簭鏄惁鍥犲爢鍒嗛厤鑰岃繍琛岃搗鏉ュ緢鎱紵涓嶄粎浠呮?zhèn)ㄩ亣鍒皹q欐牱鐨勯棶棰樸傚嚑涔庢墍鏈夐」鐩繜鏃╅兘浼?xì)閬囧埌鍫嗛棶棰樸傚ぇ瀹墮兘鎯寵錛?#8220;鎴戠殑浠g爜鐪熸濂斤紝鍙槸鍫嗗お鎱?#8221;銆傞偅鍙槸閮ㄥ垎姝g‘銆傛洿娣卞叆鐞嗚В鍫嗗強(qiáng)鍏剁敤娉曘佷互鍙?qiáng)浼?xì)鍙戠敓浠涔堥棶棰橈紝鏄緢鏈夌敤鐨勩?/p>
浠涔堟槸鍫嗭紵
錛堝鏋滄?zhèn)ㄥ凡缁忕煡閬撲粈涔堟槸鍫嗭紝鍙互璺沖埌“浠涔堟槸甯歌鐨勫爢鎬ц兘闂錛?#8221;閮ㄥ垎錛?/p>
鍦ㄧ▼搴忎腑錛屼嬌鐢ㄥ爢鏉ュ姩鎬佸垎閰嶅拰閲婃斁瀵硅薄銆傚湪涓嬪垪鎯呭喌涓嬶紝璋冪敤鍫嗘搷浣滐細(xì)
浜嬪厛涓嶇煡閬撶▼搴忔墍闇瀵硅薄鐨勬暟閲忓拰澶у皬銆?/p>
瀵硅薄澶ぇ鑰屼笉閫傚悎鍫嗘爤鍒嗛厤紼嬪簭銆?br>鍫嗕嬌鐢ㄤ簡(jiǎn)鍦ㄨ繍琛屾椂鍒嗛厤緇欎唬鐮佸拰鍫嗘爤鐨勫唴瀛樹(shù)箣澶栫殑閮ㄥ垎鍐呭瓨銆備笅鍥劇粰鍑轟簡(jiǎn)鍫嗗垎閰嶇▼搴忕殑涓嶅悓灞傘?br>
GlobalAlloc/GlobalFree錛歁icrosoft Win32 鍫嗚皟鐢紝榪欎簺璋冪敤鐩存帴涓庢瘡涓繘紼嬬殑榛樿鍫嗚繘琛屽璇濄?/p>
LocalAlloc/LocalFree錛歐in32 鍫嗚皟鐢紙涓轟簡(jiǎn)涓?nbsp;Microsoft Windows NT 鍏煎錛夛紝榪欎簺璋冪敤鐩存帴涓庢瘡涓繘紼嬬殑榛樿鍫嗚繘琛屽璇濄?/p>
COM 鐨?nbsp;IMalloc 鍒嗛厤紼嬪簭錛堟垨 CoTaskMemAlloc / CoTaskMemFree錛夛細(xì)鍑芥暟浣跨敤姣忎釜榪涚▼鐨勯粯璁ゅ爢銆傝嚜鍔ㄥ寲紼嬪簭浣跨敤“緇勪歡瀵硅薄妯″瀷 (COM)”鐨勫垎閰嶇▼搴忥紝鑰岀敵璇風(fēng)殑紼嬪簭浣跨敤姣忎釜榪涚▼鍫嗐?/p>
C/C++ 榪愯鏃?nbsp;(CRT) 鍒嗛厤紼嬪簭錛氭彁渚涗簡(jiǎn) malloc() 鍜?nbsp;free() 浠ュ強(qiáng) new 鍜?nbsp;delete 鎿嶄綔絎︺傚 Microsoft Visual Basic 鍜?nbsp;Java 絳夎璦涔熸彁渚涗簡(jiǎn)鏂扮殑鎿嶄綔絎﹀茍浣跨敤鍨冨溇鏀墮泦鏉ヤ唬鏇垮爢銆侰RT 鍒涘緩鑷繁鐨勭鏈夊爢錛岄┗鐣欏湪 Win32 鍫嗙殑欏墮儴銆?/p>
Windows NT 涓紝W(xué)in32 鍫嗘槸 Windows NT 榪愯鏃跺垎閰嶇▼搴忓懆鍥寸殑钖勫眰銆傛墍鏈?nbsp;API 杞彂瀹冧滑鐨勮姹傜粰 NTDLL銆?/p>
Windows NT 榪愯鏃跺垎閰嶇▼搴忔彁渚?nbsp;Windows NT 鍐呯殑鏍稿績(jī)鍫嗗垎閰嶇▼搴忋傚畠鐢卞叿鏈?nbsp;128 涓ぇ灝忎粠 8 鍒?nbsp;1,024 瀛楄妭鐨勭┖闂插垪琛ㄧ殑鍓嶇鍒嗛厤紼嬪簭緇勬垚銆傚悗绔垎閰嶇▼搴忎嬌鐢ㄨ櫄鎷熷唴瀛樻潵淇濈暀鍜屾彁浜ら〉銆?/p>
鍦ㄥ浘琛ㄧ殑搴曢儴鏄?#8220;铏氭嫙鍐呭瓨鍒嗛厤紼嬪簭”錛屾搷浣滅郴緇熶嬌鐢ㄥ畠鏉ヤ繚鐣欏拰鎻愪氦欏點(diǎn)傛墍鏈夊垎閰嶇▼搴忎嬌鐢ㄨ櫄鎷熷唴瀛樿繘琛屾暟鎹殑瀛樺彇銆?/p>
鍒嗛厤鍜岄噴鏀懼潡涓嶅氨閭d箞綆鍗曞悧錛熶負(fù)浣曡姳璐硅繖涔堥暱鏃墮棿錛?/p>
鍫嗗疄鐜扮殑娉ㄦ剰浜嬮」
浼犵粺涓婏紝鎿嶄綔緋葷粺鍜岃繍琛屾椂搴撴槸涓庡爢鐨勫疄鐜板叡瀛樼殑銆傚湪涓涓繘紼嬬殑寮濮嬶紝鎿嶄綔緋葷粺鍒涘緩涓涓粯璁ゅ爢錛屽彨鍋?#8220;榪涚▼鍫?#8221;銆傚鏋滄病鏈夊叾浠栧爢鍙嬌鐢紝鍒欏潡鐨勫垎閰嶄嬌鐢?#8220;榪涚▼鍫?#8221;銆傝璦榪愯鏃朵篃鑳藉湪榪涚▼鍐呭垱寤哄崟鐙殑鍫嗐傦紙渚嬪錛孋 榪愯鏃跺垱寤哄畠鑷繁鐨勫爢銆傦級(jí)闄よ繖浜涗笓鐢ㄧ殑鍫嗗錛屽簲鐢ㄧ▼搴忔垨璁稿宸茶澆鍏ョ殑鍔ㄦ侀摼鎺ュ簱 (DLL) 涔嬩竴鍙互鍒涘緩鍜屼嬌鐢ㄥ崟鐙殑鍫嗐俉in32 鎻愪緵涓鏁村 API 鏉ュ垱寤哄拰浣跨敤縐佹湁鍫嗐傛湁鍏沖爢鍑芥暟錛堣嫳鏂囷級(jí)鐨勮灝芥寚瀵鹼紝璇峰弬瑙?nbsp;MSDN銆?/p>
褰撳簲鐢ㄧ▼搴忔垨 DLL 鍒涘緩縐佹湁鍫嗘椂錛岃繖浜涘爢瀛樺湪浜庤繘紼嬬┖闂達(dá)紝騫朵笖鍦ㄨ繘紼嬪唴鏄彲璁塊棶鐨勩備粠緇欏畾鍫嗗垎閰嶇殑鏁版嵁灝嗗湪鍚屼竴涓爢涓婇噴鏀俱傦紙涓嶈兘浠庝竴涓爢鍒嗛厤鑰屽湪鍙︿竴涓爢閲婃斁銆傦級(jí)
鍦ㄦ墍鏈夎櫄鎷熷唴瀛樼郴緇熶腑錛屽爢椹葷暀鍦ㄦ搷浣滅郴緇熺殑“铏氭嫙鍐呭瓨綆$悊鍣?#8221;鐨勯《閮ㄣ傝璦榪愯鏃跺爢涔熼┗鐣欏湪铏氭嫙鍐呭瓨欏墮儴銆傛煇浜涙儏鍐典笅錛岃繖浜涘爢鏄搷浣滅郴緇熷爢涓殑灞傦紝鑰岃璦榪愯鏃跺爢鍒欓氳繃澶у潡鐨勫垎閰嶆潵鎵ц鑷繁鐨勫唴瀛樼鐞嗐備笉浣跨敤鎿嶄綔緋葷粺鍫嗭紝鑰屼嬌鐢ㄨ櫄鎷熷唴瀛樺嚱鏁版洿鍒╀簬鍫嗙殑鍒嗛厤鍜屽潡鐨勪嬌鐢ㄣ?/p>
鍏稿瀷鐨勫爢瀹炵幇鐢卞墠銆佸悗绔垎閰嶇▼搴忕粍鎴愩傚墠绔垎閰嶇▼搴忕淮鎸佸浐瀹氬ぇ灝忓潡鐨勭┖闂插垪琛ㄣ傚浜庝竴嬈″垎閰嶈皟鐢紝鍫嗗皾璇曚粠鍓嶇鍒楄〃鎵懼埌涓涓嚜鐢卞潡銆傚鏋滃け璐ワ紝鍫嗚榪粠鍚庣錛堜繚鐣欏拰鎻愪氦铏氭嫙鍐呭瓨錛夊垎閰嶄竴涓ぇ鍧楁潵婊¤凍璇鋒眰銆傞氱敤鐨勫疄鐜版湁姣忓潡鍒嗛厤鐨勫紑閿錛岃繖灝嗚楄垂鎵ц鍛ㄦ湡錛屼篃鍑忓皯浜?jiǎn)鍙娇鐢ㄧ殑瀛樺偍绌洪棿銆?/p>
Knowledge Base 鏂囩珷 Q10758錛?#8220;鐢?nbsp;calloc() 鍜?nbsp;malloc() 綆$悊鍐呭瓨” 錛堟悳绱㈡枃绔犵紪鍙鳳級(jí), 鍖呭惈浜?jiǎn)鏈夊厡櫩欎簺涓婚鐨勬洿澶氳儗鏅煡璇嗐傚彟澶栵紝鏈夊叧鍫嗗疄鐜板拰璁捐鐨勮緇嗚璁轟篃鍙湪涓嬪垪钁椾綔涓壘鍒幫細(xì)“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)錛堣嫳鏂囷級(jí)銆?/p>
Windows NT 鐨勫疄鐜幫紙Windows NT 鐗堟湰 4.0 鍜屾洿鏂扮増鏈級(jí) 浣跨敤浜?nbsp;127 涓ぇ灝忎粠 8 鍒?nbsp;1,024 瀛楄妭鐨?nbsp;8 瀛楄妭瀵歸綈鍧楃┖闂插垪琛ㄥ拰涓涓?#8220;澶у潡”鍒楄〃銆?#8220;澶у潡”鍒楄〃錛堢┖闂插垪琛╗0]錛?nbsp;淇濆瓨澶т簬 1,024 瀛楄妭鐨勫潡銆傜┖闂插垪琛ㄥ綰充簡(jiǎn)鐢ㄥ弻鍚戦摼琛ㄩ摼鎺ュ湪涓璧風(fēng)殑瀵硅薄銆傞粯璁ゆ儏鍐典笅錛?#8220;榪涚▼鍫?#8221;鎵ц鏀墮泦鎿嶄綔銆傦紙鏀墮泦鏄皢鐩擱偦絀洪棽鍧楀悎騫舵垚涓涓ぇ鍧楃殑鎿嶄綔銆傦級(jí)鏀墮泦鑰楄垂浜?jiǎn)棰濆鐨勫懆鏈熷Q屼絾鍑忓皯浜?jiǎn)鍫嗗潡鐨勫唴閮剮鐗囥?/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錛堣嫳鏂囷級(jí)銆傦級(jí)鍗曚竴鍏ㄥ眬閿佹湰璐ㄤ笂鏄敤鏉ヤ繚鎶ゅ爢鏁版嵁緇撴瀯錛岄槻姝㈣法澶氱嚎紼嬬殑闅忔満瀛樺彇銆傝嫢鍫嗘搷浣滃お棰戠箒錛屽崟涓鍏ㄥ眬閿佷細(xì)瀵規(guī)ц兘鏈変笉鍒╃殑褰卞搷銆?/p>
浠涔堟槸甯歌鐨勫爢鎬ц兘闂錛?br>浠ヤ笅鏄?zhèn)ㄤ娇鐢ㄥ爢鏃朵細(xì)閬囧埌鐨勬渶甯歌闂錛?nbsp;
鍒嗛厤鎿嶄綔閫犳垚鐨勯熷害鍑忔參銆傚厜鍒嗛厤灝辮楄垂寰堥暱鏃墮棿銆傛渶鍙兘瀵艱嚧榪愯閫熷害鍑忔參鍘熷洜鏄┖闂插垪琛ㄦ病鏈夊潡錛屾墍浠ヨ繍琛屾椂鍒嗛厤紼嬪簭浠g爜浼?xì)鑰楄垂鍛ㄦ湡瀵繪壘杈冨ぇ鐨勭┖闂插潡錛屾垨浠庡悗绔垎閰嶇▼搴忓垎閰嶆柊鍧椼?/p>
閲婃斁鎿嶄綔閫犳垚鐨勯熷害鍑忔參銆傞噴鏀炬搷浣滆楄垂杈冨鍛ㄦ湡錛屼富瑕佹槸鍚敤浜?jiǎn)鏀堕泦鎿嶄綔銆傛敹闆嗘湡闂達(dá)紝姣忎釜閲婃斁鎿嶄綔“鏌ユ壘”瀹冪殑鐩擱偦鍧楋紝鍙栧嚭瀹冧滑騫舵瀯閫犳垚杈冨ぇ鍧楋紝鐒跺悗鍐嶆妸姝よ緝澶у潡鎻掑叆絀洪棽鍒楄〃銆傚湪鏌ユ壘鏈熼棿錛屽唴瀛樺彲鑳戒細(xì)闅忔満紕板埌錛屼粠鑰屽鑷撮珮閫熺紦瀛樹(shù)笉鑳藉懡涓紝鎬ц兘闄嶄綆銆?/p>
鍫嗙珵浜夐犳垚鐨勯熷害鍑忔參銆傚綋涓や釜鎴栧涓嚎紼嬪悓鏃惰闂暟鎹紝鑰屼笖涓涓嚎紼嬬戶緇繘琛屼箣鍓嶅繀欏葷瓑寰呭彟涓涓嚎紼嬪畬鎴愭椂灝卞彂鐢熺珵浜夈傜珵浜夋繪槸瀵艱嚧楹葷儲(chǔ)錛涜繖涔熸槸鐩墠澶氬鐞嗗櫒緋葷粺閬囧埌鐨勬渶澶ч棶棰樸傚綋澶ч噺浣跨敤鍐呭瓨鍧楃殑搴旂敤紼嬪簭鎴?nbsp;DLL 浠ュ綰跨▼鏂瑰紡榪愯錛堟垨榪愯浜庡澶勭悊鍣ㄧ郴緇熶笂錛夋椂灝嗗鑷撮熷害鍑忔參銆傚崟涓閿佸畾鐨勪嬌鐢ㄢ斿父鐢ㄧ殑瑙e喅鏂規(guī)鈥旀剰鍛崇潃浣跨敤鍫嗙殑鎵鏈夋搷浣滄槸搴忓垪鍖栫殑銆傚綋絳夊緟閿佸畾鏃跺簭鍒楀寲浼?xì)寮曡碉L(fēng)嚎紼嬪垏鎹笂涓嬫枃銆傚彲浠ユ兂璞′氦鍙夎礬鍙i棯鐑佺殑綰㈢伅澶勮蛋璧板仠鍋滃鑷寸殑閫熷害鍑忔參銆?nbsp;
绔炰簤閫氬父浼?xì)瀵艰嚧绾拷E嬪拰榪涚▼鐨勪笂涓嬫枃鍒囨崲銆備笂涓嬫枃鍒囨崲鐨勫紑閿鏄緢澶х殑錛屼絾寮閿鏇村ぇ鐨勬槸鏁版嵁浠庡鐞嗗櫒楂橀熺紦瀛樹(shù)腑涓㈠け錛屼互鍙?qiáng)鍚庢潵绾拷E嬪媧繪椂鐨勬暟鎹噸寤恒?/p>
鍫嗙牬鍧忛犳垚鐨勯熷害鍑忔參銆傞犳垚鍫嗙牬鍧忕殑鍘熷洜鏄簲鐢ㄧ▼搴忓鍫嗗潡鐨勪笉姝g‘浣跨敤銆傞氬父鎯呭艦鍖呮嫭閲婃斁宸查噴鏀劇殑鍫嗗潡鎴栦嬌鐢ㄥ凡閲婃斁鐨勫爢鍧楋紝浠ュ強(qiáng)鍧楃殑瓚婄晫閲嶅啓絳夋槑鏄鵑棶棰樸傦紙鐮村潖涓嶅湪鏈枃璁ㄨ鑼冨洿涔嬪唴銆傛湁鍏沖唴瀛橀噸鍐欏拰娉勬紡絳夊叾浠栫粏鑺傦紝璇峰弬瑙?nbsp;Microsoft Visual C++(R) 璋冭瘯鏂囨。 銆傦級(jí)
棰戠箒鐨勫垎閰嶅拰閲嶅垎閰嶉犳垚鐨勯熷害鍑忔參銆傝繖鏄嬌鐢ㄨ剼鏈璦鏃墮潪甯告櫘閬嶇殑鐜拌薄銆傚瀛楃涓茶鍙嶅鍒嗛厤錛岄殢閲嶅垎閰嶅闀垮拰閲婃斁銆備笉瑕佽繖鏍峰仛錛屽鏋滃彲鑳斤紝灝介噺鍒嗛厤澶у瓧絎︿覆鍜屼嬌鐢ㄧ紦鍐插尯銆傚彟涓縐嶆柟娉曞氨鏄敖閲忓皯鐢ㄨ繛鎺ユ搷浣溿?br>绔炰簤鏄湪鍒嗛厤鍜岄噴鏀炬搷浣滀腑瀵艱嚧閫熷害鍑忔參鐨勯棶棰樸傜悊鎯蟲(chóng)儏鍐典笅錛屽笇鏈涗嬌鐢ㄦ病鏈夌珵浜夊拰蹇熷垎閰?閲婃斁鐨勫爢銆傚彲鎯滐紝鐜板湪榪樻病鏈夎繖鏍風(fēng)殑閫氱敤鍫嗭紝涔熻灝嗘潵浼?xì)鏈夈?/p>
鍦ㄦ墍鏈夌殑鏈嶅姟鍣ㄧ郴緇熶腑錛堝 IIS銆丮SProxy銆丏atabaseStacks銆佺綉緇滄湇鍔″櫒銆?nbsp;Exchange 鍜屽叾浠栵級(jí), 鍫嗛攣瀹氬疄鍦ㄦ槸涓ぇ鐡墮銆傚鐞嗗櫒鏁拌秺澶氾紝绔炰簤灝辮秺浼?xì)鎭跺寲銆?/p>
灝介噺鍑忓皯鍫嗙殑浣跨敤
鐜板湪鎮(zhèn)ㄦ槑鐧戒嬌鐢ㄥ爢鏃跺瓨鍦ㄧ殑闂?shù)簡(jiǎn)锛岄汏N亾鎮(zhèn)ㄤ笉鎯蟲(chóng)嫢鏈夎兘瑙e喅榪欎簺闂鐨勮秴綰ч瓟媯掑悧錛熸垜鍙笇鏈涙湁銆備絾娌℃湁欖旀硶鑳戒嬌鍫嗚繍琛屽姞蹇斿洜姝や笉瑕佹湡鏈涘湪浜у搧鍑?guó)櫞т箣鍓嶇殑鏈鍚庝竴鏄熸湡鑳藉澶т負(fù)鏀硅銆傚鏋滄彁鍓嶈鍒掑爢絳栫暐錛屾儏鍐靛皢浼?xì)澶уぇ濂借浆銆傝皟鏁翠嬌鐢ㄥ爢鐨勬柟娉曪紝鍑忓皯瀵瑰爢鐨勬搷浣滄槸鎻愰珮鎬ц兘鐨勮壇鏂廣?/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 灝嗚鍒嗗埆鍒嗛厤鍜岄噴鏀俱傝繖浼?xì)澧炲姞棰濆寮閿鈥旀垜浠閬垮厤榪欑鍋氭硶銆?/p>
鎶婂甫鎸囬拡鐨勫瓙瀵硅薄宓屽叆鐖跺璞°傚綋瀵硅薄涓湁鎸囬拡鏃訛紝鍒欐剰鍛崇潃瀵硅薄涓湁鍔ㄦ佸厓绱狅紙鐧懼垎涔嬪叓鍗侊級(jí)鍜屾病鏈夊紩鐢ㄧ殑鏂頒綅緗傚祵鍏ュ鍔犱簡(jiǎn)浣嶇疆浠庤屽噺灝戜簡(jiǎn)榪涗竴姝ュ垎閰?閲婃斁鐨勯渶姹傘傝繖灝嗘彁楂樺簲鐢ㄧ▼搴忕殑鎬ц兘銆?/p>
鍚堝茍灝忓璞″艦鎴愬ぇ瀵硅薄錛堣仛鍚堬級(jí)銆傝仛鍚堝噺灝戝垎閰嶅拰閲婃斁鐨勫潡鐨勬暟閲忋傚鏋滄湁鍑犱釜寮鍙戣咃紝鍚勮嚜寮鍙戣璁$殑涓嶅悓閮ㄥ垎錛屽垯鏈緇堜細(xì)鏈夎澶氬皬瀵硅薄闇瑕佸悎騫躲傞泦鎴愮殑鎸戞垬灝辨槸瑕佹壘鍒版紜殑鑱氬悎杈圭晫銆?/p>
鍐呰仈緙撳啿鍖鴻兘澶熸弧瓚崇櫨鍒嗕箣鍏崄鐨勯渶瑕侊紙aka 80-20 瑙勫垯錛夈備釜鍒儏鍐典笅錛岄渶瑕佸唴瀛樼紦鍐插尯鏉ヤ繚瀛樺瓧絎︿覆/浜岃繘鍒舵暟鎹紝浣嗕簨鍏堜笉鐭ラ亾鎬誨瓧鑺傛暟銆備及璁″茍鍐呰仈涓涓ぇ灝忚兘婊¤凍鐧懼垎涔嬪叓鍗侀渶瑕佺殑緙撳啿鍖恒傚鍓╀綑鐨勭櫨鍒嗕箣浜屽崄錛屽彲浠ュ垎閰嶄竴涓柊鐨勭紦鍐插尯鍜屾寚鍚戣繖涓紦鍐插尯鐨勬寚閽堛傝繖鏍鳳紝灝卞噺灝戝垎閰嶅拰閲婃斁璋冪敤騫跺鍔犳暟鎹殑浣嶇疆絀洪棿錛屼粠鏍規(guī)湰涓婃彁楂樹(shù)唬鐮佺殑鎬ц兘銆?/p>
鍦ㄥ潡涓垎閰嶅璞★紙鍧楀寲錛夈傚潡鍖栨槸浠ョ粍鐨勬柟寮忎竴嬈″垎閰嶅涓璞$殑鏂規(guī)硶銆傚鏋滃鍒楄〃鐨勯」榪炵畫璺熻釜錛屼緥濡傚涓涓?nbsp;{鍚嶇О錛屽紏 瀵圭殑鍒楄〃錛屾湁涓ょ閫夋嫨錛氶夋嫨涓鏄負(fù)姣忎竴涓?#8220;鍚嶇О-鍊?#8221;瀵瑰垎閰嶄竴涓妭鐐癸紱閫夋嫨浜屾槸鍒嗛厤涓涓兘瀹圭撼錛堝浜斾釜錛?#8220;鍚嶇О-鍊?#8221;瀵圭殑緇撴瀯銆備緥濡傦紝涓鑸儏鍐典笅錛屽鏋滃瓨鍌ㄥ洓瀵癸紝灝卞彲鍑忓皯鑺傜偣鐨勬暟閲忥紝濡傛灉闇瑕侀澶栫殑絀洪棿鏁伴噺錛屽垯浣跨敤闄勫姞鐨勯摼琛ㄦ寚閽堛?nbsp;
鍧楀寲鏄弸濂界殑澶勭悊鍣ㄩ珮閫熺紦瀛橈紝鐗瑰埆鏄浜?nbsp;L1-楂橀熺紦瀛橈紝鍥犱負(fù)瀹冩彁渚涗簡(jiǎn)澧炲姞鐨勪綅緗?nbsp;鈥斾笉鐢ㄨ瀵逛簬鍧楀垎閰嶏紝寰堝鏁版嵁鍧椾細(xì)鍦ㄥ悓涓涓櫄鎷熼〉涓?/p>
姝g‘浣跨敤 _amblksiz銆侰 榪愯鏃?nbsp;(CRT) 鏈夊畠鐨勮嚜瀹氫箟鍓嶇鍒嗛厤紼嬪簭錛岃鍒嗛厤紼嬪簭浠庡悗绔紙Win32 鍫嗭級(jí)鍒嗛厤澶у皬涓?nbsp;_amblksiz 鐨勫潡銆傚皢 _amblksiz 璁劇疆涓鴻緝楂樼殑鍊艱兘娼滃湪鍦板噺灝戝鍚庣鐨勮皟鐢ㄦ鏁般傝繖鍙騫挎硾浣跨敤 CRT 鐨勭▼搴忛傜敤銆?br>浣跨敤涓婅堪鎶鏈皢鑾峰緱鐨勫ソ澶勪細(xì)鍥犲璞$被鍨嬨佸ぇ灝忓強(qiáng)宸ヤ綔閲忚屾湁鎵涓嶅悓銆備絾鎬昏兘鍦ㄦц兘鍜屽彲鍗囩緝鎬ф柟闈㈡湁鎵鏀惰幏銆傚彟涓鏂歸潰錛屼唬鐮佷細(xì)鏈夌偣鐗規(guī)畩錛屼絾濡傛灉緇忚繃娣辨濈啛铏戯紝浠g爜榪樻槸寰堝鏄撶鐞嗙殑銆?/p>
鍏朵粬鎻愰珮鎬ц兘鐨勬妧鏈?br>涓嬮潰鏄竴浜涙彁楂橀熷害鐨勬妧鏈細(xì)
浣跨敤 Windows NT5 鍫?nbsp;
鐢變簬鍑犱釜鍚屼簨鐨勫姫鍔涘拰杈涘嫟宸ヤ綔錛?998 騫村垵 Microsoft Windows(R) 2000 涓湁浜?jiǎn)鍑犱釜閲嶅ぇ鏀箻q涳細(xì)
鏀硅繘浜?jiǎn)鍫嗕唬鐮佸唴鐨勯攣瀹氥傚爢浠g爜瀵規(guī)瘡鍫嗕竴涓攣銆傚叏灞閿佷繚鎶ゅ爢鏁版嵁緇撴瀯錛岄槻姝㈠綰跨▼寮忕殑浣跨敤銆備絾涓嶅垢鐨勬槸錛屽湪楂橀氫俊閲忕殑鎯呭喌涓嬶紝鍫嗕粛鍙楀洶浜庡叏灞閿侊紝瀵艱嚧楂樼珵浜夊拰浣庢ц兘銆俉indows 2000 涓紝閿佸唴浠g爜鐨勪復(fù)鐣屽尯灝嗙珵浜夌殑鍙兘鎬у噺鍒版渶灝?浠庤屾彁楂樹(shù)簡(jiǎn)鍙幾緙╂с?/p>
浣跨敤 “Lookaside”鍒楄〃銆傚爢鏁版嵁緇撴瀯瀵瑰潡鐨勬墍鏈夌┖闂查」浣跨敤浜?jiǎn)澶畯鍦?nbsp;8 鍒?nbsp;1,024 瀛楄妭錛堜互 8-瀛楄妭閫掑錛夌殑蹇熼珮閫熺紦瀛樸傚揩閫熼珮閫熺紦瀛樻渶鍒濅繚鎶ゅ湪鍏ㄥ眬閿佸唴銆傜幇鍦紝浣跨敤 lookaside 鍒楄〃鏉ヨ闂繖浜涘揩閫熼珮閫熺紦瀛樼┖闂插垪琛ㄣ傝繖浜涘垪琛ㄤ笉瑕佹眰閿佸畾錛岃屾槸浣跨敤 64 浣嶇殑浜掗攣鎿嶄綔錛屽洜姝ゆ彁楂樹(shù)簡(jiǎn)鎬ц兘銆?/p>
鍐呴儴鏁版嵁緇撴瀯綆楁硶涔熷緱鍒版敼榪涖?br>榪欎簺鏀硅繘閬垮厤浜?jiǎn)瀵瑰垎閰嶉珮閫熺紦瀛樼殑闇姹傦紝浣嗕笉鎺掗櫎鍏朵粬鐨勪紭鍖栥備嬌鐢?nbsp;Windows NT5 鍫嗚瘎浼版?zhèn)ㄧ殑浠g爜锛涘畠瀵篂畯浜?nbsp;1,024 瀛楄妭 (1 KB) 鐨勫潡錛堟潵鑷墠绔垎閰嶇▼搴忕殑鍧楋級(jí)鏄渶浣崇殑銆侴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 涔熸湁鏀硅繘鐨勫爢鍒嗛厤紼嬪簭銆傦級(jí)
浣跨敤鍒嗛厤楂橀熺紦瀛?nbsp;
鍒嗛厤楂橀熺紦瀛樺厑璁?dāng)R珮閫熺紦瀛樺垎閰嶇殑鍧楋紝浠ヤ究灝嗘潵閲嶇敤銆傝繖鑳藉鍑忓皯瀵硅繘紼嬪爢錛堟垨鍏ㄥ眬鍫嗭級(jí)鐨勫垎閰?閲婃斁璋冪敤鐨勬鏁幫紝涔熷厑璁告渶澶ч檺搴︾殑閲嶇敤鏇劇粡鍒嗛厤鐨勫潡銆傚彟澶栵紝鍒嗛厤楂橀熺紦瀛樺厑璁告敹闆嗙粺璁′俊鎭?浠ヤ究杈冨ソ鍦扮悊瑙e璞″湪杈冮珮灞傛涓婄殑浣跨敤銆?/p>
鍏稿瀷鍦幫紝鑷畾涔夊爢鍒嗛厤紼嬪簭鍦ㄨ繘紼嬪爢鐨勯《閮ㄥ疄鐜般傝嚜瀹氫箟鍫嗗垎閰嶇▼搴忎笌緋葷粺鍫嗙殑琛屼負(fù)寰堢浉浼箋備富瑕佺殑宸埆鏄畠鍦ㄨ繘紼嬪爢鐨勯《閮ㄤ負(fù)鍒嗛厤鐨勫璞℃彁渚涢珮閫熺紦瀛樸傞珮閫熺紦瀛樿璁℃垚涓濂楀浐瀹氬ぇ灝忥紙濡?nbsp;32 瀛楄妭銆?4 瀛楄妭銆?28 瀛楄妭絳夛級(jí)銆傝繖涓涓緢濂界殑絳栫暐錛屼絾榪欑鑷畾涔夊爢鍒嗛厤紼嬪簭涓㈠け涓庡垎閰嶅拰閲婃斁鐨勫璞$浉鍏崇殑“璇箟淇℃伅”銆?nbsp;
涓庤嚜瀹氫箟鍫嗗垎閰嶇▼搴忕浉鍙嶏紝“鍒嗛厤楂橀熺紦瀛?#8221;浣滀負(fù)姣忕被鍒嗛厤楂橀熺紦瀛樻潵瀹炵幇銆傞櫎鑳藉鎻愪緵鑷畾涔夊爢鍒嗛厤紼嬪簭鐨勬墍鏈夊ソ澶勪箣澶栵紝瀹冧滑榪樿兘澶熶繚鐣欏ぇ閲忚涔変俊鎭傛瘡涓垎閰嶉珮閫熺紦瀛樺鐞嗙▼搴忎笌涓涓洰鏍囦簩榪涘埗瀵硅薄鍏寵仈銆傚畠鑳藉浣跨敤涓濂楀弬鏁拌繘琛屽垵濮嬪寲錛岃繖浜涘弬鏁拌〃紺哄茍鍙戠駭鍒佸璞″ぇ灝忓拰淇濇寔鍦ㄧ┖闂插垪琛ㄤ腑鐨勫厓绱犵殑鏁伴噺絳夈傚垎閰嶉珮閫熺紦瀛樺鐞嗙▼搴忓璞$淮鎸佽嚜宸辯殑縐佹湁絀洪棽瀹炰綋姹狅紙涓嶈秴榪囨寚瀹氱殑闃鍊鹼級(jí)騫朵嬌鐢ㄧ鏈変繚鎶ら攣銆傚悎鍦ㄤ竴璧鳳紝鍒嗛厤楂橀熺紦瀛樺拰縐佹湁閿佸噺灝戜簡(jiǎn)涓庝富緋葷粺鍫嗙殑閫氫俊閲忥紝鍥犺屾彁渚涗簡(jiǎn)澧炲姞鐨勫茍鍙戙佹渶澶ч檺搴︾殑閲嶇敤鍜岃緝楂樼殑鍙幾緙╂с?/p>
闇瑕佷嬌鐢ㄦ竻鐞嗙▼搴忔潵瀹氭湡媯(gè)鏌ユ墍鏈夊垎閰嶉珮閫熺紦瀛樺鐞嗙▼搴忕殑媧誨姩鎯呭喌騫跺洖鏀舵湭鐢ㄧ殑璧勬簮銆傚鏋滃彂鐜版病鏈夋椿鍔紝灝嗛噴鏀懼垎閰嶅璞$殑姹狅紝浠庤屾彁楂樻ц兘銆?/p>
鍙互瀹℃牳姣忎釜鍒嗛厤/閲婃斁媧誨姩銆傜涓綰т俊鎭寘鎷璞°佸垎閰嶅拰閲婃斁璋冪敤鐨勬繪暟銆傞氳繃鏌ョ湅瀹冧滑鐨勭粺璁′俊鎭彲浠ュ緱鍑哄悇涓璞′箣闂寸殑璇箟鍏崇郴銆傚埄鐢ㄤ互涓婁粙緇嶇殑璁稿鎶鏈箣涓錛岃繖縐嶅叧緋誨彲浠ョ敤鏉ュ噺灝戝唴瀛樺垎閰嶃?/p>
鍒嗛厤楂橀熺紦瀛樹(shù)篃璧峰埌浜?jiǎn)璋冭瘯鍔╂墜鐨勪綔鐢ㄥQ屽府鍔╂?zhèn)ㄨ窡韪病鏈夊畬鍏ㄦ竻闄ょ殑瀵硅薄鏁伴噺銆傞氳繃鏌ョ湅鍔ㄦ佸爢鏍堣繑鍥炶釜榪瑰拰闄ゆ病鏈夋竻闄ょ殑瀵硅薄涔嬪鐨勭鍚嶏紝鐢氳嚦鑳藉鎵懼埌紜垏鐨勫け璐ョ殑璋冪敤鑰呫?/p>
MP 鍫?nbsp;
MP 鍫嗘槸瀵瑰澶勭悊鍣ㄥ弸濂界殑鍒嗗竷寮忓垎閰嶇殑紼嬪簭鍖咃紝鍦?nbsp;Win32 SDK錛圵indows NT 4.0 鍜屾洿鏂扮増鏈級(jí)涓彲浠ュ緱鍒般傛渶鍒濈敱 JVert 瀹炵幇錛屾澶勫爢鎶借薄寤虹珛鍦?nbsp;Win32 鍫嗙▼搴忓寘鐨勯《閮ㄣ侻P 鍫嗗垱寤哄涓?nbsp;Win32 鍫嗭紝騫惰瘯鍥懼皢鍒嗛厤璋冪敤鍒嗗竷鍒頒笉鍚屽爢錛屼互鍑忓皯鍦ㄦ墍鏈夊崟涓閿佷笂鐨勭珵浜夈?/p>
鏈▼搴忓寘鏄ソ鐨勬楠?nbsp;鈥斾竴縐嶆敼榪涚殑 MP-鍙嬪ソ鐨勮嚜瀹氫箟鍫嗗垎閰嶇▼搴忋備絾鏄紝瀹冧笉鎻愪緵璇箟淇℃伅鍜岀己涔忕粺璁″姛鑳姐傞氬父灝?nbsp;MP 鍫嗕綔涓?nbsp;SDK 搴撴潵浣跨敤銆傚鏋滀嬌鐢ㄨ繖涓?nbsp;SDK 鍒涘緩鍙噸鐢ㄧ粍浠訛紝鎮(zhèn)ㄥ皢澶уぇ鍙楃泭銆備絾鏄紝濡傛灉鍦ㄦ瘡涓?nbsp;DLL 涓緩绔嬭繖涓?nbsp;SDK 搴擄紝灝嗗鍔犲伐浣滆緗?/p>
閲嶆柊鎬濊冪畻娉曞拰鏁版嵁緇撴瀯
瑕佸湪澶氬鐞嗗櫒鏈哄櫒涓婁幾緙╋紝鍒欑畻娉曘佸疄鐜般佹暟鎹粨鏋勫拰紜歡蹇呴』鍔ㄦ佷幾緙┿傝鐪嬫渶緇忓父鍒嗛厤鍜岄噴鏀劇殑鏁版嵁緇撴瀯銆傝瘯闂紝“鎴戣兘鐢ㄤ笉鍚岀殑鏁版嵁緇撴瀯瀹屾垚姝ゅ伐浣滃悧錛?#8221;渚嬪錛屽鏋滃湪搴旂敤紼嬪簭鍒濆鍖栨椂鍔犺澆浜?jiǎn)鍙椤圭殑鍒楄〃锛寴q欎釜鍒楄〃涓嶅繀鏄嚎鎬ч摼鎺ョ殑鍒楄〃銆傚鏋滄槸鍔ㄦ佸垎閰嶇殑鏁扮粍灝遍潪甯稿ソ銆傚姩鎬佸垎閰嶇殑鏁扮粍灝嗗噺灝戝唴瀛樹(shù)腑鐨勫爢鍧楀拰紕庣墖錛屼粠鑰屽寮烘ц兘銆?/p>
鍑忓皯闇瑕佺殑灝忓璞$殑鏁伴噺鍑忓皯鍫嗗垎閰嶇▼搴忕殑璐熻澆銆備緥濡傦紝鎴戜滑鍦ㄦ湇鍔″櫒鐨勫叧閿鐞嗚礬寰勪笂浣跨敤浜斾釜涓嶅悓鐨勫璞★紝姣忎釜瀵硅薄鍗曠嫭鍒嗛厤鍜岄噴鏀俱備竴璧烽珮閫熺紦瀛樿繖浜涘璞★紝鎶婂爢璋冪敤浠庝簲涓噺灝戝埌涓涓紝鏄捐憲鍑忓皯浜?jiǎn)鍫嗙殑璐熻浇锛岀壒鍒綋姣徔U掗挓澶勭悊 1,000 涓互涓婄殑璇鋒眰鏃躲?/p>
濡傛灉澶ч噺浣跨敤“Automation”緇撴瀯錛岃鑰冭檻浠庝富綰夸唬鐮佷腑鍒犻櫎“Automation BSTR”錛屾垨鑷沖皯閬垮厤閲嶅鐨?nbsp;BSTR 鎿嶄綔銆傦紙BSTR 榪炴帴瀵艱嚧榪囧鐨勯噸鍒嗛厤鍜屽垎閰?閲婃斁鎿嶄綔銆傦級(jí)
鎽樿
瀵規(guī)墍鏈夊鉤鍙板線寰閮藉瓨鍦ㄥ爢瀹炵幇錛屽洜姝ゆ湁宸ㄥぇ鐨勫紑閿銆傛瘡涓崟鐙唬鐮侀兘鏈夌壒瀹氱殑瑕佹眰錛屼絾璁捐鑳介噰鐢ㄦ湰鏂囪璁虹殑鍩烘湰鐞嗚鏉ュ噺灝戝爢涔嬮棿鐨勭浉浜掍綔鐢ㄣ?nbsp;
璇勪環(huán)鎮(zhèn)ㄧ殑浠g爜涓爢鐨勪嬌鐢ㄣ?/p>
鏀硅繘鎮(zhèn)ㄧ殑浠g爜錛屼互浣跨敤杈冨皯鐨勫爢璋冪敤錛氬垎鏋愬叧閿礬寰勫拰鍥哄畾鏁版嵁緇撴瀯銆?/p>
鍦ㄥ疄鐜拌嚜瀹氫箟鐨勫寘瑁呯▼搴忎箣鍓嶄嬌鐢ㄩ噺鍖栧爢璋冪敤鎴愭湰鐨勬柟娉曘?/p>
濡傛灉瀵規(guī)ц兘涓嶆弧鎰忥紝璇瘋姹?nbsp;OS 緇勬敼榪涘爢銆傛洿澶氳繖綾昏姹傛剰鍛崇潃瀵規(guī)敼榪涘爢鐨勬洿澶氬叧娉ㄣ?/p>
瑕佹眰 C 榪愯鏃剁粍閽堝 OS 鎵鎻愪緵鐨勫爢鍒朵綔灝忓閥鐨勫垎閰嶅寘瑁呯▼搴忋傞殢鐫 OS 鍫嗙殑鏀硅繘錛孋 榪愯鏃跺爢璋冪敤鐨勬垚鏈皢鍑忓皬銆?/p>
鎿嶄綔緋葷粺錛圵indows NT 瀹舵棌錛夋鍦ㄤ笉鏂敼榪涘爢銆傝闅忔椂鍏蟲(chóng)敞鍜屽埄鐢ㄨ繖浜涙敼榪涖?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
鎴戝湪瀛︿範(fàn)瀵硅薄鐨勭敓瀛樻柟寮忕殑鏃跺欒鍒頒竴縐嶆槸鍦ㄥ爢鏍?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)鏍堝唴瀛樺垎閰嶈繍綆楀唴緗簬澶勭悊鍣ㄧ殑鎸囦護(hù)闆嗕腑錛屾晥鐜囧緢楂橈紝浣嗘槸鍒嗛厤鐨勫唴瀛樺閲忔湁闄愩?nbsp;
4錛夊爢涓婂垎閰嶇殑鍐呭瓨鍙互鏈夋垜浠嚜宸卞喅瀹氾紝浣跨敤闈炲父鐏墊椿銆?nbsp;
---------------------------------------------------------------
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
int function_add(int a, int b);
int x = 3, y = 5;
int result = function_add(x, y);
int __stdcall function_add(int a,int b);銆銆娉ㄦ剰涓嶅悓緙栬瘧鍣ㄤ細(xì)鎻掑叆鑷繁鐨勬眹緙栦唬鐮佷互鎻愪緵緙栬瘧鐨勯氱敤鎬э紝浣嗘槸澶т綋浠g爜濡傛銆傚叾涓湪鍑芥暟寮濮嬪淇濈暀esp鍒癳bp涓紝鍦ㄥ嚱鏁扮粨鏉熸仮澶嶆槸緙栬瘧鍣ㄥ父鐢ㄧ殑鏂規(guī)硶銆?/p>
銆銆浠庡嚱鏁拌皟鐢ㄧ湅錛?鍜?渚濇琚玴ush榪涘爢鏍堬紝鑰屽湪鍑芥暟涓張閫氳繃鐩稿浜巈bp(鍗沖垰榪涘嚱鏁版椂鐨勫爢鏍堟寚閽堬級(jí)鐨勫亸縐婚噺瀛樺彇鍙傛暟銆傚嚱鏁扮粨鏉熷悗錛宺et 8琛ㄧず娓呯悊8涓瓧鑺傜殑鍫嗘爤錛屽嚱鏁拌嚜宸辨仮澶嶄簡(jiǎn)鍫嗘爤銆?br>
鐢變簬涓嶅悓鐨勭紪璇戝櫒浜х敓鏍堢殑鏂瑰紡涓嶅敖鐩稿悓錛岃皟鐢ㄨ呭氨涓嶄竴瀹氳兘澶熸甯哥殑瀹屾垚鍫嗘爤鐨勬竻闄ゅ伐浣滐紝浣嗗嚱鏁版湰韜嚜宸卞彲浠ヨВ鍐蟲(chóng)竻闄ゅ伐浣滐紝鎵浠ワ紝鍦ㄨ法騫沖彴鐨勭▼搴忓紑鍙戜腑鐨勫嚱鏁拌皟鐢紝鎴戜滑閫氬父閮戒嬌鐢╛_stdcall綰﹀畾錛寃indows涓嬬殑緇濆ぇ澶氭暟鍑芥暟涔熼兘鏄痵tdcall璋冪敤銆傛棦鐒跺姝わ紝涓轟粈涔堣繕闇瑕乢_cdecl鍛紵鍒潃鎬ワ紝鎺ョ潃寰涓嬬湅銆?br>
浜屻乧decl璋冪敤綰﹀畾
cdecl錛屼篃鍙啓浣淿_cdecl錛屽張縐頒負(fù)C璋冪敤綰﹀畾錛屾槸C/C++璇█鍜孧FC紼嬪簭榛樿緙虹渷鐨勮皟鐢ㄧ害瀹氾紝瀹冪殑瀹氫箟璇硶鏄細(xì)
閲囩敤__cdecl綰﹀畾鏃訛紝鍑芥暟鍙傛暟鎸夌収浠庡彸鍒板乏鐨勯『搴忓叆鏍堬紝騫朵笖鐢辮皟鐢ㄥ嚱鏁拌呮妸鍙傛暟寮瑰嚭鏍堜互娓呯悊鍫嗘爤銆傚洜姝わ紝瀹炵幇鍙彉鍙傛暟鐨勫嚱鏁板彧鑳戒嬌鐢ㄨ璋冪敤綰﹀畾銆傜敱浜庤繖縐嶅彉鍖栵紝C璋冪敤綰﹀畾鍏佽鍑芥暟鐨勫弬鏁扮殑涓暟鏄笉鍥哄畾鐨勶紝榪欎篃鏄疌璇█鐨勪竴澶х壒鑹層傚悓鏃訛紝鐢變簬姣忎竴涓嬌鐢╛_cdecl綰﹀畾鐨勫嚱鏁伴兘瑕佸寘鍚竻鐞嗗爢鏍堢殑浠g爜錛屾墍浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細(xì)姣旇緝澶с俖_cdecl鍙互鍐欐垚_cdecl銆?
瀵逛簬鍓嶉潰鐨刦unction鍑芥暟錛屼嬌鐢╟decl鍚庣殑姹囩紪鐮佸彉鎴愶細(xì)
璋冪敤澶?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澶勪繚瀛樹(shù)簡(jiǎn)b
銆銆mov銆esp,ebp銆銆銆銆 // 鎭㈠esp
銆銆pop銆ebp
銆銆ret銆銆銆銆銆銆銆銆銆// 娉ㄦ剰錛岃繖閲屾病鏈変慨鏀瑰爢鏍?/p>
涓嶅啓浜?jiǎn)锛岀疮寰楁厡锛屽懙鍛?杞澆涓ょ瘒鏂囩珷鍚?br>
__stdcall,__cdecl,_cdecl,_stdcall,銆俖_fastcall,_fastcall 鍖哄埆綆浠?nbsp;
1.
浠婂ぉ鍐欑嚎紼嬪嚱鏁版椂錛屽彂鐜癿sdn涓ThreadProc鐨勫畾涔夋湁瑕佹眰錛欴WORD WINAPI ThreadProc(LPVOID lpParameter);
涓嶈В涓轟粈涔堣鐢╓INAPI瀹忓畾涔夛紝鏌ヤ簡(jiǎn)鍚庡彂鐜頒笅闈㈢殑瀹氫箟銆備簬鏄箮闇瑕佸尯鍒玙_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綾誨瀷鐨勶紝棣栧厛錛岄渶瑕佷簡(jiǎn)瑙d袱鑰呬箣闂寸殑鍖哄埆錛?WINDOWS鐨勫嚱鏁拌皟鐢ㄦ椂闇瑕佺敤鍒版爤錛圫TACK錛屼竴縐嶅厛鍏ュ悗鍑虹殑瀛樺偍緇撴瀯錛夈傚綋鍑芥暟璋冪敤瀹屾垚鍚庯紝鏍堥渶瑕佹竻妤氾紝榪欓噷灝辨槸闂鐨勫叧閿紝濡備綍娓呴櫎錛燂紵 濡傛灉鎴戜滑鐨勫嚱鏁頒嬌鐢ㄤ簡(jiǎn)_cdecl錛岄偅涔堟爤鐨勬竻闄ゅ伐浣滄槸鐢辮皟鐢ㄨ咃紝鐢–OM鐨勬湳璇潵璁插氨鏄鎴鋒潵瀹屾垚鐨勩傝繖鏍峰甫鏉ヤ簡(jiǎn)涓涓鎵嬬殑闂錛屼笉鍚岀殑緙栬瘧鍣ㄤ駭鐢熸爤鐨勬柟寮忎笉灝界浉鍚岋紝閭d箞璋冪敤鑰呰兘鍚︽甯哥殑瀹屾垚娓呴櫎宸ヤ綔鍛紵絳旀鏄笉鑳姐?濡傛灉浣跨敤__stdcall錛屼笂闈㈢殑闂灝辮В鍐充簡(jiǎn)錛屽嚱鏁拌嚜宸辮В鍐蟲(chóng)竻闄ゅ伐浣溿傛墍浠ワ紝鍦ㄨ法錛堝紑鍙戯級(jí)騫沖彴鐨勮皟鐢ㄤ腑錛屾垜浠兘浣跨敤__stdcall錛堣櫧鐒舵湁鏃舵槸浠INAPI鐨勬牱瀛愬嚭鐜幫級(jí)銆傞偅涔堜負(fù)浠涔堣繕闇瑕乢cdecl鍛紵褰撴垜浠亣鍒拌繖鏍風(fēng)殑鍑芥暟濡俧printf()瀹冪殑鍙傛暟鏄彲鍙樼殑錛屼笉瀹氶暱鐨勶紝琚皟鐢ㄨ呬簨鍏堟棤娉曠煡閬撳弬鏁扮殑闀垮害錛屼簨鍚庣殑娓呴櫎宸ヤ綔涔熸棤娉曟甯哥殑榪涜錛屽洜姝わ紝榪欑鎯呭喌鎴戜滑鍙兘浣跨敤_cdecl銆傚埌榪欓噷鎴戜滑鏈変竴涓粨璁猴紝濡傛灉浣犵殑紼嬪簭涓病鏈夋秹鍙?qiáng)鍙彉鍙傛晭图屾渶濂戒嬌鐢╛_stdcall鍏抽敭瀛椼?/p>
2.
__cdecl,__stdcall鏄0鏄庣殑鍑芥暟璋冪敤鍗忚.涓昏鏄紶鍙傚拰寮規(guī)爤鏂歸潰鐨勪笉鍚?涓鑸琧++鐢ㄧ殑鏄痏_cdecl,windows閲屽ぇ閮界敤鐨勬槸__stdcall(API)
__cdecl鏄疌/C++鍜孧FC紼嬪簭榛樿浣跨敤鐨勮皟鐢ㄧ害瀹氾紝涔熷彲浠ュ湪鍑芥暟澹版槑鏃跺姞涓奯_cdecl鍏抽敭瀛楁潵鎵嬪伐鎸囧畾銆傞噰鐢╛_cdecl綰﹀畾鏃訛紝鍑芥暟鍙傛暟鎸夌収浠庡彸鍒板乏鐨勯『搴忓叆鏍堬紝騫朵笖鐢辮皟鐢ㄥ嚱鏁拌呮妸鍙傛暟寮瑰嚭鏍堜互娓呯悊鍫嗘爤銆傚洜姝わ紝瀹炵幇鍙彉鍙傛暟鐨勫嚱鏁板彧鑳戒嬌鐢ㄨ璋冪敤綰﹀畾銆傜敱浜庢瘡涓涓嬌鐢╛_cdecl綰﹀畾鐨勫嚱鏁伴兘瑕佸寘鍚竻鐞嗗爢鏍堢殑浠g爜錛屾墍浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細(xì)姣旇緝澶с俖_cdecl鍙互鍐欐垚_cdecl銆?
__stdcall璋冪敤綰﹀畾鐢ㄤ簬璋冪敤Win32 API鍑芥暟銆傞噰鐢╛_stdcall綰﹀畾鏃訛紝鍑芥暟鍙傛暟鎸夌収浠庡彸鍒板乏鐨勯『搴忓叆鏍堬紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鏍堬紝鍑芥暟鍙傛暟涓暟鍥哄畾銆傜敱浜庡嚱鏁頒綋鏈韓鐭ラ亾浼犺繘鏉ョ殑鍙傛暟涓暟錛屽洜姝よ璋冪敤鐨勫嚱鏁板彲浠ュ湪榪斿洖鍓嶇敤涓鏉et n鎸囦護(hù)鐩存帴娓呯悊浼犻掑弬鏁扮殑鍫嗘爤銆俖_stdcall鍙互鍐欐垚_stdcall銆?
__fastcall綰﹀畾鐢ㄤ簬瀵規(guī)ц兘瑕佹眰闈炲父楂樼殑鍦哄悎銆俖_fastcall綰﹀畾灝嗗嚱鏁扮殑浠庡乏杈瑰紑濮嬬殑涓や釜澶у皬涓嶅ぇ浜?涓瓧鑺傦紙DWORD錛夌殑鍙傛暟鍒嗗埆鏀懼湪ECX鍜孍DX瀵勫瓨鍣紝鍏朵綑鐨勫弬鏁頒粛鏃ц嚜鍙沖悜宸﹀帇鏍堜紶閫侊紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍫嗘爤銆俖_fastcall鍙互鍐欐垚_fastcall
3.
__stdcall:
_stdcall 璋冪敤綰﹀畾鐩稿綋浜?6浣嶅姩鎬佸簱涓粡甯鎬嬌鐢ㄧ殑PASCAL璋冪敤綰﹀畾銆?/p>
_stdcall鏄疨ascal紼嬪簭鐨勭己鐪佽皟鐢ㄦ柟寮忥紝閫氬父鐢ㄤ簬Win32 Api涓紝鍑芥暟閲囩敤浠庡彸鍒板乏鐨勫帇鏍堟柟寮忥紝鑷繁鍦ㄩ鍑烘椂娓呯┖鍫嗘爤銆俈C灝嗗嚱鏁扮紪璇戝悗浼?xì)鍦ㄥ嚱鏁板悕鍓嶉潰鍔犱笂涓嬪垝绾垮墠缂錛屽湪鍑芥暟鍚嶅悗鍔犱笂"@"鍜屽弬鏁扮殑瀛楄妭鏁般?/p>
_cdecl:
_cdecl c璋冪敤綰﹀畾, 鎸変粠鍙寵嚦宸︾殑欏哄簭鍘嬪弬鏁板叆鏍堬紝鐢辮皟鐢ㄨ呮妸鍙傛暟寮瑰嚭鏍堛傚浜庝紶閫佸弬鏁扮殑鍐呭瓨鏍堟槸鐢辮皟鐢ㄨ呮潵緇存姢鐨勶紙姝e洜涓哄姝わ紝瀹炵幇鍙彉鍙傛暟鐨勫嚱鏁板彧鑳戒嬌鐢ㄨ璋冪敤綰﹀畾錛夈傚彟澶栵紝鍦ㄥ嚱鏁板悕淇グ綰﹀畾鏂歸潰涔熸湁鎵涓嶅悓銆?/p>
_cdecl鏄疌鍜孋錛嬶紜紼嬪簭鐨勭己鐪佽皟鐢ㄦ柟寮忋傛瘡涓涓皟鐢ㄥ畠鐨勫嚱鏁伴兘鍖呭惈娓呯┖鍫嗘爤鐨勪唬鐮侊紝鎵浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細(xì)姣旇皟鐢╛stdcall鍑芥暟鐨勫ぇ銆傚嚱鏁伴噰鐢ㄤ粠鍙沖埌宸︾殑鍘嬫爤鏂瑰紡銆俈C灝嗗嚱鏁扮紪璇戝悗浼?xì)鍦ㄥ嚱鏁板悕鍓嶉潰鍔犱笂涓嬪垝绾垮墠缂銆傛槸MFC緙虹渷璋冪敤綰﹀畾銆?/p>
__fastcall:
__fastcall璋冪敤綰﹀畾鏄?浜?濡傚叾鍚嶏紝瀹冪殑涓昏鐗圭偣灝辨槸蹇紝鍥犱負(fù)瀹冩槸閫氳繃瀵勫瓨鍣ㄦ潵浼犻佸弬鏁扮殑錛堝疄闄呬笂錛屽畠鐢‥CX鍜孍DX浼犻佸墠涓や釜鍙屽瓧錛圖WORD錛夋垨鏇村皬鐨勫弬鏁幫紝鍓╀笅鐨勫弬鏁頒粛鏃ц嚜鍙沖悜宸﹀帇鏍堜紶閫侊紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍐呭瓨鏍堬級(jí)錛屽湪鍑芥暟鍚嶄慨楗扮害瀹氭柟闈紝瀹冨拰鍓嶄袱鑰呭潎涓嶅悓銆?/p>
_fastcall鏂瑰紡鐨勫嚱鏁伴噰鐢ㄥ瘎瀛樺櫒浼犻掑弬鏁幫紝VC灝嗗嚱鏁扮紪璇戝悗浼?xì)鍦ㄥ嚱鏁板悕鍓嶉潰鍔犱?@"鍓嶇紑錛屽湪鍑芥暟鍚嶅悗鍔犱笂"@"鍜屽弬鏁扮殑瀛楄妭鏁般?/p>
thiscall:
thiscall浠呬粎搴旂敤浜?C++"鎴愬憳鍑芥暟銆倀his鎸囬拡瀛樻斁浜嶤X瀵勫瓨鍣紝鍙傛暟浠庡彸鍒板乏鍘嬨倀hiscall涓嶆槸鍏抽敭璇嶏紝鍥犳涓嶈兘琚▼搴忓憳鎸囧畾銆?/p>
naked call:
閲囩敤1-4鐨勮皟鐢ㄧ害瀹氭椂錛屽鏋滃繀瑕佺殑璇濓紝榪涘叆鍑芥暟鏃剁紪璇戝櫒浼?xì)漶旂敓浠g爜鏉ヤ繚瀛楨SI錛孍DI錛孍BX錛孍BP瀵勫瓨鍣紝閫鍑哄嚱鏁版椂鍒欎駭鐢熶唬鐮佹仮澶嶈繖浜涘瘎瀛樺櫒鐨勫唴瀹廣?/p>
naked call涓嶄駭鐢熻繖鏍風(fēng)殑浠g爜銆俷aked call涓嶆槸綾誨瀷淇グ絎︼紝鏁呭繀欏誨拰_declspec鍏卞悓浣跨敤銆?/p>
鍙﹂檮:
鍏抽敭瀛?__stdcall銆乢_cdecl鍜宊_fastcall鍙互鐩存帴鍔犲湪瑕佽緭鍑虹殑鍑芥暟鍓嶏紝涔熷彲浠ュ湪緙栬瘧鐜鐨凷etting...\C/C++ \Code Generation欏歸夋嫨銆傚綋鍔犲湪杈撳嚭鍑芥暟鍓嶇殑鍏抽敭瀛椾笌緙栬瘧鐜涓殑閫夋嫨涓嶅悓鏃訛紝鐩存帴鍔犲湪杈撳嚭鍑芥暟鍓嶇殑鍏抽敭瀛楁湁鏁堛傚畠浠搴旂殑鍛戒護(hù)琛屽弬鏁板垎鍒負(fù)/Gz銆?Gd鍜?Gr銆傜己鐪佺姸鎬佷負(fù)/Gd錛屽嵆__cdecl銆?/p>
瑕佸畬鍏ㄦā浠縋ASCAL璋冪敤綰﹀畾棣栧厛蹇呴』浣跨敤__stdcall璋冪敤綰﹀畾錛岃嚦浜庡嚱鏁板悕淇グ綰﹀畾錛屽彲浠ラ氳繃鍏跺畠鏂規(guī)硶妯′豢銆傝繕鏈変竴涓煎緱涓鎻愮殑鏄疻INAPI瀹忥紝W(xué)indows.h鏀寔璇ュ畯錛屽畠鍙互灝嗗嚭鍑芥暟緲昏瘧鎴愰傚綋鐨勮皟鐢ㄧ害瀹氾紝鍦╓IN32涓紝瀹冭瀹氫箟涓篲_stdcall銆備嬌鐢╓INAPI瀹忓彲浠ュ垱寤鴻嚜宸辯殑APIs銆?/p>
鍚嶅瓧淇グ綰﹀畾
1銆佷慨楗板悕(Decoration name)
“C”鎴栬?#8220;C++”鍑芥暟鍦ㄥ唴閮紙緙栬瘧鍜岄摼鎺ワ級(jí)閫氳繃淇グ鍚嶈瘑鍒備慨楗板悕鏄紪璇戝櫒鍦ㄧ紪璇戝嚱鏁板畾涔夋垨鑰呭師鍨嬫椂鐢熸垚鐨勫瓧絎︿覆銆傛湁浜涙儏鍐典笅浣跨敤鍑芥暟鐨勪慨楗板悕鏄繀瑕佺殑錛屽鍦ㄦā鍧楀畾涔夋枃浠墮噷澶存寚瀹氳緭鍑?#8220;C++”閲嶈澆鍑芥暟銆佹瀯閫犲嚱鏁般佹瀽鏋勫嚱鏁幫紝鍙堝鍦ㄦ眹緙栦唬鐮侀噷璋冪敤“C””鎴?#8220;C++”鍑芥暟絳夈?
淇グ鍚嶇敱鍑芥暟鍚嶃佺被鍚嶃佽皟鐢ㄧ害瀹氥佽繑鍥炵被鍨嬨佸弬鏁扮瓑鍏卞悓鍐沖畾銆?
2銆佸悕瀛椾慨楗扮害瀹氶殢璋冪敤綰﹀畾鍜岀紪璇戠綾?C鎴朇++)鐨勪笉鍚岃屽彉鍖栥傚嚱鏁板悕淇グ綰﹀畾闅忕紪璇戠綾誨拰璋冪敤綰﹀畾鐨勪笉鍚岃屼笉鍚岋紝涓嬮潰鍒嗗埆璇存槑銆?
a銆丆緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?
__stdcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓笅鍒掔嚎鍓嶇紑錛屽悗闈㈠姞涓婁竴涓?#8220;@”絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負(fù)_functionname@number銆?
__cdecl璋冪敤綰﹀畾浠呭湪杈撳嚭鍑芥暟鍚嶅墠鍔犱笂涓涓笅鍒掔嚎鍓嶇紑錛屾牸寮忎負(fù)_functionname銆?/p>
__fastcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓?#8220;@”絎﹀彿錛屽悗闈篃鏄竴涓?#8220;@”絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負(fù)@functionname@number銆?
瀹冧滑鍧囦笉鏀瑰彉杈撳嚭鍑芥暟鍚嶄腑鐨勫瓧絎﹀ぇ灝忓啓錛岃繖鍜孭ASCAL璋冪敤綰﹀畾涓嶅悓錛孭ASCAL綰﹀畾杈撳嚭鐨勫嚱鏁板悕鏃犱換浣曚慨楗頒笖鍏ㄩ儴澶у啓銆?
b銆丆++緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?
__stdcall璋冪敤綰﹀畾錛?
1銆佷互“?”鏍囪瘑鍑芥暟鍚嶇殑寮濮嬶紝鍚庤窡鍑芥暟鍚嶏紱
2銆佸嚱鏁板悕鍚庨潰浠?#8220;@@YG”鏍囪瘑鍙傛暟琛ㄧ殑寮濮嬶紝鍚庤窡鍙傛暟琛紱
3銆佸弬鏁拌〃浠ヤ唬鍙瘋〃紺猴細(xì)
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銆佸弬鏁拌〃鐨勭涓欏逛負(fù)璇ュ嚱鏁扮殑榪斿洖鍊肩被鍨嬶紝鍏跺悗渚濇涓哄弬鏁扮殑鏁版嵁綾誨瀷,鎸囬拡鏍囪瘑鍦ㄥ叾鎵鎸囨暟鎹被鍨嬪墠錛?
5銆佸弬鏁拌〃鍚庝互“@Z”鏍囪瘑鏁翠釜鍚嶅瓧鐨勭粨鏉燂紝濡傛灉璇ュ嚱鏁版棤鍙傛暟錛屽垯浠?#8220;Z”鏍囪瘑緇撴潫銆?
鍏舵牸寮忎負(fù)“?functionname@@YG*****@Z”鎴?#8220;?functionname@@YG*XZ”錛屼緥濡?
int Test1錛坈har *var1,unsigned long錛?----“?Test1@@YGHPADK@Z”
void Test2錛堬級(jí) -----“?Test2@@YGXXZ”
__cdecl璋冪敤綰﹀畾錛?
瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?#8220;@@YG”鍙樹(shù)負(fù)“@@YA”銆?
__fastcall璋冪敤綰﹀畾錛?
瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?#8220;@@YG”鍙樹(shù)負(fù)“@@YI”銆?
VC++瀵瑰嚱鏁扮殑鐪佺己澹版槑鏄?#8220;__cedcl“,灝嗗彧鑳借C/C++璋冪敤.
CB鍦ㄨ緭鍑哄嚱鏁板0鏄庢椂浣跨敤4縐嶄慨楗扮鍙?
//__cdecl
cb鐨勯粯璁ゅ鹼紝瀹冧細(xì)鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞_錛屽茍淇濈暀姝ゅ嚱鏁板悕涓嶅彉錛屽弬鏁版寜鐓т粠鍙沖埌宸︾殑欏哄簭渚濇浼犻掔粰鏍堬紝涔熷彲浠ュ啓鎴恄cdecl鍜宑decl褰㈠紡銆?
//__fastcall
濂逛慨楗扮殑鍑芥暟鐨勫弬鏁板皢灝借偗鍛㈡劅鍦頒嬌鐢ㄥ瘎瀛樺櫒鏉ュ鐞嗭紝鍏跺嚱鏁板悕鍓嶅姞@錛屽弬鏁版寜鐓т粠宸﹀埌鍙崇殑欏哄簭鍘嬫爤錛?
//__pascal
瀹冭鏄庣殑鍑芥暟鍚嶄嬌鐢≒ascal鏍煎紡鐨勫懡鍚嶇害瀹氥傝繖鏃跺嚱鏁板悕鍏ㄩ儴澶у啓銆傚弬鏁版寜鐓т粠宸﹀埌鍙崇殑欏哄簭鍘嬫爤錛?
//__stdcall
浣跨敤鏍囧噯綰﹀畾鐨勫嚱鏁板悕銆傚嚱鏁板悕涓嶄細(xì)鏀瑰彉銆備嬌鐢╛_stdcall淇グ鏃躲傚弬鏁版寜鐓х敱鍙沖埌宸︾殑欏哄簭鍘嬫爤錛屼篃鍙互鏄痏stdcall錛?/p>
VC++瀵瑰嚱鏁扮殑鐪佺己澹版槑鏄?__cedcl",灝嗗彧鑳借C/C++璋冪敤.
娉ㄦ剰錛?/p>
1銆乢beginthread闇瑕乢_cdecl鐨勭嚎紼嬪嚱鏁板湴鍧錛宊beginthreadex鍜孋reateThread闇瑕乢_stdcall鐨勭嚎紼嬪嚱鏁板湴鍧銆?/p>
2銆佷竴鑸琖IN32鐨勫嚱鏁伴兘鏄痏_stdcall銆傝屼笖鍦╓indef.h涓湁濡備笅鐨勫畾涔夛細(xì)
#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"鐨勪綔鐢細(xì)濡傛灉Add(int a, int b)鏄湪c璇█緙栬瘧鍣ㄧ紪璇戯紝鑰屽湪c++鏂囦歡浣跨敤錛屽垯闇瑕佸湪c++鏂囦歡涓0鏄庯細(xì)extern "C" Add(int a, int b)錛屽洜涓篶緙栬瘧鍣ㄥ拰c++緙栬瘧鍣ㄥ鍑芥暟鍚嶇殑瑙i噴涓嶄竴鏍鳳紙c++緙栬瘧鍣ㄨВ閲婂嚱鏁板悕鐨勬椂鍊欒鑰冭檻鍑芥暟鍙傛暟錛岃繖鏍鋒槸浜?jiǎn)鏂逛究鍑芥暟閲嶈浇锛岃屽湪c璇█涓笉瀛樺湪鍑芥暟閲嶈澆鐨勯棶棰橈級(jí)錛屼嬌鐢╡xtern "C"錛屽疄璐ㄥ氨鏄憡璇塩++緙栬瘧鍣紝璇ュ嚱鏁版槸c搴撻噷闈㈢殑鍑芥暟銆傚鏋滀笉浣跨敤extern "C"鍒欎細(xì)鍑虹幇閾炬帴閿欒銆?/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鎻愪緵浜?jiǎn)涓浜涘畯錛屽彲浠ヤ嬌鐢ˋ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鎴栬呯粨鏉熸椂錛岄兘浼?xì)璋冪敤DLLMain銆備絾鏄紝浣跨敤TerminateProcess鎴朤erminateThread緇撴潫榪涚▼鎴栬呯嚎紼嬶紝涓嶄細(xì)璋冪敤DLLMain銆?/p>
7銆佷竴涓狣LL鍦ㄥ唴瀛樹(shù)腑鍙湁涓涓疄渚?/p>
DLL紼嬪簭鍜岃皟鐢ㄥ叾杈撳嚭鍑芥暟鐨勭▼搴忕殑鍏崇郴錛?/p>
1)銆丏LL涓庤繘紼嬨佺嚎紼嬩箣闂寸殑鍏崇郴
DLL妯″潡琚槧灝勫埌璋冪敤瀹冪殑榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿銆?/p>
DLL浣跨敤鐨勫唴瀛樹(shù)粠璋冪敤榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿鍒嗛厤錛屽彧鑳借璇ヨ繘紼嬬殑綰跨▼鎵璁塊棶銆?/p>
DLL鐨勫彞鏌勫彲浠ヨ璋冪敤榪涚▼浣跨敤錛涜皟鐢ㄨ繘紼嬬殑鍙ユ焺鍙互琚獶LL浣跨敤銆?/p>
DLLDLL鍙互鏈夎嚜宸辯殑鏁版嵁孌碉紝浣嗘病鏈夎嚜宸辯殑鍫嗘爤錛屼嬌鐢ㄨ皟鐢ㄨ繘紼嬬殑鏍堬紝涓庤皟鐢ㄥ畠鐨勫簲鐢ㄧ▼搴忕浉鍚岀殑鍫嗘爤妯″紡銆?/p>
2)銆佸叧浜庡叡浜暟鎹
DLL瀹氫箟鐨勫叏灞鍙橀噺鍙互琚皟鐢ㄨ繘紼嬭闂紱DLL鍙互璁塊棶璋冪敤榪涚▼鐨勫叏灞鏁版嵁銆備嬌鐢ㄥ悓涓DLL鐨勬瘡涓涓繘紼嬮兘鏈夎嚜宸辯殑DLL鍏ㄥ眬鍙橀噺瀹炰緥銆傚鏋滃涓嚎紼嬪茍鍙戣闂悓涓鍙橀噺錛屽垯闇瑕佷嬌鐢ㄥ悓姝ユ満鍒訛紱瀵逛竴涓狣LL鐨勫彉閲忥紝濡傛灉甯屾湜姣忎釜浣跨敤DLL鐨勭嚎紼嬮兘鏈夎嚜宸辯殑鍊鹼紝鍒欏簲璇ヤ嬌鐢ㄧ嚎紼嬪眬閮ㄥ瓨鍌?TLS錛孴hread Local Strorage)銆?br>
鍦–璇█涓紝鍋囪鎴戜滑鏈夎繖鏍風(fēng)殑涓涓嚱鏁幫細(xì)
銆銆
銆銆int function(int a,int b)
銆銆
銆銆璋冪敤鏃跺彧瑕佺敤result = function(1,2)榪欐牱鐨勬柟寮忓氨鍙互浣跨敤榪欎釜鍑芥暟銆備絾鏄紝褰撻珮綰ц璦琚紪璇戞垚璁$畻鏈哄彲浠ヨ瘑鍒殑鏈哄櫒鐮佹椂錛屾湁涓涓棶棰樺氨鍑哥幇鍑烘潵錛氬湪CPU涓紝璁$畻鏈烘病鏈夊姙娉曠煡閬撲竴涓嚱鏁拌皟鐢ㄩ渶瑕佸灝戜釜銆佷粈涔堟牱鐨勫弬鏁幫紝涔熸病鏈夌‖浠跺彲浠ヤ繚瀛樿繖浜涘弬鏁般備篃灝辨槸璇達(dá)紝璁$畻鏈轟笉鐭ラ亾鎬庝箞緇欒繖涓嚱鏁頒紶閫掑弬鏁幫紝浼犻掑弬鏁扮殑宸ヤ綔蹇呴』鐢卞嚱鏁拌皟鐢ㄨ呭拰鍑芥暟鏈韓鏉ュ崗璋冦備負(fù)姝わ紝璁$畻鏈烘彁渚涗簡(jiǎn)涓縐嶈縐頒負(fù)鏍堢殑鏁版嵁緇撴瀯鏉ユ敮鎸佸弬鏁頒紶閫掋?/p>
銆銆鏍堟槸涓縐嶅厛榪涘悗鍑虹殑鏁版嵁緇撴瀯錛屾爤鏈変竴涓瓨鍌ㄥ尯銆佷竴涓爤欏舵寚閽堛傛爤欏舵寚閽堟寚鍚戝爢鏍堜腑絎竴涓彲鐢ㄧ殑鏁版嵁欏癸紙琚О涓烘爤欏訛級(jí)銆傜敤鎴峰彲浠ュ湪鏍堥《涓婃柟鍚戞爤涓姞鍏ユ暟鎹紝榪欎釜鎿嶄綔琚О涓哄帇鏍?Push)錛屽帇鏍堜互鍚庯紝鏍堥《鑷姩鍙樻垚鏂板姞鍏ユ暟鎹」鐨勪綅緗紝鏍堥《鎸囬拡涔熼殢涔嬩慨鏀廣傜敤鎴蜂篃鍙互浠庡爢鏍堜腑鍙栬蛋鏍堥《錛岀О涓哄脊鍑烘爤(pop)錛屽脊鍑烘爤鍚庯紝鏍堥《涓嬬殑涓涓厓绱犲彉鎴愭爤欏訛紝鏍堥《鎸囬拡闅忎箣淇敼銆?/p>
銆銆鍑芥暟璋冪敤鏃訛紝璋冪敤鑰呬緷嬈℃妸鍙傛暟鍘嬫爤錛岀劧鍚庤皟鐢ㄥ嚱鏁幫紝鍑芥暟琚皟鐢ㄤ互鍚庯紝鍦ㄥ爢鏍堜腑鍙栧緱鏁版嵁錛屽茍榪涜璁$畻銆傚嚱鏁拌綆楃粨鏉熶互鍚庯紝鎴栬呰皟鐢ㄨ呫佹垨鑰呭嚱鏁版湰韜慨鏀瑰爢鏍堬紝浣垮爢鏍堟仮澶嶅師瑁呫?/p>
銆銆鍦ㄥ弬鏁頒紶閫掍腑錛屾湁涓や釜寰堥噸瑕佺殑闂蹇呴』寰楀埌鏄庣‘璇存槑錛?br>銆銆
銆銆褰撳弬鏁頒釜鏁板浜庝竴涓椂錛屾寜鐓т粈涔堥『搴忔妸鍙傛暟鍘嬪叆鍫嗘爤
銆銆鍑芥暟璋冪敤鍚庯紝鐢辮皝鏉ユ妸鍫嗘爤鎭㈠鍘熻
銆銆鍦ㄩ珮綰ц璦涓紝閫氳繃鍑芥暟璋冪敤綰﹀畾鏉ヨ鏄庤繖涓や釜闂銆傚父瑙佺殑璋冪敤綰﹀畾鏈夛細(xì)
銆銆stdcall
銆銆cdecl
銆銆fastcall
銆銆thiscall
銆銆naked call
銆銆stdcall璋冪敤綰﹀畾
銆銆stdcall寰堝鏃跺欒縐頒負(fù)pascal璋冪敤綰﹀畾錛屽洜涓簆ascal鏄棭鏈熷緢甯歌鐨勪竴縐嶆暀瀛︾敤璁$畻鏈虹▼搴忚璁¤璦錛屽叾璇硶涓ヨ皚錛屼嬌鐢ㄧ殑鍑芥暟璋冪敤綰﹀畾灝辨槸stdcall銆傚湪Microsoft C++緋誨垪鐨凜/C++緙栬瘧鍣ㄤ腑錛屽父甯哥敤PASCAL瀹忔潵澹版槑榪欎釜璋冪敤綰﹀畾錛岀被浼肩殑瀹忚繕鏈塛INAPI鍜孋ALLBACK銆?/p>
銆銆stdcall璋冪敤綰﹀畾澹版槑鐨勮娉曚負(fù)(浠ュ墠鏂囩殑閭d釜鍑芥暟涓轟緥錛夛細(xì)
銆銆
銆銆int __stdcall function(int a,int b)
銆銆
銆銆stdcall鐨勮皟鐢ㄧ害瀹氭剰鍛崇潃錛?錛夊弬鏁頒粠鍙沖悜宸﹀帇鍏ュ爢鏍堬紝2錛夊嚱鏁拌嚜韜慨鏀瑰爢鏍?3)鍑芥暟鍚嶈嚜鍔ㄥ姞鍓嶅鐨勪笅鍒掔嚎錛屽悗闈㈢揣璺熶竴涓狜絎﹀彿錛屽叾鍚庣揣璺熺潃鍙傛暟鐨勫昂瀵?/p>
銆銆浠ヤ笂榪拌繖涓嚱鏁頒負(fù)渚嬶紝鍙傛暟b棣栧厛琚帇鏍堬紝鐒跺悗鏄弬鏁癮錛屽嚱鏁拌皟鐢╢unction(1,2)璋冪敤澶勭炕璇戞垚姹囩紪璇█灝嗗彉鎴愶細(xì)
銆銆push 2銆銆銆銆銆銆銆 絎簩涓弬鏁板叆鏍?br>銆銆push 1銆銆銆銆銆銆銆 絎竴涓弬鏁板叆鏍?br>銆銆call function銆銆銆銆璋冪敤鍙傛暟錛屾敞鎰忔鏃惰嚜鍔ㄦ妸cs:eip鍏ユ爤
銆銆鑰屽浜庡嚱鏁拌嚜韜紝鍒欏彲浠ョ炕璇戜負(fù)錛?
銆銆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澶勪繚瀛樹(shù)簡(jiǎn)b
銆銆mov銆esp, ebp銆銆銆銆鎭㈠esp
銆銆pop銆ebp
銆銆ret銆8
銆銆鑰屽湪緙栬瘧鏃訛紝榪欎釜鍑芥暟鐨勫悕瀛楄緲昏瘧鎴?a href="mailto:_function@8">_function@8
銆銆娉ㄦ剰涓嶅悓緙栬瘧鍣ㄤ細(xì)鎻掑叆鑷繁鐨勬眹緙栦唬鐮佷互鎻愪緵緙栬瘧鐨勯氱敤鎬э紝浣嗘槸澶т綋浠g爜濡傛銆傚叾涓湪鍑芥暟寮濮嬪淇濈暀esp鍒癳bp涓紝鍦ㄥ嚱鏁扮粨鏉熸仮澶嶆槸緙栬瘧鍣ㄥ父鐢ㄧ殑鏂規(guī)硶銆?/p>
銆銆浠庡嚱鏁拌皟鐢ㄧ湅錛?鍜?渚濇琚玴ush榪涘爢鏍堬紝鑰屽湪鍑芥暟涓張閫氳繃鐩稿浜巈bp(鍗沖垰榪涘嚱鏁版椂鐨勫爢鏍堟寚閽堬級(jí)鐨勫亸縐婚噺瀛樺彇鍙傛暟銆傚嚱鏁扮粨鏉熷悗錛宺et 8琛ㄧず娓呯悊8涓瓧鑺傜殑鍫嗘爤錛屽嚱鏁拌嚜宸辨仮澶嶄簡(jiǎn)鍫嗘爤銆?/p>
銆銆
銆銆cdecl璋冪敤綰﹀畾
銆銆cdecl璋冪敤綰﹀畾鍙堢О涓篊璋冪敤綰﹀畾錛屾槸C璇█緙虹渷鐨勮皟鐢ㄧ害瀹氾紝瀹冪殑瀹氫箟璇硶鏄細(xì)
銆銆int function (int a ,int b)銆//涓嶅姞淇グ灝辨槸C璋冪敤綰﹀畾
銆銆int __cdecl function(int a,int b)//鏄庣‘鎸囧嚭C璋冪敤綰﹀畾
銆銆鍦ㄥ啓鏈枃鏃訛紝鍑轟箮鎴戠殑鎰忔枡錛屽彂鐜癱decl璋冪敤綰﹀畾鐨勫弬鏁板帇鏍堥『搴忔槸鍜宻tdcall鏄竴鏍風(fēng)殑錛屽弬鏁伴鍏堢敱鍙沖悜宸﹀帇鍏ュ爢鏍堛傛墍涓嶅悓鐨勬槸錛屽嚱鏁版湰韜笉娓呯悊鍫嗘爤錛岃皟鐢ㄨ呰礋璐f竻鐞嗗爢鏍堛傜敱浜庤繖縐嶅彉鍖栵紝C璋冪敤綰﹀畾鍏佽鍑芥暟鐨勫弬鏁扮殑涓暟鏄笉鍥哄畾鐨勶紝榪欎篃鏄疌璇█鐨勪竴澶х壒鑹層傚浜庡墠闈㈢殑function鍑芥暟錛屼嬌鐢╟decl鍚庣殑姹囩紪鐮佸彉鎴愶細(xì)
銆銆璋冪敤澶?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澶勪繚瀛樹(shù)簡(jiǎn)b
銆銆mov銆esp,ebp銆銆銆銆 鎭㈠esp
銆銆pop銆ebp
銆銆ret銆銆銆銆銆銆銆銆銆娉ㄦ剰錛岃繖閲屾病鏈変慨鏀瑰爢鏍?/p>
銆銆MSDN涓錛岃淇グ鑷姩鍦ㄥ嚱鏁板悕鍓嶅姞鍓嶅鐨勪笅鍒掔嚎錛屽洜姝ゅ嚱鏁板悕鍦ㄧ鍙瘋〃涓璁板綍涓篲function錛屼絾鏄垜鍦ㄧ紪璇戞椂浼間箮娌℃湁鐪嬪埌榪欑鍙樺寲銆?/p>
銆銆鐢變簬鍙傛暟鎸夌収浠庡彸鍚戝乏欏哄簭鍘嬫爤錛屽洜姝ゆ渶寮濮嬬殑鍙傛暟鍦ㄦ渶鎺ヨ繎鏍堥《鐨勪綅緗紝鍥犳褰撻噰鐢ㄤ笉瀹氫釜鏁板弬鏁版椂錛岀涓涓弬鏁板湪鏍堜腑鐨勪綅緗偗瀹氳兘鐭ラ亾錛屽彧瑕佷笉瀹氱殑鍙傛暟涓暟鑳藉鏍規(guī)嵁絎竴涓悗鑰呭悗緇殑鏄庣‘鐨勫弬鏁扮‘瀹氫笅鏉ワ紝灝卞彲浠ヤ嬌鐢ㄤ笉瀹氬弬鏁幫紝渚嬪瀵逛簬CRT涓殑sprintf鍑芥暟錛屽畾涔変負(fù)錛?
銆銆int sprintf(char* buffer,const char* format,...)
銆銆鐢變簬鎵鏈夌殑涓嶅畾鍙傛暟閮藉彲浠ラ氳繃format紜畾錛屽洜姝や嬌鐢ㄤ笉瀹氫釜鏁扮殑鍙傛暟鏄病鏈夐棶棰樼殑銆?/p>
銆銆fastcall
銆銆fastcall璋冪敤綰﹀畾鍜宻tdcall綾諱技錛屽畠鎰忓懗鐫錛?
銆銆
銆銆鍑芥暟鐨勭涓涓拰絎簩涓狣WORD鍙傛暟錛堟垨鑰呭昂瀵告洿灝忕殑錛夐氳繃ecx鍜宔dx浼犻掞紝鍏朵粬鍙傛暟閫氳繃浠庡彸鍚戝乏鐨勯『搴忓帇鏍?
銆銆琚皟鐢ㄥ嚱鏁版竻鐞嗗爢鏍?
銆銆鍑芥暟鍚嶄慨鏀硅鍒欏悓stdcall
銆銆鍏跺0鏄庤娉曚負(fù)錛歩nt fastcall function(int a, int b)
銆銆thiscall
銆銆thiscall鏄敮涓涓涓笉鑳芥槑紜寚鏄庣殑鍑芥暟淇グ錛屽洜涓簍hiscall涓嶆槸鍏抽敭瀛椼傚畠鏄疌++綾繪垚鍛樺嚱鏁扮己鐪佺殑璋冪敤綰﹀畾銆傜敱浜庢垚鍛樺嚱鏁拌皟鐢ㄨ繕鏈変竴涓猼his鎸囬拡錛屽洜姝ゅ繀欏葷壒孌婂鐞嗭紝thiscall鎰忓懗鐫錛?
銆銆鍙傛暟浠庡彸鍚戝乏鍏ユ爤
銆銆濡傛灉鍙傛暟涓暟紜畾錛宼his鎸囬拡閫氳繃ecx浼犻掔粰琚皟鐢ㄨ咃紱濡傛灉鍙傛暟涓暟涓嶇‘瀹氾紝this鎸囬拡鍦ㄦ墍鏈夊弬鏁板帇鏍堝悗琚帇鍏ュ爢鏍堛傚鍙傛暟涓暟涓嶅畾鐨勶紝璋冪敤鑰呮竻鐞嗗爢鏍堬紝鍚﹀垯鍑芥暟鑷繁娓呯悊鍫嗘爤涓轟簡(jiǎn)璇存槑榪欎釜璋冪敤綰﹀畾錛屽畾涔夊涓嬬被鍜屼嬌鐢ㄤ唬鐮侊細(xì)
銆銆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
銆銆榪欐槸涓涓緢灝戣鐨勮皟鐢ㄧ害瀹氾紝涓鑸▼搴忚璁¤呭緩璁笉瑕佷嬌鐢ㄣ傜紪璇戝櫒涓嶄細(xì)緇欒繖縐嶅嚱鏁板鍔犲垵濮嬪寲鍜屾竻鐞嗕唬鐮侊紝鏇寸壒孌婄殑鏄紝浣犱笉鑳界敤return榪斿洖榪斿洖鍊鹼紝鍙兘鐢ㄦ彃鍏ユ眹緙栬繑鍥炵粨鏋溿傝繖涓鑸敤浜庡疄妯″紡椹卞姩紼嬪簭璁捐錛屽亣璁懼畾涔変竴涓眰鍜岀殑鍔犳硶紼嬪簭錛屽彲浠ュ畾涔変負(fù)錛?
銆銆__declspec(naked) int銆add(int a,int b)
銆銆{
銆銆銆 __asm mov eax,a
銆銆銆 __asm add eax,b
銆銆銆 __asm ret
銆銆}
銆銆娉ㄦ剰錛岃繖涓嚱鏁版病鏈夋樉寮忕殑return榪斿洖鍊鹼紝榪斿洖閫氳繃淇敼eax瀵勫瓨鍣ㄥ疄鐜幫紝鑰屼笖榪為鍑哄嚱鏁扮殑ret鎸囦護(hù)閮藉繀欏繪樉寮忔彃鍏ャ備笂闈唬鐮佽緲昏瘧鎴愭眹緙栦互鍚庡彉鎴愶細(xì)
銆銆mov eax,[ebp+8]
銆銆add eax,[ebp+12]
銆銆ret 8
銆 娉ㄦ剰榪欎釜淇グ鏄拰__stdcall鍙?qiáng)cdecl緇撳悎浣跨敤鐨勶紝鍓嶉潰鏄畠鍜宑decl緇撳悎浣跨敤鐨勪唬鐮侊紝瀵逛簬鍜宻tdcall緇撳悎鐨勪唬鐮侊紝鍒欏彉鎴愶細(xì)
銆銆__declspec(naked) int __stdcall function(int a,int b)
銆 {
銆銆銆銆__asm mov eax,a
銆銆銆銆__asm add eax,b
銆銆銆銆__asm ret 8銆銆銆銆//娉ㄦ剰鍚庨潰鐨?
銆銆}
銆銆鑷充簬榪欑鍑芥暟琚皟鐢紝鍒欏拰鏅氱殑cdecl鍙?qiáng)stdcall璋冪敤鍑芥暟涓鑷淬?/p>
銆銆鍑芥暟璋冪敤綰﹀畾瀵艱嚧鐨勫父瑙侀棶棰?br>銆銆濡傛灉瀹氫箟鐨勭害瀹氬拰浣跨敤鐨勭害瀹氫笉涓鑷達(dá)紝鍒欏皢瀵艱嚧鍫嗘爤琚牬鍧忥紝瀵艱嚧涓ラ噸闂錛屼笅闈㈡槸涓ょ甯歌鐨勯棶棰橈細(xì)
銆銆鍑芥暟鍘熷瀷澹版槑鍜屽嚱鏁頒綋瀹氫箟涓嶄竴鑷?
銆銆DLL瀵煎叆鍑芥暟鏃跺0鏄庝簡(jiǎn)涓嶅悓鐨勫嚱鏁扮害瀹?
銆銆浠ュ悗鑰呬負(fù)渚嬶紝鍋囪鎴戜滑鍦╠ll縐嶅0鏄庝簡(jiǎn)涓縐嶅嚱鏁頒負(fù)錛?
銆銆__declspec(dllexport) int func(int a,int b);//娉ㄦ剰錛岃繖閲屾病鏈塻tdcall錛屼嬌鐢ㄧ殑鏄痗decl
銆銆浣跨敤鏃朵唬鐮佷負(fù)錛?
銆銆typedef int (*WINAPI DLLFUNC)func(int a,int b);
銆銆hLib = LoadLibrary(...);
銆銆DLLFUNC func = (DLLFUNC)GetProcAddress(...)//榪欓噷淇敼浜?jiǎn)璋冪敤绾﹀?br>銆銆result = func(1,2);//瀵艱嚧閿欒
銆銆鐢變簬璋冪敤鑰呮病鏈夌悊瑙INAPI鐨勫惈涔夐敊璇殑澧炲姞浜?jiǎn)杩欎釜淇图屼笂杩颁唬鐮佸繀鐒跺D嚧鍫嗘爤琚牬鍧忥紝MFC鍦ㄧ紪璇戞椂鎻掑叆鐨刢heckesp鍑芥暟灝嗗憡璇変綘錛屽爢鏍堣鐮村潖
鐗瑰湴鎷挎潵涓庡ぇ瀹跺垎浜紝甯屾湜鑳界粰鍍忔垜榪欐牱鐨勮彍楦熶滑涓浜涘府鍔╋紝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>榪欐椂灝卞垱寤轟簡(jiǎn)涓涓┖鐨勫彲浠ョ敓鎴恉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榪欓噷瑕佽鏄庣殑鏄細(xì)鍦╒C涓湁涓や釜鏂規(guī)硶鏉ュ鍑篸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)錛屽唴瀹瑰涓嬶細(xì)1 #include <iostream>
2 #define DLL_EXPORT
3 #include "dll_test.h"
4
5 extern "C"
6 {
7 // 瀹氫箟浜?jiǎn)锛圖LL涓殑錛夋墍鏈夊嚱鏁?/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鐜板湪宸茬粡鍒涘緩浜?jiǎn)DLL錛岄偅涔堝浣曞湪涓涓簲鐢ㄧ▼搴忎腑浣跨敤瀹冨憿錛?/pre>褰揇LL琚敓鎴愬悗錛屽畠鍒涘緩浜?jiǎn)涓涓?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鎺у埗鍙伴」鐩殑鐩綍涓劧鍚庡湪紼嬪簭涓姞鍏ヨ鍙ワ細(xì) #include "dll_test.h"鏂伴」鐩唬鐮佸涓嬶細(xì)#include<iostream>#include "DLLTutorial.h"int main(){Function();std::cout<< Add(32, 56)<< endl;return 0;}(2)鏄劇ず閾炬帴紼嶅井澶嶆潅涓鐐圭殑鍔犺澆DLL鐨勬柟娉曢渶瑕佺敤鍒板嚱鏁版寚閽堝拰涓浜沇indows鍑芥暟銆備絾鏄紝閫氳繃榪欑杞藉叆DLL鐨勬柟娉曪紝涓嶉渶瑕丏LL鐨?lib鏂囦歡鎴栧ご鏂囦歡錛岃屽彧闇瑕丏LL鍗沖彲銆?/pre>涓嬮潰鍒楀嚭涓浜涗唬鐮侊細(xì)/****************************************************************/ #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); } /*******************************************************************/棣栧厛鍙互鐪嬪埌錛岃繖閲屽寘鎷繘浜?jiǎn)windows.h澶存枃浠訛紝鍚屾椂鍘繪帀浜?jiǎn)瀵筪ll_test.h澶存枃浠剁殑鍖呭惈銆傚師鍥犲緢綆鍗曪細(xì)鍥犱負(fù)windows.h鍖呭惈浜?jiǎn)涓浜沇indows鍑芥暟錛?/pre>瀹冧篃鍖呭惈浜?jiǎn)涓浜涘皢浼?xì)鐢ㄥ埌鐨刉indows鐗瑰畾鍙橀噺銆傚彲浠ュ幓鎺塂LL鐨勫ご鏂囦歡錛屽洜涓哄綋浣跨敤榪欎釜鏂規(guī)硶杞藉叆DLL鏃跺茍涓嶉渶瑕佸叾澶存枃浠躲?/pre>涓嬮潰浣犱細(xì)鐪嬪埌錛氫互涓嬮潰褰㈠紡鐨勪竴灝忓潡鍙ょ伒綺炬殑浠g爜:typedef int (*AddFunc)(int,int); typedef void (*FunctionFunc)();榪欐槸鍑芥暟鎸囬拡銆傚洜涓鴻繖鏄竴涓叧浜嶥LL鐨勮嚜瀛︽寚鍗楋紝娣卞叆鎺㈢┒鍑芥暟鎸囬拡瓚呭嚭浜?jiǎn)鏈寚鍗楃殑鑼冨涍_(dá)紱鍥犳錛岀幇鍦ㄦ垜浠彧鎶婂畠浠綋浣淒LL鍖呭惈鐨勫嚱鏁扮殑鍒悕銆?/pre>鎴戝枩嬈㈠湪灝鵑儴鐢?#8220;Func”鍛藉悕涔嬨?int,int)閮ㄥ垎鏄繖涓嚱鏁扮殑鍙傛暟閮ㄥ垎錛屾瘮濡傦紝Add鍑芥暟瑕佽幏寰椾袱涓暣鏁幫紱鍥犳錛屼綘闇瑕佸畠浠?/pre>錛堣瘧娉細(xì)鎸?int,int)閮ㄥ垎錛変綔涓哄嚱鏁版寚閽堢殑鍙傛暟銆侳unction鍑芥暟娌℃湁鍙傛暟錛屽洜姝や綘璁╁畠涓虹┖銆俶ain()閮ㄥ垎涓殑鍓嶉潰涓よ鏄0鏄庡嚱鏁版寚閽堜互浣垮緱浣犲彲浠ヨ涓哄畠浠瓑鍚屼簬DLL鍐呴儴鐨勫嚱鏁般傛垜鍙槸鍠滄棰勫厛瀹氫箟瀹冧滑銆?/pre>涓涓狧INSTANCE鏄竴涓猈indows鏁版嵁綾誨瀷錛氭槸涓涓疄渚嬬殑鍙ユ焺錛涘湪姝ゆ儏鍐典笅錛岃繖涓疄渚嬪皢鏄繖涓狣LL銆備綘鍙互閫氳繃浣跨敤鍑芥暟LoadLibrary()鑾峰緱DLL鐨?/pre>瀹炰緥錛屽畠鑾峰緱涓涓悕縐頒綔涓哄弬鏁般?/pre>鍦ㄨ皟鐢↙oadLibrary鍑芥暟鍚庯紝浣犲繀闇鏌ョ湅涓涓嬪嚱鏁拌繑鍥炴槸鍚︽垚鍔熴備綘鍙互閫氳繃媯(gè)鏌INSTANCE鏄惁絳変簬NULL錛堝湪Windows.h涓畾涔変負(fù)0鎴朩indows.h鍖?/pre>鍚殑涓涓ご鏂囦歡錛夋潵鏌ョ湅鍏舵槸鍚︽垚鍔熴傚鏋滃叾絳変簬NULL錛岃鍙ユ焺灝嗘槸鏃犳晥鐨勶紝騫朵笖浣犲繀闇閲婃斁榪欎釜搴撱傛崲鍙ヨ瘽璇達(dá)紝浣犲繀闇閲婃斁DLL鑾峰緱鐨勫唴瀛樸?/pre>濡傛灉鍑芥暟榪斿洖鎴愬姛錛屼綘鐨凥INSTANCE灝卞寘鍚簡(jiǎn)鎸囧悜DLL鐨勫彞鏌勩備竴鏃︿綘鑾峰緱浜?jiǎn)鎸囧悜DLL鐨勫彞鏌勶紝浣犵幇鍦ㄥ彲浠ヤ粠DLL涓噸鏂拌幏寰楀嚱鏁般?/pre>涓轟簡(jiǎn)榪欐牱浣滐紝浣犲繀欏諱嬌鐢ㄥ嚱鏁癎etProcAddress()錛屽畠?yōu)畣DLL鐨勫彞鏌勶紙浣犲彲浠ヤ嬌鐢℉INSTANCE錛夊拰鍑芥暟鐨勫悕縐頒綔涓哄弬鏁般備綘鍙互璁╁嚱鏁版寚閽堣幏寰楃敱GetProcAddress()榪斿洖鐨勫鹼紝鍚屾椂浣犲繀闇灝咷etProcAddress()杞崲涓洪偅涓嚱鏁板畾涔夌殑鍑芥暟鎸囬拡銆備婦涓緥瀛愶紝瀵逛簬Add()鍑芥暟錛屼綘蹇呴渶灝咷etProcAddress()杞崲涓篈ddFunc錛涜繖灝辨槸瀹冪煡閬撳弬鏁板強(qiáng)榪斿洖鍊肩殑鍘熷洜銆傜幇鍦紝鏈濂藉厛紜畾鍑芥暟鎸囬拡鏄惁絳変簬NULL浠ュ強(qiáng)瀹冧滑鎷ユ湁DLL鐨勫嚱鏁般?/pre>榪欏彧鏄竴涓畝鍗曠殑if璇彞錛涘鏋滃叾涓竴涓瓑浜嶯ULL錛屼綘蹇呴渶濡傚墠鎵榪伴噴鏀懼簱銆備竴鏃﹀嚱鏁版寚閽堟嫢鏈塂LL鐨勫嚱鏁幫紝浣犵幇鍦ㄥ氨鍙互浣跨敤瀹冧滑浜?jiǎn)锛屼絾鏄瘶q欓噷鏈変竴涓?/pre>闇瑕佹敞鎰忕殑鍦版柟錛氫綘涓嶈兘浣跨敤鍑芥暟鐨勫疄闄呭悕縐幫紱浣犲繀闇浣跨敤鍑芥暟鎸囬拡鏉ヨ皟鐢ㄥ畠浠傚湪閭d互鍚庯紝鎵鏈変綘闇瑕佸仛鐨勬槸閲婃斁搴撳姝よ屽凡銆?/pre>鐜板湪浣犵煡閬撲簡(jiǎn)DLL鐨勪竴浜涘熀鏈煡璇嗐備綘鐭ラ亾濡備綍鍒涘緩瀹冧滑錛屼綘涔熺煡閬撳浣曠敤涓ょ涓嶅悓鐨勬柟娉曢摼鎺ュ畠浠傝繖閲屼粛鐒舵湁鏇村鐨勪笢瑗塊渶瑕佹垜浠涔?fàn)锛屼絾鎴戞妸瀹冧滑鐣櫨l欎綘浠嚜宸辨帰绱簡(jiǎn)鍜屾洿媯掔殑浣滆呮潵鍐欎簡(jiǎn)銆?
]]>