溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

linux上下文指的是什么

發(fā)布時(shí)間:2022-11-11 09:47:46 來(lái)源:億速云 閱讀:123 作者:iii 欄目:建站服務(wù)器

本文小編為大家詳細(xì)介紹“l(fā)inux上下文指的是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“l(fā)inux上下文指的是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

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

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ò)覺(jué)。

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

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

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

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

什么是上下文:

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

上下文切換:就是先把前一個(gè)任務(wù)的 CPU 上下文(也就是 CPU 寄存器和程序計(jì)數(shù)器)保存起來(lái),然后加載新任務(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)限,可以直接訪問(wèn)所有資源(讀取文件,)

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

  • 用戶空間(Ring 3):只能訪問(wèn)受限資源,不能直接訪問(wèn)內(nèi)存等硬件設(shè)備,必須通過(guò)系統(tǒng)調(diào)用進(jìn)入到內(nèi)核中,才能訪問(wèn)這些特權(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沒(méi)有權(quán)限,當(dāng)需要讀取文件時(shí),就涉及到系統(tǒng)調(diào)用

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

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

  • 把 CPU 寄存器里原來(lái)用戶態(tài)的指令位置保存起來(lá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ù)原來(lái)保存的用戶態(tài),然后再切換到用戶空間,繼續(xù)運(yùn)行進(jìn)程;

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

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

  • 進(jìn)程執(zhí)行終止,它之前順頌的CPU就會(huì)被釋放出來(lái),這時(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)來(lái)說(shuō),線程是最小的執(zhí)行單元,進(jìn)程是最小的資源管理單元。說(shuō)白了,所謂內(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源不共享,所以切換過(guò)程就跟進(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)保存下來(lái),中斷結(jié)束后,進(jìn)程仍然可以從原來(lái)的狀態(tài)恢復(fù)運(yùn)行。

中斷上下文切換并不涉及到進(jìn)程的用戶態(tài)。所以,即便中斷過(guò)程打斷了一個(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)注。

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

Linux有哪些版本

Linux的版本有:Deepin、UbuntuKylin、Manjaro、LinuxMint、Ubuntu等版本。其中Deepin是國(guó)內(nèi)發(fā)展最好的Linux發(fā)行版之一;UbuntuKylin是基于Ubuntu的衍生發(fā)行版;Manjaro是基于Arch的Linux發(fā)行版;LinuxMint默認(rèn)的Cinnamon桌面類似Windows XP簡(jiǎn)單易用;Ubuntu則是以桌面應(yīng)用為主的Linux操作系統(tǒng)。

讀到這里,這篇“l(fā)inux上下文指的是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI