操作系統學習筆記(進程、線程、CPU調度、死鎖)

1、進程與線程

進程:

  1. 父進程先創建,子進程後創建,但是子進程先死亡,因爲子進程可能需要共享父進程的資源;
  2. 進程中止原因:進程結束、進程終止、內存清除;
  3. 生產者-消費者:生產者進程是產生數據的進程,在硬盤中讀取數據到內存;中間線程將緩衝區1的數據解壓到緩衝區2;消費者進程是消費數據的進程,將緩衝區2將數據顯示;
  4. 生產者消費者一定是時間片輪轉,不是批處理,否則會陷入無盡的等待;
  5. 原語:執行過程中不可中斷,一條機器指令是一條原語,事務的原子性;
  6. 阻塞會等待,非阻塞不會等待;
  7. 緩衝區:節省時間,提高效率;
  8. 進程是資源(CPU、內存等)分配的基本單位,它是程序執行時的一個實例。程序運行時系統就會創建一個進程,併爲它分配資源,然後把該進程放入進程就緒隊列,進程調度器選中它的時候就會爲它分配CPU時間,程序開始真正運行。

線程:

  1. 線程:一個進程可以包括一個至多個線程(有限個),每個線程擁有自己的計存器和堆棧,共享進程的數據和文件;
  2. 三個主要的線程庫:POSIX Pthreads、Win32 threads、Java threads;
  3. c語言API,操作系統系統調用,API在系統調用之上,API調用系統調用,系統調用與操作系統有關,API跨系統,更高層可移植性,接口比系統調用更簡單;
  4. Java在語言層可以創建線程,c語言不行,java虛擬機把java語言解析成字節碼,java中ready狀態和running狀態合併爲runnable狀態;
  5. 用戶級線程多於內核級線程,不存在一個用戶線程對應多個內核線程;
  6. 線程是程序執行時的最小單位,它是進程的一個執行流,是CPU調度和分派的基本單位,一個進程可以由很多個線程組成,線程間共享進程的所有資源,每個線程有自己的堆棧和局部變量。線程由CPU獨立調度執行,在多CPU環境下就允許多個線程同時運行。同樣多線程也可以實現併發操作,每個請求分配一個線程來處理。

2、CPU調度

  1. 用戶進程執行I/O操作需要執行系統調用,進程處於等待狀態只是等待CPU,可照樣執行I/O操作;
  2. 進程因爲時間片到了,從運行狀態轉到就緒狀態,如果就緒隊列爲空,進程依舊會回到就緒隊列;
  3. 優化:最大化CPU利用率與吞吐量,最小化週轉時間、等待時間和響應時間;
  4. 程序從磁盤調入內存就是進程,不在內存只能叫做程序;
  5. 進程調度分爲剝奪式(會中斷正在執行的進程)和非剝奪式;
  6. CPU調度四種情形:進程從運行到等待、從運行到就緒、從等待到就緒、終止;
  7. 優先級調度:每個進程帶有一個優先級數字,小的數字優先級越高;
  8. 操作系統進程優先級比用戶進程優先級高,操作系統負責調度,否則用戶進程得不到調度;
  9. 優先級調度問題:靜態優先級會導致飢餓問題,低優先級的進程可能永遠得不到調度,於是將進程等待時間加入進程的優先級,稱爲動態優先級,但是動態優先級會增加額外的開銷;
  10. 現代操作系統的操作策略:先到先服務,優先級調度和時間片輪轉的共同作用;
  11. 時間片輪轉:每個進程會活得一定時間的時間片,通常10-100毫秒,時間片結束,進程進入就緒隊列;
  12. 時間片長,上下文切換的時間少,CPU利用率高;

3、死鎖

  1. 一系列阻塞的進程,互相持有資源,又等待對方釋放資源,就形成了死鎖;
  2. 硬件資源:cpu、內存、I/O設備;軟件資源:進程、數據等;
  3. 資源的使用:請求->用->釋放;
  4. 死鎖四種情形:互斥,持有和等待,非剝奪,循環等待;
  5. 解決方法:每個進程申請最大資源數(小於操作系統所有的),操作系統要麼分配所有資源,要麼不分配;
  6. 銀行家算法:銀行家算法是從當前狀態出發,按照系統各類資源剩餘量逐個檢查各進程需要申請的資源量,找到一個各類資源申請量均小於等於系統剩餘資源量的進程P1。然後分配給該P1進程所請求的資源,假定P1完成工作後歸還其佔有的所有資源,更新系統剩餘資源狀態並且移除進程列表中的P1,進而檢查下一個能完成工作的客戶,…。如果所有客戶都能完成工作,則找到一個安全序列,銀行家纔是安全的。若找不到這樣的安全序列,則當前狀態不安全;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章