## **操作系統**
**死鎖以及為什么發生死鎖,解除死鎖**
死鎖是指一組相互競爭系統資源或進行通信的進程間的"永久"阻塞。
產生死鎖的原因:
(1)競爭系統資源
(2)進程的推進順序不當
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
**解除死鎖**:
當發現有進程死鎖后,應立即把它從死鎖狀態中解脫出來,常采用的方法有:
剝奪資源:從其它進程剝奪足夠數量的資源給死鎖進程,以解除死鎖狀態;
撤消進程可以直接撤消死鎖進程或撤消代價最小的進程,直至有足夠的資源可用,
死鎖狀態消除為止
所謂代價是指優先級、運行代價、進程的重要性和價值等。
**進程之間通信方式**:
> 信號,管道,消息隊列,共享內存。
## **啟動流程 ( Windows )**:
基本上操作系統是從計算機通電自檢完成后開始進行的,這一過程可以分為
( 預引導、引導、載入內核、初始化內核、登錄等 5 個階段 )
1) 預引導
通電自檢后,從引導設備中讀取并運行主引導記錄MBR
2) 引導
引導階段又可以分為 初始化引導載入程序、操作系統選擇、硬件檢測、硬件配置文件選擇
在這一過程中需要使用的文件包括 ntldr、boot.ini、ntdetect.com、ntoskrnl.exe、ntbootdd.sys、bootsect.dos ( 非必須 )
A 初始化引導載入程序:
程序 ntldr 會自動尋找系統自帶的一個微型的文件驅動,讀取文件系統驅動并成功找到硬盤上的分區后,引導載入程序的初始化過程就已經完成。
B 操作系統選擇:
ntldr 程序完成了初始化工作后就會從硬盤上讀取 boot.ini 文件,進行操作系統選擇(多系統)
C 硬件檢測:
操作系統選擇了想要載入的 Windows 系統后,ntdetect.com 首先要將當前計算機中安裝的所有硬件信息收集起來并列成一個表,接著將該表發送給 ntldr,這個表的信息稍后會被用來創建注冊表中有關硬件的鍵。這里需要被收集信息的硬件包括總線 / 適配器類型顯卡、通訊端口、串口、浮點運算器 ( CPU )、可移動存儲器、鍵盤、指示裝置 ( 鼠標 )。
D 配置文件選擇:
這個步驟不是必須的。
只有在計算機(常用于筆記本電腦)創建了多個硬件配置文件的時候才需要處理這一步
3) 載入內核階段
在這一階段,ntldr 會載入 Windows 的內核文件 ntoskrnl.exe,但這里僅僅是載入,內核此刻還不會被初始化。隨后被載入的是硬件抽象層。接下來要被內核載入的是:HKEY_LOCAL_MACHINE\System 注冊表鍵。
ntldr 會根據載入的 Select 鍵的內容判斷接下來需要載入哪個 ControlSet 注冊表鍵,這些鍵決定隨后系統會載入哪些設備驅動或者啟動哪些服務。
這些注冊表鍵的內容被載入后,系統將進入初始化內核階段。
這時候ntldr會將系統的控制權交給操作系統內核。
4) 初始化內核階段
在這一階段中主要會完成 4 項任務:
創建 Hardware 注冊表鍵、對 Control Set 注冊表鍵進行復制載入和初始化設備驅動、啟動服務
A.創建Hardware注冊表鍵:
Windows 內核會使用前面硬件檢測階段收集倒的硬件信息來創建 HKEY_LOCAL_MACHINE/Hardware 鍵。也就是說注冊表中該鍵的內容不是固定的,會根據系統中的硬件配置情況動態更新。
B.對Control Set注冊表鍵進行復制:
如果上一步成功,系統內核會對 Control Set 鍵的內容創建一個備份。這個備份會被用在系統的高級啟動菜單中 "最后一次正確的配置" 選項。
例如,系統新裝了一個顯卡驅動,Hardware 還沒有創建成功系統就崩潰了,這時就可以使用"最后一次正確的配置"選項,用上一次 Control Set 注冊表鍵的備份內容重新生成 Hardware 鍵,從而撤銷因安裝了顯卡驅動對系統設置的更改。
C.載入和初始化設備驅動:
操作系統內核首先會初始化之前在載入內核階段載入的底層設備驅動,然后會在注冊表的,HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services 鍵下查找所有 Strat 鍵值為 1 的設備驅動,這些設備驅動將會在載入之后立刻進行初始化。
D.啟動服務:
系統內核成功載入并且成功初始化所有底層設備驅動后,ntoskrnl.exe 創建會話管理器進程 smss.exe,這是第一個用戶態進程 會話管理器會啟動其他高層子系統和服務,加載并初始化內核模式中的 Win32 子系統 ( win32k.sys ),啟動 csrss.exe ( win32 子系統在用戶模式的部分 ),進而啟動 Win32 子系統。Win32 子系統的作用是控制所有輸入 / 輸出設備以及訪問顯示設備。當這些操作都完成后,Windows 的圖形界面就可以顯示出來了,同時用戶也將可以使用鍵盤以及其他 I/O 設備。
接下來會話管理器會啟動 winlogon 進程。至此,初始化內核階段已經成功完成,這時候用戶就可以開始登陸了。
5)登錄階段
這一階段,由會話管理器啟動的 winlogon.exe 進程將會啟動本地安全性授權 lsass.exe 子系統,加載圖形化標識和驗證 ( Graphical Identfication and Authentication,GINA ) 并等待用戶登錄。
默認 GINA 是 Msgina.dll,可以自行開發 GINA 實現基于生物信息的用戶登錄 ( 指紋識別,人臉識別 ),然后啟動后臺服務管理器 services.exe ,通過它啟動所有標識為自動啟動的 Win32 服務程序。
在登錄過程中,后臺可能仍在加載一些非關鍵的設備驅動。系統會再次掃描 HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services 注冊表鍵,尋找 Start 鍵的數值是 2 或者更大數字的服務。這些服務就是非關鍵服務,系統直到成功登錄后才開始加載這些服務,至此,Windows 啟動過程完成。
### **線程**:
線程有時候又被稱為輕量級進程,是程序執行的最小單元。
一個進程可對應多個線程,而一個線程只屬于一個進程。進程的執行是以線程為單位進行的,比如說一個簡單 “hello world” 程序只有一個線程,就是 main() 函數對應的線程。
## **保護模式,實模式**
保護模式與實模式相對應,在保護模式下, CPU 的尋址模式與實模式不同。
實模式下的尋址方式是 "段基址+段偏移",段的默認大小為 64kb ,所有段都是可讀寫的,唯有代碼段是可執行的,段的特權級為 0。
特權級有 0、1、2、3 四個級別,0 特權級別最高,3 特權級別最低想要控制系統,就必須取得0特權級,比如調試工具 SoftICE 就工作在0特權級上。