最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【python】為什么線程比進(jìn)程快

2022-11-13 00:32 作者:阿提艾斯  | 我要投稿

????????面試的時(shí)候,面試官問了一個(gè)問題:python的多線程有GIL鎖,其實(shí)是偽并發(fā),為什么線程還是比進(jìn)程快?

????????剛聽到這個(gè)問題其實(shí)很容易想到第一層,因?yàn)榫€程切換比進(jìn)程切換快。緊接著面試官又問了:那為什么線程切換比進(jìn)程切換快呢?難住了,自己平時(shí)確實(shí)沒有細(xì)細(xì)想過,于是下來趕緊查了資料,了解了相關(guān)知識(shí)點(diǎn),如下:

????????首先需要知道一個(gè)概念,上下文切換。當(dāng)給了這個(gè)名詞,我會(huì)有一個(gè)自己的初步定義,舉個(gè)例子,我們正在洗衣服,衣服搓了一半,突然室友按門鈴,你要過去給室友開門。這就好比進(jìn)程切換,從洗衣服的進(jìn)程切換到開門的進(jìn)程。開完門,你還要切換回洗衣服的進(jìn)程,切換回洗衣服的進(jìn)程有什么條件呢?衣服還在盆里,盆里有水,有衣服,有洗衣液,衣服還處在你剛剛離開搓一半的狀態(tài),這一系列的條件就可以理解為上下文,相當(dāng)于某一刻的狀態(tài)快照。

????????回到計(jì)算機(jī)世界里,查到相關(guān)資料如下:

上下文切換,就是從一個(gè)可執(zhí)行進(jìn)程切換到另一個(gè)可執(zhí)行進(jìn)程,由定義在kernel/sched.c中的context_switch()函數(shù)負(fù)責(zé)處理。每當(dāng)一個(gè)新的進(jìn)程被選出來準(zhǔn)備投入運(yùn)行的時(shí)候,schedule()就會(huì)調(diào)用該函數(shù)。它完成了兩項(xiàng)基本的工作:

· 調(diào)用聲明在<asm/mmu_context.h>中的switch_mm(),該函數(shù)負(fù)責(zé)把虛擬內(nèi)存從上一個(gè)進(jìn)程映射切換到新進(jìn)程中。

· 調(diào)用聲明在<asm/system.h>中的switch_to(),該函數(shù)負(fù)責(zé)從上一個(gè)進(jìn)程的處理器狀態(tài)切換到新進(jìn)程的處理器狀態(tài)。這包括保存、恢復(fù)棧信息和寄存器信息,還有其他任何與體系結(jié)構(gòu)相關(guān)的狀態(tài)信息,都必須以每個(gè)進(jìn)程為對(duì)象進(jìn)行管理和保存。

--《Linux 內(nèi)核設(shè)計(jì)與實(shí)現(xiàn) 第3版》p51-p52?

????????由上面的資料可以看出,進(jìn)程的切換就是上下文的切換,而上下文的切換要做兩件事情:虛擬內(nèi)存的切換處理器狀態(tài)的切換。程序要運(yùn)行,最終還是要將虛擬內(nèi)存映射到物理內(nèi)存上的,這個(gè)映射過程就是頁表查詢機(jī)制,這個(gè)查詢過程比較慢,所以使用cache緩存常用的地址映射,可以加速頁表查詢。每個(gè)進(jìn)程都會(huì)維護(hù)這樣一個(gè)虛擬內(nèi)存映射到物理內(nèi)存的表,切換一次,頁表也要跟著切換,切換后cache里的地址映射相當(dāng)于要重新建立一次,那么虛擬地址轉(zhuǎn)換為物理地址就會(huì)變慢。

虛擬內(nèi)存映射到物理內(nèi)存

????????而線程切換和進(jìn)程切換最主要的一個(gè)區(qū)別就是:每個(gè)進(jìn)程都有自己的虛擬地址空間,進(jìn)程內(nèi)的線程共享進(jìn)程的虛擬地址空間,不需要進(jìn)行虛擬內(nèi)存的切換,這就在一定程度上減少了時(shí)間消耗。


????????以上大部分為自己的理解,有什么理解錯(cuò)誤的地方,可以一起討論~

???????????

????????

【python】為什么線程比進(jìn)程快的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
峡江县| 丹凤县| 景洪市| 黄石市| 扶风县| 镇原县| 昭平县| 华阴市| 亳州市| 曲阳县| 维西| 永善县| 上思县| 陕西省| 石门县| 彭州市| 来安县| 黑龙江省| 沁水县| 祥云县| 巨野县| 泌阳县| 卢氏县| 惠东县| 鄢陵县| 义乌市| 宝鸡市| 通渭县| 瑞安市| 江安县| 泽州县| 汾西县| 诸城市| 汉阴县| 景洪市| 纳雍县| 东城区| 文成县| 辰溪县| 东明县| 长宁区|