操作系統 --- 哈工大孫志崗70講總結(13-25)


13.windows創建新進程 --- createProcess() 參數為需要執行的程序的位置
 
Google msdn API可以查找Windows的API
 
Linux下man(manual手冊) API可以查找API使用
 
linux下 kill  進程id 結束進程
 
進程間的通信:
消息傳遞 : 進程 ---> 內核 ---> 進程
一方send一方receive,需要先建立鏈路
阻塞型、非阻塞型的消息傳遞
消息在操作系統中的緩存:
無緩沖
有界緩沖
無界緩沖
共享內存 : 進程之間協商(系統調用),划出共享內存(同步問題,有些系統不支持)
int main(void){
     int i;
     for(i=0;i<3;i++){
     fork();
 
     sleep(30);
     }
}
 
對於這個程序,main進程生成三個進程。main的第一個子進程生成2個子進程,第二個子進程生成一個子進程,第三個子進程不生成子進程。
而不是每一個子進程都生成三個子進程。(每次主進程fork之后都會i++,3個子進程中的i值不一樣)

 

運行程序:
 

 

運行結果:子進程和父進程全局變量相互獨立
子進程輸出遞增
父進程一直輸出0
父進程和子進程的value的地址是一樣的
 
線程獨立擁有:(屬於同一進程的線程共享數據文件代碼段)
線程ID
PC
寄存器
 
16.
線程特點:
響應性:
一個進程發起IO操作進入等待狀態,此時用戶點擊窗口,操作系統發起消息但是進程無法響應。對於多線程進程,將IO操作交給新建立的線程。
資源共享,經濟實惠,創建進程開銷很大:
 
 
用戶級線程:使用技術模擬出多套寄存器多個PC多個棧(保存現場恢復現場)。
效率高:不涉及內核
可定制性好
缺點:
1.如果任何一個線程調用了阻塞型的系統調用,那么所有線程全部被阻塞
2.不能在多個處理器上運行,在操作系統眼中只是一個線程
內核級線程:內核支持的線程
 
17
Linux線程實現:
clone()系統調用可以實現fork()和線程
clone參數(標志位):
CLONE_FS子任務和父任務文件系統共享
CLONE_FILES 打開的文件是共享的
CLONE_VM 內存共享
 
Linux創建線程和進程的區別:
調用fork的時候調用clone沒有加CLONE_VM
創建線程的時候加了CLONE_VM參數
 
這導致在系統看來進程和線程沒有區別,線程沒有優化(所以把線程叫做輕量級進程)
 
18.線程模型不穩定,一個線程出問題導致進程崩潰。
 
19 進程可以分為:
CPU綁定進程
IO綁定進程
 
CPU調度發生:決定下一個需要運行的進程
調度算法優劣:
CPU利用率
吞吐率:單位時間運行了多少進程
周轉時間:進程創建到結束一共多少時間
等待時間:在就緒隊列一共過了多少時間
響應時間:事件發生后進程過多少時間才能響應時間
 
最短作業調度:
搶占式
非搶占式(最短剩余時間優先)
時間片輪轉法:分配時間片(固定長度),到時間就等待。從就緒隊列中選優先級高的,分配時間片。
 
如何實現時間片輪轉+選擇優先級高的 ---- 多級隊列
每個進程放到不同優先級的隊列中,每次從最高優先級的隊列中取進程運行
優先級:
系統進程如中斷處理需要及時處理,放在最高優先級
交互式進程(和用戶輸入輸出相關,IO時間較多,使用CPU時間很短,要求快速給用戶響應),次優先級
CPU使用較多的進程
 
現在操作系統常用策略:多級反饋隊列(MultiLevel FeedBack Queue)
根據進程之前的行為決定CPU調度
實現:

 

上面兩個隊列使用時間片輪轉法
第三個隊列使用先進先出
對於第一個隊列的進程CPU分配的時間片為8
所有進程進來(不知道是CPU綁定還是IO綁定的)先放到優先級最高的隊列
如果進程一進來就把8個時間片用完了(沒有進入IO,CPU綁定型),就把進程放入下一優先級的隊列。
如果又用完了16個時間片,那么再往低優先級的放(先進先出隊列)
這樣可以使CPU綁定型的進程在低優先級,CPU可以快速響應用戶輸入輸出(IO綁定型)
 
問題:如果一個進程一開始CPU綁定型(IO綁定型)或者相反,會出問題
解決:
不是一次判斷而是運行時多次判斷,如果進程有任何一次將CPU時間片用完,那么就放入低一級的優先隊列
如果低優先級隊列中的進程進行了一次IO(從等待狀態到就緒狀態),就會放入高一級的優先隊列。這樣的好處是用戶IO完后需要CPU盡快處理
 
多核CPU的調度:更復雜的調度,需要做負載均衡(CPU都忙)
多核CPU有同構和異構(CPU指令、運算速度)
和單核相同:下一個進程選擇都是選擇優先級高的
不同:有
對稱式多處理器管理 (大部分)--- 每一個內核都可能運行進程或者操作系統
每一個CPU都有自己的就緒隊列
所有處理器共享就緒隊列 --- 如果一個進程從一個CPU切換到另一個CPU,會導致Cache刷新(CPU的緩存不共享)
非對稱式多處理器管理:只有一個CPU運行操作系統  --- 對操作系統設計簡單很多
 
親和性(Affnity ):程序員可以設置進程進入哪個CPU運行
負載均衡:
忙CPUpush到閑CPU中或者閑CPU 從忙CPU pull
 
兩者沖突? -- 》 soft Affnity(一般設置)或者hard Affinity
 
Solaris舉例:(不需要重新編譯內核可以修改這個表)

 

數字越大優先級越大,給的時間片越少
一行解釋: 20優先級的隊列分配 120的時間片。時間片用盡進行優先級調整成 10(用完了說明是CPU密集型,往更低級的隊列里放)
return from sleep : 對應優先級如果進行了IO,從等待態到就緒態的時候優先級變為 return from sleep(從IO中被喚醒觸發這個操作)
 
Windows XP調度:
 

 

設置優先級的時候需要兩個值:
哪一類(時間緊要的,最高的,正常之上的,正常的 等等)
每個類別里還有對時間片渴求程度的區分
比如:
常用進程優先級是8(normal,normal)
在below normal中的time-critical(時間緊迫的)的優先級是15,很高
激活窗口的線程的優先級是原來的
 
Linux的優先級:(數字越小優先級越高)
Real-time : 0-99
Nice : 100-140
 

 

 
每個優先級有一個隊列,每個優先級分配對應的時間片。
一個線程用完時間片就扔到 另一個數組的優先級隊列中。這樣active array數組中的優先級隊列中就是時間片沒有用完的。通過active和expired切換保證所有線程都有執行的機會
 
24.進程的同步
rewind(File * f):使文件指針執行文件頭部
fopen:打開文件,返回文件指針
 
25.
臨界區:訪問共享資源(臨界資源)的代碼段
 
進程進入臨界區的調度原則是:
 
1、如果有若干進程要求進入空閑的臨界區,一次僅允許一個進程進入。
 
2、任何時候,處於臨界區內的進程不可多於一個。如已有進程進入自己的臨界區,則其它所有試圖進入臨界區的
 
進程必須等待。
 
3、進入臨界區的進程要在有限時間內退出,以便其它進程能及時進入自己的臨界區。
 
4、如果進程不能進入自己的臨界區,則應讓出CPU,避免進程出現“忙等待


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM