句柄問題分析

什么是句柄

句柄就是一個對象的標識符,只要獲得對象的句柄业汰,我們就可以對對象進行任意的操作伙窃,包括窗口,按鈕样漆,圖標为障,輸出設備,控件或者文件等放祟;

句柄是一種特殊的智能指針鳍怨,用一個唯一的整數(shù)值標識一個對象(即編號),并不指向?qū)嶋H的內(nèi)核對象跪妥,而是內(nèi)核對象的虛擬地址鞋喇;

只有Windows中才有句柄,Windows中的句柄是指針的指針眉撵,因為windows中對象的經(jīng)常會在內(nèi)存中移動侦香,所以地址值經(jīng)常會變,所以就對外提供一個指針的指針即句柄給用戶纽疟,句柄的地址是不會變的罐韩。

Linux中是沒有文件句柄的,只有文件描述符污朽,只是大家習慣把它說成句柄伴逸,Linux中, 每當進程打開一個文件時膘壶,系統(tǒng)就為其分配一個唯一對應的整型文件描述符错蝴,用來標識這個文件;

Windows之所以要設立句柄颓芭,根本上源于內(nèi)存管理機制的問題—虛擬地址顷锰,簡而言之數(shù)據(jù)的地址需要變動,變動以后就需要有人來記錄管理變動亡问,(就好像戶籍管理一樣)官紫,因此系統(tǒng)用句柄來記載數(shù)據(jù)地址的變更肛宋。

Windows系統(tǒng)中有許多內(nèi)核對象(這里的對象不完全等價于"面向?qū)ο蟪绦蛟O計"一詞中的"對象",雖然實質(zhì)上還真差不多)束世,比如打開的文件酝陈,創(chuàng)建的線程,程序的窗口毁涉,等等沉帮。這些重要的對象肯定不是4個字節(jié)或者8個字節(jié)足以完全描述的,他們擁有大量的屬性贫堰。為了保存這樣一個"對象"的狀態(tài)穆壕,往往需要上百甚至上千字節(jié)的內(nèi)存空間,那么怎么在程序間或程序內(nèi)部的子過程(函數(shù))之間傳遞這些數(shù)據(jù)呢其屏?拖著這成百上千的字節(jié)拷貝來拷貝去嗎喇勋?顯然會浪費效率。那么怎么辦偎行?當然傳遞這些對象的首地址是一個辦法年叮,但這至少有兩個缺點:

暴露了內(nèi)核對象本身烹俗,使得程序(而不是操作系統(tǒng)內(nèi)核)也可以任意地修改對象地內(nèi)部狀態(tài)(首地址都知道了烁落,還有什么不能改的掠械?),這顯然是操作系統(tǒng)內(nèi)核所不允許的汗盘;

操作系統(tǒng)有定期整理內(nèi)存的責任皱碘,內(nèi)存管理器經(jīng)常在內(nèi)存中來回移動對象,依此來滿足各種應用程序的內(nèi)存需要隐孽,對象被移動意味著它的地址變化了癌椿,如果地址總是如此變化,我們該到哪里去找該對象呢??

所以菱阵,Windows操作系統(tǒng)就采用進一步的間接:在進程的地址空間中設一張表踢俄,表里頭專門保存一些編號和由這個編號對應一個地址,而由那個地址去引用實際的對象晴及,這個編號跟那個地址在數(shù)值上沒有任何規(guī)律性的聯(lián)系都办,純粹是個映射而已。這個編號就叫做"句柄"虑稼。


關于Windows句柄

Windows對象和句柄類型

Windows對象分為內(nèi)核對象琳钉、GDI對象和User對象:

內(nèi)核對象是不屬于進程的,是屬于windows內(nèi)核的蛛倦。進程只有一個內(nèi)核對象句柄表歌懒,用來存放所有的內(nèi)核對象句柄。所以溯壶,多個進程可以同時使用一個內(nèi)核對象 及皂,只要有句柄即可甫男。

對于GDI對象和User對象,他們是一個進程內(nèi)部擁有的東西验烧,不會被多個進程共有板驳。GDI對象與繪圖相關,而User對象與交互相關碍拆。

內(nèi)核對象如文件若治、進程、線程等倔监;GDI對象如字體、畫筆菌仁、位圖等浩习;User對象如圖標、菜單济丘、窗體等谱秽,不同對象對應著不同類型的句柄,如文件句柄摹迷、窗體句柄等疟赊;

查看句柄

通過任務管理器

查看句柄

