进程的切换过程
切換方式
進程的切換,實質上就是被中斷運行進程與待運行進程的上下文切換。從主觀上來理解。只分為兩步:
1.切換新的頁表,然后使用新的虛擬地址空間
2.切換內核棧,加入新的內容(PCB控制塊,資源相關),硬件上下文切換
現在從這兩句話理解,來看看這些東西到底是什么。
1,虛擬地址空間
虛擬地址空間,顧名思義:就是虛擬的,不是真的地址空間
在早期的計算機中,我們的計算機內存都非常的小。如果計算機內存是100M.已經運行了兩個40M的任務。如果還想運行一個40M的。那么空間肯定就不夠了。
所以后來 它在磁盤上劃分出一塊空間由操作系統管理,當物理內存耗盡是充當物理內存來使用。它將多個物理內存碎片和部分磁盤空間重定義為連續的地址空間,以此讓程序認為自己擁有連續可用的內存
但是具體要講清楚這個,我們還要看頁表
2,頁表
剛剛講到了虛擬地址空間,說了他只是虛擬的一段空間,但是。程序可不管你那么多。人家只要在物理內存上運行。你給人家畫空餅可沒意思。
所以出現了頁表。把虛擬地址空間對應的部分,映射到物理地址上
現在計算機一般是采用分頁管理居多,這里分段管理我個人也理解了就不多敘述。
我們來看下分頁管理:
很多初學者在這里會有一個疑問,既然給程序造成連續的空間假象,那要是內存中確實沒內存可用了,會怎么辦呢?那么對于*新的頁數,他就會發生缺頁中斷,然后會覆蓋起其他的頁
缺頁中斷大概有三種算法:
1.(OPT)最晚不使用的算法:表示新的頁如果進來沒內存框可放了,會替換之后 幾乎或者根本不會用到的頁。但這種算法只是一種理想算法,因為沒人能預估之后的事,包括計算機
2.(FIFO)先進先出算法:表示沒來一個新的頁,他都會替換最早進來的那個頁。這種辦法有個缺點:如果最早進來的那個頁是經常被訪問的,那么一定情況下效率會比較低。所以FIFO算法在按 線性順序訪問地址空間時使用
3.(LRU)最近最久未使用:這種辦法,會找出當前內存中,最近被使用最少的頁。然后替換他。這種辦法是前兩個算法的折中選擇,基本現在都用這種。還有一種是LFU 最常不使用算法,這種是找系統內使用頻率最少的頁(LRU是最近一段時間),然后替換他。但是,這種算法實現要長期的為每個頁維護一個計數代價較大不常使用。
具體三個的算法的圖解:https://blog.csdn.net/qq_34777600/article/details/79508613
第二步的切換內核棧,就是使用新的棧來存放進程運行時資源了。然后新進程有新的PCB控制塊。第二步也是線程切換的步驟,因為線程共享進程的虛擬地址空間,所以切換的時候沒有第一步的過程
進程一共有五個狀態:
像剛剛的切換:
1.會把原來的進程保存狀態,然后進入阻塞狀態。這種情況一般是IO請求或者內存申請失敗了。
2.可能是原來的進程正常終止了,或者CPU的時間片沒了,終止是進入終止態,CPU時間片沒了是進入就緒態,加入就緒隊列等待下一次獲得CPU
總結
- 上一篇: 7-6 中国生肖年 (5分) java
- 下一篇: ps填充前景色