操作系統是四類資源管理者
- 處理機管理
- 存儲器管理
- 設備管理
- 文件管理
最基本的基本操作系統類型
- 多道批處理系統
- 分時系統
- 實時系統
資源共享方式
- 互斥共享方式:一個時間內只允許一個進程訪問
- 同時訪問方式:允許多個進程訪問
並行性:多個事件在同一時刻發生
併發性:多個事件在同一時間間隔內發生
進程結構:PCB(process controller block進程控制塊),程序段,數據段
信號量
1.整型信號量
用一個整型的數值S記錄資源數目
wait(S){
while(s<=0);
s=s-1
}
signal(s){
s=s+1;
}
2.記錄型信號量
有兩個數據項,數據結構描述爲
typedef struct{
int value; //記錄可用資源的個數
Struct process *L; //當value<=0時,將阻塞的進程存到L中,從而達到阻塞的進程不佔用cpu的目的
}semaphore;
記錄型信號量的PV操作:
wait(semaphore S){
S.value--;
if(s.value<0) S.L.add(this); //將該進程加入到阻塞隊列中
}
signal(semaphore S){
S.value++;
if(S.value<=0){
S.L.remove(someprocess tmp); //從隊列中彈出一個阻塞進程
tmp.wakeup(); //喚醒該進程
}
}
3.AND型信號量
數據結構和記錄型信號量相同
PV操作:
與記錄型信號量不同的是在wait中加入AND條件,又稱AND同步或同時AND操作:Swait
SWait(S1,S2,...Sn){
if(S1>=1 and ...Sn>=1){
for(i=1:n){
Si=Si-1
}
}
else{
將該進程放入等待隊列並將程序計數器置於Swait操作的開始位置上
}
}
Ssignal(S1,S2,...Sn){
for(int i:n){
Si=Si+1;
}
將等待隊列中所有進程激活
}
調度
調度算法
-
FCFS(First come first server) 先來先服務算法
有利於長作業(進程),而不利於短作業(進程)
有利於CPU繁忙型作業(很少使用I/O ),不利於I/O繁忙型
-
短作業優先法(SJF):從後備隊列中選擇一個或若干個估計運行時間最短的算法調入內存運行
-
短進程優先算法(SPF):從後備隊列中選出一估計運行時間最短的進程,分配處理機使它立即執行到完成或阻塞,再重新調度
SJ/PF算法的缺點:
- 對長作業不利.如果有一長作業在後備隊列中,但是總是優先調度那些短作業,將導致該作業長期不能執行
- 未考慮作業的緊迫程度
- 作業的長短完全是用戶決定的,所有估計執行時間而定的不一定能真正達到短作業優先
-
非搶佔式優先權算法
先執行優先權最高的到該進程執行完或阻塞後再選擇下一個進程
-
搶佔式優先權算法
實時監控就緒隊列,當出現優先級更高的進程時,就重新將處理及分配給新的優先權最高的進程
比較合理的算法:
-
高響應比優先權調度算法
引用動態優先權,並使作業優先級隨着等待時間的增加而以速率a增高
該優先權的變化規律爲:
優先權=(等待時間+要求服務時間)/要求服務時間
優先權=響應比=響應時間/要求服務時間
響應比就是優先權
-
多級反饋隊列調度算法
(1) 爲多個就緒隊列賦不同的優先級:
- 第一個隊列的優先級最高其餘逐個降低
- 各隊列中進程執行的時間片也不同,優先級越高的隊列中時間片越小
(2) 新進程進入內存後,首先放入第一隊列的末尾,按FCFS原則等待調度執行時,如果能在時間片內完成,便準備調離系統,如果未完成,就放到第二隊列的末尾…
(3) 僅當第1~(i-1)隊列都空時,纔會調度第i隊列中的進程運行,如果正在執行第i隊列的中的某個進程時又有新的進程進入優先權高的隊列中時,新進程將搶佔處理機,即由調度進程把正在運行的進程放回到第i隊列的末尾,然後把處理機分配到新的高優先權進程
優先權的類型
- 靜態優先權:優先權從初始(創建進程時確定)開始一直不變
- 動態優先權:可以動態的改變,一般時隨進程推進或等待時間而增大
確定優先權依據
- 系統進程應該高於用戶進程
- 資源佔用少的應該高於資源佔用多的
- 用戶需求
分區分配算法
在空閒分區中找一個適合的地方給請求者分配內存
-
首次適應算法FF
- 空閒分區鏈以地址遞增的次序鏈接
- 從鏈首開始查找,知道找到一個大小能滿足要求的空閒分區爲止,再按作業的大小,從該分區中劃出一塊內存給請求者,餘下的空閒分區仍留在空閒鏈中.如果找一遍找不到就返回失敗
-
循環首次適應算法(首次適應算法會導致高地址內存的利用率比較高)
每次從上次找到的空閒區的下一個分區開始查找(滿足分配均勻)
-
最佳適應算法
將所有空閒分區按其容量從小到大的順序形成一個空閒分區鏈,第一次找到的空閒去必然是最佳的
分頁請求管理
- 在分頁系統的基礎上,增加了請求調頁功能,頁面置換功能所形成的頁式虛擬存儲系統
- 它允許只轉入若干頁(而非全部程序)的用戶程序和數據,便可啓動允許
- 再通過調頁功能即頁面置換功能,陸續的將即將要允許的頁面調入內存,同時把災難不運行的頁面換出到外存上,置換時以頁面爲單位
請求分頁的頁表機制
基本作用是將邏輯地址變換爲物理地址,在頁表中再增加若干項,供換入換出時參考:狀態位
頁號 | 物理塊號 | 狀態位P | 訪問字段A | 修改位M | 外存地址 |
---|---|---|---|---|---|
用來標誌該頁面是否在內存 | 用來記錄本頁在一段時間內被訪問的此時,或記錄本頁最近已有多長時間沒被訪問,供換出頁面時參考 | 該頁面調入內存後是否被修改過,如果修改過,要在外存中重寫 | 用於存放該頁在外存中的地址,便於調出 |
缺頁中斷機構
請求分頁系統中每當索要訪問的頁面不在內存時,便要產生缺頁中斷,請求將所缺之頁調入內存
與一般中斷的區別:
- 在指令執行期間產生和處理中斷信號
- 一條指令在執行期間,可能產生多次缺頁中斷
內存分配的三個問題
抖動:內存中頻繁的換入換出
-
最小物理塊數
- 能保證程序正常運行所需的最少物理塊數.若系統爲進程分配的物理塊數少於此值時進程將無法運行
- 最少物理塊數與計算機硬件結構有關,取決於指令的格式,功能和取址方式
-
物理塊的分配策略
-
固定分配局部置換:爲每個進程分配一固定頁數的內存空間且在整個內存空間不改變,如果卻頁就從該進程中的頁面中選出一頁再調入一頁
缺點:爲每個進程分配多少個面的內存難以確定,若太少會導致頻繁的換入換出(抖動);如果分配太多,會使內存中進程數減少,會造成CPU和其他資源的浪費
-
可變分配全局置換:先給每個進程分配一定數目的物理塊,OS保持一個空閒的物理塊隊列,缺頁時從空閒的物理塊隊列中取出一個分配給進程,並將欲調入的缺頁裝入其中,當物理塊隊列爲空時從內存中選一頁調出
!全局指的是系統給的全局物理塊隊列
-
可 變分配局部置換:局部是指從自身進程的頁面中選出一頁進行換出,如果頻繁缺頁中斷,就再分配一個物理塊
-
-
物理塊的分配算法
- 平均分配算法:將系統中所有可供分配的物理塊,平均分配給各個進程
- 按比例分配算法:根據進程的大笑按比例分配物理塊的算法,