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

        linux中的上下文是什么

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

        linux中的上下文是什么

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

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

        1.什么是上下文?

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

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

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

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

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

        什么是上下文:

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

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

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

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

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

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

        Linux 按照特權(quán)等級(jí),把進(jìn)程的運(yùn)行空間分為內(nèi)核空間用戶空間 。在這兩種空間中運(yùn)行的進(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操作頻繁時(shí),System參數(shù)會(huì)很高。

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

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

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

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

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

        從用戶態(tài)到內(nèi)核態(tài)的轉(zhuǎn)變,需要通過系統(tǒng)調(diào)用來完成。比如查看文件時(shí),需要執(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)運(yùn)行內(nèi)核任務(wù);

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

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

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

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

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

        • 某個(gè)進(jìn)程因?yàn)樾枰南到y(tǒng)資源比較大(比如內(nèi)存不足),這時(shí)候該進(jìn)程會(huì)被掛起,系統(tǒng)會(huì)調(diào)度其他進(jìn)程執(zhí)行;

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

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

        線程的上下文切換?

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

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

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

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

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

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

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

        中斷上下文切換?

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

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

        小結(jié)

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

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

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

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

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 华人在线精品免费观看| 国产精品视频九九九| 四虎影视国产精品亚洲精品hd | 午夜福利麻豆国产精品| 日本人精品video黑人| 麻豆国产在线精品国偷产拍 | 亚洲欧美日韩国产精品影院| 国产精品午夜一级毛片密呀| 国产精品亚洲午夜一区二区三区| 久久精品一本到99热免费| 精品人妻无码专区中文字幕| 国产A∨免费精品视频| 久久99国产精品二区不卡| 国产精品一区二区久久国产| 人人妻人人澡人人爽欧美精品 | 久久精品人人做人人妻人人玩| 夜夜爽一区二区三区精品| 欧美精品区一级片免费播放| 久久精品?ⅴ无码中文字幕| 国产精品人人做人人爽| 91精品国产麻豆国产自产在线 | 精品视频一区二区三区| 国产成人99久久亚洲综合精品| 精品久久久久久中文字幕| 国产成人精品久久二区二区| 国产日韩精品中文字无码| 久久综合久久自在自线精品自| 青草国产精品久久久久久| 亚洲国产精品无码AAA片| 中文字幕亚洲精品无码| 中文成人无字幕乱码精品区| 野狼第一精品社区| 亚洲国产一二三精品无码| 无码人妻精品一区二区三| 久久精品中文字幕无码绿巨人 | 久久久精品久久久久特色影视| 精品人妻伦九区久久AAA片69| 精品国产免费一区二区三区| 欧美精品色婷婷五月综合| 亚洲人精品午夜射精日韩| 亚洲精品V欧洲精品V日韩精品 |