国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

談?wù)勥M(jìn)程上下文、中斷上下文及原子上下文的一些概念

發(fā)布時(shí)間:2018-9-3 10:54    發(fā)布者:技術(shù)小白
開講之前,咱們有必要看看這兩個(gè)概念:
a -- 上下文
上下文是從英文context翻譯過(guò)來(lái),指的是一種環(huán)境。相對(duì)于進(jìn)程而言,就是進(jìn)程執(zhí)行時(shí)的環(huán)境;

具體來(lái)說(shuō)就是各個(gè)變量和數(shù)據(jù),包括所有的寄存器變量、進(jìn)程打開的文件、內(nèi)存信息等。

b -- 原子
原子(atom)本意是“不能被進(jìn)一步分割的最小粒子”,而原子操作(atomic operation)意為"不可被中斷的一個(gè)或一系列操作" ;

一、為什么會(huì)有上下文這種概念
內(nèi)核空間和用戶空間是現(xiàn)代操作系統(tǒng)的兩種工作模式,內(nèi)核模塊運(yùn)行在內(nèi)核空間,而用戶態(tài)應(yīng)用程序運(yùn)行在用戶空間。它們代表不同的級(jí)別,而對(duì)系統(tǒng)資源具有不同的訪問(wèn)權(quán)限。內(nèi)核模塊運(yùn)行在最高級(jí)別(內(nèi)核態(tài)),這個(gè)級(jí)下所有的操作都受系統(tǒng)信任,而應(yīng)用程序運(yùn)行在較低級(jí)別(用戶態(tài))。在這個(gè)級(jí)別,處理器控制著對(duì)硬件的直接訪問(wèn)以及對(duì)內(nèi)存的非授權(quán)訪問(wèn)。內(nèi)核態(tài)和用戶態(tài)有自己的內(nèi)存映射,即自己的地址空間。

其中處理器總處于以下狀態(tài)中的一種:
內(nèi)核態(tài),運(yùn)行于進(jìn)程上下文,內(nèi)核代表進(jìn)程運(yùn)行于內(nèi)核空間;
內(nèi)核態(tài),運(yùn)行于中斷上下文,內(nèi)核代表硬件運(yùn)行于內(nèi)核空間;
用戶態(tài),運(yùn)行于用戶空間。

系統(tǒng)的兩種不同運(yùn)行狀態(tài),才有了上下文的概念。用戶空間的應(yīng)用程序,如果想請(qǐng)求系統(tǒng)服務(wù),比如操作某個(gè)物理設(shè)備,映射設(shè)備的地址到用戶空間,必須通過(guò)系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)。(系統(tǒng)調(diào)用是操作系統(tǒng)提供給用戶空間的接口函數(shù))。

通過(guò)系統(tǒng)調(diào)用,用戶空間的應(yīng)用程序就會(huì)進(jìn)入內(nèi)核空間,由內(nèi)核代表該進(jìn)程運(yùn)行于內(nèi)核空間,這就涉及到上下文的切換,用戶空間和內(nèi)核空間具有不同的 地址映射,通用或?qū)S玫募拇嫫鹘M,而用戶空間的進(jìn)程要傳遞很多變量、參數(shù)給內(nèi)核,內(nèi)核也要保存用戶進(jìn)程的一些寄存器、變量等,以便系統(tǒng)調(diào)用結(jié)束后回到用戶 空間繼續(xù)執(zhí)行,

二、進(jìn)程上下文
所謂的進(jìn)程上下文,就是一個(gè)進(jìn)程在執(zhí)行的時(shí)候,CPU的所有寄存器中的值、進(jìn)程的狀態(tài)以及堆棧上的內(nèi)容,當(dāng)內(nèi)核需要切換到另一個(gè)進(jìn)程時(shí),它 需要保存當(dāng)前進(jìn)程的所有狀態(tài),即保存當(dāng)前進(jìn)程的進(jìn)程上下文,以便再次執(zhí)行該進(jìn)程時(shí),能夠恢復(fù)切換時(shí)的狀態(tài),繼續(xù)執(zhí)行。

一個(gè)進(jìn)程的上下文可以分為三個(gè)部分:用戶級(jí)上下文、寄存器上下文以及系統(tǒng)級(jí)上下文。

用戶級(jí)上下文: 正文、數(shù)據(jù)、用戶堆棧以及共享存儲(chǔ)區(qū);

寄存器上下文: 通用寄存器、程序寄存器(IP)、處理器狀態(tài)寄存器(EFLAGS)、棧指針(ESP);

系統(tǒng)級(jí)上下文: 進(jìn)程控制塊task_struct、內(nèi)存管理信息(mm_struct、vm_area_struct、pgd、pte)、內(nèi)核棧。


當(dāng)發(fā)生進(jìn)程調(diào)度時(shí),進(jìn)行進(jìn)程切換就是上下文切換(context switch)。

操作系統(tǒng)必須對(duì)上面提到的全部信息進(jìn)行切換,新調(diào)度的進(jìn)程才能運(yùn)行。而系統(tǒng)調(diào)用進(jìn)行的是模式切換(mode switch)。模式切換與進(jìn)程切換比較起來(lái),容易很多,而且節(jié)省時(shí)間,因?yàn)槟J角袚Q最主要的任務(wù)只是切換進(jìn)程寄存器上下文的切換。

進(jìn)程上下文主要是異常處理程序和內(nèi)核線程。內(nèi)核之所以進(jìn)入進(jìn)程上下文是因?yàn)檫M(jìn)程自身的一些工作需要在內(nèi)核中做。例如,系統(tǒng)調(diào)用是為當(dāng)前進(jìn)程服務(wù)的,異常通常是處理進(jìn)程導(dǎo)致的錯(cuò)誤狀態(tài)等。所以在進(jìn)程上下文中引用current是有意義的。

三、中斷上下文

硬件通過(guò)觸發(fā)信號(hào),向CPU發(fā)送中斷信號(hào),導(dǎo)致內(nèi)核調(diào)用中斷處理程序,進(jìn)入內(nèi)核空間。這個(gè)過(guò)程中,硬件的一些變量和參數(shù)也要傳遞給內(nèi)核, 內(nèi)核通過(guò)這些參數(shù)進(jìn)行中斷處理。

所以,“中斷上下文”就可以理解為硬件傳遞過(guò)來(lái)的這些參數(shù)和內(nèi)核需要保存的一些環(huán)境,主要是被中斷的進(jìn)程的環(huán)境。

內(nèi)核進(jìn)入中斷上下文是因?yàn)橹袛嘈盘?hào)而導(dǎo)致的中斷處理或軟中斷。而中斷信號(hào)的發(fā)生是隨機(jī)的,中斷處理程序及軟中斷并不能事先預(yù)測(cè)發(fā)生中斷時(shí)當(dāng)前運(yùn)行的是哪個(gè)進(jìn)程,所以在中斷上下文中引用current是可以的,但沒有意義。

事實(shí)上,對(duì)于A進(jìn)程希望等待的中斷信號(hào),可能在B進(jìn)程執(zhí)行期間發(fā)生。例如,A進(jìn)程啟動(dòng)寫磁盤操作,A進(jìn)程睡眠后B進(jìn)程在運(yùn)行,當(dāng)磁盤寫完后磁盤中斷信號(hào)打斷的是B進(jìn)程,在中斷處理時(shí)會(huì)喚醒A進(jìn)程。

四、進(jìn)程上下文 VS 中斷上下文

內(nèi)核可以處于兩種上下文:進(jìn)程上下文和中斷上下文。

在系統(tǒng)調(diào)用之后,用戶應(yīng)用程序進(jìn)入內(nèi)核空間,此后內(nèi)核空間針對(duì)用戶空間相應(yīng)進(jìn)程的代表就運(yùn)行于進(jìn)程上下文。

異步發(fā)生的中斷會(huì)引發(fā)中斷處理程序被調(diào)用,中斷處理程序就運(yùn)行于中斷上下文。

中斷上下文和進(jìn)程上下文不可能同時(shí)發(fā)生。

運(yùn)行于進(jìn)程上下文的內(nèi)核代碼是可搶占的,但中斷上下文則會(huì)一直運(yùn)行至結(jié)束,不會(huì)被搶占。因此,內(nèi)核會(huì)限制中斷上下文的工作,不允許其執(zhí)行如下操作:

a -- 進(jìn)入睡眠狀態(tài)或主動(dòng)放棄CPU
由于中斷上下文不屬于任何進(jìn)程,它與current沒有任何關(guān)系(盡管此時(shí)current指向被中斷的進(jìn)程),所以中斷上下文一旦睡眠或者放棄CPU,將無(wú)法被喚醒。所以也叫原子上下文(atomic context)。

b -- 占用互斥體
為了保護(hù)中斷句柄臨界區(qū)資源,不能使用mutexes。如果獲得不到信號(hào)量,代碼就會(huì)睡眠,會(huì)產(chǎn)生和上面相同的情況,如果必須使用鎖,則使用spinlock。

c --  執(zhí)行耗時(shí)的任務(wù)
中斷處理應(yīng)該盡可能快,因?yàn)閮?nèi)核要響應(yīng)大量服務(wù)和請(qǐng)求,中斷上下文占用CPU時(shí)間太長(zhǎng)會(huì)嚴(yán)重影響系統(tǒng)功能。在中斷處理例程中執(zhí)行耗時(shí)任務(wù)時(shí),應(yīng)該交由中斷處理例程底半部來(lái)處理。

d -- 訪問(wèn)用戶空間虛擬內(nèi)存
因?yàn)橹袛嗌舷挛氖呛吞囟ㄟM(jìn)程無(wú)關(guān)的,它是內(nèi)核代表硬件運(yùn)行在內(nèi)核空間,所以在中斷上下文無(wú)法訪問(wèn)用戶空間的虛擬地址

e -- 中斷處理例程不應(yīng)該設(shè)置成reentrant(可被并行或遞歸調(diào)用的例程)
因?yàn)橹袛喟l(fā)生時(shí),preempt和irq都被disable,直到中斷返回。所以中斷上下文和進(jìn)程上下文不一樣,中斷處理例程的不同實(shí)例,是不允許在SMP上并發(fā)運(yùn)行的。

