日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核学习之四:进程切换简述

發布時間:2025/4/9 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核学习之四:进程切换简述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?進程是現代操作系統的核心概念之一,用于分配系統(CPU,內存)資源的使用。了解linux進程及進程切換的知識,首先要理解進程與程序的區別,進程是執行流,是動態概念;程序是數據與指令序列的集合,是靜態概念。進程作為動態的執行流,可以用execv系統調用自由選擇一個程序(只要有權限)來執行的,理解這一點很重要。在閱讀本書的第三章《進程》中,有兩個地方比較難于理解的。

?

1 switch_to宏的last參數

? ? ?書中討論switch_to宏(第110頁)時,提到,該宏有3個參數:prev,next和last。前兩個分別是當前進程描述符地址和待切換的進程描述符的地址,相信大家對這兩個參數都不會有疑問,prev就是從current得到的,而next則是schedule()函數在根據調度算法從進程等待隊列中挑選的。關鍵是第三個last參數,為什么需要這么一個參數呢?書中的描述比較難理解。它的意思是說,A切換到B時,prev=A,next=B, 經過一定時間后,A被重新調度到CPU上執行時,A需要知道從哪個進程切換過來的,需要從last參數得到。實際上我們只需要關注A->B這一個過程就可以理解last參數的使用了。下面我們用圖片記錄每個步驟:

(1) 在進程切換之前,A是當前進程,esp寄存器指向A的內核棧,prev,next這兩個局部變量保存在棧中,也就是在A的內核棧中。那么B的內核棧有沒有這兩個參數呢?當然也有,因為B既然是在等待隊列中,很可能B也經歷過被其他進程切換出去這一個過程,在那個過程中,B的內核棧同樣保存了這兩個變量(如果B是新創建的進程,可以在創建時,或在schedule函數中將兩個值壓入內核棧),但是這兩個值肯定跟A中的prev=A,next=B不同,因為那個過程中,B是被切換的,因此,這時,B的內核棧中應該是prev=B.

? ? ?為了在切換到B進程執行時,prev參數是正確的,就需要借助于第三個參數last 。在schedule函數中(它挑選的B,當然也知道B進程描述符的地址),它從B的進程描述符中得到B的內核棧的地址(書中是thread_info參數,3.2.54版本代碼中改成了stack參數,原理是一樣的),從而得到B的prev參數的地址,作為第三個參數傳給switch_to宏。switch_to宏還將A的進程描述符地址加載到EAX寄存器中,而在進程切換過程中,EAX寄存器內容是不會改變的。

(2) 執行進程切換,主要是內核棧的切換,因為內核實現中,將thread_info結構與內核棧放在一起,esp改變了,current參數得到的當前進程描述符地址也跟著改變。這時,當前進程變成了B進程,并在B的內核棧上工作。注意,這時B內核棧的prev參數還是不正確的,它指向的依然是B。

(3) 將EAX寄存器內容復制到last指向的內存,即B內核棧的prev參數所在的地址。這樣,B內核棧上的prev參數就指向了正確的A進程描述符的地址。

?

2 進程切換過程中進程棧

? ? ?書中對進程切換的描述中,對進程的棧的描述是零散的,很容易讓人犯糊途。棧是進程中的重要數據結構,在函數調用中起到核心作用,關于棧的詳細描述可以參閱《深入理解計算機系統》。下面描述進程切換過程中,進程的棧的變遷。

? ? ?linux的進程有兩種棧,用戶棧和內核棧,它們在不同的內存區域,用戶棧在用戶態中使用,在用戶地址空間分配(0~3G),內核棧在內核態中使用,在內核地址空間分配(3G~4G)。用戶棧主要用于函數調用和存儲局部變量,內核棧除此之外還要保存進程切換額外的信息,如通用寄存器等。不管是用戶棧還是內核棧,CPU都是用ESP寄存器保存棧頂地址,因此早在進程切換前,進程進入內核態后,用戶棧就需要被切換出去,整個切換過程,都是在內核棧上工作,因而用戶棧與進程切換無關。另一方面,內核的實現中,將thread_info結構與內核棧放在一起,內核棧改變了,current參數得到的當前進程描述符地址也跟著改變,因此進程切換,就是由內核棧切換來完成的。整個完整的進程切換可以分為三個部分,以下假設從進程A切換到進程B:

(1) ?A的用戶態-->A的內核態

? ? ?這一過程是由中斷,異常或系統調用實現的,書中的后面章節會有介紹,以后再詳談。這里只討論幾個要點,每次從用戶態切換到內核態,內核棧都會被清空,ESP直接指向內核棧的棧底,而用戶棧的信息則會保存到內核棧中。清空內核棧的設計估計是考慮到經過了用戶態的操作后,以前內核棧的調用信息沒有用處了,沒有必要再保存,畢竟內核棧只分配了8K或4K的空間。那么,切換到內核態之前,內核怎么知道進程的內核棧地址呢,進程描述符雖然保存有內核棧的地址(stack變量),但是進程描述符位于動態內態中,從內存讀取的效率太低了。實現上,它是從TSS中獲取的。

