進程管理邏輯圖
- 將多個程序拷貝到進程中,占用內存,如圖扇形區域,當酷狗進程需要資源的時候,會通過I/O子系統取用資源的過程中,會放棄對cpu的占用,cpu就會處理別的進程,因此提高了cpu的利用率(I/O低速,cpu高速)
- qq想要知道鍵盤輸入的結果,他就會拜托I/O子系統去取鍵盤輸入的結果,這個時候會放棄CPU的占用,CPU會重新分配給其他應用程序。當I/O取到鍵盤輸入的數值,會把結果返回給QQ
- 死鎖中對于資源的搶占不僅僅是cpu,也有鍵盤、鼠標、U盤等I/O資源
- I/O低速 CPU高速?
- 當QQ需要使用I/O獲取數據的時候,會由先前的獲得CPU狀態變成等待CPU狀態,這個過程是因為I/O阻塞從而主動放棄CPU。然后進入排隊隊列,狀態為I/O中,阻塞。
- 因為不同的進程對資源的要求以及獲取速度的不同,有可能獲得了CPU但是狀態還是阻塞中,所以會短暫的獲取CPU然后立刻放棄CPU,進入排隊隊列。這會造成CPU的資源浪費。
- PCB存儲的就是多進程狀態圖的狀態信息
- 排隊,形成一個循環隊列;只有就緒狀態的進程才可以獲取cpu,處于阻塞狀態的進程無法獲取cpu
- 阻塞狀態的成員獲得cpu之后,因為I/O狀態沒有轉備好數據,立刻放棄cpu。這個過程是低效的,應該按照進程的屬性排成兩個隊列?
- 隊列分成兩種,就緒隊列(I/O完)和阻塞隊列(I/O),提高了CPU的利用率
進程的由來
- 1,如果將一個程序所依賴的所有功能弄到一個進程的話,如圖所示,如果網絡功能進行網絡資源的訪問,涉及到I/O會釋放對CPU的占用,因此其余的功能,比如渲染、物理引擎計算等等也會失去CPU的占用,軟件會卡死;
- 2,如果為軟件的不同功能都分配一個進程,每個進程實現不同的功能,多個進程會導致時空開銷大,而且存儲狀態信息的工具PCB有限,因此引入了線程的概念。
- 3,兩個功能進程之間切換。時空開銷具體體現在上下文切換,上下文切換,是指上面涉及到的就緒、阻塞、運行狀態的轉換,如果切換過于頻繁,在挑選PCB和修改PCB的信息,時間效率會降低;cpu執行qq程序,后切換到LOL程序,在回到qq程序,這個過程會涉及到狀態信息的保存,利用棧保存當前信息,因為棧需要開辟空間,因此會帶來空間開銷。
- 3,線程,將功能轉化為線程。解決了進程上述提到的問題。進程是線程的容器,進程和線程同時存在。
- 4,進程和進程之間并發,線程和線程之間并發(同一個進程不同線程;不同進程的不同線程)
- 新事物的出現,在解決舊的矛盾的同時也會引入新的矛盾
?
進程和程序的區別
- 1,程序是靜態的,進程是動態的。程序就是代碼,但是進程會涉及到狀態的轉換,就緒、阻塞和運行之間的切換,這個過程是動態的
- 2,進程是程序的一次執行過程。
- 3,程序和進程不是一一對應的,即以下兩點
- 一個程序對應多個進程-->多開?word程序打開不同的文檔
- 一個進程對應多個程序-->UI界面進程:QQ 360?LOL
進程的特征
- 1,并行
- 2,異步
- 3,動態性:狀態的轉換;存儲在PCB
- 4,結構性:(描述,組織)?進程 =?程序+PCB;程序:指令段(程序段)和數據段
- 5,獨立性:資源分配,給每一個進程分配的空間都是隔離的
進程的結構
編譯
- 編譯過程中,將.c文件轉化為.o文件,將內部代碼轉化為程序段和數據段,具體轉化如下:
- a+b -> 3+2;其中a是變量名字,在編譯的時候,所有的數據會匯聚在一起,所有的指令也會匯聚在一起。將數據存儲到數據段,指令存儲到程序段(指令段)。
鏈接
- 將.o文件中的所有數據段放在一起,所有的程序段放在一起。然后形成exe運行程序
- 程序運行的時候,將程序代碼從磁盤拷貝到內存中,?也就是將數據段和程序段從磁盤復制到內存中,并且創建一個pcb模板,記錄到內存中
PCB
- 運行軟件,將程序從磁盤拷貝到內存(將其指令段和程序段拷貝到內存上)上運行的同時會創建一個PCB(檔案),PCB
- PCB是進程存在的唯一標識
- PCB存儲的內容:
- 進程標識符:唯一性,進程的數字標識,數字代表程序
- 進程的當前狀態:新建、就緒、堵塞、運行、結束
- 進程的優先級:VIP,用于后面的程序調度
- 代碼的入口地址:程序由磁盤拷貝到內存中,入口的地址是指拷貝到內存中的起始地址,指向內存
- 代碼的外存地址:標識本段代碼是從磁盤哪個區域拷貝過來的,指向磁盤
- 進入內存的時間:從磁盤拷貝到內存的完成的時間
- 代碼段指針:指向代碼段
- 數據段指針:指向數據段
- 堆棧指針:CPU在不同進程之間切換,用于保存現場信息
進程的狀態與控制
?
- 就緒:使用PCB里面的PID代表進程,使當前狀態為ready,標識就緒;使用pcb進行排隊
- PCB :process?control?block,通過調整PCB內部參數的數值,控制不同的進程
- 進程狀態轉換圖-目的:便于OS監控和調度
- *進程程序運行 需要同時具備?PCB +?內存 +?CPU
- 每種狀態擁有了哪些資源?
- 什么時候需要狀態裝換?
- 狀態裝換需要做什么事情?(進程的控制)
- 1,分配(申請)?PCB +?內存 +?CPU
- 2,回收? ? ? ? ??PCB +?內存 +?CPU
- 3,修改PCB 中進程的當前狀態
- 例子
- ?點擊QQ,CPU將代碼復制到內存,并且開辟QQ_PCB,并修改當前狀態為ready,由新建狀態變成了就緒狀態;通過pcb內部代碼運行的入口地址,找到QQ程序的入口地址,cpu分配,由就緒狀態變成了運行狀態,改狀態信息為run。cpu運行一段時間就會由一個程序跳轉到另外一個程序,假設QQ占有的cpu時間到了,就會釋放cpu,cpu會到360進程,因此qq從運行狀態變成了就緒狀態。
- QQ發消息,因為發消息需要網卡,發消息的時候會釋放CPU,由由運行狀態變成阻塞block狀態,當得到I/o請求,將阻塞狀態變成就緒狀態
- 關閉qq程序或者異常退出,會使得qq進程終止,歸還 內存、刪除pcb,交還CPU,注意順序問題
進程之間通信?IPC(Inter?process?communication)
os實現進程之間通信?
- 1,為什么要通信?安全性和交互性,不同進程之間創建之后,都會在內存上分配一段內存,彼此內存空間不可見(內存隔離),這個目的是為了提高安全性。但是如何在保證安全性的前提下實現進程之間交互,就需要進程通信
- 2,通信的例子?粘貼復制,實現word和txt之間內容拷貝;天影天堂下載電影,自動啟動迅雷下載,通信的內容就是電影的鏈接;網站登錄,第三方登錄選擇QQ登錄
?
?
- 1,共享內存 2,消息傳遞 3,管道通信
- 最后一個是管道通信,因為os可以實現和不同進程之間的通信,因此不同進程可以通過連接通信管道,實現進程之間的通信
- 半雙工是指每次雙方只有一個人講話,不可以同時說話
三級調度
- 中級調度,比如使命召喚,整個游戲有100G,但是內存只有8G,游戲運行的時候,會根據游戲場景變化和人物的變化,動態切換,即將磁盤數據拷貝到內存中執行,對于執行完的數據,要不丟棄,要不復制到磁盤。解決內部不夠問題,以及提高了內存的利用率。
-
高級調度,第一次將數據從磁盤拷貝到內存
- ?低級調度,程序已經到達內存,cpu一個一個來執行,搶奪cpu
進程調度算法
FCFS算法 +?調度過程? first?come?first?service
- 算法思想:先來先服務,一次運行一個程序,只有前面的程序結束之后,才會運行下一個程序
- 調度方式:不可剝奪,非搶占(搶占cpu)。非搶占,主動放棄;搶占,是被迫放棄。按照磁盤拷貝到內存的順序,PCB形成一個隊列,按照這個隊列依次執行程序。只有前面的程序釋放,后面的程序才有機會得到cpu來執行。
- 調度時機:一個進程結束
- 特點 :?利長不利短,利于需要占據cpu長的程序,不利于占用cpu短的程序
- ?? ??? ?? ? 利CPU忙,不利I/O忙;因為排隊,CPU不停歇,非常忙碌;如果io頻繁,會增加大量的I/O時間
- ?? ??? ?? ? 不利分時、實時系統;分時:cpu在不同的進程之間切換;實時,立刻調動cpu到指定的進程執行。FCFS算法不滿足分時和實時系統以上的條件
- 典型案例:打印機?銀行窗口
時間片輪轉算法 +?調度過程
- 算法思想:分時間輪流獲取CPU(按照隊列的順序),循環隊列,適用于分時操作系統,每個進程運行指定的時間片長度然后釋放cpu
- 調度方式:可剝奪,搶占的方式
- 調度時機:時間片用完(搶占);程序結束(主動,非剝奪)
- 程序的運行時間如何得到的??利用cpu的頻率,得到一個周期的時間 (1/n = T),然后利用計時器(計數器)不斷計數,從而得到一個時間,也就是每個進程占用執行多長時間,10ms。
- 特點:1,時間片大小很講究,不能太大,也不能太小
- ?? ?? ? ? 2,時間片太大,退化為FCFS
- ?? ?? ? ? 3,時間片太小,時空開銷很大,
- ? ? ? ? ? 4,適用于分時系統
SJF算法?短作業優先
- 算法思想:優先選擇短作業,運行時間由程序員提供
- 調度方式:非剝奪?非搶占
- 調度時機:程序結束的時候;阻塞時I/O請求
- 特點:
- 1,利短不利長(長饑餓)
- 2,不可以保證緊迫作業及時運行,(用戶、程序員可能提供虛假的運行時間)
- 3,平均等待時間、平均周轉時間最少
- 4,吞吐量很大
優先級調度算法 +?調度過程
- 算法思想:優先級級別高的優先執行,PCB里面會存一個信息,表明優先級信息
- 調度方式:搶占式,可剝奪式;非搶占式,非剝奪式
- 調度時機:程序結束的時候;阻塞時(I/O請求);更高優先級進程進入隊列的時候
- 特點
- 1,滿足緊迫作業的要求
- 2,特別適用于實時系統中
- 3,動態優先級?靜態優先級
- *優先級翻轉問題
高響應比優先算法
- 算法思想:優先選擇響應比高的進程作業
- 調度方式:無?主要用在調度作業中,從磁盤拷貝到內存
- 調度時機?無
- 特點:
- 1,是FCFS(利長不利短)和SJF(利短不利長)的結合體,利用響應比來結合兩者,綜合利用彼此之間的優勢
- 2,克服了饑餓兼顧了長作業,有使得短作業先運行
- 相關概念
- 提交時間:程序從磁盤拷貝到內存,構建完成PCB
- 等待時間:當程序拷貝到內存之后,如果有其他程序正在占用CPU,那么就需要等待,
- 響應比rp = (等待時間 +運行服務時間)/?運行服務時間
- 占用CPU時間少的進程可以有限執行
- 等待時間一定,服務時間增大,響應比越小,進程運行越靠后執行
- 等待時間一定,服務時間減少,響應比越大,進程運行越靠前執行
- 等待很長時間的進程也會有機會運行
- 服務時間一定,等待時間越大,響應比越大,進程靠前執行
- 服務時間一定,等待時間越小,響應比越小,進程靠后執行
多級反饋隊列調度算法?
- 算法思想:FCFS +?優先級 +?時間片輪轉 (結合體? )
- 調度方式?綜合
- 調度時機?綜合
- 特點
- 1,短作業優先
- 2,周轉時間短
- 3,長作業也會得到處理
?例子
- 假設QQ、360和LOL一次來處理,分成5個級別,只有一次CPU,在第一級CPU每次執行10分鐘,當QQ轉型完成之后,會在第二級排隊等待,cpu會執行360 10分鐘,360運行完10分鐘會在第二級等待,cpu執行LOL。如果第一級沒有等待程序,cpu會到第二級一次執行,第二級的時間片會比第一級的時間片長,執行方式和上面一致,直到有程序執行完退出。
甘特圖
- 生產計劃進度圖
- 描述多個進程之間的進度關系
調度準則介紹
1,cpu利用率? ,盡可能忙碌?FCFS
- 11到13階段 QQ和LOL都沒有占用CPU,屬于cpu空閑
- 空閑率 = (13 - 11)/ 30?
- 使用率 = 1 - 空閑率?
2,吞吐量
- 一個程序開始到結束算一個,計算單位時間內完成程序的數量。
- SJF算法:盡可能使執行時間最短的優先執行,因此吞吐量最大
3,周轉時間
- 結束時間到提交時間的時間差就是周轉時間
- 平均周轉時間 = 所有進程的周轉時間 / 進程的數量
- 帶權周轉時間 = 周轉時間 / 服務時間(運行時間)? 永遠大于1?
- 平均帶權周轉時間 = 所有進程的帶權周轉時間 / 進程的數量
4,等待時間
- 開始時間減去提交時間
5,服務時間(運行時間)
- 結束時間減去開始時間
調度準則之評價調度算法
同步互斥邏輯圖?
并發性 異步性 獨立性
- 并發性:多個進程同時執行
- 異步性:cpu執行每個進程的代碼行數,處理邏輯不同,不具有預測性
- 獨立性:進程之間不通信
臨界資源和臨界區
- 臨界資源:一次只能被一個進程所使用的資源
- 軟件層面:共享變量
- 硬件層面:打印機 網卡 鍵盤
- 和平精英:兩個人搶同一把槍,如何判定這把槍屬于哪個人?這個槍屬于臨界資源,需要在前面添加信號量(交通燈),信號量開始和結束的段落是臨界區,信號量使得cpu在獲取臨界資源前進行檢查,是否可以占有
- 競爭和互斥相關
- 同步和合作相關,體現在代碼執行的運行次序方面
互斥的硬件實現方法
互斥的軟件實現方法
單標志法:
- 令牌環網(輪流傳遞的思想),生死系于別人;對于一個變量進行操作,使用這個變量代表說話人的身份
雙標志法
- 每個人有自己的標志
- 但是雙方可能同時檢查對方的標志,有漏洞,雙方同時修改,導致bug,不會同時出現為true的情形,但是會出現同時為false的情形
- 對臨界資源,競爭雙方先看對方的標志位,如果對方沒有對臨界資源的搶占,就自己對臨界資源進行搶占,并且更新標志位
- 比如A和B搶奪資源,A的標志位為flag,B的標志位為flag;flag為true表示占有資源,flag為false,表示不占有資源。A在對臨界資源的搶奪之前,會看B的標志位,如果為true,表明B占有資源,A就不可以搶占資源,如果為false,則搶占資源,并修改標志位,將自己的標志位修改為true
雙標志后檢查法
- 基于雙標志先檢查法的優化,因為雙方太謙讓而導致的bug
- 交換了兩行代碼的先后順序
- 先申明自己要搶資源,但是會導致無限等待和饑餓問題
peterson算法
- 真正實現互斥
- 引入一個變量
信號量的由來
- 信號量使cpu在進入臨界區之前停下來
- 統一API,p和v操作;p是等待,v是釋放的意思
信號量的工作原理
偽代碼
信號量實現同步
- 初始的時候,將信號量設為0,當P0進程執行的時候,P(S),本質上是wait(s),s.value-1小于0,進入等待
- cpu執行P1進程,V(s)本質上是signal(s),喚醒P0進程,實現了P1進程優先在P0進程之前執行,因此使用信號量實現了進程之間的同步操作
信號量實現互斥
- cpu先執行P0,后執行P1,不會產生互斥現象
- cpu先執行P1,后執行P0,不會產生互斥現象
- cpu先執行P0,期間執行P1,能達到互斥
- cpu先執行P1,期間執行P0,能達到互斥
同步互斥小口訣
- 畫圖理解題目
- 判斷題目類型
- 分析進程數目 填寫進程模板
- 補充基本代碼(偽代碼)
- 補充PV代碼
- 檢查調整代碼
注意事項
- 代碼是一步一步寫出來的,代碼是反復調整寫出來的
- 60%是生產者和消費者模型
- 30%是讀者和寫者的模型