f -- 中斷處理例程可以被更高級(jí)別的IRQ中斷
如果想禁止這種中斷,可以將中斷處理例程定義成快速處理例程,相當(dāng)于告訴CPU,該例程運(yùn)行時(shí),禁止本地CPU上所有中斷請(qǐng)求。這直接導(dǎo)致的結(jié)果是,由于其他中斷被延遲響應(yīng),系統(tǒng)性能下降。

五、原子上下文

內(nèi)核的一個(gè)基本原則就是:在中斷或者說(shuō)原子上下文中,內(nèi)核不能訪問(wèn)用戶空間,而且內(nèi)核是不能睡眠的。也就是說(shuō)在這種情況下,內(nèi)核是不能調(diào)用有可能引起睡眠的任何函數(shù)。一般來(lái)講原子上下文指的是在中斷或軟中斷中,以及在持有自旋鎖的時(shí)候。內(nèi)核提供 了四個(gè)宏來(lái)判斷是否處于這幾種情況里:
這四個(gè)宏所訪問(wèn)的count都是thread_info->preempt_count。這個(gè)變量其實(shí)是一個(gè)位掩碼。最低8位表示搶占計(jì)數(shù),通常由spin_lock/spin_unlock修改,或程序員強(qiáng)制修改,同時(shí)表明內(nèi)核容許的最大搶占深度是256。

8-15位是軟中斷計(jì)數(shù),通常由local_bh_disable/local_bh_enable修改,同時(shí)表明內(nèi)核容許的最大軟中斷深度是256。
16-27位是硬中斷計(jì)數(shù),通常由enter_irq/exit_irq修改,同時(shí)表明內(nèi)核容許的最大硬中斷深度是4096。

第28位是PREEMPT_ACTIVE標(biāo)志。用代碼表示就是:
PREEMPT_MASK: 0x000000ff
SOFTIRQ_MASK: 0x0000ff00
HARDIRQ_MASK: 0x0fff0000

凡是上面4個(gè)宏返回1得到地方都是原子上下文,是不容許內(nèi)核訪問(wèn)用戶空間,不容許內(nèi)核睡眠的,不容許調(diào)用任何可能引起睡眠的函數(shù)。而且代表thread_info->preempt_count不是0,這就告訴內(nèi)核,在這里面搶占被禁用。

但 是,對(duì)于in_atomic()來(lái)說(shuō),在啟用搶占的情況下,它工作的很好,可以告訴內(nèi)核目前是否持有自旋鎖,是否禁用搶占等。但是,在沒有啟用搶占的情況 下,spin_lock根本不修改preempt_count,所以即使內(nèi)核調(diào)用了spin_lock,持有了自旋鎖,in_atomic()仍然會(huì)返回 0,錯(cuò)誤的告訴內(nèi)核目前在非原子上下文中。所以凡是依賴in_atomic()來(lái)判斷是否在原子上下文的代碼,在禁搶占的情況下都是有問(wèn)題的。
信盈達(dá)C語(yǔ)言電子PCBSTM32LinuxFPGA、Python等課程免費(fèi)試聽,預(yù)約咨詢宋工Q3/5/2/4/6/5/9/0/8/8   Tel/WX:1/7/3/1/7/9/5/1/9/0/8



本文地址:http://m.qingdxww.cn/thread-546698-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 利用SAM E54 Xplained Pro評(píng)估工具包演示CAN轉(zhuǎn)USB橋接器以及基于CAN的主機(jī)和自舉程序應(yīng)用程序
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級(jí)模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产91蝌蚪| 国产精品视频福利一区二区 | 中文字幕第一页在线 | 亚洲spank男男实践网站 | 国产福利91精品一区二区 | 上海麻豆文化传媒网站入口 | 亚洲区视频在线观看 | 99久久免费国产精品特黄 | 1000部又爽又黄无遮挡的视频 | 国产美女在线观看 | 久久网国产 | 国产在线91精品入口首页 | 欧美日韩在线精品一区二区三区 | aaa大片 | 中文字幕欧美日韩 | 亚洲青草视频 | 一本大道无香蕉综合在线 | 国产精品手机在线观看 | 亚洲欧美成人永久第一网站 | 免费视频久久 | 日本久久久 | 羞羞网站免费观看 | 免费看黄网站在线 | 亚洲欧美日韩成人网 | 欧美日韩麻豆 | 欧美国产在线看 | 精品国产一区二区 | 婷婷丁香综合网 | 久久精品99视频 | 亚洲一区第一页 | 国产精选91热在线观看 | 四虎永久在线观看免费网站网址 | 91国视频在线观看 | freeexoxoxo性欧美 | 欧美一区二区三区成人看不卡 | 国产一级毛片外aaaa | 久久亚洲国产成人亚 | 国产精品视频网站 | 亚洲精品自在在线观看 | 亚洲视频在线观看网址 | 欧美日韩国产在线 |