說(shuō)一說(shuō)Andorid的Context(上下文)

前言

Android中有一個(gè)常用的類(lèi)Context污抬,它貫穿著Android生命周期的始終骡尽。通常來(lái)講己沛,中文翻譯為“上下文”,字面理解就是Android運(yùn)行期間前后環(huán)境之間的聯(lián)系厚脉,例如可以通過(guò)它整個(gè)系統(tǒng)運(yùn)行時(shí)必要類(lèi)、常量值等胶惰,在需要的時(shí)候就可以通過(guò)context獲得傻工。
這樣說(shuō)或許還是不太容易理解。我們知道孵滞,Android的底層實(shí)現(xiàn)是Linux的中捆,所以這個(gè)“上下文”跟Linux中的上下文之間,有沒(méi)有什么聯(lián)系呢坊饶?或者說(shuō)理解Linux中的上下文對(duì)理解Android的Context有沒(méi)有幫助呢泄伪?我個(gè)人認(rèn)為還是有的。所以本文先從Linux的角度學(xué)習(xí)一個(gè)它的“上下文”的原理匿级,隨后再通過(guò)源碼的方式了解Android中的Context蟋滴。

Linux的上下文切換

為什么要進(jìn)行上下文切換

Linux是一個(gè)多任務(wù)系統(tǒng),可以支持大于cpu數(shù)量的任務(wù)同時(shí)運(yùn)行根蟹。不過(guò)這并不是真正的“同時(shí)”脓杉,只不過(guò)cpu會(huì)在極短的時(shí)間片上切換任務(wù),使得用戶(hù)看起來(lái)這些任務(wù)是在同時(shí)運(yùn)行简逮。
既然cpu要不斷地進(jìn)行任務(wù)切換球散,那么每個(gè)任務(wù)都有必要的信息需要保存和恢復(fù),否則下次切換回運(yùn)行時(shí)就不知道之前切換出去時(shí)的狀態(tài)了散庶。對(duì)于這種這些需要記錄蕉堰、保存的環(huán)境信息,我們稱(chēng)他們?yōu)椤吧舷挛摹薄?/p>

上下文的內(nèi)容
  1. cpu寄存器:容量小悲龟、速度快
  2. 程序計(jì)數(shù)器sp:指令位置

有了這兩個(gè)屋讶,就可以知道一個(gè)任務(wù)從哪里加載、運(yùn)行须教,從而使得原來(lái)的任務(wù)的狀態(tài)不受影響皿渗,可以繼續(xù)運(yùn)行斩芭。


CPU寄存器與SP寄存器

因此,cpu對(duì)任務(wù)的切換乐疆,就是不斷地保存划乖、恢復(fù)上下文的過(guò)程,也叫做上下文切換挤土。我們知道琴庵,Linux中存在進(jìn)程和線程兩個(gè)概念,在程序運(yùn)行時(shí)也會(huì)不斷地進(jìn)行進(jìn)程仰美、線程的切換迷殿,每次切換都會(huì)涉及到上下文。除此之外咖杂,計(jì)算機(jī)中還存在硬件中斷庆寺,用以執(zhí)行一些重要但耗時(shí)少的任務(wù),因此上下文切換存在三種類(lèi)別:程上下文切換翰苫、線程上下文切換中斷上下文切換止邮。

進(jìn)程上下文切換

Linux進(jìn)程分為用戶(hù)空間和內(nèi)核空間,內(nèi)核空間權(quán)限最高奏窑,可以訪問(wèn)所有資源导披,而用戶(hù)空間訪問(wèn)權(quán)限受限,必須通過(guò)系統(tǒng)調(diào)用才能通過(guò)內(nèi)核訪問(wèn)受限資源埃唯。

用戶(hù)態(tài)和內(nèi)核態(tài)

當(dāng)進(jìn)程在用戶(hù)態(tài)通過(guò)系統(tǒng)調(diào)用調(diào)用內(nèi)核態(tài)資源時(shí)撩匕,cpu會(huì)發(fā)生上下文切換。但這種切換是一個(gè)進(jìn)程內(nèi)部的切換墨叛,所以不會(huì)涉及到虛擬內(nèi)存等問(wèn)題:

  1. 保存cpu寄存器里原來(lái)用戶(hù)態(tài)的指令位置止毕,將cpu寄存器更新為內(nèi)核態(tài)指令位置,隨后執(zhí)行內(nèi)核態(tài)任務(wù)漠趁;
  2. 系統(tǒng)調(diào)用結(jié)束后扁凛,cpu恢復(fù)之前保存的用戶(hù)態(tài)指令,切換回用戶(hù)空間闯传,繼續(xù)執(zhí)行谨朝。

