CS-Notes 筆記的筆記
附上 cs-Note的鏈接
概念篇
計算機操作系統
進程與線程
- 進程是資源分配的基本單位以及系統調度的單位,線程是獨立調度的基本單位
- 進程控制塊(PCB) :描述進程的基本信息和運行狀態
- 創建或撤銷線程的時候,系統都要回收資源,開銷很大。但是創建或銷燬進程時開銷較小。另外,進程切換需要執行進程CPU環境的保存以及新調度進程CPU環境的設置,而線程切換時只需要保存和設置少量寄存器的內容
- 線程狀態:
- 就緒
- 運行
- 等待/阻塞
進程同步
同步與互斥
- 同步:由於合作產生的直接制約關係,使得進程有一定的先後執行關係
- 互斥:多個進程只有一個進程能進入臨界區
信號量與互斥量
- 信號量是限制同時進入臨界區的線程數量的整形變量,可以進行PV操作。當信號量的值爲 1 時,則成爲了 互斥量。
進程通信
- 同步與通信:通過進程通信纔可以更好地完成進程的同步
管道
- 匿名管道
- 只限制於父子進程以及兄弟進程中使用
- 只支持半雙工通信。(在使用讀管道時,就不能寫;在使用時,兩個文件描述符需要關閉一個)
- 命名管道
- 可以在父子進程外使用
消息隊列
- 相對於FIFO(命名管道),有以下優點
- 可以根據消息類型選擇性進行接收
- 獨立於讀寫進程,不需要讀寫進程自己處理同步
信號量
共享內存
- 將 同一個文件加載到內存,將內存地址 映射到各個進程的地址空間,從而實現多進程對一各內存塊的訪問。注意:需要師兄信號量來控制內存的讀寫。
套接字(SOCKET)
- 可以跨機器進行通信
內存管理
分頁
- 將內存分爲固定大小的頁面,需要經過 **內存管理單元(MMU)**將邏輯地址映射到物理地址。
- 特點:無外碎片-即頁面與頁面之間沒有空間,但是存在內碎片(即頁面之內有空餘的空間)
分段
- 分段的產生,可以解決一些問題:
- 安全性和共享內存:相同類型的類型在同一個段,可以限制對其的操作
- 溢出保護:因爲段是有範圍的,可以識別是否訪問段外的地址
- 減少重新編譯代價:因爲不同類型的數據放在不同的段,因此其中一個段改變,就不需要所有的段都重新編譯
分頁與分段
- 分頁對程序員是透明的,但是分段是程序員可以感知到的。分段是將類似 常量段,代碼段,堆棧段等放在不同的虛擬空間以免出現數據段之間因數據動態增長出現相互覆蓋的情況。
- 分頁的邏輯地址是一維地址,分段的是二維地址。所謂的n維則是需要進行n次轉換才能獲得真正的物理地址。
文件系統
inode
- 因爲
inode
對應的目錄不會儲存子文件的文件名,因此需要重命名子文件、刪除文件、新增文件其實都是對目錄的操作,而不是對文件本身的操作,故進行重命名文件操作需要擁有目錄的寫權限,而不是該文件的寫操作。
數據流重定向
1 | 代碼 | 運算符 |
---|---|---|
標準輸入 (stdin) | 0 | < 或 << |
標準輸出 (stdout) | 1 | > 或 >> |
標準錯誤輸出 (stderr) | 2 | 2> 或 2>> |
>> 表示追加在原文件 |
孤兒進程
父進程已經退出,但是子進程還在運行的進程。會由init
進程(進程號爲 1)將他們回收
殭屍進程
由於父進程沒有調用子進程的wait()
或waitpid()
,因爲子進程退出後進程描述符不會被釋放,導致有限的進程描述符被長久佔用而不能產生新的進程。解決辦法是:將父進程殺死,子進程就會變成孤兒進程從而被回收。
HTTP
HTTP/1.0
- 缺點:默認關閉
Keep-Alive
導致每次請求都需要經過TCP三次握手,成爲短鏈接。
HTTP/1.1
- 默認開啓
Keep-Alive
,但是還是存在不能併發的問題,如果需要併發則必須要建立新的連接 - 支持流水線,即無需等待response的到來即可再次request
- 頭部重複但卻沒有進行壓縮
HTTP/2.0
增加了幾個優化
- 多路複用: 可以使用一個TCP連接實現併發傳輸
- 二進制幀: 通過給每各幀進行編號,就可以實現併發有序了。
- 壓縮頭部: 由於頭部信息基本不變,可以只傳變化的頭部,同時使用壓縮算法如果
Huffman
編碼進行壓縮。 - 服務器推送: 當請求主頁 html 時,同時返回 關聯的 css以及 js文件。從而減少客戶端的請求,直接從緩存中取出。
額外參考鏈接:
算法篇
進度調度算法
1. 批處理系統
目的是保證吞吐量以及週轉時間最短(從提交到終止的時間)
- 先來先服務(FCFS)
- 特點:有利於長作業
- 缺點:不利於短作業,因爲短作業需要執行的時間很短,但是卻需要等很久。
- 短作業優先(SJF)
- 特點:短作業優先
- 缺點:會導致長作業餓死
- 最短剩餘時間優先(SRTN)
- 特點:當一個新作業到達時,將其整個運行時間與當前進程的剩餘時間作比較,較短的進程獲得調度
2. 交互式系統
目的是快速地對用戶的交互進行響應。
- 時間片輪轉
- 特點:將所有就緒的進程按 FCFS 的原則排隊,每個進程輪流獲得資源,其佔用資源的時間相等
- 缺點:如果時間片過長,實時性無法得到保證。如果時間片過短,則會在浪費很多時間在進程切換上。
- 優先級調度
- 特點:根據優先級高低進行調度
- 缺點:可能會讓優先級低的進程獲取不到調度
- 多級反饋隊列
- 特點:設置多個隊列,每個隊列獲得的時間片長短不一樣,隊列獲得時間片越多,優先級越低(可以當成其數學期望是一樣的)。融合了時間片輪轉調度算法以及優先級調度算法。可以實現 將 本來是用時間片調度算法切換100次的作業,切換次數減少至 7次(1,2,4,8,16,32,64)
- 特點:設置多個隊列,每個隊列獲得的時間片長短不一樣,隊列獲得時間片越多,優先級越低(可以當成其數學期望是一樣的)。融合了時間片輪轉調度算法以及優先級調度算法。可以實現 將 本來是用時間片調度算法切換100次的作業,切換次數減少至 7次(1,2,4,8,16,32,64)
死鎖解決方式
鴕鳥策略
直接忽略
死鎖檢測
-
資源的數量都只有一個的情況下:
- 檢查資源分配有向圖是否存在環來判斷是否死鎖。
下圖的方框代表資源,圓圈代表進程,箭頭指向爲資源分配情況
-
資源數量不僅是一個的情況下:
- 算法詳情:
- 算法詳情:
死鎖預防
- 死鎖必要條件
- 互斥:每個資源要麼已經分配給了一個進程,要麼就是可用的。
破壞辦法:只有一個進程能真正能獲取到進程。如 假脫機打印機技術。
- 佔有和等待:已經得到了某個資源的進程可以再請求新的資源。
破壞方法:進程需要一次性 獲取所有資源
- 資源不可以搶佔:已經分配給一個進程的資源不能強制性地被搶佔,它只能被佔有它的進程顯式地釋放。
破壞辦法:優先級高或權限高的進程可以直接搶奪資源
- 環路等待:有兩個或者兩個以上的進程組成一條環路,該環路中的每個進程都在等待下一個進程所佔有的資源。
破壞辦法:給資源統一編號,只能按編號順序來請求資源。如,要獲取編號爲 n+1的資源就必須先拿到編號爲 n 的資源。
死鎖避免
- 每個資源分配決策前,要檢測本次資源分配是否會讓系統進入不安全的狀態,即可能會產生死鎖
- 死鎖避免的算法與 死鎖檢測 算法相似。也稱爲銀行家算法。
- 特點:這種解決方式較爲嚴格,因爲就算系統進入不安全的狀態,如果沒按某種調度順序執行進程,就有可能沒產生死鎖。
頁面置換算法
最佳算法(OPT)
- 實現:所選擇的被換出的頁面將是最長時間不被訪問的
- 缺點:沒有人可以預知未來,所以CPU不知道未來會加載那些頁面
最近最久未使用(LRU)
- 實現:維護一個頁面使用記錄的鏈表,每次使用調用某一個頁面後將頁面放在表尾,這樣位於表頭的頁面將是最久未被使用的頁面。
- 缺點:每次調用都得調整鏈表,代價高
最近未使用
- 實現:每個頁面有兩個狀態位:R(read) 與 M(modified) ,當頁面被讀以及被修改相應置 1;R位會被定時清零。當缺頁時,優先換出 類編號最小的 頁面。編號如下:
R = 0, M = 0
R = 0, M = 1
R = 1, M = 0
R = 1, M = 1
- 思想:換出一個被修改的髒頁面比換出一個被頻繁使用的乾淨頁面要好。
先進先出(FIFO)
- 實現:先進來的頁面優先換出
- 缺點:程序的局部性原理說明,程序執行一段指令(訪問一個頁面),不久的將來也會執行這段指令(訪問這個頁面),所以這樣會導致缺頁率增加。
第二次機會算法
- 實現:設置 R 標誌位,當被訪問時置 1。當需要置換頁面時,從頁面鏈表表頭搜索,當一個R位爲0,則立即換出;當一個R位爲 1,則置 0 並挪到鏈表表尾。
- 特點:表頭表示最老的頁面(不一定最老就得被換出去),表尾表示最年輕的頁面
- 缺點:跟最近最久未使用缺點類似,每次都得調整表頭以及表尾。
時鐘算法
- 實現:跟第二次機會算法類似,不過把鏈表變爲循環鏈表,就不需要挪動鏈表了。
磁盤調度算法
先來先服務(FCFS)
最短尋道時間優先(SSTF)
- 特點:優先調度在當前磁頭所在磁道距離最近的磁道。
- 缺點:容易出現磁頭兩端的請求出現飢餓
電梯算法(SCAN)
- 實現:總是沿着一個方向處理請求,直到這個方向不會再有請求則改變運行方向。