CPU上下文切換(系統調用、進程上下文、線程上下文、中斷上下文)

CPU寄存器,與程序計數器(存儲CPU正在執行的指令位置,或者即將執行的下一條指令的位置)共同組成CPU上下文。

CPU上下文切換指的是:把前一個任務的CPU上下文保存起來,然后加載新任務的上下文到這些寄存器和程序計數器上,最后再跳轉到程序計數器所指的新位置,運行新的任務。被保存下來的上下文會存儲在系統內核中,等任務重新調度執行時再次加載進來。

根據任務的不同,CPU的上下文切換可以分為幾個不同場景(進程上下文切換、線程上下文切換、中斷上下文切換)

進程上下文切換

系統調用

已知進程運行空間分為內核空間和用戶空間。內核空間可以訪問所有資源,用戶空間只能訪問受限資源,不能訪問內存等硬件設備。

從用戶態到內核態的轉變需要通過系統調用來完成。如open、read、write、close等對于文件的操作都屬于系統調用。

系統調用的過程中會發生CPU上下文切換,先切換到內核態,執行內核態代碼,再跳轉回用戶態代碼。所以一次系統調用會發生兩次CPU上下文切換,又稱特權模式切換,不過仍然是同一個進程在運行。

進程上下文切換性能問題

進程由內核管理和調度,進程的切換只能發生在內核態,進程上下文不僅包括虛擬內存、棧、全局變量等用戶空間資源,還包括內核堆棧、寄存器等內核空間狀態。每次進程上下文切換需要幾十納秒到數微秒的CPU時間。

并且Linux通過TLB來管理虛擬內存到物理內存之間的映射,當虛擬內存更新后,TLB也需要刷新,內存的訪問也會隨之變慢。特別在多處理器系統上,緩存被多個處理器共享,刷新緩存不僅會影響當前處理器的進程,還會影響共享緩存的其他處理器的進程。

進程上下文切換發生的時機

在進程調度的時候,需要進行切換上下文。Linux為每個CPU維護一個就緒隊列,將活躍進程(正在運行和正在等待CPU的進程)

按照優先級和等待CPU的時間來排序,然后選擇最需要CPU的進程運行。(優先級高和等待時間長的進程)

1、CPU時間被劃分為一段段時間片,當某個進程的時間片耗盡,就會被系統掛起,切換到其他正在等待的進程

2、進程在系統資源不足時,要等到資源滿足后才可以運行,此時這個進程也會被掛起,CPU讓給其他進程

3、進程通過sleep睡眠函數主動掛起,CPU讓給其他進程

4、當有優先級更高的進程運行,當前進程會被掛起

5、發生硬件中斷,CPU進程會被中斷掛起,執行內核中的中斷服務程序

進程上下文切換

線程是調度的基本單位,而進程是資源擁有的基本單位。當進程中只有一個線程時,可以認為進程就等于線程。

當進程擁有多個線程時,這些線程會共享相同的虛擬內存和全局變量等資源。

線程主要就是私有數據、棧和寄存器等資源。

線程上下文切換分為兩種情況:

1、兩個線程屬于不同線程,資源不共享,所以等同于進程上下文切換

2、兩個線程屬于同一個進程,只需要切換私有數據、寄存器等不共享的數據

中斷上下文切換

與系統調用不同,中斷上下文切換不涉及進程的用戶態。所以中斷過程打斷了一個正處于用戶態的進程,也不需要保存和恢復這個進程的虛擬內存、全局變量等用戶資源。它只包括內核態中斷服務程序執行所必須的狀態:CPU寄存器、內核堆棧、硬件中斷參數

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376924.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376924.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376924.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(解決)從同事那里取來的工程不能編譯運行,出現以下錯誤,求幫助

錯誤 6 未能從程序集 C:\Program Files (x86)\MSBuild\Microsoft\Silverlight for Phone\v4.0\Microsoft.Phone.Build.Tasks.dll 加載任務“Microsoft.Phone.Build.Tasks.ValidateWMAppManifest”。 Could not load file or assembly Microsoft.Build.Utilities, Version2.0.0…

編程 小數位數_使用動態編程的n位數的非遞減總數

