前端備戰21秋招之作業系統,執行緒/進程/死鎖
前端備戰秋招之作業系統
內容根據春招面經整理,文末有面試遇到的相關問題
筆者文筆有限,如有不足之處還請斧正
文字內容較多,請細細品讀,有些點可能有贅述之處,品完此文,面試與此相關的問題,就能得心應手的對付了,還能總結出一套自己的結論
進程
進程是一種抽象的概念,從來沒有統一的標準定義
各式各樣的定義
進程是可並發執行的程式在一個數據集合上的運行過程
進程是指進程實體的運行過程
- 進程是一個具有一定獨立功能的程式在一個數據集上的一次動態執行的過程
- 作業系統進行資源分配和調度的一個獨立單位
- 行為的一個規則叫做程式,程式在處理機上執行時所發生的活動稱為進程
- 具有一定功能的程式在某個數據集合上的一次活動
- 進程是一個程式與其數據一道通過處理機的執行所發生的活動
兩個基本屬性
- 進程是一個資源分配的基本單位
- 進程是一個可獨立調度和分派的基本單位
特點
- 結構性:由程式(段),數據(段),進程式控制制塊(PCB)三部分組成
- 程式:描述進程要完成的功能
- 數據:程式執行時所需數據和工作區
- 進程式控制制塊:進程唯一標識,包含描述資訊與控制資訊
- OS感知進程存在的唯一標誌
- 動態性:進程是程式的執行過程
- 臨時產生的,動態產生/消亡
- 並發性:多個進程可同時存在於記憶體中,能在一段時間內同時運行
- 獨立性:獨立運行的基本單位,獨立獲得資源與調度的基本單位
- 進程是系統進行資源分配和調度的一個獨立單位
- 非同步性:各自的進程獨立的按不可預知的速度推進
狀態
- 運行(Running):佔用CPU且正在CPU上運行
- 就緒(Ready):已具備運行條件(獲取了除CPU以外的其它所需資源),但CPU沒有空閑
- 等待/阻塞/睡眠(Waiting/Blocked):因等待某一事件而不能運行
低級調度
低級調度又稱為
進程調度
、微觀調度或短程調度
- 非搶佔式調度:不允許某進程搶佔已經分配出去的處理機。
- 搶佔式調度:允許調度程式根據某種原則,暫停正在執行的進程,將處理*機重新分配給另一進程。
- 搶佔原則
- 優先權原則
- 短作業(進程)優先原則
- 時間片原則
- 搶佔原則
進程調度時機
- 一個進程運行完畢,或因某種錯誤而終止運行
- 當一個進程在運行時變為等待狀態(等待I/O)
- 分時系統中時間片到
- 當有一個優先順序更高的進程就緒(搶佔式)
- 在進程通訊中,執行中的進程執行了某種原語操作(P操作,阻塞原語)
CPU調度過程
即進程切換步驟
為了控制進程的執行,內核必須有能力掛起正在CPU上執行的進程,並恢復以前掛起的某個進程的執行,這叫做進程切換、任務切換、上下文切換
- 保存現場:順序保存,最後一步保存PSW
- 選擇要運行的程式
- 恢復現場:最後一步恢複選中進程的PSW
通訊
- 管道:匿名/具名管道
- 訊號量
- 共享記憶體
- 消息隊列
- 套接字
執行緒
- 將進程的兩個基本屬性分開,執行緒作為調度的基本單位,不同時作為獨立分配資源的單位
- 執行緒會被頻繁調度和切換
- 進程作為擁有資源的單位,不進行頻繁切換
定義
- 是進程中的一個實體,是被系統獨立調度的基本單位
好處
- 建一個新執行緒花費時間少
- 執行緒的終止時間比進程短
- 同進程內的執行緒切換時間比進程短
- 因為同一進程內的執行緒共享記憶體和文件,因此它們之間相互通訊無須調用內核
屬性
- 輕型實體:基本不擁有資源
- 獨立調度的基本單位
- 可以並發執行
- 共享進程資源
執行緒的特徵
- 結構性
- TCB:標識、現場資訊(暫存器、PC、棧指針)、調度資訊(狀態、優先順序)
- 數據塊:過程參數、數據、系統與用戶堆棧
- 並發性
- 同一進程中的各執行緒在同一主存空間,可以共享進程中的所有資源(數據、設備、文件),執行緒間通訊方便
- 共享性
- 同一進程的各執行緒
- 動態性
- 有生命周期,有狀態變化,可創建子執行緒
- 在引入執行緒的OS中,執行緒是進程中的一個實體,是被系統獨立調度和分派的基本單位
- 執行緒自己基本不擁有系統資源,只擁有少量必不可少的資源:程式計數器PC、一組暫存器、棧
- 執行緒可與同屬一個進程的其它執行緒共享進程所擁有的全部資源
- 一個執行緒可以創建和撤消另一個執行緒;同一進程中的多個執行緒之間可以並發執行
- 系統調度的基本單位是執行緒而不是進程,每當創建一個進程時,至少要同時為該進程創建一個執行緒,否則該進程無法被調度執行
執行緒間通訊方式
- 執行緒間的通訊可以通過共享進程級全局變數
通訊
- 共享進程級全局變數
- 自定義消息
同步方式
- 事件
- 訊號量
- 互斥量
- 臨界區
進程與執行緒的區別
- 引入進程的目的是為了使多個程式更好的並發執行,改善資源利用率、提高系統效率
- 引入執行緒則是為了減少並發執行時所付出的時空開銷,使並發粒度更細、並發性更好
關係
- 一個執行緒屬於一個進程
- 一個進程至少有一個執行緒
- 資源分配給進程,執行緒共享其中的資源
- 處理機分配給執行緒
定義
- 進程:可並發執行的程式在一個數據集合上的運行過程
- 執行緒:是進程中的一個實體,是被系統獨立調度的基本單位
調度
- 傳統OS中,擁有資源、獨立調度的基本單位是進程
- 引入執行緒的系統中,執行緒是調度和分派的基本單位,而進程是擁有資源的基本單位
- 在同一個進程內執行緒切換不會產生進程切換,由一個進程內的執行緒切換到另一個進程內的執行緒時,將會引起進程切換
並發性
在引入執行緒的系統中,進程之間可並發,同一進程內的各執行緒之間也能並發執行。因而系統具有更好的並發性
資源
無論是傳統OS,還是引入執行緒的OS,進程都是擁有資源的獨立單位,執行緒一般不擁有系統資源,但它可以訪問隸屬進程的資源。即一個進程的所有資源可供進程內的所有執行緒共享
系統開銷
- 進程創建和撤消的開銷遠大於執行緒創建和撤消的開銷
- 進程切換時,當前進程的CPU環境要保存,新進程的CPU環境要設置
- 執行緒切換時只須保存和設置少量暫存器,並不涉及存儲管理方面的操作
- 同一進程內的各執行緒由於它們擁有相同的地址空間,它們之間的同步和通訊的實現也比較容易
目的
- 進程:為了使多個程式更好的並發執行,改善資源利用率、提高系統效率
- 執行緒:為了減少並發執行時所付出的時空開銷,使並發粒度更細、並發性更好
差異
進程
- 擁有獨立的地址空間:一個進程崩潰後,在保護模式下不會對其它進程產生影響
執行緒
- 只是進程中的不同執行路徑
- 有獨立的堆棧與局部變數
- 沒有單獨的地址空間
- 一個執行緒死掉等於整個進程死掉
小總結
- 多進程程式比多執行緒程式健壯
- 進程切換時耗費資源更大,效率較差
- 執行緒執行開銷小,但不利於資源的管理和保護
- 要求同時進行又要共享某些變數的並發操作,只能用執行緒,不能用進程
- 多個執行緒共享記憶體,從而極大地提高了程式的運行效率
- 進程在執行過程中擁有獨立的記憶體單元
死鎖
死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源而造成阻塞的現象,若無外力作用,它們都將無法繼續執行
產生原因
- 競爭資源引起進程死鎖
- 可剝奪和非剝奪資源
- 競爭非剝奪資源
- 競爭臨時性資源
- 進程推進順序不當
產生條件
- 互斥條件:涉及的資源是非共享的
- 涉及的資源是非共享的,一段時間內某資源只由一個進程佔用,如果此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放
- 不剝奪條件:不能強行剝奪進程擁有的資源
- 進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放
- 請求和保持條件:進程在等待一新資源時繼續佔有已分配的資源
- 指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放
環路等待條件:存在一種進程的循環鏈,鏈中的每一個進程已獲得的資源同時被鏈中的下一個進程所請求
在發生死鎖時,必然存在一個進程——資源的環形鏈
- 指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放
解決辦法
只要打破四個必要條件之一就能有效預防死鎖的發生
面試相關問題
能力有限,這裡就沒有留下個人的回答了,避免帶入誤區,影響到讀者的總結,我相信讀者可以根據上文中知識點的描述,能總結出自己的結論