通過Process Explorer工具,點擊進程右鍵峡碉、屬性近哟、性能選項卡查看:

查看句柄

Handles為內(nèi)核對像的句柄,包括文件句柄鲫寄,GDI 和User分別是GDI句柄和User句柄吉执。

修改句柄

文件句柄數(shù)默認為512,GDI句柄默認為10000地来,User句柄默認為10000戳玫;

GDI和User句柄可通過注冊表修改,修改“GDIProcessHandleQuota”與“USERProcessHandleQuota”注冊表項:

修改句柄


關于Linux句柄

Linux中類似Windowns句柄的是fd未斑,在Linux系統(tǒng)設計里面遵循一切都是文件的原則咕宿,即磁盤文件、目錄蜡秽、網(wǎng)絡套接字府阀、磁盤、管道等芽突,所有這些都是文件肌似,在我們進行打開的時候會返回一個fd,即是文件句柄诉瓦,Linux不存在具體的句柄類型川队。

查看句柄

ulimit?-n:查看當前用戶單個進程能夠打開的最大文件句柄數(shù)量(包括Socket鏈接)力细,默認是1024

lsof -n?|awk?'{print?$2}'|sort|uniq?-c?|sort?-nr|more:查看所有進程的句柄數(shù)量(降序排序)固额,第一列是句柄數(shù)眠蚂,第二列是PID;

lsof?-n|awk?'{print?$2}'|sort|uniq?-c|sort?-nr|more?|grep <pid>:查看某個進程的句柄數(shù)斗躏;

修改句柄

方法1:ulimit?-HSn?4096:修改句柄數(shù)為4096逝慧,僅對當前進程有效,關閉或重啟失效啄糙;

方法2:修改linux系統(tǒng)參數(shù)笛臣。vi /etc/security/limits.conf 添加

*  soft  nofile  2048

*  hard  nofile  32768?

就可以將文件句柄限制統(tǒng)一改成軟2048,硬32768隧饼,硬限制是實際的限制沈堡,而軟限制,是warnning限制燕雁,只會做出warning 诞丽;

修改以后保存,注銷當前用戶拐格,重新登錄僧免,執(zhí)行ulimit -a 查看當前狀態(tài)是否生效。


句柄問題

1. 句柄泄露:句柄只增不減捏浊,一般是由于各類資源未釋放懂衩,如Socket、文件等金踪;

2.?too many files open:這里的file不只是指文件勃痴,包括Socket連接等,當句柄數(shù)超過了限制热康,進程將無法獲取新的句柄沛申,而從導致不能打開新的文件或者網(wǎng)絡套接字,對于線上Server即會出現(xiàn)服務被拒絕的情況姐军;

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铁材,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奕锌,更是在濱河造成了極大的恐慌著觉,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惊暴,死亡現(xiàn)場離奇詭異饼丘,居然都是意外死亡,警方通過查閱死者的電腦和手機辽话,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門肄鸽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卫病,“玉大人,你說我怎么就攤上這事典徘◇翱粒” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵逮诲,是天一觀的道長帜平。 經(jīng)常有香客問我,道長梅鹦,這世上最難降的妖魔是什么裆甩? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮齐唆,結(jié)果婚禮上嗤栓,老公的妹妹穿的比我還像新娘。我一直安慰自己蝶念,他們只是感情好抛腕,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布芋绸。 她就那樣靜靜地躺著媒殉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摔敛。 梳的紋絲不亂的頭發(fā)上廷蓉,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音马昙,去河邊找鬼桃犬。 笑死,一個胖子當著我的面吹牛行楞,可吹牛的內(nèi)容都是我干的攒暇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼子房,長吁一口氣:“原來是場噩夢啊……” “哼形用!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起证杭,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤田度,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后解愤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镇饺,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年送讲,在試婚紗的時候發(fā)現(xiàn)自己被綠了奸笤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惋啃。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖揭保,靈堂內(nèi)的尸體忽然破棺而出肥橙,到底是詐尸還是另有隱情,我是刑警寧澤秸侣,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布存筏,位于F島的核電站,受9級特大地震影響味榛,放射性物質(zhì)發(fā)生泄漏椭坚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一搏色、第九天 我趴在偏房一處隱蔽的房頂上張望善茎。 院中可真熱鬧,春花似錦频轿、人聲如沸垂涯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耕赘。三九已至,卻和暖如春膳殷,著一層夾襖步出監(jiān)牢的瞬間操骡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工赚窃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留册招,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓勒极,卻偏偏與公主長得像是掰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辱匿,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容