站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        linux中的上下文是什么

        在linux中,上下文又叫CPU上下文,是CPU運行任何任務(wù)前,必須依賴的環(huán)境,包括CPU寄存器和程序計數(shù)器;而上下文切換就是先把前一個任務(wù)的CPU上下文(也就是CPU寄存器和程序計數(shù)器)保存起來,然后加載新任務(wù)的上下文到這些寄存器和程序計數(shù)器,最后再跳轉(zhuǎn)到程序計數(shù)器所指的新位置,運行新任務(wù)。

        linux中的上下文是什么

        程序員必備接口測試調(diào)試工具:立即使用
        Apipost = Postman + Swagger + Mock + Jmeter
        Api設(shè)計、調(diào)試、文檔、自動化測試工具
        后端、前端、測試,同時在線協(xié)作,內(nèi)容實時同步

        本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。

        1.什么是上下文?

        Linux是一個多任務(wù)的操作系統(tǒng),它支持遠(yuǎn)大于CPU數(shù)量的任務(wù)同時運行,當(dāng)然,這些任務(wù)實際上并不是真正的在同時運行,而是系統(tǒng)在很短的時間內(nèi),將CPU輪流分配給他們,給用戶造成很多任務(wù)同時運行的錯覺。

        在每個任務(wù)運行前, CPU 都需要知道任務(wù)從哪里加載,又從哪里開始運行。也就是說,需要系統(tǒng)事先給他設(shè)置好 CPU 寄存器和程序計數(shù)器(Program Counter,PC)

        • CPU 寄存器:是 CPU 內(nèi)置的容量小、但速度極快的內(nèi)存

        • 程序計數(shù)器:是用來存儲 CPU 正在執(zhí)行的指令位置、或者即將執(zhí)行的下一條指令位置

        綜上所述,我們就有答案了

        什么是上下文:

        我們通常說的上下文又叫CPU上下文,是CPU運行任何任務(wù)前,必須依賴的環(huán)境,包括CPU 寄存器和程序計數(shù)器

        上下文切換:就是先把前一個任務(wù)的 CPU 上下文(也就是 CPU 寄存器和程序計數(shù)器)保存起來,然后加載新任務(wù)的上下文到這些寄存器和程序計數(shù)器,最后再跳轉(zhuǎn)到程序計數(shù)器所指的新位置,運行新任務(wù)。

        2.上下文切換詳細(xì)介紹

        根據(jù)CPU切換運行任務(wù)的不同,又可以分為進(jìn)程上下文切換線程上下文切換中斷上下文切換

        我們先了解下面2個上下文切換涉及的知識點系統(tǒng)調(diào)用、進(jìn)程運行態(tài)

        進(jìn)程的運行態(tài):

        Linux 按照特權(quán)等級,把進(jìn)程的運行空間分為內(nèi)核空間用戶空間 。在這兩種空間中運行的進(jìn)程狀態(tài)分別稱為內(nèi)核態(tài)用戶態(tài)

        • 內(nèi)核空間(Ring 0):具有最高權(quán)限,可以直接訪問所有資源(讀取文件,)

          • 分配內(nèi)存、IO操作、創(chuàng)建子進(jìn)程……都是內(nèi)核操作。這也表明,當(dāng)IO操作頻繁時,System參數(shù)會很高。

        • 用戶空間(Ring 3):只能訪問受限資源,不能直接訪問內(nèi)存等硬件設(shè)備,必須通過系統(tǒng)調(diào)用進(jìn)入到內(nèi)核中,才能訪問這些特權(quán)資源

          • 典型的用戶態(tài)空間程序有:Shells、數(shù)據(jù)庫、web服務(wù)器、PHP程序、Java程序……

        在linux系統(tǒng)使用top命令查看cpu時,能看到user和system兩項,對應(yīng)的就是用戶態(tài)和內(nèi)核態(tài)占用的cpu資源

        如上,我們的web服務(wù)是運行在用戶態(tài)下的,對文件的io沒有權(quán)限,當(dāng)需要讀取文件時,就涉及到系統(tǒng)調(diào)用

        系統(tǒng)調(diào)用:

        從用戶態(tài)到內(nèi)核態(tài)的轉(zhuǎn)變,需要通過系統(tǒng)調(diào)用來完成。比如查看文件時,需要執(zhí)行多次系統(tǒng)調(diào)用:open、read、write、close等。系統(tǒng)調(diào)用的過程如下:

        • 把 CPU 寄存器里原來用戶態(tài)的指令位置保存起來;

        • 為了執(zhí)行內(nèi)核代碼,CPU 寄存器需要更新為內(nèi)核態(tài)指令的新位置,最后跳轉(zhuǎn)到內(nèi)核態(tài)運行內(nèi)核任務(wù);

        • 系統(tǒng)調(diào)用結(jié)束后,CPU 寄存器需要恢復(fù)原來保存的用戶態(tài),然后再切換到用戶空間,繼續(xù)運行進(jìn)程;

        所以,一次系統(tǒng)調(diào)用的過程,其實是發(fā)生了兩次 CPU 上下文切換。

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

        • 進(jìn)程執(zhí)行終止,它之前順頌的CPU就會被釋放出來,這時就從就緒隊列中取出下一個等待時間片的進(jìn)程;

        • 當(dāng)某個進(jìn)程的時間片耗盡,它就會被系統(tǒng)掛起,切換到其他等待CPU的進(jìn)程運行;

        • 某個進(jìn)程因為需要的系統(tǒng)資源比較大(比如內(nèi)存不足),這時候該進(jìn)程會被掛起,系統(tǒng)會調(diào)度其他進(jìn)程執(zhí)行;

        • 當(dāng)有優(yōu)先級更高的進(jìn)程(系統(tǒng)操作進(jìn)程)需要時間片,為了保證優(yōu)先級更高的進(jìn)程能夠執(zhí)行,當(dāng)前進(jìn)程會被掛起;

        • 如果當(dāng)前進(jìn)程中有sleep函數(shù),他也會被掛起;

        線程的上下文切換?

        對操作系統(tǒng)來說,線程是最小的執(zhí)行單元,進(jìn)程是最小的資源管理單元。說白了,所謂內(nèi)核中的任務(wù)調(diào)用,實際上的調(diào)度對象是線程;而進(jìn)程只是給線程提供了虛擬內(nèi)存、全局變量等資源。所以,對于現(xiàn)場和進(jìn)程,我們可以這么理解:

        • 當(dāng)進(jìn)程只有一個線程時,可以認(rèn)為進(jìn)程就等于線程。

        • 當(dāng)進(jìn)程擁有多個線程時,這些線程會共享父進(jìn)程的資源(即共享相同的虛擬內(nèi)存和全局變量等資源)。這些資源在上下文切換時是不需要修改的。

        • 另外,線程也有自己的私有數(shù)據(jù),比如棧和寄存器等,這些在上下文切換時也是需要保存的。

        綜上,線程上下文切換有兩種情況:

        • 前后兩個線程屬于不同進(jìn)程,因為資源不共享,所以切換過程就跟進(jìn)程上下文切換是一樣的;

        • 前后兩個線程屬于同一個進(jìn)程,因為虛擬內(nèi)存是共享的,所以在切換時,虛擬內(nèi)存這些資源就保持不動,只需要切換線程的私有數(shù)據(jù)、寄存器等不共享的數(shù)據(jù)。

        中斷上下文切換?

        中斷處理會打斷進(jìn)程的正常調(diào)度和執(zhí)行。在打斷其他進(jìn)程時,需要將進(jìn)程當(dāng)前的狀態(tài)保存下來,中斷結(jié)束后,進(jìn)程仍然可以從原來的狀態(tài)恢復(fù)運行。

        中斷上下文切換并不涉及到進(jìn)程的用戶態(tài)。所以,即便中斷過程打斷了一個正處在用戶態(tài)的進(jìn)程,也不需要保存和恢復(fù)這個進(jìn)程的虛擬內(nèi)存、全局變量等用戶態(tài)資源。中斷上下文,其實只包括內(nèi)核態(tài)中斷服務(wù)程序執(zhí)行所必須的狀態(tài),包括 CPU 寄存器、內(nèi)核堆棧、硬件中斷參數(shù)等。

        小結(jié)

        根據(jù)Tsuna的測試報告,每次上下文切換都需要幾十納秒到數(shù)微妙的CPU時間,這個時間還是相當(dāng)可觀的。

        不管是哪種場景導(dǎo)致的上下文切換,你都應(yīng)該知道:

        • CPU上下文切換,是保證Linux系統(tǒng)正常工作的核心功能之一,一般情況下不需要我們特別關(guān)注。

        • 但過多的上下文切換,會把CPU時間消耗在寄存器、內(nèi)核棧以及虛擬內(nèi)存等數(shù)據(jù)的保存和恢復(fù)上,從而縮短進(jìn)程真正運行的時間,導(dǎo)致系統(tǒng)的整體性能大幅下降。

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国产AV午夜精品一区二区入口 | 无码国模国产在线无码精品国产自在久国产| 亚洲高清国产拍精品青青草原| 欧美精品1区2区| 国产精品亚洲日韩欧美色窝窝色欲| 久久久无码精品亚洲日韩软件| 中文字幕精品视频| 99精品视频免费| 国产精品久久久久jk制服| 亚洲精品乱码久久久久久| 欧美成人精品第一区二区三区| 国产成人精品久久| 久久精品国产99国产电影网 | 国产精品爱搞视频网站| 国产成人精品视频播放| 久久精品99久久香蕉国产色戒 | 亚洲国产精品嫩草影院在线观看| 久久精品国产亚洲精品| 国产欧美日本精品| 国产精品99无码一区二区| 9191精品国产免费久久| 日韩精品在线视频| 欧美巨大黑人精品videos| 国产精品视频一区二区三区经| 2022精品天堂在线视频| 国产精品区免费视频| 精品熟女少妇a∨免费久久| 日韩精品无码熟人妻视频| 亚洲AV无码久久精品蜜桃| 四虎影视永久在线观看精品| 热re99久久精品国99热| 久久狠狠高潮亚洲精品| 国产精品亚洲аv无码播放| 久久香蕉国产线看观看精品yw| 中文成人无码精品久久久不卡| 亚洲韩国精品无码一区二区三区| 中文精品99久久国产 | 国产成人精品一区在线| 国产精品麻豆VA在线播放| 国产伦精品一区二区免费| 国产香蕉国产精品偷在线观看|