? ? ?書中“任務狀態段”一節(第108頁)對TSS進行比較詳細的描述,每個CPU都有一個TSS,CPU可以快速訪問它。TSS的一個最重要的功能就是在用戶態轉為內核態時供CPU讀取內核棧地址,即是init_tss[cpu]->sp0字段(3.2.54版本的代碼),實際上,它存儲的是棧底地址,因此一加載到ESP中,就同時清空了內核棧。

(2) A的內核態->B的內核態

這一階段實現的是進程間的內核棧切換,同時也實現進程切換。與此過程關系最密切的是task_struct的thread變量,thread變量的類型是thread_struct,可稱為線程描述符,用于保存進程切換的硬件上下文(書中第109頁)。書中的switch_to和__switch_to函數詳細描述了進程切換過程中的每一個步驟,與內核棧相關的有:

  • 保存A的內核棧棧頂地址,即ESP寄存器的內容到A_task->thread->sp。(switch_to的第3步,變量名根據3.2.54版本中的代碼)
  • 將B_task->thread->sp內容加載到ESP。(switch_to的第4步,這步完成了內核棧的切換)
  • 將B_task->thread->sp0加載到init_tss[cpu]->sp0字段(__switch_to的第3步),這一步與(1)的描述對應,以后B在運行期間,用戶態切換到內核態時,ESP寄存器總是從init_tss[cpu]->sp0字段獲取內核棧的地址,這一操作同時清空了內核棧內容。(thread_struct結構有sp0,sp1變量,sp0保存內核棧棧底地址,sp保存棧頂地址)。

(3)B的內核態->B用戶態

? ? ? 執行與(1)相反的過程,從內核棧中取出(1)中保存的用戶棧信息,裝載相應寄存器,切換到用戶棧,內核棧信息不必保存,因為(2)中已保存了棧底地址,下次進入內核棧時直接將其加載到ESP寄存器中即可(將棧底地址作為棧頂使用)。這一過程書中后面的章節同樣會有詳細描述。

?

? ? ?有關進程的內容遠不止這些,例如,進程的創建與清除,進程隊列,進程調度等,總之要理解linux內核的進程管理,必須將《深入理解linux內核》一書相關章節逐句逐句細細品讀。

轉載于:https://www.cnblogs.com/wuchanming/p/4807416.html

總結

以上是生活随笔為你收集整理的linux内核学习之四:进程切换简述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 妺妺窝人体色www婷婷 | 中文字幕无线码 | 国产一区二区精品 | 欧美裸体xxx | 精品中文一区二区三区 | av资源网址 | 中文字幕av播放 | 欧美熟妇另类久久久久久多毛 | 亚洲av片不卡无码久久 | 自拍偷拍第5页 | 视频在线a | 亚洲精品图区 | 欧美巨大荫蒂茸毛毛人妖 | 国内一级黄色片 | 亚洲系列第一页 | 五月婷婷俺也去 | 国内成人自拍视频 | 热久久久久久 | 97国产精品| 成人v片 | 日本一本在线视频 | 亚洲高清网站 | 在线观看成人小视频 | 波多野结衣潜藏淫欲 | www.尤物| 日本一级黄 | 日本黄色中文字幕 | 四虎av在线播放 | 国产老女人乱淫免费可以 | 久久久久久久黄色 | 激情a | 成人黄色三级 | 国产精品久久九九 | 亚洲欧美日韩精品在线观看 | 草久久免费视频 | 日韩精品免费一区二区 | 久久国产精品网站 | 日本人妻丰满熟妇久久久久久 | 福利亚洲| 亚洲影视在线观看 | 亚洲AV成人无码网站天堂久久 | 两个女人互添下身爱爱 | 国产99在线 | 国产视频污 | 欧美熟妇激情一区二区三区 | 又黄又爽的视频在线观看 | 两个小y头稚嫩紧窄h文 | 国产福利不卡视频 | 日韩精品在线观看视频 | 青青视频在线免费观看 | 日韩在线观看视频免费 | 日韩欧美极品 | 亚洲一区二区三区电影 | 欧美一区二区三区免费 | 日日爽视频 | 国产毛片精品国产一区二区三区 | 国产成人欧美一区二区三区的 | 国产人妻互换一区二区 | 亚洲图片一区二区三区 | 日本熟妇乱子伦xxxx | 国产99久久久国产精品成人免费 | h在线播放| 高潮喷水一区二区三区 | 午夜精品视频一区 | 久艹在线观看视频 | 久久黄色av | 吊视频一区二区三区 | 午夜精品久久久久久毛片 | 超碰com | 1级av| 美女在线一区 | 玖玖在线观看 | 日本不卡在线视频 | 男人和女人日批 | 91禁在线观看 | 中文字幕日韩无 | 91视频播放| 西方裸体在线观看 | 夜夜嗨一区二区 | 久久久久久成人 | 男人女人拔萝卜视频 | 成人性生交大片免费看中文 | 蜜桃av色偷偷av老熟女 | 国产一区精品在线观看 | 狠狠操狠狠插 | 国产suv精品一区二区68 | 新91视频在线观看 | 欧美精品自拍视频 | 中日韩在线观看视频 | 黄色尤物视频 | 不卡视频在线观看 | 国产情侣一区 | 欧美视频直播网站 | 成人免费三级 | 亚洲欧美国产高清va在线播放 | 91免费视频入口 | 肉肉视频在线观看 | 日韩少妇内射免费播放18禁裸乳 | 久9精品 |