久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

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

      linux中的上下文是什么

      在linux中,上下文又叫CPU上下文,是CPU運(yùn)行任何任務(wù)前,必須依賴(lài)的環(huán)境,包括CPU寄存器和程序計(jì)數(shù)器;而上下文切換就是先把前一個(gè)任務(wù)的CPU上下文(也就是CPU寄存器和程序計(jì)數(shù)器)保存起來(lái),然后加載新任務(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ò)覺(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ù)前,必須依賴(lài)的環(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)分別稱(chēng)為內(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)的整體性能大幅下降。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)