而進(jìn)程的上下文切換就不太一樣了,它要比用戶(hù)態(tài)和內(nèi)核態(tài)切換更多了保存進(jìn)程的甥绿、全局變量字币、虛擬空間以及內(nèi)核堆棧寄存器等。同理共缕,在加載新進(jìn)程時(shí)洗出,也要把新進(jìn)程的這些信息更新過(guò)來(lái)。注意图谷,進(jìn)程的切換只能發(fā)生在內(nèi)核態(tài)翩活,因?yàn)檫M(jìn)程是由內(nèi)核管理的阱洪,這也是與用戶(hù)、內(nèi)核態(tài)切換不一樣的地方菠镇。
頻繁切換進(jìn)程會(huì)耗費(fèi)大量資源澄峰、浪費(fèi)時(shí)間、效率低下辟犀,導(dǎo)致負(fù)載率升高。
還有一點(diǎn)需要知道绸硕,Linux通過(guò)TLB管理虛擬內(nèi)存與物理內(nèi)存之間的映射關(guān)系堂竟,它是由多個(gè)處理器共享的。因此玻佩,當(dāng)切換進(jìn)程任務(wù)出嘹,導(dǎo)致虛擬內(nèi)存更新,Linux需要及時(shí)更新TLB咬崔,而此時(shí)税稼,不但當(dāng)前cpu不能正常工作,其它c(diǎn)pu也是無(wú)法正常工作的垮斯,需要更新完畢后才可以繼續(xù)郎仆。

上下文切換時(shí)機(jī)
  1. 用戶(hù)態(tài)和內(nèi)核態(tài)切換:用戶(hù)態(tài)使用系統(tǒng)調(diào)用時(shí),例如需要讀取文件時(shí)兜蠕,使用read()扰肌。
  2. 進(jìn)程切換:
    • 進(jìn)程執(zhí)行完畢:釋放cpu資源,以便就緒隊(duì)列里其他進(jìn)程繼續(xù)執(zhí)行熊杨;
    • cpu的時(shí)間片調(diào)度:當(dāng)前進(jìn)程的時(shí)間片執(zhí)行完曙旭,切換其他進(jìn)程,以便使所有進(jìn)程實(shí)現(xiàn)并行執(zhí)行晶府;
    • 進(jìn)程系統(tǒng)資源不足:系統(tǒng)掛起進(jìn)程桂躏;
    • 當(dāng)前進(jìn)程調(diào)用sleep:進(jìn)程主動(dòng)掛起;
    • 執(zhí)行優(yōu)先級(jí)更高的進(jìn)程:
    • 硬件中斷:
線程上下文切換

進(jìn)程是資源擁有的基本單位川陆,而線程是系統(tǒng)調(diào)度的基本單位剂习。進(jìn)程為線程提供了虛擬內(nèi)存、全局變量等資源书劝,一個(gè)進(jìn)程內(nèi)的線程共享這些資源进倍。
因此,線程的上下文切換:

  1. 同一個(gè)進(jìn)程內(nèi)的線程切換:僅僅需要切換線程的私有數(shù)據(jù)购对、寄存器等線程私有資源即可猾昆;
  2. 不同進(jìn)程內(nèi)的線程切換:由于是不同進(jìn)程,因此跟進(jìn)程切換一樣骡苞,需要更新虛擬內(nèi)存垂蜗、棧楷扬、全局變量、內(nèi)核堆棧贴见、寄存器等資源烘苹。
    因此,線程的切換(同進(jìn)程內(nèi))比進(jìn)程切換更高效片部。
中斷上下文切換

為了響應(yīng)外部設(shè)備或硬件的某些問(wèn)題镣衡,cpu需要及時(shí)處理硬件中斷。中斷的上下文切換同樣不涉及用戶(hù)態(tài)档悠,因此不會(huì)影響到當(dāng)前用戶(hù)態(tài)的虛擬內(nèi)存廊鸥、全局變量,只需要保存當(dāng)前進(jìn)程的用戶(hù)態(tài)狀態(tài)辖所,隨后更新至中斷響應(yīng)程序的寄存器狀態(tài)惰说、內(nèi)核堆棧、硬件中斷參數(shù)等信息缘回。
中斷處理比進(jìn)程的優(yōu)先級(jí)更高吆视,而且處理時(shí)間相對(duì)較短(打字、鼠標(biāo)點(diǎn)擊)酥宴。

Android中的Context

了解了Linux中的上下文概念后啦吧,我們一起來(lái)看一看Android中的Context“上下文”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幅虑,一起剝皮案震驚了整個(gè)濱河市丰滑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倒庵,老刑警劉巖褒墨,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異擎宝,居然都是意外死亡郁妈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)绍申,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)噩咪,“玉大人,你說(shuō)我怎么就攤上這事极阅∥改耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵筋搏,是天一觀的道長(zhǎng)仆百。 經(jīng)常有香客問(wèn)我,道長(zhǎng)奔脐,這世上最難降的妖魔是什么俄周? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任吁讨,我火速辦了婚禮,結(jié)果婚禮上峦朗,老公的妹妹穿的比我還像新娘建丧。我一直安慰自己,他們只是感情好波势,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布翎朱。 她就那樣靜靜地躺著,像睡著了一般尺铣。 火紅的嫁衣襯著肌膚如雪闭翩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天迄埃,我揣著相機(jī)與錄音,去河邊找鬼兑障。 笑死侄非,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的流译。 我是一名探鬼主播逞怨,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼福澡!你這毒婦竟也來(lái)了叠赦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤革砸,失蹤者是張志新(化名)和其女友劉穎除秀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體算利,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡册踩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了效拭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暂吉。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缎患,靈堂內(nèi)的尸體忽然破棺而出慕的,到底是詐尸還是另有隱情,我是刑警寧澤挤渔,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布肮街,位于F島的核電站,受9級(jí)特大地震影響蚂蕴,放射性物質(zhì)發(fā)生泄漏低散。R本人自食惡果不足惜俯邓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望熔号。 院中可真熱鬧稽鞭,春花似錦、人聲如沸引镊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弟头。三九已至吩抓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赴恨,已是汗流浹背疹娶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伦连,地道東北人雨饺。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像惑淳,于是被迫代替她去往敵國(guó)和親额港。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 理解平均負(fù)載( Load Average),并用三個(gè)案例展示了不同場(chǎng)景下平均負(fù)載升高的分析方法绢馍。這其中向瓷,多個(gè)進(jìn)程競(jìng)...
    養(yǎng)碼哥閱讀 1,357評(píng)論 0 1
  • Linux 是一個(gè)多任務(wù)操作系統(tǒng),它支持遠(yuǎn)大于 CPU 數(shù)量的任務(wù)同時(shí)運(yùn)行舰涌。當(dāng)然风罩,這些任務(wù)實(shí)際上并不是真的在同時(shí)運(yùn)...
    taj3991閱讀 290評(píng)論 0 0
  • 打鄉(xiāng)下來(lái)到都市,眨一下眼舵稠,就過(guò)了二十來(lái)年超升。來(lái)到都市,先是在一所學(xué)校哺徊,拼死拼活地干室琢,后來(lái)就厭倦了,跳了出來(lái)落追,自己為自...
    周老師語(yǔ)文工作室閱讀 409評(píng)論 2 5
  • SIRKA水性戶(hù)內(nèi)水性木器漆系列 SIRKA水性木器漆系列產(chǎn)品具有綠色環(huán)保盈滴、不燃燒、附著力好、干燥快巢钓,施工性好...
    西萊卡水性漆王國(guó)建閱讀 1,060評(píng)論 0 0
  • 想要問(wèn)問(wèn)你為什么病苗?有了雞皮膚還不想辦法去除?寶寶心里苦症汹,如果可以選擇硫朦,誰(shuí)愿意披著一身雞皮膚過(guò)日子?可是沒(méi)得選背镇,用過(guò)...
    8d69Vw24閱讀 458評(píng)論 0 1