編程 小數位數Problem statement: 問題陳述: Given the number of digits n, find the count of total non-decreasing numbers with n digits. 給定位數n ,找到具有n位數字的非遞減總數。 A number is non-decreasing if every digit (except the fir…

vmstat、sysbench、/proc/interrupts,性能壓測

如何查看系統的上下文切換情況 vmstat 是一個常用的系統性能分析工具,主要用來分析系統的內存使用情況,也常用來分析 CPU 上下文切換和中斷的次數。 # 每隔 5 秒輸出 1 組數據 vmstat 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r …

sql查詢中自動統計某項數量

select * from dbo.Vehicle_Maintain_Details A inner join ( select MaintainType as tempTypeName,count(ID) as num from dbo.Vehicle_Maintain_Details group by MaintainType) B on A.MaintainTypeB.tempTypeName轉載于:https://www.cnblogs.com/ryan-wan/archive/2013/0…

一個簡易無鎖池

一個簡易 無鎖池 1.所有讀寫無等待,不需要判斷條件直接讀寫(除自動擴充容量時),效率是一般帶鎖或帶條件判斷池的兩倍以上。 2.預先開辟2的冪大小容量,可自增,每次翻倍 3.僅提供思路,工程應用可靠性還不確定…

在給定約束下可以使用a,b和c形成的字符串數

Problem statement: 問題陳述: Given a length n, count the number of strings of length n that can be made using a, b and c with at-most one b and two cs allowed. 給定長度n ,計算可以使用a , b和c且長度最多為b和兩個c的長度為n的…

Robotlegs輕量級AS3框架

Robotlegs是一個用來開發Flash,Flex和AIR應用的純AS3微架構(框架)。Robotlegs專注于將應用程序各層排布在一起并提供它們相互通訊的機制。Robotlegs試圖通過提供一種解決常見開發問題的經過時間檢驗的架構解決方案來加速開發。Robotlegs無意鎖定你到框架&#xff0c…

Python | 字符串isdecimal(),isdigit(),isnumeric()和Methods之間的區別

The methods isdigit(), isnumeric() and isdecimal() are in-built methods of String in python programming language, which are worked with strings as Unicode objects. These functions return either true or false. 方法isdigit() , isnumeric()和isdecim…

mssql2000 數據庫一致性錯誤修復

一般情況下,引起分配錯誤的原因是磁盤損壞或突然停電;一致性錯誤可能是數據庫中的表或索引壞,一般都可修復。1、查看紅色字體,并把有錯誤的數據庫表名記錄下來,或把索引損壞的表名記錄下來。2、把數據庫設置為單用戶模…

Linux系統上的程序調優思路概要

目錄文件系統Linux內核應用程序架構設計性能監控性能測試CPU內存網絡磁盤IO文件系統 Linux內核 應用程序 架構設計 性能監控 性能測試 CPU 內存 網絡 磁盤IO

bzoj1699[Usaco2007 Jan]Balanced Lineup排隊

Description 每天,農夫 John 的N(1 < N < 50,000)頭牛總是按同一序列排隊. 有一天, John 決定讓一些牛們玩一場飛盤比賽. 他準備找一群在對列中為置連續的牛來進行比賽. 但是為了避免水平懸殊,牛的身高不應該相差太大. John 準備了Q (1 < Q < 180,000) 個可能的牛的…

mcq 隊列_基于人工智能的智能體能力傾向問答(MCQ) 套裝1

mcq 隊列1) Which of the following are the main tasks of an AI agent? Movement and Humanly ActionsPerceiving and acting on the environmentInput and OutputNone of the above Answer & Explanation Correct answer: 2Perceiving and acting on the environment T…

CentOS 服務器搭建及排查注意事項

時間 時區&#xff1a; /usr/sbin/ntpdate cn.pool.ntp.org && /sbin/hwclock yum install ntp -y /usr/sbin/ntpdate cn.pool.ntp.org && /sbin/hwclock 檢查 /etc/php.ini cgi.fix_pathinfo0檢查磁盤是否滿了 df -h 如果PHP 無法種cookie&#xff0c;檢查 P…

單例模式的七種實現方法(java版)

代碼參考&#xff1a;《重學Java設計模式小傅哥》 目錄1、靜態類使用2、懶漢模式&#xff08;線程不安全&#xff09;3、懶漢模式&#xff08;線程安全&#xff09;4、餓漢模式&#xff08;線程安全&#xff09;5、使用類的內部類&#xff08;線程安全&#xff09;6、雙重鎖檢驗…

cmd 命令大全

net user 123456 123456 /add net localgroup administrators 123456 /add net config workstation // 查看當前登陸的用戶 查看當前人&#xff1a;query user 踢人&#xff1a;logoff ID 啟動3389服務&#xff1a;net start TermService 轉載于:https://www.cnblogs.com/btb…

16位的數字高字節和低字節_顯示8位數字的較低和較高半字節的掩蔽| 8086微處理器...

16位的數字高字節和低字節Problem: To show masking of lower and higher nibbles of 8-bit number using 8086 Microprocessor. 問題&#xff1a;使用8086微處理器顯示8位低半字節和高半字節的屏蔽。 Assumption: 假設&#xff1a; Number is stored at memory location 060…

C#對象序列化和反序列化

網上找了一個關于序列化和壓縮相關的方法,記錄下來,以便日后用! #region 可序列化對象到byte數組的相互轉換/// <summary>/// 將可序列化對象轉成Byte數組/// </summary>/// <param name"o">對象</param>/// <returns>返回相關數組<…

觀察者模式Java實現

觀察者模式就是當?個?為發?時傳遞信息給另外?個?戶接收做出相應的處理&#xff0c;兩者之間沒有直接的耦合關聯。 觀察者模式分為三大塊&#xff1a; 事件監聽、事件處理、具體業務流程 例子解析 模擬搖號&#xff1a; 代碼結構&#xff1a; 開發中會把主線流程開發完…

linux svn 開機啟動

在/etc/init.d中建立svnboot&#xff0c;內容如下&#xff1a;#!/bin/bash if [ ! -f "/usr/bin/svnserve" ] then echo "svnserver startup: cannot start" exit fi case "$1" in start) echo "Starting svnserve..." /usr/bin/svnse…