Python中的GIL和GC

GIL (Global Interpreter Lock) 全局解釋鎖

參考資料
每一個interpreter進程,只能同時僅有一個線程來執(zhí)行, 獲得相關(guān)的鎖, 存取相關(guān)的資源.
那么很容易就會發(fā)現(xiàn),如果一個interpreter進程只能有一個線程來執(zhí)行, 多線程的并發(fā)則成為不可能, 即使這幾個線程之間不存在資源的競爭.

    1. 并不是Python的特性喇澡,它是在實現(xiàn)Python解析器(CPython)時所引入的一個概念
    1. 一個防止多線程并發(fā)執(zhí)行機器碼的一個Mutex
    1. 設(shè)計初衷是屯蹦,解決線程間數(shù)據(jù)一致性和狀態(tài)同步的困難

改進:為了讓各個線程能夠平均利用CPU時間屎媳,python會計算當(dāng)前已執(zhí)行的微代碼數(shù)量,達到一定閾值后就強制釋放GIL甥捺。
而這時也會觸發(fā)一次操作系統(tǒng)的線程調(diào)度(當(dāng)然是否真正進行上下文切換由操作系統(tǒng)自主決定)。

問題: (前提單進程)

[單核多線程ok镀层,處理io密集型和文件密集型不錯]這種模式在只有一個CPU核心的情況下毫無問題镰禾。任何一個線程被喚起時都能成功獲得到GIL
(因為只有釋放了GIL才會引發(fā)線程調(diào)度)。

[多核單進程不好]但當(dāng)CPU有多個核心的時候唱逢,大部分情況下主線程已經(jīng)又再一次獲取到GIL了吴侦。這個時候被喚醒執(zhí)行的線程只能白白的浪費CPU時間,
看著另一個線程拿著GIL歡快的執(zhí)行著坞古。然后達到切換時間后進入待調(diào)度狀態(tài)备韧,再被喚醒,再等待痪枫,以此往復(fù)惡性循環(huán)织堂。

總結(jié):Python的多線程在多核CPU上,只對于IO密集型計算產(chǎn)生正面效果奶陈;而當(dāng)有至少有一個CPU密集型線程存在易阳,那么多線程效率會由于GIL而大幅下降。

2.1 引用計數(shù)RC(reference count) [解決垃圾回收]

-> 垃圾回收GC(garbage collection)
為了解決內(nèi)存泄露問題吃粒,采用了對象引用計數(shù)潦俺,并基于引用計數(shù)實現(xiàn)自動垃圾回收。

優(yōu)點:
雖然引用計數(shù)必須在每次分配和釋放內(nèi)存的時候加入管理引用計數(shù)的動作,然而與其他主流的垃圾收集技術(shù)相比黑竞,
引用計數(shù)有一個最大的有點捕发,即“實時性”,任何內(nèi)存很魂,一旦沒有指向它的引用扎酷,就會立即被回收。
而其他的垃圾收集計數(shù)必須在某種特殊條件下(比如內(nèi)存分配失敹舸摇)才能進行無效內(nèi)存的回收法挨。

缺點
循環(huán)引用問題

解決方案:“標(biāo)記-清除”,“分代回收”兩種收集技術(shù)幅聘。
參考文檔

2.1 標(biāo)記-清除 [解決循環(huán)引用]

可以包含其他對象引用的容器對象(比如:list凡纳,set,dict帝蒿,class荐糜,instance)都可能產(chǎn)生循環(huán)引用。
容器+可變變量

原理:并不改動真實的引用計數(shù)葛超,而是將集合中對象的引用計數(shù)復(fù)制一份副本暴氏,在副本上標(biāo)記清除。
對于副本做任何的改動绣张,都不會影響到對象生命走起的維護答渔。

計數(shù)副本的唯一作用是尋找root object集合(該集合中的對象是不能被回收的,根對象集合)侥涵。
當(dāng)成功尋找到root object集合之后沼撕,首先將現(xiàn)在的內(nèi)存鏈表一分為二,一條鏈表中維護root object集合芜飘,
成為root鏈表<不被清除的>务豺,而另外一條鏈表中維護剩下的對象,成為unreachable鏈表燃箭。
處理: 現(xiàn)在的unreachable可能存在被root鏈表中的對象冲呢,直接或間接引用的對象,
這些對象是不能被回收的招狸,一旦在標(biāo)記的過程中敬拓,發(fā)現(xiàn)這樣的對象,就將其從unreachable鏈表中移到root鏈表中裙戏;
當(dāng)完成標(biāo)記后乘凸,unreachable鏈表中剩下的所有對象就是名副其實的垃圾對象了,
接下來的垃圾回收只需限制在unreachable鏈表中即可累榜。

2.2 分代回收 [解決垃圾回收营勤,加快回收]

存活時間劃分為不同的集合灵嫌,"代"
背景: 當(dāng)需要回收的內(nèi)存塊越多時,垃圾檢測帶來的額外操作就越多葛作,而垃圾回收帶來的額外操作就越少寿羞。
為了提高垃圾收集的效率,采用“空間換時間的策略”赂蠢。

原理:將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時間劃分為不同的集合绪穆,每一個集合就成為一個“代”,
垃圾收集的頻率隨著“代”的存活時間的增大而減小虱岂。也就是說玖院,活得越長的對象,就越不可能是垃圾第岖,
就應(yīng)該減少對它的垃圾收集頻率难菌。

那么如何來衡量這個存活時間:通常是利用幾次垃圾收集動作來衡量,如果一個對象經(jīng)過的垃圾收集次數(shù)越多蔑滓,
可以得出:該對象存活時間就越長郊酒。0代,1代

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末键袱,一起剝皮案震驚了整個濱河市猎塞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杠纵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钩骇,死亡現(xiàn)場離奇詭異比藻,居然都是意外死亡,警方通過查閱死者的電腦和手機倘屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門银亲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纽匙,你說我怎么就攤上這事务蝠。” “怎么了烛缔?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵馏段,是天一觀的道長。 經(jīng)常有香客問我践瓷,道長院喜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任晕翠,我火速辦了婚禮喷舀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己硫麻,他們只是感情好爸邢,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拿愧,像睡著了一般杠河。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赶掖,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天感猛,我揣著相機與錄音,去河邊找鬼奢赂。 笑死陪白,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膳灶。 我是一名探鬼主播咱士,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轧钓!你這毒婦竟也來了序厉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤毕箍,失蹤者是張志新(化名)和其女友劉穎弛房,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體而柑,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡文捶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了媒咳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粹排。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涩澡,靈堂內(nèi)的尸體忽然破棺而出顽耳,到底是詐尸還是另有隱情,我是刑警寧澤妙同,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布射富,位于F島的核電站,受9級特大地震影響粥帚,放射性物質(zhì)發(fā)生泄漏辉浦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一茎辐、第九天 我趴在偏房一處隱蔽的房頂上張望宪郊。 院中可真熱鬧掂恕,春花似錦、人聲如沸弛槐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乎串。三九已至店枣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叹誉,已是汗流浹背鸯两。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留长豁,地道東北人钧唐。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像匠襟,于是被迫代替她去往敵國和親钝侠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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

  • [TOC] 內(nèi)存管理 一酸舍、托管堆基礎(chǔ) 在面向?qū)ο笾兴停總€類型代表一種可使用的資源,要使用該資源啃勉,必須為代表資源的類...
    _秦同學(xué)_閱讀 3,802評論 0 3
  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進行...
    月亮是我踢彎得閱讀 5,967評論 3 28
  • Java SE 基礎(chǔ): 封裝忽舟、繼承、多態(tài) 封裝: 概念:就是把對象的屬性和操作(或服務(wù))結(jié)合為一個獨立的整體淮阐,并盡...
    Jayden_Cao閱讀 2,109評論 0 8
  • 所有知識點已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數(shù)萧诫? 在 Jav...
    侯蛋蛋_閱讀 2,432評論 1 4
  • python內(nèi)存管理是通過引用計數(shù)來實現(xiàn)的。當(dāng)對象的引用計數(shù)為0時枝嘶,會被gc回收。 為了探索對象在內(nèi)存的存儲哑诊,我們...
    冬季戀歌1218閱讀 1,665評論 0 2