锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲全部视频,国产精品综合视频,国产精品美女一区二区在线观看 http://m.shnenglu.com/feixuwu/archive/2011/05/14/146395.htmlfeixuwu feixuwu Sat, 14 May 2011 13:16:00 GMT http://m.shnenglu.com/feixuwu/archive/2011/05/14/146395.html http://m.shnenglu.com/feixuwu/comments/146395.html http://m.shnenglu.com/feixuwu/archive/2011/05/14/146395.html#Feedback 0 http://m.shnenglu.com/feixuwu/comments/commentRss/146395.html http://m.shnenglu.com/feixuwu/services/trackbacks/146395.html 闂 鏈榪戞父鎴忓紑濮嬫妧鏈皝嫻嬩簡錛屼笉榪囧垰鍒氫笂綰?涓皬鏃訛紝Server灝辨寕浜嗭紝鎸傚湪妗嗘灦浠g爜閲岋紝涓涓笉鍙兘鎸傜殑鍦版柟銆?br />浠嶤allStack鐪嬶紝鏄湪鑾峰彇鏁版嵁鏃跺彂閫佽姹傚寘鐨勬椂鍊欐寕鐨勶紝鐢變簬妗嗘灦閮ㄥ垎鏄叾浠栭儴闂ㄧ殑鍚屼簨寮鍙戠殑錛屾墍浠ユ煡闂鐨勬椂鍊欏氨鎷変笂浠栦滑浜嗭紝 澶у鎶樿吘浜?澶╋紝娌℃湁瀹炶川鎬х殑榪涘睍錛屾湇鍔″櫒榪樻槸鍩烘湰涓婃瘡3涓皬鏃跺畷鏈轟竴嬈°傜敱浜庝笂灞傞昏緫澶ч儴鍒嗛兘鍦ㄦ垜閭o紝鎵浠ュ帇鍔涙瘮杈冨ぇ錛屽畷鏈虹殑鐩存帴鍘熷洜鏄痟ashtable鐨勪竴涓《鐨勬寚閽堝紓甯革紝 榪欎釜hashtable鏄鏋朵唬鐮佺殑涓涓唴閮ㄦ垚鍛橈紝鎸夐亾鐞嗘垜浠槸鏃犱粠鐮村潖鐨勶紝鍙湁鍙兘鏄綰跨▼鐜涓嬭凱浠e櫒鎹熷潖瀵艱嚧鐨勩?br />浣嗘槸妗嗘灦浠g爜鍦ㄨ繖涓湴鏂圭‘瀹炴棤鎳堝彲鍑伙紝鎵浠ョ湡姝g殑鍘熷洜搴旇榪樻槸涓婂眰浠g爜鐮村潖浜嗗爢鍐呭瓨錛屽緢鍙兘鏄竴涓猰emcpy瓚婄晫瀵艱嚧鐨勩傝繖姣曠珶鏄釜鐚滄兂錛屽浣曟壘鍒拌瘉鎹憿錛岃繖鏄釜闂銆?br />鎶婃墍鏈変唬鐮侀噷鐨刴emcpy嫻忚浜嗕竴閬嶏紝娌℃湁鍙戠幇鏄庢樉闂銆?br />
鐚滄祴 涓鑸父鎴忎腑姣旇緝瀹規槗鍑虹幇浣嗘槸涓嶅ソ鏌ョ殑闂寰堝鏃跺欓兘鏄剼鏈紙lua錛夊鑷寸殑錛屾垜浠殑鑴氭湰閮ㄥ垎鏄竴涓悓浜嬪嚑騫村墠鍐欑殑錛屽湪鍑犱釜浜у搧涓兘浣跨敤榪囷紝鎸夐亾鐞嗘病榪欎箞鑴嗗急錛屼笉榪囪佸ぇ榪樻槸鍜屾渶鍒濆紑鍙戣繖涓ā鍧楃殑閮ㄩ棬娌熼氫簡涓嬶紝 榪樼湡鍙戠幇闂浜嗭紝璧剁揣鎷夸簡鏂扮殑鐗堟湰鏇存柊涓婂幓銆傜粡榪囦竴澶╃殑瑙傚療錛屾湇鍔″櫒娌℃湁瀹曟満浜嗭紝OK錛岄棶棰樼宸цВ鍐充簡,鑳屼簡榪欎箞涔呯殑榛戦攨錛岀粓浜庢斁涓嬫潵浜嗐?br />
PageHeap 鍋囧娌℃湁紕板閥瑙e喅浜嗚繖涓棶棰橈紝姝e父鐨勬濊礬璇ュ浣曡В鍐寵繖涓棶棰樺憿錛岃繖涓椂鍊欐垜鎬蹇祑indows浜嗭紝鍦╳indows涓嬫湁PageHeap鏉ヨВ鍐寵繖綾誨啓瓚婄晫鐨勯棶棰樸傚熀鏈濊礬灝辨槸姣忔鍒嗛厤鍐呭瓨鐨勬椂鍊欙紝閮藉皢鍐呭瓨鐨勭粨灝炬斁鍦ㄩ〉鐨勮竟緙橈紝绱ф帴鐫榪欏潡鍐呭瓨鍒嗛厤涓鍧椾笉鑳藉啓鐨勫唴瀛橈紝榪欐牱錛屼竴鏃﹀啓瓚婄晫錛屽氨浼氬啓寮傚父錛屽鑷村畷鏈恒俵inux涓嬫病鏈夌幇鎴愮殑宸ュ叿錛屼絾鏄痩inux鎻愪緵浜唌map鍔熻兘錛屾垜浠彲浠ヨ嚜宸卞疄鐜拌繖鏍蜂竴涓姛鑳斤紝褰撶劧錛岃繖涓鍒囬兘涓嶇敤鑷繁鍔ㄦ墜浜嗭紝tcmalloc宸茬粡鍖呭惈浜?br />榪欎釜鍔熻兘浜嗭紝涓嶈繃鍦ㄦ枃妗i噷鍩烘湰娌℃湁浠嬬粛錛屾垜涔熸槸鍦ㄩ槄璇籺cmalloc浠g爜鏃剁湅鍒扮殑錛岃繖涓姛鑳介粯璁ゆ槸鍏抽棴鐨勶紝鎵撳紑榪欎釜寮鍏抽渶瑕佹敼鍐欎唬鐮侊細 榪欎釜浠g爜鍦╠ebugallocation.cc閲岋細 DEFINE_bool(malloc_page_fence, EnvToBool("TCMALLOC_PAGE_FENCE", false), "Enables putting of memory allocations at page boundaries " "with a guard page following the allocation (to catch buffer " "overruns right when they happen)."); 鎶奻alse鏀規垚true灝卞彲浠ヤ簡銆?br />鎯寵鍦ㄩ」鐩噷鍔犲叆PageHeap鍔熻兘錛屽彧闇瑕侀摼鎺ョ殑鏃跺欏姞涓?-ltcmalloc_debug鍗沖彲銆傛妸瀹冨姞鍏ラ」鐩腑錛岃瘯鐫榪愯涓嬶紝鐩存帴鎸備簡錛?br />浠旂粏涓鐪嬶紝鍘熸潵鏄」鐩腑寰堝鎴愬憳鍙橀噺娌℃湁鍒濆鍖栧鑷寸殑錛宼cmalloc_debug浼氳嚜鍔ㄥ皢new 鍜宮alloc鍑烘潵鐨勫唴瀛樺垵濮嬪寲涓烘寚瀹氬鹼紝榪欐牱錛屼竴鏃﹀彉閲忔病鏈夊垵濮嬪寲錛屽緢瀹規槗灝辨毚闇蹭簡銆?br />淇敼瀹岃繖涓棶棰樺悗錛岀紪璇戯紝鍐嶈繍琛岋紝榪樻槸鎸傦紝榪欎釜鏄痬protect鐨勬椂鍊欐寕鐨勶紝閿欒鏄唴瀛樹笉澶燂紝榪欐庝箞鍙兘鍛紝鍏跺疄鏄揪鍒頒簡璧勬簮闄愬埗浜嗐?br />echo 128000 > /proc/sys/vm/max_map_count 鎶妋ap鏁伴噺闄愬埗鍔犲ぇ,鍐嶈繍琛岋紝OK浜嗭紒 浣嗘槸娓告垙Server鍚姩鍚庯紝鍙戠幇涓涓棶棰橈紝CPU闀挎湡澶勪簬100%錛屽鑷寸櫥闄嗕竴涓帺瀹墮兘寰堝洶闅撅紝gdb涓柇鍚庯紝info thread錛屽彂鐜板ぇ閮ㄥ垎鐨勬搷浣滈兘鍦╩map鍜宮protect,鏈寮濮?br />鎬鐤戞垜鐨刲inux鐗堟湰鏈夐棶棰橈紝瀵艱嚧榪?涓狝P鎱紝鍐欎簡嫻嬭瘯紼嬪簭璇曚簡涓嬶紝鍙戠幇鍏跺疄API涓嶆參錛屼及璁℃槸棰戠箒璋冪敤瀵艱嚧鐨勩?br />鎵浠ュ緱鎹㈢鎬濊礬浼樺寲涓嬫墠鍙互錛屽叾瀹炲ぇ閮ㄥ垎鎯呭喌涓嬶紝鎴戜滑free鐨勬椂鍊欙紝鏃犻渶灝嗛〉闈unmap鎺夛紝鍙互鍏坈ache榪涙潵錛屼笅嬈″垎閰嶇殑鏃跺欙紝濡傛灉鏈夛紝鐩存帴鎷挎潵鐢ㄥ氨鍙互浜嗐?br />鏈綆鍗曠殑cache綆楁硶灝辨槸瀹氫箟涓涓獀oid* s_pageCache[50000]鏁扮粍錛岄〉闈㈡暟鐩稿悓鐨勫唴瀛樼粍鎴愪竴涓摼琛紝鎸傚湪涓涓暟緇勯」涓嬶紝榪欎釜寰堝儚STL鐨勫皬鍐呭瓨澶勭悊錛屾垜浠彲浠ュ皢mmap鍑烘潵鐨勫唴瀛樼殑 鍓嶉潰鍑犱釜瀛楄妭(涓涓寚閽堝ぇ灝?鐢ㄤ簬绱㈠紩涓嬩竴涓猣reePage銆傚綋鐒惰繖涓繃紼嬮渶瑕佸姞閿侊紝涓嶈兘鐢╬thread鐨勯攣錛堝洜涓轟粬浠細璋冪敤malloc絳夊唴瀛樺垎閰嶅嚱鏁幫級錛屽繀欏葷敤spinlock錛屼粠linux婧愮爜閲岀洿鎺ユ妱涓涓繃鏉ュ嵆鍙?br />static void* s_pagePool[MAX_PAGE_ALLOC]={0}; malloc鐨勬椂鍊欙紝鍏堜粠pagePool閲岄潰鑾峰彇: // 鍏堜粠pagePool鎵?br /> void* pFreePage = NULL; spin_lock(&s_pageHeapLock); assert(nPageNum < MAX_PAGE_ALLOC); if(s_pagePool[nPageNum]) { pFreePage = s_pagePool[nPageNum]; void* pNextFreePage = *((void**)pFreePage); s_pagePool[nPageNum] = pNextFreePage; } spin_unlock(&s_pageHeapLock); free鍐呭瓨鐨勬椂鍊欙紝鐩存帴鏀懼埌pagePoll閲? spin_lock(&s_pageHeapLock); assert(nPageNum < MAX_PAGE_ALLOC); void* pNextFree = s_pagePool[nPageNum]; *(void**)pAddress = pNextFree; s_pagePool[nPageNum] = pAddress; spin_unlock(&s_pageHeapLock); 緙栬瘧銆佽繍琛?OK浜嗭紝CPU榪呴熼檷涓嬫潵浜嗭紝絀鴻澆鐨勬椂鍊欎笉鍒?%,鑰屼笖涔熻兘杈懼埌媯嫻嬪啓婧㈠嚭鐨勯棶棰樸?br /> ]]> core鍜孋allStack http://m.shnenglu.com/feixuwu/archive/2011/04/10/143871.htmlfeixuwu feixuwu Sun, 10 Apr 2011 06:47:00 GMT http://m.shnenglu.com/feixuwu/archive/2011/04/10/143871.html http://m.shnenglu.com/feixuwu/comments/143871.html http://m.shnenglu.com/feixuwu/archive/2011/04/10/143871.html#Feedback 0 http://m.shnenglu.com/feixuwu/comments/commentRss/143871.html http://m.shnenglu.com/feixuwu/services/trackbacks/143871.html 鏈榪戦」鐩紑濮嬮泦涓祴璇曚簡錛屾湇鍔″櫒紼嬪簭緇忓父crash錛岀敱浜庢湇鍔″櫒涓鑸儏鍐典笅閮芥槸鍏抽棴浜哻ore鐨勶紝鎵浠ュソ鍑犳閮藉彧鑳介氳繃鏉備貢鐨勬棩蹇楁潵瀹氫綅闂銆?br>褰撶劧錛屾垜浠彲浠ラ氳繃ulimit鏉ユ墦寮core寮鍏籌紝涓嶈繃榪欏彲鑳藉甫鏉ユ柊鐨勯棶棰橈細鎴戜滑鐨勬湇鍔″櫒紼嬪簭姣忎釜core鏂囦歡澶ф鏈?G澶氾紝嫻嬭瘯鏈熼棿濡傛灉棰戠箒crash,娌℃湁娉ㄦ剰鍙婃椂娓呯悊錛屼竴涓嶅皬蹇冨氨浼氭妸紓佺洏鍐欐弧錛?br>鑰屼笖core鏂囦歡姣曠珶鏄拰榪涚▼紼嬪簭鐩稿叧鐨勶紝鏈夋椂鍊欐壘鐩稿簲鐗堟湰涔熸槸涓夯鐑︿簨銆?br> 鑳藉惁鍦ㄧ▼搴廲rash鐨勬椂鍊欙紝灝哻allStack浠ュ強鍙傛暟鍜屽眬閮ㄥ彉閲忛兘璁板綍鍒版棩蹇楅噷錛?br>榪欎釜鎶鏈叾瀹炲湪娓告垙瀹㈡埛绔凡緇忕敤浜嗗緢澶氬勾浜嗭紝涓鑸父鎴忓鎴風crash鍚庯紝閮戒細寮瑰嚭涓涓槸鍚﹀彂閫侀敊璇殑閫夋嫨妗嗭紝鍏跺疄灝辨槸鍙戦佺殑CallStack鐨勬棩蹇楀拰MiniDUmp鏂囦歡銆?br>瑕佹兂璁板綍CallStack灝卞繀鐒舵秹鍙婂埌Stack鐨勯亶鍘嗭紝linux涓嬬殑Stack閬嶅巻浣跨敤寰堢畝鍗曪紝綆鍗曠殑backtrace灝卞彲浠ユ悶瀹氾紝man backtrace灝辨湁鐜版垚鐨勪緥瀛愶紝 榪欐瘮windows涓嬪鏉傜殑澶寸柤鐨凷tackWalk濂界敤鐨勫銆?br> 瑙e喅浜哠tack閬嶅巻闂鍚庯紝榪樺墿涓嬩竴涓棶棰橈細濡備綍鍦ㄧ▼搴廲rash鐨勬椂鍊欏緱鍒伴氱煡鎵ц鎴戜滑鑷繁鐨刣ump浠g爜錛?br>鍦╓indwos涓嬫湁SEH寮傚父鏉ュ疄鐜拌繖涓姛鑳斤紝鑰宭inux涓嬪彲浠ラ氳繃浣跨敤淇″彿鍦ㄨ繘紼媍rash鐨勬椂鍊欐墽琛岃嚜宸辯殑澶勭悊浠g爜銆?br> 濂戒簡錛屽紑濮嬪啓涓畝鍗曚唬鐮佹祴璇曚笅: 棣栧厛璁劇疆鍑犱釜涓昏crash淇″彿鐨勫鐞嗗嚱鏁?br>signal(SIGSEGV, &DumpHelper::OnCrash); signal(SIGABRT, &DumpHelper::OnCrash); signal(SIGFPE, &DumpHelper::OnCrash); 鍦∣nCrash閲屾垜浠敤鍓嶉潰鎻愬埌鐨刡acktrace緋誨垪鍑芥暟錛屾潵璁板綍鍫嗘爤: void* szStackFrame[100]; int nFrameCount = backtrace(szStackFrame, 100); char** strFrameInfo = backtrace_symbols(szStackFrame, nFrameCount); char szDumpFileName[1024] = {0}; snprintf(szDumpFileName, sizeof(szDumpFileName), "dump_%u.log", (unsigned int)time(NULL) ); FILE* pFile = fopen(szDumpFileName, "wb"); if(!pFile) return; for(int i = 0; i < nFrameCount; i++) { fprintf(pFile, "%s\n", strFrameInfo[i]); } fclose(pFile); free(strFrameInfo); 鎺ョ潃錛岃緗嚑涓祵濂楄皟鐢ㄧ殑鍑芥暟錛?br>void fun() { //assert(0); int* p = NULL; *p =3; }
void fun1() { fun(); }
void fun2() { fun1(); }
void fun3() { fun2(); } 鏈鍚庯紝鎴戜滑鍦╩ain鍑芥暟閲屾墽琛宖un3,娉ㄦ剰緙栬瘧鐨勬椂鍊欏甫涓?rdynamic 閫夐」銆?span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">
榪愯涓嬶紝鏋滅劧鍙互鎵撳嵃鍩烘湰鐨勫爢鏍堬紝涓嶈繃椹笂錛屽彂鐜頒簡鏂扮殑闂錛氳繖涓爢鏍堜俊鎭篃澶畝闄嬩簡錛屽彧鏈夎皟鐢ㄥ嚱鏁扮殑鍚嶅瓧錛屽叾浣欑殑鍙傛暟銆佸眬閮ㄥ彉閲忓畬鍏ㄦ病鏈夛紝 榪欎釜鍜実db鑳界湅鍒扮殑callStack宸窛涔熷お澶т簡銆?br>瑙e喅榪欎釜闂鏈綆鍗曠殑鍔炴硶灝辨槸鐢╣db鏉ユ墦鍗板爢鏍?鍦ㄨ繖閲岋紝gdb鍜屽叾浠栫▼搴忔湁鍖哄埆錛屽鏋滀綘璇曞浘閫氳繃 echo "bt"|gdb -p XXX>a.txt鏉ヨ幏寰楀爢鏍堬紝閭e皢浼氶潪甯稿け鏈涳紝 鏍規湰涓嶈搗浣滅敤錛実oogle浜嗕笅錛屽熀鏈病浠涔堣В鍐沖姙娉曘?br>涓嶈繃gdb 鍙互浠庢枃浠惰鍏ユ寚浠わ紝渚嬪 gdb XXX<cmddata錛岃繖緇欎簡鎴戜滑鏈轟細錛?br>system("echo \"bt full|gcore\">testcmd"); char dbx[160]={0}; sprintf(dbx, "gdb -p %d ./main<testcmd >gdbdump_%d.log", getpid(), getpid() ); system(dbx); 嫻嬭瘯榪愯錛屽彂鐜板彲浠ユ墦鍗拌緇嗙殑鍫嗘爤錛屼笉榪囷紝瑕佹眰鏈哄櫒涓婃湁gdb. 涓婇潰鐨勫懡浠よ繕dump浜嗕竴涓猚ore鏂囦歡錛屼笉榪囪繖涓猚ore鏂囦歡鐨勫爢鏍堜俊鎭槸閿欒鐨勶紝鎴戜笉鐭ラ亾涓轟粈涔堛傘傘傘?br> 澶氱嚎紼嬬幆澧冧笅浣跨敤涓婅堪鍔炴硶錛屽彧鑳借緭鍑轟竴涓嚎紼嬬殑鍫嗘爤錛岄渶瑕佸厛鑾峰彇綰跨▼鏁扮洰錛岀劧鍚庨愪釜綰跨▼鎵撳嵃鍫嗘爤銆?br> 鏈鍚庯紝涓轟簡閬垮厤褰卞搷姝e父鐨刢oredump,瑕佸湪OnCrash鐨勫鐞嗗嚱鏁伴噷灝嗕俊鍙風殑澶勭悊鍑芥暟璁劇疆涓洪粯璁ゃ?br>濡傛灉鎴戜竴瀹氳鏈塩ore鍛紝setrlimit鍚э紝鍘繪帀core闄愬埗鍗沖彲銆?/span>
]]>GCC欏圭洰緙栬瘧閫熷害浼樺寲 http://m.shnenglu.com/feixuwu/archive/2011/03/19/142210.htmlfeixuwu feixuwu Sat, 19 Mar 2011 08:39:00 GMT http://m.shnenglu.com/feixuwu/archive/2011/03/19/142210.html http://m.shnenglu.com/feixuwu/comments/142210.html http://m.shnenglu.com/feixuwu/archive/2011/03/19/142210.html#Feedback 5 http://m.shnenglu.com/feixuwu/comments/commentRss/142210.html http://m.shnenglu.com/feixuwu/services/trackbacks/142210.html 鎵ц鏂囦歡錛屽熀鏈笉鑰冭檻緙栬瘧鎴愬姩鎬佸簱錛屾墍鏈変唬鐮佺殑澶存枃浠朵緷璧栦篃鏄竴鍥㈢碂錛岄殢鐫欏圭洰鐨勫澶э紝緙栬瘧閫熷害瓚婃潵瓚婃參錛屽埌鍚庢潵緙栬瘧涓涓」鐩?榪涚▼鍚屾椂緙栬瘧閮介渶瑕?0鏉ュ垎閽熴?br> 鍏跺疄鍒嗘瀽涓嬪彲浠ュ彂鐜幫紝涓昏鐨勭紪璇戦熷害鎹熻楀湪澶存枃浠朵笂錛屽挨鍏舵槸妯℃澘鐩稿叧鐨勫ご鏂囦歡銆俈C鏈変竴涓緙栬瘧澶存枃浠舵妧鏈紝灝嗗父鐢ㄧ殑鍏叡澶存枃浠舵斁鍦ㄤ竴璧鳳紝棰勫厛緙栬瘧鎴恜ch鏂囦歡錛岃繖鏍?br>鍙互鍔犲揩緙栬瘧閫熷害銆俫cc鍒板簳鏈夋病鏈夌被浼兼妧鏈憿錛屾墦寮gcc鐨勬墜鍐屾悳绱簡precompiled錛屽彂鐜拌繕鐪熸湁鐩稿叧浠嬬粛錛屼嬌鐢ㄦ柟娉曚篃寰堢畝鍗曘?br> 涓昏鏄互涓嬫楠わ細 1銆佸湪欏圭洰涓嬪緩绔嬩竴涓?stdafx.h鐨勬枃浠訛紝鍖呭惈浜嗗ぇ閮ㄥ垎鍏叡澶存枃浠躲傚湪姣忎釜cpp鏈寮濮嬮兘#include "stdafx.h"銆俢pp鏂囦歡鍖呭惈浜嗚繖涓緙栬瘧澶存枃浠跺悗錛屽氨鍙互灝嗗師鏉ュ拰 stdafx .h 閲屽ご鏂囦歡閲嶅鐨勫唴瀹瑰垹闄や簡錛屽挨鍏舵槸妯℃澘鐩稿叧鐨勫ご鏂囦歡錛屽彟澶栵紝闈濸CH鐨勫ご鏂囦歡閲屽敖閲忓皯鍖呭惈鍏朵粬澶存枃浠躲?nbsp; 2銆佷慨鏀筸akefile鏂囦歡, 鍔犲叆OBJ瀵?gch鐨勪緷璧?鐢ㄤ竴涓畝鍗曠殑欏圭洰鍋氱ず渚嬶紝涓鐪嬪氨鏄庣櫧
TARGET=TimerTest PCH=stdafx.h.gch PCH_H=stdafx.h OBJ=stdafx.o TimerManager.o TimerTest.o %.o:%.cpp g++ -Wall -c -g $^ -o $@ $(TARGET):$(OBJ) g++ -g $^ -o $@ pch.d:stdafx.cpp g++ -g -MM stdafx.cpp |sed 's/stdafx.o/stdafx.h.gch/'>$@ -include pch.d $(OBJ):$(PCH) $(PCH): g++ $(PCH_H) clean: rm -f $(OBJ) $(PCH)
瀹屾垚浠ヤ笂鍐呭鍚庯紝make clean,鍐嶉噸鏂扮紪璇戯紝鍒濇浼拌鍙渶瑕?鍒嗛挓錛侊紒 鏁存暣浼樺寲浜?-5鍊嶃?br>
]]> 瀹氭椂鍣ㄧ殑瀹炵幇 http://m.shnenglu.com/feixuwu/archive/2011/03/13/141744.htmlfeixuwu feixuwu Sun, 13 Mar 2011 14:06:00 GMT http://m.shnenglu.com/feixuwu/archive/2011/03/13/141744.html http://m.shnenglu.com/feixuwu/comments/141744.html http://m.shnenglu.com/feixuwu/archive/2011/03/13/141744.html#Feedback 0 http://m.shnenglu.com/feixuwu/comments/commentRss/141744.html http://m.shnenglu.com/feixuwu/services/trackbacks/141744.html 娌℃湁瀹氭椂鍣紝鎵鏈夐渶瑕佸畾鏃剁殑浠誨姟錛岄兘鍙兘娣誨姞綾諱技OnUpdate鐨勫嚱鏁幫紝鍦ㄤ富寰幆鐨勬椂鍊欐墽琛屻傚畾鏃墮渶姹傚皯鐨勬椂鍊欙紝鐪嬩笉鍑烘槑鏄劇殑闂錛屼絾鏄竴鏃﹁繖縐嶉渶姹傚浜嗭紝灝ゅ叾鏄緢澶氬唴閮ㄥ璞℃湁瀹氭椂闇姹傜殑鏃跺欙紝 榪欎釜闂灝辨瘮杈冩槑鏄句簡錛屽啓濂戒簡OnUpdate鍚庯紝榪樿寤虹珛涓鏉′粠涓誨驚鐜疢ainLoop鍒拌嚜韜玂nUpdate鐨勮皟鐢ㄩ摼銆?br> 浜嬩歡鍏跺疄灝辨槸涓涓箍鎾拰璁㈤槄鐨勫叧緋伙紝Delegate灝辨槸瀹炵幇榪欐牱涓濂楁満鍒剁殑鍒╁櫒錛岀洰鍓岲elegate鐨勫疄鐜頒富瑕佹湁2縐嶏紝涓縐嶆槸CodeProject涓婄殑涓涓狥astDelegate瀹炵幇錛屽彟澶栦竴涓瘮杈冨吀鍨嬬殑瀹炵幇灝辨槸boost鐨?br>瀹炵幇浜嗭紝鏃犺閲囧彇鍝瀹炵幇鏂規錛屽疄鐜伴毦搴﹂兘涓嶇畻澶ぇ銆?br> Server褰撳墠妗嗘灦瀵瑰畾鏃跺櫒鏃犱換浣曟敮鎸侊紝鍙湁涓涓狣oMainLoop鐨勫嚱鏁板彲浠ユ淳鐢熸潵榪愯鑷繁鐨勫畾鏃墮昏緫銆?br> 鎴戝師鏉ラ兘鏄敤鐨凙CE灝佽鐨勭粍浠訛紝鐢ㄤ簡涓孌墊椂闂翠篃娌″彂鐜版槑鏄鵑棶棰橈紝涓嶈繃ACE鐨勫畾鏃跺櫒涓嶅お閫傚悎鍦ㄨ繖涓柊欏圭洰鐢紝涓昏鍘熷洜鏈夊涓嬪嚑鐐癸細 1銆丄CE搴撳お澶т簡錛屼笉鎯充粎浠呬負浜嗗畾鏃跺櫒寮曞叆涓涓繖涔堝簽澶х殑搴撱?br> 2銆丄CE鐨勫畾鏃跺櫒闇瑕侀澶栧惎鍔ㄤ竴涓畾鏃跺櫒綰跨▼錛屽畾鏃朵換鍔℃槸鍦ㄥ畾鏃跺櫒綰跨▼璺戠殑錛岃屾垜浠殑欏圭洰閫昏緫鍏跺疄鏄湪鍗曚釜綰跨▼榪愯鐨勶紝濡傛灉鐩存帴閲囩敤ACE瀹氭椂鍣紝浼氱粰閫昏緫甯︽潵棰濆鐨勫鏉傚害銆傜敱浜庢暣涓昏緫綰跨▼鐨勬鏋舵槸鍏叡妯″潡錛屾墜澶翠篃娌℃湁浠g爜錛屾墍浠ュ皢瀹氭椂鍣ㄧ嚎紼嬬殑浠誨姟鍙戦佸埌涓婚昏緫綰跨▼榪愯涔熸槸涓嶅彲琛岀殑銆?br> 3銆丄CE鐨勫畾鏃跺櫒鏈夊緢澶氱錛孴IMER_QUEUE銆乀IMER_WHELL銆乀IMER_HEAP絳夛紝涓漢鎰熻榪欎簺瀹氭椂鍣ㄧ殑鎻掑叆銆佸彇娑堟搷浣滈兘姣旇緝鑰楁椂錛屽姞浠ユ敼瑁呮斁鍒頒富綰跨▼run鐨勫甫浠峰皢浼氬緢澶с?br> 鍏跺疄linux鍐呮牳灝辨湁涓涓瘮杈冮珮鎬ц兘鐨勫畾鏃跺櫒錛屼唬鐮佸湪kernel/Timer.c閲岋紝 2.6鍐呮牳鐨勫畾鏃跺櫒浠g爜鏇存槸綆媧併?br>linux鐨勫畾鏃朵換鍔¢兘鏄互jiffie
涓哄崟浣嶇殑錛宭inux灝嗘墍鏈夊畾鏃朵換鍔″垎涓?涓樁姊紝 struct tvec { struct list_head vec[TVN_SIZE]; }; struct tvec_root { struct list_head vec[TVR_SIZE]; }; struct tvec_base { spinlock_t lock; struct timer_list *running_timer; unsigned long timer_jiffies; struct tvec_root tv1; struct tvec tv2; struct tvec tv3; struct tvec tv4; struct tvec tv5; } ____cacheline_aligned;
瀵逛竴涓柊鐨勫畾鏃朵換鍔★紝澶勭悊鏂規硶濡備笅: static void internal_add_timer(struct tvec_base *base, struct timer_list *timer) { unsigned long expires = timer->expires; unsigned long idx = expires - base->timer_jiffies; struct list_head *vec; if (idx < TVR_SIZE) { int i = expires & TVR_MASK; vec = base->tv1.vec + i; } else if (idx < 1 << (TVR_BITS + TVN_BITS)) { int i = (expires >> TVR_BITS) & TVN_MASK; vec = base->tv2.vec + i; } else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) { int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK; vec = base->tv3.vec + i; } else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) { int i = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK; vec = base->tv4.vec + i; } else if ((signed long) idx < 0) { /* * Can happen if you add a timer with expires == jiffies, * or you set a timer to go off in the past */ vec = base->tv1.vec + (base->timer_jiffies & TVR_MASK); } else { int i; /* If the timeout is larger than 0xffffffff on 64-bit * architectures then we use the maximum timeout: */ if (idx > 0xffffffffUL) { idx = 0xffffffffUL; expires = idx + base->timer_jiffies; } i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK; vec = base->tv5.vec + i; } /* * Timers are FIFO: */ list_add_tail(&timer->entry, vec); } 浠庝笂鍙互鐪嬪埌Linux瀵瑰畾鏃跺櫒鐨勫鐞嗭細瀵瑰嵆灝嗗湪TVR_SIZE
涓猨iffies鍐呭埌杈劇殑瀹氭椂浠誨姟錛屽皢瀹冩寕鍒扮涓緇則v1
涓嬶紝鍏蜂綋灝辨槸鎸傚埌expires & TVR_MASK
瀵瑰簲鐨勫垪琛ㄤ笂鍘匯?br>鍚屼竴涓猨iffies鍒拌揪鐨勫畾鏃跺櫒鏄寕鍦ㄥ悓涓涓摼琛ㄧ殑銆?br>鍚岀悊錛屾寕鍒扮浜屼釜緇勭殑鏄?鍒版湡鏃墮棿灝忎簬 1 << (TVR_BITS + TVN_BITS) jiffies鐨勩?br>鎸傚埌絎笁涓粍鐨勬槸 鍒版湡鏃墮棿灝忎簬1 << (TVR_BITS + 2 * TVN_BITS)
jiffies鐨勩?br>鎸傚埌絎洓涓粍鐨勬槸 鍒版湡鏃墮棿灝忎簬 1 << (TVR_BITS + 3 * TVN_BITS)
jiffies鐨勩?br>瓚呰繃1 << (TVR_BITS + 3 * TVN_BITS) 鐨勬寕鍒扮浜旂粍銆?br>榪欐牱錛屾墍鏈夊埌鏈熺殑浠誨姟閮戒細鍦ㄧ涓緇勩備換浣曟椂鍒婚兘鍙互鐩存帴閫氳繃褰撳墠jiffies&TVR_SIZE
鏉ユ壘鍒伴渶瑕佽繍琛岀殑瀹氭椂鍣ㄤ換鍔″垪琛紝瀹氭椂鍣ㄧ殑鎻掑叆鏁堢巼灝辨槸O(1)銆?br> 涓嬮潰鏄畾鏃跺櫒鐨勮繍琛屼唬鐮侊細 static int cascade(struct tvec_base *base, struct tvec *tv, int index) { /* cascade all the timers from tv up one level */ struct timer_list *timer, *tmp; struct list_head tv_list; list_replace_init(tv->vec + index, &tv_list); /* * We are removing _all_ timers from the list, so we * don't have to detach them individually. */ list_for_each_entry_safe(timer, tmp, &tv_list, entry) { BUG_ON(tbase_get_base(timer->base) != base); internal_add_timer(base, timer); } return index; } #define INDEX(N) ((base->timer_jiffies >> (TVR_BITS + (N) * TVN_BITS)) & TVN_MASK) /** * __run_timers - run all expired timers (if any) on this CPU. * @base: the timer vector to be processed. * * This function cascades all vectors and executes all expired timer * vectors. */ static inline void __run_timers(struct tvec_base *base) { struct timer_list *timer; spin_lock_irq(&base->lock); while (time_after_eq(jiffies, base->timer_jiffies)) { struct list_head work_list; struct list_head *head = &work_list; int index = base->timer_jiffies & TVR_MASK; /* * Cascade timers: */ if (!index && (!cascade(base, &base->tv2, INDEX(0))) && (!cascade(base, &base->tv3, INDEX(1))) && !cascade(base, &base->tv4, INDEX(2))) cascade(base, &base->tv5, INDEX(3)); ++base->timer_jiffies; list_replace_init(base->tv1.vec + index, &work_list); while (!list_empty(head)) { void (*fn)(unsigned long); unsigned long data; timer = list_first_entry(head, struct timer_list,entry); fn = timer->function; data = timer->data; timer_stats_account_timer(timer); set_running_timer(base, timer); detach_timer(timer, 1); spin_unlock_irq(&base->lock); { int preempt_count = preempt_count(); fn(data); if (preempt_count != preempt_count()) { printk(KERN_ERR "huh, entered %p " "with preempt_count %08x, exited" " with %08x?\n", fn, preempt_count, preempt_count()); BUG(); } } spin_lock_irq(&base->lock); } } set_running_timer(base, NULL); spin_unlock_irq(&base->lock); } 褰撶涓緇勮繍琛屽畬涓杞悗錛岄渶瑕佸皢tv2鐨勪竴緇勬柊鐨勫畾鏃朵換鍔″姞鍒扮涓緇勩傝繖灝卞ソ姣旀椂閽熺殑鎸囬拡錛岀閽堣繍琛屼竴鍦堝悗錛屽垎閽堟榪涗竴鏍鹼紝鍚庣畫鐨勮皟鏁撮兘鏄被浼箋?
cascade
灝辨槸璐熻矗灝嗕笅涓緇勭殑瀹氭椂浠誨姟娣誨姞鍒板墠闈㈢殑浠誨姟闃舵銆傚彧鏈夊綋絎竴杞殑瀹氭椂浠誨姟鍏ㄩ儴榪愯瀹屾瘯鍚庯紝鎵嶄細闇瑕佷粠絎簩杞皟鍏ユ柊鐨勪換鍔★紝鍙湁絎簩綰у埆鐨勪換鍔¢兘璋冨叆瀹屾瘯鍚庯紝鎵嶉渶瑕佷粠絎笁杞殑瀹氭椂浠誨姟璋冨叆鏂扮殑浠誨姟錛?br> if (!index && (!cascade(base, &base->tv2, INDEX(0))) && (!cascade(base, &base->tv3, INDEX(1))) && !cascade(base, &base->tv4, INDEX(2))) cascade(base, &base->tv5, INDEX(3));
榪欏氨鏄礋璐h皟鏁寸殑浠g爜錛岀浉褰撶殑綆媧併?br>鍙傜収涓婅堪浠g爜瀹炵幇涓涓畾鏃跺櫒鍚庯紝鍔犲叆4000涓畾鏃朵換鍔★細 for(int i = 1; i < 4000; i++) { g_TimerHandle[i] = g_timerManager.setTimer(&tmpSink1, i, i*10, "ss"); }
浠?0姣鍒?000*10姣,榪愯鍚庯紝嫻嬭瘯涓嬫ц兘錛?br>鍑芥暟鍚?nbsp; 鎵ц嬈℃暟 鏈灝忔椂闂?nbsp; 騫沖潎鏃墮棿 鏈澶ф椂闂?br>TimerManager::runTimer 2170566 10 10 3046 鍙互鐪嬪埌錛岄櫎浜嗕釜鍒椂闂存槸鍥犱負綰跨▼鍒囨崲瀵艱嚧鏁版嵁姣旇緝澶у,騫沖潎姣忔榪愯runTimer鐨勬椂闂存槸10寰銆?br>榪欎釜鏃墮棿榪樺寘鎷瘡涓畾鏃跺櫒鐨勬墽琛屾秷鑰楋紝鏁堢巼榪樻槸涓嶉敊鐨勩?br> ]]> Ogre鍒濅綋楠?/title> http://m.shnenglu.com/feixuwu/archive/2010/09/25/127669.htmlfeixuwu feixuwu Sat, 25 Sep 2010 13:44:00 GMT http://m.shnenglu.com/feixuwu/archive/2010/09/25/127669.html http://m.shnenglu.com/feixuwu/comments/127669.html http://m.shnenglu.com/feixuwu/archive/2010/09/25/127669.html#Feedback 1 http://m.shnenglu.com/feixuwu/comments/commentRss/127669.html http://m.shnenglu.com/feixuwu/services/trackbacks/127669.html 鍋氬畬浜嗚繖浜涗箣鍚庯紝鏈兂涓烘垜鐨凱SP灞卞涓涓柊鍓戜緺鎯呯紭銆備笉鏂欏悗鏉ヨ繛緇姞浜嗗ソ鍑犲ぉ鐝紝鍔犱簡鍑犲ぉ鐝箣鍚庯紝浜轟篃鎳掍簡錛屽北瀵ㄦ父鎴忕殑浜嬫儏涔熷氨鏃犵柧鑰岀粓浜嗐?br>鍓嶉潰鍐欒繃鍑犵瘒閫嗗悜宸ョ▼鐨勬枃绔狅紝鍓嶅嚑澶╃炕鍑烘潵鐪嬩簡涓嬶紝鎰熻鍍忔槸鍙︿竴涓漢鍐欑殑澶╀功錛屾垜鑷繁鐪嬭嚜宸辯殑鏂囩珷灝氫笖濡傛錛屽埆浜哄氨鏇翠笉鐢ㄨ浜嗭紝鍏跺疄瀵瑰ぇ閮ㄥ垎浜鴻岃█錛屽叧蹇冪殑鍙槸閫嗗悜鐨勬垚鏋溿傚鏂板墤渚犳儏緙樼殑璧勬簮鍜岀浉鍏蟲覆鏌撴劅鍏磋叮鐨勬湅鍙嬪彲浠ュ崟鐙珽mail鎴戙? 寮濮嬮槄璇籓gre浠g爜姝f槸鍦ㄨ繖鐧炬棤鑱婅禆鐨勭姸鎬佷笅寮濮嬬殑錛孫gre鎺ㄥ嚭鏉ュ緢澶氬勾浜嗭紝璨屼技05騫村氨鍚鏈嬪弸璇磋搗榪囪繖涓」鐩紝涓嶈繃鎴戜竴鍚戞槸涓撴敞鏈嶅姟绔紑鍙戯紝瀵瑰鎴風寮鍙戠粡楠屼笉鏄緢澶氾紝鍦?D棰嗗煙灝卞畬鍏ㄦ槸鐨勬柊鎵嬩簡錛屾墍浠ヤ竴鐩翠篃娌′粩緇嗙爺絀躲傝繖鍑犲ぉ鎷胯搗鍘熸潵涓嬭澆鐨勪竴涓増鏈紝綆鍗曡浜嗕笅浠g爜銆?br>Ogre鐨勭粨鏋勮繕鏄緢娓呮櫚鐨勶紝鍜屾墜鍐屼笂璇寸殑涓鏍鳳紝涓昏灝辨槸閭e嚑涓璞★紝Demo澶ч儴鍒嗕篃寰堢畝鍗曪紝浠g爜閲忎笉澶氾紝鐪嬭搗鏉ュ緢鎸浜哄績銆?br>浣嗘槸瀵規垜榪欐牱鐨勬柊鎵嬫潵璇達紝棣栧厛鎯充簡瑙g殑褰撶劧鏄覆鏌撴祦紼嬨?Ogre鐨勬覆鏌撴祦紼嬬‘瀹炰細璁?D鏂版墜涓嶉傚簲錛屽畠鏄粠RenderTarget寮濮嬬殑錛屼竴涓猂enderTarget鍙互鏈夊嚑涓猇iewPort錛屾瘡涓猇iewPort閮芥湁涓涓嫭绔嬬殑鎽勫儚鏈猴紝榪欏彲浠ュ疄鐜板悓灞忓箷澶氫釜娓叉煋銆?br>閫氳繃ViewPort瀵硅薄鐨剈pdate璋冪敤 mCamera->_renderScene(this, mShowOverlays);
鏉ユ墽琛屽満鏅覆鏌擄紝鑰屽満鏅覆鏌撻噷錛屾渶閲嶈鐨勮綆梍findVisibleObjects浜嗭紝 榪欎釜鍑芥暟灝嗗彲瑙佺殑鐗╀綋娣誨姞鍒版覆鏌撻槦鍒楅噷錛岃繖涓嚱鏁伴潪甯哥殑緇曪紝閲岄潰榪樼敤鍒頒簡Vistor,綺劇涓嶅ソ瀹規槗琚粫鏅曪紝濂藉湪鎴戞尯浣忎簡錛岀啲榪囨潵浜嗐?br>鐔熸倝浜嗗ぇ鑷寸殑娓叉煋嫻佺▼鍚庯紝鎴戣寰楄鍐欑偣涓滆タ鏉ュ疄鎴樹簡銆?br>3D鏁欑▼鐨勫紑濮嬩竴鑸細鏁欏ぇ瀹剁敾涓夎褰紝鎵浠ユ垜涔熸兂鐢∣gre鐢諱釜涓夎褰㈢帺鐜╋紝 涓寮濮嬶紝鎴戜篃鎯充粠鍍忛偅浜汥emo涓鏍蜂粠ExampleApplication緇ф壙錛屼笉榪囨垜鍙戠幇榪欐牱鍚姩澶參浜嗭紝鑰屼笖鎴戜笉闇瑕佸姞杞介偅涔堝鐨勬潗璐紝 鎵浠ヨ嚜宸辨墜鍔–onfigure浜嗭紝浠g爜濡備笅: Ogre::LogManager* pLogManager = new Ogre::LogManager; Ogre::Log* pLog = pLogManager->createLog("ogreLearn1.log"); pLog->setDebugOutputEnabled(true); Ogre::Root* pRootObject = new Ogre::Root; pRootObject->loadPlugin("RenderSystem_Direct3D9_d.dll"); pRootObject->loadPlugin("Plugin_OctreeSceneManager_d.dll"); Ogre::RenderSystem* pRenderSystem = pRootObject->getRenderSystemByName("Direct3D9 Rendering Subsystem"); pRenderSystem->setConfigOption("Full Screen", "False"); pRootObject->setRenderSystem(pRenderSystem); Ogre::RenderWindow* pRenderWindow = pRootObject->initialise(true); 緙栬瘧嫻嬭瘯浜嗕笅錛屽彲浠ユ甯歌繍琛岋紝涓嶈繃鍙戠幇灞忓箷鏄姳鐨勶紝鎴戣繕娌℃湁鍒涘緩鍦烘櫙鍛紝緇х畫娣誨姞鎽勫儚鏈哄拰ViewPort浠ュ強鍦烘櫙 // 鍒涘緩鍦烘櫙鍜屾憚鍍忔満浠ュ強ViewPort Ogre::SceneManager* pSceneManager = pRootObject->createSceneManager(Ogre::ST_GENERIC, "OgreLearn1"); Ogre::Camera* pCamera = pSceneManager->createCamera("MainCamara"); pCamera->setPosition(0.0, 0.0, -20.0); pCamera->lookAt(0, 0, 0); pCamera->setNearClipDistance(2); Ogre::Viewport* pViewPort = pRenderWindow->addViewport(pCamera); pViewPort->setBackgroundColour(Ogre::ColourValue(0, 0, 0, 1.0f) ); pCamera->setAspectRatio(pViewPort->getActualWidth()/pViewPort->getActualHeight() );
鏈鍚庡姞涓妏RootObject->startRendering();
緙栬瘧榪愯錛屼竴鍒囨甯革紝灞忓箷棰滆壊涔熷彉鎴愪簡鎯寵鐨勯粦鑹詫紝鎭╋紝涓嬩竴姝ヨ娣誨姞涓夎褰簡錛屾垜涓嶅お鍠滄鐢∣greManualObject錛屼竴鍫嗙殑綣佺悙鎿嶄綔銆傝繖閲岀敤鑷畾涔夌殑Mesh鏉ョ粯鍒?瑙掑艦銆?br>pSceneManager->setAmbientLight(Ogre::ColourValue(0.2, 0.2, 0.2) ); Ogre::MeshPtr pMeshData = Ogre::MeshManager::getSingleton().createManual("Learn", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); Ogre::SubMesh* pSubMesh = pMeshData->createSubMesh(); pSubMesh->useSharedVertices = false; pSubMesh->vertexData = new Ogre::VertexData; pSubMesh->vertexData->vertexStart = 0; pSubMesh->vertexData->vertexCount = 3;
鍏堣緗簡鐜鍏?鍏跺疄娌″暐鐢紝鎴戝悗闈細紱佹)錛岀劧鍚庡垱寤轟簡涓涓嚜瀹氫箟鐨凪esh, 绱ф帴鐫鐨勬槸鍒涘緩涓涓猄ubMesh錛岃鐭ラ亾Ogre涓渶灝忕殑緗戞牸灝辨槸SubMesh,鍒涘緩濂絊ubMesh鍚庯紝瑕佸~鍏呯綉鏍肩粨鏋勪簡錛?br>鍒涘緩浜嗕竴涓猇ertexData,璁劇疆欏剁偣鏁扮洰涓?錛堜篃灝辨槸涓涓笁瑙掑艦錛夛紝涓嬮潰璇ュ畾涔夐《鐐規牸寮忎簡錛?br>Ogre::VertexDeclaration* pDecle = pSubMesh->vertexData->vertexDeclaration; size_t sOffset = 0; pDecle->addElement(0, sOffset, Ogre::VET_FLOAT3, Ogre::VES_POSITION); sOffset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3); pDecle->addElement(0, sOffset, Ogre::VET_COLOUR, Ogre::VES_DIFFUSE); sOffset += Ogre::VertexElement::getTypeSize(Ogre::VET_COLOUR);
涓婅堪浠g爜瀹氫箟浜嗛《鐐規牸寮忥紝鍙湁鍩烘湰鐨勫潗鏍囧拰棰滆壊銆?br>涓嬩竴姝ュ皢鏄敵璇鋒樉瀛橈紝濉厖欏剁偣緇撴瀯銆?br>Ogre::HardwareVertexBufferSharedPtr vBuf = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(sOffset, 3, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY); float* pReal = static_cast<float*>(vBuf->lock(Ogre::HardwareBuffer::HBL_DISCARD)); Ogre::RGBA* pColor = NULL; *pReal++ = -2.0f; *pReal++ = 0.0f; *pReal++ = 0.0f; pColor = (Ogre::RGBA*)pReal; pRenderSystem->convertColourValue(Ogre::ColourValue(1.0f, 0.0, 0, 0.0f), pColor); pReal = (float*)(pColor+1); *pReal++ = 0.0f; *pReal++ = 2.0f; *pReal++ = 0.0f; pColor = (Ogre::RGBA*)pReal; pRenderSystem->convertColourValue(Ogre::ColourValue(0.0f, 0, 1.0, 1.0f), pColor); pReal = (float*)(pColor+1); *pReal++ = 2.0f; *pReal++ = 0.0f; *pReal++ = 0.0f; pColor = (Ogre::RGBA*)pReal; pRenderSystem->convertColourValue(Ogre::ColourValue(1.0f, 0, 0, 1.0f), pColor); pReal = (float*)(pColor+1); vBuf->unlock(); pSubMesh->vertexData->vertexBufferBinding->setBinding(0, vBuf); pMeshData->load(); pMeshData->_setBounds(Ogre::AxisAlignedBox(-2, 0, -1, 2, 2, 1) ); 濉厖欏剁偣鍚庯紝璁劇疆緗戞牸鍖呭洿鐩掞紝榪欐牱涓涓嚜瀹氫箟鐨勭綉鏍煎氨鍒涘緩濂戒簡錛屾帴涓嬫潵瑕佸垱寤轟竴涓嬌鐢ㄨ緗戞牸鐨勫疄浣撲簡 Ogre::Entity* pEntity = pSceneManager->createEntity("TestEntity", "Learn"); pEntity->setMaterialName("BaseWhiteNoLighting"); pSceneManager->getRootSceneNode()->createChildSceneNode()->attachObject(pEntity); pEntity->getParentNode()->setPosition(3, 0, 0); pEntity->getParentNode()->rotate(Ogre::Quaternion(1.0f, 1.0f, 0, 1.0f) );
濂戒簡錛岃繖鏍峰疄浣撲篃鍒涘緩濂戒簡錛屾帴涓嬫潵鎵ц娓叉煋鍚э細 pRootObject->startRendering();
閬囧埌鐨勯棶棰?/h2>
涓婅堪浠g爜鏄繍琛屾甯哥殑錛屼絾鏄竴寮濮嬶紝鎴戞墽琛岀殑緇撴灉鏄湅涓嶅埌浠諱綍涓滆タ錛岃窡韙簡涓嬶紝鍙戠幇瀹炰綋姣忔閮借鎽勫儚鏈鴻鍓簡錛屾墠鍙戣鑷畾涔塎esh瑕佽嚜宸辮緗寘鍥寸洅瀛愶紝 璁劇疆鍙寘鍥寸洅瀛愩?br> 璁劇疆浜嗗寘鍥寸洅鍚庯紝鏁版嵁宸茬粡榪涘叆浜咲3D鐨勬覆鏌撶閬擄紝浣嗘槸榪樻槸娌$湅鍒頒笁瑙掑艦錛屼粩緇嗚瀵燂紝鍘熸潵鎽勫儚鏈哄鐫鐨勬槸涓夎褰㈢殑鑳岄潰銆傘傘?br>璋冩暣鎽勫儚鏈哄悗錛岀粓浜庤兘鐪嬪埌涓涓笁瑙掑艦浜嗭紝涓嶈繃鏄櫧鑹茬殑銆傘傘?br>浠庤繖涓棁鐘剁湅錛屽簲璇ユ槸娌℃湁鍏抽棴鍏夌収瀵艱嚧鐨勶紝浣嗘槸鎴戞槑鏄庝富鍔ㄨ皟鐢≧enderSystem鍏抽棴鍏夌収浜嗗晩錛屼粩緇嗚窡韙簡涓嬪師鏉ユ槸鏉愯川鍦ㄦ崳涔憋紝 榛樿鐨勬潗璐ㄦ槸寮鍚簡鍏夌収鐨勶紝鎵浠ュ湪娓叉煋鍓嶇殑SceneManager::_setPass
鐨勬椂鍊欙紝寮鍚簡鍏夌収銆?br>榪欏ソ鍔烇紝涓誨姩璁劇疆浜嗗叧闂厜鐓х殑鏉愯川"BaseWhiteNoLighting" 鍚庯紝緇堜簬鐪嬪埌浜嗗僵鑹蹭笁瑙掑艦浜嗐?br> ]]> select 鍜?epoll http://m.shnenglu.com/feixuwu/archive/2010/07/10/119995.htmlfeixuwu feixuwu Sat, 10 Jul 2010 10:40:00 GMT http://m.shnenglu.com/feixuwu/archive/2010/07/10/119995.html http://m.shnenglu.com/feixuwu/comments/119995.html http://m.shnenglu.com/feixuwu/archive/2010/07/10/119995.html#Feedback 1 http://m.shnenglu.com/feixuwu/comments/commentRss/119995.html http://m.shnenglu.com/feixuwu/services/trackbacks/119995.html 浠婂ぉ闂叉潵鏃犱簨錛岀炕鐪嬩簡涓嬪唴鏍鎬唬鐮侊紝緇撳悎鍐呮牳浠g爜鍜屽ぇ瀹跺垎浜笅鎴戠殑瑙傜偣銆?br>
涓銆佽繛鎺ユ暟
鎴戞湰浜轟篃鏇劇粡鍦ㄩ」鐩腑鐢ㄨ繃select鍜宔poll,瀵逛簬select錛屾劅瑙︽渶娣辯殑鏄痩inux涓媠elect鏈澶ф暟鐩檺鍒?windows 涓嬩技涔庢病鏈夐檺鍒?錛屾瘡涓繘紼嬬殑select鏈澶氳兘澶勭悊FD_SETSIZE涓狥D(鏂囦歡鍙ユ焺)錛?br>濡傛灉瑕佸鐞嗚秴榪?024涓彞鏌勶紝鍙兘閲囩敤澶氳繘紼嬩簡銆?br>甯歌鐨勪嬌鐢╯lect鐨勫榪涚▼妯″瀷鏄繖鏍風殑錛?涓涓繘紼嬩笓闂╝ccept錛屾垚鍔熷悗灝唂d閫氳繃unix socket浼犻掔粰瀛愯繘紼嬪鐞嗭紝鐖惰繘紼嬪彲浠ユ牴鎹瓙榪涚▼璐熻澆鍒嗘淳銆傛浘緇忕敤榪?涓埗榪涚▼+4涓瓙榪涚▼ 鎵胯澆浜嗚秴榪?000涓殑璐熻澆銆?br>榪欑妯″瀷鍦ㄦ垜浠綋鏃剁殑涓氬姟榪愯鐨勯潪甯稿ソ銆俥poll鍦ㄨ繛鎺ユ暟鏂歸潰娌℃湁闄愬埗錛屽綋鐒跺彲鑳介渶瑕佺敤鎴瘋皟鐢ˋPI閲嶇幇璁劇疆榪涚▼鐨勮祫婧愰檺鍒躲?br>
浜屻両O宸埆
1銆乻elect鐨勫疄鐜?/h2>
榪欐鍙互緇撳悎linux鍐呮牳浠g爜鎻忚堪浜嗭紝鎴戜嬌鐢ㄧ殑鏄?.6.28錛屽叾浠?.6鐨勪唬鐮佸簲璇ュ樊涓嶅鍚с?br>鍏堢湅鐪媠elect: select緋葷粺璋冪敤鐨勪唬鐮佸湪fs/Select.c涓嬶紝 asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp) { struct timespec end_time, *to = NULL; struct timeval tv; int ret; if (tvp) { if (copy_from_user(&tv, tvp, sizeof(tv))) return -EFAULT; to = &end_time; if (poll_select_set_timeout(to, tv.tv_sec + (tv.tv_usec / USEC_PER_SEC), (tv.tv_usec % USEC_PER_SEC) * NSEC_PER_USEC)) return -EINVAL; } ret = core_sys_select(n, inp, outp, exp, to); ret = poll_select_copy_remaining(&end_time, tvp, 1, ret); return ret; }
鍓嶉潰鏄粠鐢ㄦ埛鎺т歡鎷瘋礉鍚勪釜fd_set鍒板唴鏍哥┖闂達紝鎺ヤ笅鏉ョ殑鍏蜂綋宸ヤ綔鍦╟ore_sys_select涓紝 core_sys_select->do_select,鐪熸鐨勬牳蹇冨唴瀹瑰湪do_select閲岋細 int do_select(int n, fd_set_bits *fds, struct timespec *end_time) { ktime_t expire, *to = NULL; struct poll_wqueues table; poll_table *wait; int retval, i, timed_out = 0; unsigned long slack = 0; rcu_read_lock(); retval = max_select_fd(n, fds); rcu_read_unlock(); if (retval < 0) return retval; n = retval; poll_initwait(&table); wait = &table.pt; if (end_time && !end_time->tv_sec && !end_time->tv_nsec) { wait = NULL; timed_out = 1; } if (end_time && !timed_out) slack = estimate_accuracy(end_time); retval = 0; for (;;) { unsigned long *rinp, *routp, *rexp, *inp, *outp, *exp; set_current_state(TASK_INTERRUPTIBLE); inp = fds->in; outp = fds->out; exp = fds->ex; rinp = fds->res_in; routp = fds->res_out; rexp = fds->res_ex; for (i = 0; i < n; ++rinp, ++routp, ++rexp) { unsigned long in, out, ex, all_bits, bit = 1, mask, j; unsigned long res_in = 0, res_out = 0, res_ex = 0; const struct file_operations *f_op = NULL; struct file *file = NULL; in = *inp++; out = *outp++; ex = *exp++; all_bits = in | out | ex; if (all_bits == 0) { i += __NFDBITS; continue; } for (j = 0; j < __NFDBITS; ++j, ++i, bit <<= 1) { int fput_needed; if (i >= n) break; if (!(bit & all_bits)) continue; file = fget_light(i, &fput_needed); if (file) { f_op = file->f_op; mask = DEFAULT_POLLMASK; if (f_op && f_op->poll) mask = (*f_op->poll)(file, retval ? NULL : wait); fput_light(file, fput_needed); if ((mask & POLLIN_SET) && (in & bit)) { res_in |= bit; retval++; } if ((mask & POLLOUT_SET) && (out & bit)) { res_out |= bit; retval++; } if ((mask & POLLEX_SET) && (ex & bit)) { res_ex |= bit; retval++; } } } if (res_in) *rinp = res_in; if (res_out) *routp = res_out; if (res_ex) *rexp = res_ex; cond_resched(); } wait = NULL; if (retval || timed_out || signal_pending(current)) break; if (table.error) { retval = table.error; break; } /* * If this is the first loop and we have a timeout * given, then we convert to ktime_t and set the to * pointer to the expiry value. */ if (end_time && !to) { expire = timespec_to_ktime(*end_time); to = &expire; } if (!schedule_hrtimeout_range(to, slack, HRTIMER_MODE_ABS)) timed_out = 1; } __set_current_state(TASK_RUNNING); poll_freewait(&table); return retval; }
涓婇潰鐨勪唬鐮佸緢澶氾紝鍏跺疄鐪熸鍏抽敭鐨勪唬鐮佹槸榪欎竴鍙? mask = (*f_op->poll)(file, retval ? NULL : wait);
榪欎釜鏄皟鐢ㄦ枃浠剁郴緇熺殑 poll鍑芥暟錛屼笉鍚岀殑鏂囦歡緋葷粺poll鍑芥暟鑷劧涓嶅悓錛岀敱浜庢垜浠繖閲屽叧娉ㄧ殑鏄痶cp榪炴帴錛岃宻ocketfs鐨勬敞鍐屽湪 net/Socket.c閲屻?br>register_filesystem(&sock_fs_type);
socket鏂囦歡緋葷粺鐨勫嚱鏁頒篃鏄湪net/Socket.c閲岋細 static const struct file_operations socket_file_ops = { .owner = THIS_MODULE, .llseek = no_llseek, .aio_read = sock_aio_read, .aio_write = sock_aio_write, .poll = sock_poll, .unlocked_ioctl = sock_ioctl, #ifdef CONFIG_COMPAT .compat_ioctl = compat_sock_ioctl, #endif .mmap = sock_mmap, .open = sock_no_open, /* special open code to disallow open via /proc */ .release = sock_close, .fasync = sock_fasync, .sendpage = sock_sendpage, .splice_write = generic_splice_sendpage, .splice_read = sock_splice_read, }; 浠巗ock_poll璺熼殢涓嬪幓錛?br>鏈鍚庡彲浠ュ埌 net/ipv4/tcp.c鐨?br>unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
榪欎釜鏄渶緇堢殑鏌ヨ鍑芥暟錛?br>涔熷氨鏄select 鐨勬牳蹇冨姛鑳芥槸璋冪敤tcp鏂囦歡緋葷粺鐨刾oll鍑芥暟錛屼笉鍋滅殑鏌ヨ錛屽鏋滄病鏈夋兂瑕佺殑鏁版嵁錛屼富鍔ㄦ墽琛屼竴嬈¤皟搴︼紙闃叉涓鐩村崰鐢╟pu錛夛紝鐩村埌鏈変竴涓繛鎺ユ湁鎯寵鐨勬秷鎭負姝€?br>浠庤繖閲屽彲浠ョ湅鍑簊elect鐨勬墽琛屾柟寮忓熀鏈氨鏄笉鍚岀殑璋冪敤poll,鐩村埌鏈夐渶瑕佺殑娑堟伅涓烘錛屽鏋渟elect 澶勭悊鐨剆ocket寰堝錛岃繖鍏跺疄瀵規暣涓満鍣ㄧ殑鎬ц兘涔熸槸涓涓秷鑰椼?br>
2銆乪poll鐨勫疄鐜?/h2>
epoll鐨勫疄鐜頒唬鐮佸湪 fs/EventPoll.c涓嬶紝 鐢變簬epoll娑夊強鍒板嚑涓郴緇熻皟鐢紝榪欓噷涓嶉愪釜鍒嗘瀽浜嗭紝浠呬粎鍒嗘瀽鍑犱釜鍏抽敭鐐癸紝 絎竴涓叧閿偣鍦?br>static int ep_insert(struct eventpoll *ep, struct epoll_event *event, struct file *tfile, int fd)
榪欐槸鍦ㄦ垜浠皟鐢╯ys_epoll_ctl 娣誨姞涓涓綆$悊socket鐨勬椂鍊欒皟鐢ㄧ殑鍑芥暟錛屽叧閿殑鍑犺濡備笅錛?br>epq.epi = epi; init_poll_funcptr(&epq.pt, ep_ptable_queue_proc); /* * Attach the item to the poll hooks and get current event bits. * We can safely use the file* here because its usage count has * been increased by the caller of this function. Note that after * this operation completes, the poll callback can start hitting * the new item. */ revents = tfile->f_op->poll(tfile, &epq.pt);
榪欓噷涔熸槸璋冪敤鏂囦歡緋葷粺鐨刾oll鍑芥暟錛屼笉榪囪繖嬈″垵濮嬪寲浜嗕竴涓粨鏋勶紝榪欎釜緇撴瀯浼氬甫鏈変竴涓猵oll鍑芥暟鐨刢allback鍑芥暟錛歟p_ptable_queue_proc錛?br>鍦ㄨ皟鐢╬oll鍑芥暟鐨勬椂鍊欙紝浼氭墽琛岃繖涓猚allback錛岃繖涓猚allback鐨勫姛鑳藉氨鏄皢褰撳墠榪涚▼娣誨姞鍒?socket鐨勭瓑寰呰繘紼嬩笂銆?br>static void ep_ptable_queue_proc(struct file *file, wait_queue_head_t *whead, poll_table *pt) { struct epitem *epi = ep_item_from_epqueue(pt); struct eppoll_entry *pwq; if (epi->nwait >= 0 && (pwq = kmem_cache_alloc(pwq_cache, GFP_KERNEL))) { init_waitqueue_func_entry(&pwq->wait, ep_poll_callback); pwq->whead = whead; pwq->base = epi; add_wait_queue(whead, &pwq->wait); list_add_tail(&pwq->llink, &epi->pwqlist); epi->nwait++; } else { /* We have to signal that an error occurred */ epi->nwait = -1; } }
娉ㄦ剰鍒板弬鏁?whead
瀹為檯涓婃槸 sk->sleep錛屽叾瀹炲氨鏄皢褰撳墠榪涚▼娣誨姞鍒皊k鐨勭瓑寰呴槦鍒楅噷錛屽綋璇ocket鏀跺埌鏁版嵁鎴栬呭叾浠栦簨浠惰Е鍙戞椂錛屼細璋冪敤 sock_def_readable
鎴栬卻ock_def_write_space
閫氱煡鍑芥暟鏉ュ敜閱掔瓑寰呰繘紼嬶紝榪?涓嚱鏁伴兘鏄湪socket鍒涘緩鐨勬椂鍊欏~鍏呭湪sk緇撴瀯閲岀殑銆?br>浠庡墠闈㈢殑鍒嗘瀽鏉ョ湅錛宔poll紜疄鏄瘮select鑱槑鐨勫銆佽交鏉劇殑澶氾紝涓嶇敤鍐嶈嫤鍝堝搱鐨勫幓杞浜嗐?br> ]]> 鎺ㄨ崘涓涓法騫沖彴鍐呭瓨鍒嗛厤鍣?/title> http://m.shnenglu.com/feixuwu/archive/2010/07/10/119980.htmlfeixuwu feixuwu Sat, 10 Jul 2010 09:32:00 GMT http://m.shnenglu.com/feixuwu/archive/2010/07/10/119980.html http://m.shnenglu.com/feixuwu/comments/119980.html http://m.shnenglu.com/feixuwu/archive/2010/07/10/119980.html#Feedback 11 http://m.shnenglu.com/feixuwu/comments/commentRss/119980.html http://m.shnenglu.com/feixuwu/services/trackbacks/119980.html http://code.google.com/p/google-perftools/錛夛紝鎹google鐨勫緢澶氫駭鍝侀兘鐢ㄥ埌浜嗚繖涓唴瀛樺垎閰嶅簱錛岃屼笖緇忎粬嫻嬭瘯錛屾垜浠殑娓告垙瀹㈡埛绔泦鎴愪簡榪欎釜鏈鏂板唴瀛樺垎閰嶅櫒鍚庯紝FPS瓚寵凍鎻愰珮浜嗗皢榪?0甯у乏鍙籌紝榪欏彲鏄釜浜嗕笉璧風殑鎻愬崌錛岃鐭ラ亾3D緇勭殑鍏勫紵蹇欎簡鍑犲懆涔熸病瑙佽繖涔堝ぇ鐨勬ц兘鎻愬崌銆?br> 濡傛灉鎴戜滑鑷繁鏈韓鐢ㄧ殑crt鎻愪緵鐨勫唴瀛樺垎閰嶅櫒錛岃繖涓彁鍗囦篃綆椾笉寰椾粈涔堛傞棶棰樻槸鎴戜滑鍐呴儴緋葷粺鏄湁涓涓皬鍐呭瓨綆$悊鍣ㄧ殑錛屼竴鑸潵璇村皬鍐呭瓨鍒嗛厤鐨勭畻娉曢兘澶у悓灝忓紓錛岀幇鎴愮殑瀹炵幇涔熷緢澶氾紝姣斿linux鍐呮牳鐨剆lab銆丼GI STL鐨勫垎閰嶅櫒銆乷gre鑷甫鐨勫唴瀛樺垎閰嶅櫒錛屾垜浠嚜宸辯殑鍐呭瓨鍒嗛厤鍣ㄤ篃鍜屽墠闈㈠垪涓劇殑瀹炵幇宸笉澶氥傝鎴戜滑鏉ョ湅鐪嬭繖涓」鐩湁浠涔堢壒鍒殑鍚с?br>
涓銆佷嬌鐢ㄦ柟娉?/h1>
鎵撳紑涓婚〉錛岀敱浜庡叕鍙哥綉緇滅姝VN浠庡閮ㄦ洿鏂幫紝鎵浠ュ彧鑳戒笅杞戒簡鎵撳寘鐨勬簮浠g爜銆傝В鍘嬪悗錛岀湅鍒版湁涓猟oc鐩綍錛岃繘鍘伙紝鎵撳紑浣跨敤鏂囨。錛屽彂鐜頒嬌鐢ㄦ柟娉曟瀬涓虹畝鍗曪細 To use TCMalloc, just link TCMalloc into your application via the
"-ltcmalloc" linker flag.鍐嶇湅綆楁硶錛屼篃娌′粈涔堢壒鍒殑錛岃繕鏄拰slab浠ュ強SGI STL鍒嗛厤鍣ㄧ被浼肩殑綆楁硶銆?br>unix鐜灞呯劧鍙閾炬帴榪欎釜tcmalloc搴撳氨鍙互浜嗭紒錛屽お鏂逛究浜嗭紝涓嶈繃鎴戞墜澶存病鏈塴inux鐜錛屾枃妗d笂涔熸病鎻愬埌windows鐜鎬庝箞浣跨敤錛?br>鎵撳紑婧愪唬鐮佸寘錛屾湁涓獀s2003瑙e喅鏂規錛屾墦寮錛岄殢渚挎寫閫変竴涓祴璇曢」鐩紝鏌ョ湅欏圭洰灞炴э紝鍙戠幇浠呬粎鏈?鐐逛笉鍚岋細 1銆侀摼鎺ュ櫒鍛戒護琛岄噷澶氫簡 "..\..\release\libtcmalloc_minimal.lib"錛屽氨鏄摼鎺ョ殑鏃跺欎緷璧栦簡榪欎釜鍐呭瓨浼樺寲搴撱?br>2銆侀摼鎺ュ櫒->杈撳叆->寮哄埗絎﹀彿寮曠敤 澶氫簡 __tcmalloc銆?br>榪欐牱灝卞彲浠ユ紜殑浣跨敤tcmalloc搴撲簡錛屾祴璇曚簡涓嬶紝嫻嬭瘯欏圭洰榪愯OK!
浜屻佸浣曟浛鎹RT鐨刴alloc
浠庡墠闈㈢殑鎻忚堪鍙煡錛岄」鐩己鍒跺紩鐢ㄤ簡__tcmalloc錛?鎼滅儲浜嗘祴璇曚唬鐮侊紝娌″彂鐜扮敤鍒癬tcmalloc鐩稿叧鐨勫嚱鏁板拰鍙橀噺,榪欎釜閫夐」搴旇鏄負浜嗛槻姝ll琚紭鍖栨帀(鍥犱負浠g爜閲屾病鏈変粈涔堝湴鏂圭敤鍒拌繖涓猟ll鐨勭鍙?銆?br>鍒濈湅璧鋒潵錛岄摼鎺ヨ繖涓簱鍚庯紝涓嶄細褰卞搷浠諱綍鐜版湁浠g爜:鎴戜滑娌℃湁寮曠敤榪欎釜Lib搴撶殑澶存枃浠訛紝涔熸病鏈変嬌鐢ㄨ繃榪欎釜dll鐨勫鍑哄嚱鏁般傞偅涔堣繖涓猟ll鏄庝箞浼樺寲搴旂敤紼嬪簭鎬ц兘鐨勫憿錛?br>瀹為檯璋冭瘯錛屾灉鐒跺彂鐜伴棶棰樹簡錛岀湅鐪嬪涓嬩唬鐮?br> void* pData = malloc(100); 00401085 6A 64 push 64h 00401087 FF 15 A4 20 40 00 call dword ptr [__imp__malloc (4020A4h)] 璺熻釜 call malloc榪欏彞錛宻tep榪涘幓錛屽彂鐜版槸 78134D09 E9 D2 37 ED 97 jmp `anonymous namespace'::LibcInfoWithPatchFunctions<8>::Perftools_malloc (100084E0h) 鏋滅劧錛屼粠榪欓噷寮濮嬶紝灝辮煩杞埌libtcmalloc鎻愪緵鐨凱erftools_malloc浜嗐?br>鍘熸潵鏄氳繃API鎸傞挬鏉ュ疄鐜版棤緙濇浛鎹㈢郴緇熻嚜甯︾殑malloc絳塩rt鍑芥暟鐨勶紝鑰屼笖榪樻槸閫氳繃澶у鍏鐨勪笉鎺ㄨ崘鐨勬敼鍐欏嚱鏁板叆鍙f寚浠ゆ潵瀹炵幇鐨勶紝涓鑸彧鏈夊湪娓告垙澶栨寕鍜岄噾灞辮瘝闇鎬箣綾葷殑杞歡鎵嶄細鐢ㄥ埌榪欐牱鐨勬寕閽╂妧鏈紝 鑰屼笖閲戝北璇嶉湼緇忓父闇瑕佹洿鏂拌ˉ涓佽В鍐充笉鍚岀郴緇熷吋瀹歸棶棰樸?br>
涓夈佹ц兘宸埆鍘熷洜
濡傚墠闈㈡墍榪幫紝tcmalloc紜疄鐢ㄤ簡寰坔acker鐨勫姙娉曟潵瀹炵幇鏃犵紳鐨勬浛鎹㈢郴緇熻嚜甯︾殑鍐呭瓨鍒嗛厤鍑芥暟錛堟湰浜哄湪浣跨敤榪欑被鎶鏈氬父鏄敤鏉ュ共鍧忎簨鐨勩傘傘傦級錛屼絾鏄繖涔熶笉瓚充互瑙i噴涓轟粈涔堝畠鐨勬晥鐜囨瘮鎴戜滑鑷繁鐨勫ソ閭d箞澶氥?br>鍥炲埌tcmalloc 鐨勬墜鍐岋紝tcmalloc闄や簡浣跨敤甯歌鐨勫皬鍐呭瓨綆$悊澶栵紝瀵瑰綰跨▼鐜鍋氫簡鐗規畩澶勭悊錛岃繖鍜屾垜鍘熸潵瑙佸埌鐨勫唴瀛樺垎閰嶅櫒澶ф湁涓嶅悓錛屼竴鑸殑鍐呭瓨鍒嗛厤鍣ㄤ綔鑰呴兘浼氬伔鎳掞紝鎶婂綰跨▼闂鎵旂粰浣跨敤鑰咃紝澶у鏄姞 涓猙ool鍨嬬殑妯℃澘鍙傛暟鏉ヨ〃紺烘槸鍚︽槸澶氱嚎紼嬬幆澧冿紝榪樼編鍏跺悕鏇?鍙畾鍒訛紝鏈簡榪樺緱鍚瑰槝涓嬫ā鏉跨殑浼樿秺鎬с?br>tcmalloc鏄庝箞鍋氱殑鍛紵 絳旀鏄瘡綰跨▼涓涓猅hreadCache錛屽ぇ閮ㄥ垎鎿嶄綔緋葷粺閮戒細鏀寔thread local storage 灝辨槸浼犺涓殑TLS,榪欐牱灝卞彲浠ュ疄鐜版瘡綰跨▼涓涓垎閰嶅櫒浜嗭紝 榪欐牱錛屼笉鍚岀嚎紼嬪垎閰嶉兘鏄湪鍚勮嚜鐨則hreadCache閲屽垎閰嶇殑銆傛垜浠殑欏圭洰鐨勫垎閰嶅櫒鐢變簬鏄綰跨▼鐜鐨勶紝鎵浠ヤ笉綆′笁涓冧簩鍗佷竴錛屽叏閮藉姞閿佷簡錛屾ц兘鑷劧灝變綆浜嗐?br> 浠呬粎鏄姝わ紝榪樻槸涓嶈凍浠ュ皢tcmalloc鍜宲tmalloc2鍒嗕釜楂樹笅錛屽悗鑰呬篃鏄瘡涓嚎紼嬮兘鏈塼hreadCache鐨勩?br>鍏充簬榪欎釜闂錛宒oc閲屾湁涓孌佃鏄庯紝鍘熸枃璐村嚭鏉ワ細 ptmalloc2 also reduces lock contention by using per-thread arenas but
there is a big problem with ptmalloc2's use of per-thread arenas. In
ptmalloc2 memory can never move from one arena to another. This can
lead to huge amounts of wasted space. 澶ф剰鏄繖鏍風殑錛歱tmalloc2 涔熸槸閫氳繃tls鏉ラ檷浣庣嚎紼嬮攣錛屼絾鏄痯tmalloc2鍚勪釜綰跨▼鐨勫唴瀛樻槸鐙珛鐨勶紝涔熷氨鏄錛岀涓涓嚎紼嬬敵璇風殑鍐呭瓨錛岄噴鏀劇殑鏃跺欒繕鏄繀欏繪斁鍒扮涓涓嚎紼嬫睜涓紙涓嶅彲縐誨姩錛夛紝榪欐牱鍙兘瀵艱嚧澶ч噺鍐呭瓨嫻垂銆?br>
鍥涖佷唬鐮佺粏鑺?/h1>
1銆佹棤緙濇浛鎹alloc絳塩rt鍜岀郴緇熷垎閰嶅嚱鏁般?/h2>
鍓嶉潰鎻愬埌tcmalloc浼氭棤緙濈殑鏇挎崲鎺夊師鏈塪ll涓殑malloc錛岃繖灝辨剰鍛崇潃浣跨敤tcmalloc鐨勯」鐩繀欏繪槸 MD錛堝綰跨▼dll錛夋垨鑰匨Dd錛堝綰跨▼dll璋冭瘯錛夈倀cmalloc鐨刣ll瀹氫箟浜嗕竴涓?br>static TCMallocGuard module_enter_exit_hook; 鐨勯潤鎬佸彉閲忥紝榪欎釜鍙橀噺浼氬湪dll鍔犺澆鐨勬椂鍊欏厛浜嶥llMain榪愯錛屽湪榪欎釜綾葷殑鏋勯犲嚱鏁幫紝浼氳繍琛孭atchWindowsFunctions鏉ユ寕閽╂墍鏈塪ll鐨?malloc銆乫ree銆乶ew絳夊垎閰嶅嚱鏁幫紝榪欐牱灝辮揪鍒頒簡鏇挎崲鍔熻兘錛岄櫎姝や箣澶栵紝 涓轟簡淇濊瘉緋葷粺鍏煎鎬э紝鎸傞挬API鐨勬椂鍊欒繕瀹炵幇浜嗘櫤鑳藉垎鏋愭寚浠わ紝鍚﹀垯鍐欏叆絎竴鏉mp鎸囦護鐨勬椂鍊欏彲鑳戒細鐮寸幆鍚庣畫鎸囦護鐨勫畬鏁存с?br>
2銆丩ibcInfoWithPatchFunctions 鍜孴hreadCache銆?/h2>
LibcInfoWithPatchFunctions妯℃澘綾誨寘鍚玹cmalloc瀹炵幇鐨勪紭鍖栧悗鐨刴alloc絳変竴緋誨垪鍑芥暟銆侺ibcInfoWithPatchFunctions鐨勬ā鏉垮弬鏁板湪鎴戠湅鏉ユ病浠涔堢敤澶勶紝tcmalloc榛樿鍙互鎸傞挬 鏈澶?0涓甫鏈塵alloc瀵煎嚭鍑芥暟鐨勫簱(鎴戞兂鑲畾鏄鐢ㄤ簡)銆俆hreadCache鍦ㄦ瘡涓嚎紼嬮兘浼氭湁涓涓猅LS瀵硅薄錛?br>__thread ThreadCache* ThreadCache::threadlocal_heap_銆?br>
3銆佸彲鑳界殑闂
璁炬兂涓嬭繖鏍蜂竴涓儏鏅細鍋囧鏈変竴涓猟ll 鍦╰cmalloc涔嬪墠鍔犺澆錛屽茍涓斿湪鍒嗛厤浜嗗唴瀛橈紙浣跨敤crt鎻愪緵鐨刴alloc錛夛紝閭d箞鍦ㄥ姞杞絫cmalloc鍚庯紝tcmalloc浼氭浛鎹㈡墍鏈夌殑free鍑芥暟錛岀劧鍚庯紝鍦ㄦ煇涓椂鍒伙紝 鍦ㄥ墠闈㈢殑閭d釜dll浠g爜涓噴鏀捐鍐呭瓨錛岃繖宀備笉鏄緢鍗遍櫓銆傚疄闄呮祴璇曞彂鐜版病鏈変換浣曢棶棰橈紝鍏抽敭鍦ㄨ繖閲岋細 span = Static::pageheap()->GetDescriptor(p); if (!span) { // span can be NULL because the pointer passed in is invalid // (not something returned by malloc or friends), or because the // pointer was allocated with some other allocator besides // tcmalloc. The latter can happen if tcmalloc is linked in via // a dynamic library, but is not listed last on the link line. // In that case, libraries after it on the link line will // allocate with libc malloc, but free with tcmalloc's free. (*invalid_free_fn)(ptr); // Decide how to handle the bad free request return; }
tcmalloc浼氶氳繃span璇嗗埆榪欎釜鍐呭瓨鏄惁鑷繁鍒嗛厤鐨勶紝濡傛灉涓嶆槸錛宼cmalloc浼氳皟鐢ㄨdll鍘熷瀵瑰簲鍑芥暟(榪欎釜寰堥噸瑕?閲婃斁銆傝繖鏍峰氨瑙e喅浜嗚繖涓鎵嬬殑闂銆?br>
浜斻佸叾浠?/h1>
鍏跺疄tcmalloc浣跨敤鐨勬瘡涓妧鏈偣鎴戜粠鍓嶉兘鐢ㄨ繃錛屼絾鏄垜浠庢潵娌℃兂榪囩敤API鎸傞挬鏉ュ疄鐜拌繖鏍蜂竴涓湁瓚g殑鍐呭瓨浼樺寲搴擄紙鍗充嬌鎯寵繃錛屼篃鏄竴闂岃繃灝卞惁瀹氫簡錛夈?br>浠巘cmalloc寰楀埌鐏墊劅錛岀粨鍚堝父鐢ㄧ殑澶栨寕鎶鏈紝鍙互寰堣交鏉劇殑寮鍙戜竴涓嫭绔嬪伐鍏鳳細榪欎釜宸ュ叿鍙互鎸傝澆鍒版寚瀹氳繘紼嬭繘琛屽唴瀛樹紭鍖栵紝鍦ㄦ垜鐪嬫潵錛岃繖鍙兘鍙互浣滀負涓涓鎸傝緟鍔╁伐鍏鋒潵浼樺寲閭d簺 鍐呭瓨浼樺寲鍋氱殑寰堝樊瀵艱嚧甯ч熷緢浣庣殑鍥戒駭娓告垙銆?br> ]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
国产精品99久久久久久www |
欧美成人国产va精品日本一级 |
久久精品国产清自在天天线
|
久久躁狠狠躁夜夜爽 |
久久精品国产综合精品 |
久久精品一区二区三区中文字幕
|
国内精品国语自产拍在线观看 |
国产一区二区日韩精品 |
影音国产精品 |
亚洲系列中文字幕 |
欧美一区二区福利在线 |
免费在线欧美黄色 |
亚洲精品美女在线观看播放 |
亚洲婷婷免费 |
久久久精品日韩 |
欧美日韩岛国 |
国产亚洲激情 |
99精品国产热久久91蜜凸 |
亚洲欧美日韩成人高清在线一区 |
久久久久久久999精品视频 |
女人天堂亚洲aⅴ在线观看 |
亚洲人成毛片在线播放 |
午夜在线一区 |
欧美久久婷婷综合色 |
一区二区三区精品视频在线观看 |
欧美一区二区在线 |
欧美日韩视频第一区 |
国产区精品视频 |
av成人动漫 |
欧美二区在线观看 |
午夜久久久久久 |
欧美日韩国产欧美日美国产精品 |
国产一区二区三区的电影 |
夜夜嗨av色综合久久久综合网
|
一区二区三区四区国产精品 |
久久国产精品一区二区 |
国产精品高潮呻吟视频 |
亚洲人成绝费网站色www |
久久国产一区 |
在线视频欧美日韩 |
欧美精品三级 |
91久久精品视频 |
久久成人这里只有精品 |
99精品免费 |
久久久久久久91 |
一区二区电影免费观看 |
美日韩丰满少妇在线观看 |
国产日韩欧美二区 |
香蕉乱码成人久久天堂爱免费
|
午夜欧美大片免费观看 |
亚洲乱码国产乱码精品精 |
老巨人导航500精品 |
国产亚洲精品久久久久动 |
亚洲欧美综合国产精品一区 |
亚洲最新视频在线 |
欧美久久视频 |
亚洲一级网站 |
亚洲午夜久久久 |
国产精品二区影院 |
亚洲欧美日韩综合国产aⅴ |
一本色道久久加勒比88综合 |
欧美三级电影一区 |
一区二区三区不卡视频在线观看 |
亚洲激情婷婷 |
国产精品白丝jk黑袜喷水 |
亚洲与欧洲av电影 |
午夜精品久久久久久99热软件 |
国产精品爽爽ⅴa在线观看 |
午夜精品国产更新 |
欧美亚洲一级片 |
激情五月婷婷综合 |
欧美激情亚洲精品 |
欧美精品免费在线观看 |
亚洲在线观看 |
校园春色综合网 |
在线激情影院一区 |
亚洲精品在线一区二区 |
国产精品高潮在线 |
久久综合网络一区二区 |
欧美国产日韩一区二区在线观看
|
一区二区三区 在线观看视频 |
亚洲人成啪啪网站 |
欧美性淫爽ww久久久久无 |
欧美在线亚洲 |
麻豆精品网站 |
亚洲一区999 |
久久xxxx |
亚洲精品一二三 |
亚洲校园激情 |
亚洲欧洲在线一区 |
亚洲综合色在线 |
亚洲欧洲日本国产 |
亚洲综合成人婷婷小说 |
亚洲国产精品第一区二区 |
99国产精品国产精品久久
|
欧美一区二区免费 |
久久久噜噜噜久久 |
亚洲性夜色噜噜噜7777 |
久久久久国产精品人 |
国产精品成人aaaaa网站 |
欧美在线观看网址综合 |
免费精品99久久国产综合精品 |
亚洲视频一区二区 |
久久久国产亚洲精品 |
99re8这里有精品热视频免费 |
亚洲已满18点击进入久久 |
亚洲国产另类 国产精品国产免费 |
日韩视频一区二区三区 |
伊人久久大香线蕉综合热线 |
亚洲永久免费av |
99pao成人国产永久免费视频 |
欧美一级午夜免费电影 |
亚洲视频一区二区 |
免费不卡视频 |
久久久欧美精品sm网站 |
国产精品视频 |
一区二区三区高清不卡 |
亚洲欧洲三级 |
老司机精品福利视频 |
久久久人成影片一区二区三区观看
|
久久亚洲二区 |
久久福利一区 |
国产精品久久久久9999吃药 |
亚洲日本久久 |
亚洲精品国产精品乱码不99 |
久久嫩草精品久久久久 |
久久久久欧美精品 |
国产视频一区在线观看一区免费 |
制服丝袜亚洲播放 |
在线综合+亚洲+欧美中文字幕 |
免费精品视频 |
亚洲电影免费在线 |
亚洲欧洲日本一区二区三区 |
美女露胸一区二区三区 |
欧美二区不卡 |
99精品国产在热久久婷婷 |
欧美乱在线观看 |
日韩午夜精品视频 |
亚洲中午字幕 |
国产精品女同互慰在线看 |
亚洲一区二区在线播放 |
欧美一区二区日韩一区二区 |
国产欧美一区二区精品仙草咪 |
午夜在线电影亚洲一区 |
快she精品国产999 |
亚洲人成在线播放网站岛国 |
欧美日韩国产免费 |
亚洲一区视频 |
久久久综合精品 |
亚洲高清网站 |
欧美日韩精品系列 |
亚洲欧美国产精品专区久久 |
久久久久久国产精品mv |
91久久精品网 |
国产精品久久一卡二卡 |
久久精品国产999大香线蕉 |
欧美国产专区 |
亚洲一二三区在线 |
国产一区二区三区四区在线观看
|
国产精品国产三级国产专播精品人 |
亚洲久久视频 |
欧美一区二区三区四区在线观看地址
|
免费高清在线一区 |
亚洲精品乱码视频 |
欧美一站二站 |
亚洲国产人成综合网站 |
欧美午夜精品 |
久久久噜噜噜久久人人看 |
日韩亚洲视频在线 |
久久综合色天天久久综合图片 |
亚洲乱码国产乱码精品精天堂 |
国产精品久久久一本精品 |
另类尿喷潮videofree |
亚洲网站在线 |
亚洲国产精品va在线看黑人
|
一本色道精品久久一区二区三区
|
这里只有精品视频在线 |
毛片av中文字幕一区二区 |
一区二区三区日韩欧美精品 |
国产一区二区三区免费不卡 |
欧美日韩国产在线观看 |
久久精品夜色噜噜亚洲aⅴ |
一本久久综合 |
亚洲激情视频网站 |
卡通动漫国产精品 |
亚洲男人av电影 |
日韩一级大片在线 |
在线成人中文字幕 |
国产情侣久久 |
欧美午夜片在线免费观看 |
免费亚洲电影在线 |
久久久久免费 |
欧美在线精品免播放器视频 |
亚洲视频香蕉人妖 |
99精品国产一区二区青青牛奶
|
裸体一区二区 |
久久精品国产99 |
午夜精品久久久久久久男人的天堂
|
美女图片一区二区 |
久久精品国亚洲 |