本博客,根據王道所學。以下為第二章節知識點:
進程的概念、組成、狀態與其轉換、進程間通信、信號;單/多線程模型、線程管理、調度時機的切換、調度的目標、調度算法、多處理機調度;
同步與互斥、進程互斥的軟硬件實現方法、信號亮機制、生產者-單/多消費者、管程、死鎖及其衍生問題;
?
在博客末尾,附有學習日記
知識總覽(進程的概念、組成、特點):
進程的組成--PCB
理解:
詳細:
在操作系統中,PSW(Program Status Word,程序狀態字)是用于存儲當前程序執行狀態信息的專用寄存器或存儲區域,是 CPU 硬件的重要組成部分。它記錄了程序運行時的關鍵狀態,以便 CPU 在執行指令時快速獲取和更新相關信息,同時支持操作系統對程序執行進行控制和管理。
具體如:狀態切花時的state、進位標志,溢出標志....
進程的組成--程序段、數據段
程序是如何運行的:
1、
2、
進程的組成
進程的特征:(5大特征)
知識總覽(2.1.3_進程的狀態與轉換):
進程的狀態--創建態、就緒態
進程的狀態--運行態
進程的狀態--阻塞態
進程的狀態--終止態
進程狀態的轉化
熟稱丁字褲。
進程的狀態
進程的組織--鏈接方式
進程的組織--索引方式
(一般主要用鏈接方式,索引方式不是那么重要)
知識回顧與重要考點
進程的組織
知識總覽(進程的狀態):
本章節,更多是理解性內容,背下來倒是沒多大必要啦,但是讀懂,還是很重要。
什么是進程:
如何實現進程控制?
1、
2、
如何實現原語的“原子性”?
這種特權指令,若允許用戶程序使用的呢,那么隨便執行一個作業(執行一個進程),附一個關中斷指令的buf,不到結尾停不下來,那還要操作系統干嘛。
進程控制相關的原語
創建
終止
阻塞和喚醒
程序是如何運行的:
1、
運行圖:
2、
PSW是程序狀態字,用于存放程序的運行狀態和標志位。PSW是計算機系統的核心部件——運算器的一部分,用來存放兩類信息:一類是體現當前指令執行結果的各種狀態信息,稱為狀態標志,如有無進位(CF位),有無溢出(OF位),結果正負(SF位),結果是否為零(ZF位),奇偶標志位(PF位)等;另一類是存放控制信息,稱為控制狀態,如允許中斷 (IF位),跟蹤標志(TF位),方向標志 (DF)等。操作系統將程序運行時的一組動態信息匯集在一起,稱為程序狀態字PSW,并放在處理器的一組特殊寄存器里,以方便系統的控制和管理。?
進程控制相關的原語:
知識點回顧:
作業和進程的關系就像你 “讓電腦幫忙做一件事” 和 “電腦實際派工人干活” 的關系
拓展:
作業:
進程
作業與進程的關系:
知識總覽(進程通信):
什么是進程通信:
為什么進程通信需要操作系統的支持:
就像你的手機里,下載了一個陌生軟件。
如果隨意能讀取其他進程的信息,你的私人信息隨隨便便就能暴露,那不就炸了嗎。
進程存儲分為3部分(共享存儲、消息傳遞、管道通信)
共享存儲:
具體細節:
消息傳遞
直接通信:
間接通信:
管道通信:
1、
很像:channel / 循環隊列(先進先出)
2、
總結:
王道書_糾正:
知識總覽(信號)
信號的作用:
拓展:
就是一個包
實現原理
信號的發送與保存
信號的處理(When)
信號的處理(how)
按照缺省(默認) 處理 / 用戶自定義
疑難點
各個進程的信號處理有何區別?
每個進程可以自定義不同的信號。不同進程、對同一類型,進行不同自定義處理
信號與異常有什么關系?
信號與異常時配套關系,單獨的內核態處理不了一些異常,可通過向用戶態發出信號,配合處理。(拓展)
重點回顧:
信號,通常用于通知進程某個特定事件已經發生了
知識點(線程、多線程模型)
知識總覽(線程):
其實就是為了更好的利用硬件資源,在同等時間內,并發處理更多事情
什么是線程,為什么要引入線程?
增加并發量。
讓進程變成了最小的資源分配單位,在進程內的線程才是最小的處理機調度單位
舉一個簡單的例子:引入進程之后,你只能在傳輸文件之后,才能發消息。消息發送完畢之后你才能干其他。
1、
2、
3、
引入線程機制后,有什么變化?
線程的屬性
其實線程與進程各個方面及其相似 (TCB內存著大秘密哦)
知識總覽(多線程模型):
線程的實現方式
1、
早期是通過線程庫實現的。
最簡單的并行是通過while()循環實現。
2、
線程的實現方式1:
線程的管理工作誰來做?切換線程時是否需要cpu變態?操作系統是否能意識到線程是個啥?
(一對一)線程的實現方式2:
線程的管理工作由誰來完成?線程的切換是否需要cpu變態?
操作系統是否能意識到內核級線程的存在?這種線程的實現方式有什么優點和缺點?
多線程模型(一對一)
優點:不怕阻塞
缺點:一個進程占據的內核級線程太多
多線程模型(多對一)
這個和沒有加內核級線程的模式,沒啥區別啊,多此一舉。
多線程模型(多對多)
知識回顧與重要考點
知識總覽(線程管理)
線程的狀態與轉換
與進程很像(就緒、運行、阻塞)
進程的組織與控制
知識大綱(處理機調度):
調度的基本概念:
調度的意思是,操作系統對調度開個口,就是對一堆要做的任務排個先后序。
高級調度:
對作業排個序
中級調度:
中級調度是通過掛起(內存調度)(內存與外存的關系)
低級調度:
就是cpu分配給那個進程的調度時間
補充知識:
就緒、運行、阻塞三態,都是存在內存中的。內存不夠了,就會掉到硬盤那里。
三層調度的聯系、對比:
只是頻率的對比
知識回顧與重要考點
知識總覽(進程調度的時機切換與過程調度方式)
進程調度的時機
進程調度就是低級調度(什么時機,那個上cpu)
進程調度的時機
這個涉及臨界區資源(資源)與臨界區(調用資源的靜態代碼)
進程調度的方式
非剝奪、與剝奪兩種
進程的切換與過程
區區一個進程調度,還分為“狹義”與“廣義“。
“廣義” 就是 選擇一個進程 并且 切換一個進程。
且進程的切換是有代價的。花時間與資源調度(規定 一般時間比不會超過總花費時間的1%)
知識回顧與重要考點
知識總覽(調度目標-調度算法的評價指標)
CPU利用率
忙碌時間 / 總時間
系統吞吐量
作業總數 / 總共花了多長時間
周轉時間
完成作業,花了多長時間
等待時間
等待處理機的時間
響應時間
從首次提交 到 首次響應
總:
知識總覽(調度算法)
先來先服務(fcfs)
非搶占式,如queue,對長作業有利,對短作業不利
短作業優先(SJF):
非搶占式:
搶占式:
短作業優先
高相應比算法(HRRN):
由來:
詳細:
就是結合了fcfs與sjf兩者的優點。
知識重點回顧:
知識總覽(調度算法)
時間片輪轉(RR)
相當與建立了一個隊列,先來的那個直接插在隊首。
非常之公平,但是時間片太長的話,會退化成fcfs
優點是,盡可能讓每個進程得到響應
優先級調度算法
優先級調度算法,是搶占式的,根據優先數確定順序
多級反饋隊列
思考:
詳細:
結合FCFS 與 RR(時間片輪轉),加上多級隊列,完美結合。
適用于交互系統。(RR可以讓進程得到及時響應)
知識總覽:
單處理機調度vs多處理機調度
負載均衡、處理機親和性
方案一:公共就緒隊列
方案二、私有就緒隊列
知識回顧與重要考點
知識總覽(同步與互斥的基本概念):
同步?互斥?
什么是進程同步:
與進程異步相對應的,就是同步。
通過管道,告訴我們,制約關系-->導致同步
什么是進程互斥:
就是多個進程 同時看中一份 不能同時共享的資源。需要互斥使用。
具體(進程互斥):
原則:
1、空閑讓進
2、忙則等待
3、有限等待
4、讓權等待
知識回顧:
知識總覽(互斥-軟件實現方法)
如果沒有進程互斥?
必然導致資源運用混亂
單標志法:
這個是固定的按照 你一次,我一次的方法運用的。
所以會導致“空閑等待”的問題
雙標志法:
當p0執行完1后,時間片到了,又執行了p1的5
會導致空閑讓進、有限等待
后檢查法:
先檢查法:
Peterson算法
除了,讓全等待,其他都已完成。
就是你讓我,我讓你,誰最后讓,誰最后讓對方做。(孔融讓梨)
知識回顧:
知識總覽(硬件)
一、中斷屏蔽方法(禁用中斷)大白話解釋:
好比你在圖書館寫作業,為了不被打擾,你直接把圖書館的門鈴拆了(禁用所有人的進出)。這樣一來,沒人能打斷你,但副作用是緊急情況(如著火)也無法通知你。
優點:
- 簡單粗暴:直接不讓任何中斷發生,保證你的代碼(臨界區)執行時不會被打擾。
- 絕對有效:在單核 CPU 中,禁用中斷后,CPU 不會切換到其他任務,你的代碼可以獨占資源。
缺點:
- 危險:如果長時間禁用中斷,系統可能無法響應緊急事件(如硬件故障、用戶按鍵),導致系統崩潰。
- 不公平:其他任務可能因此餓死(無法獲得 CPU 時間)。
- 多核失效:現代 CPU 通常多核并行,禁用一個核的中斷對其他核無效,無法阻止其他核訪問共享資源。
- 不適用于用戶程序:只有操作系統內核能禁用中斷,普通程序無權操作。
適用場景:
- 操作系統內核中極短時間的關鍵操作(如修改系統全局變量)。
- 單核系統中對實時性要求極高的代碼。
二、TestAndSet(TSL 指令)大白話解釋:
好比你去公共廁所,門上有個 “有人 / 無人” 的牌子。你每次進門前先看牌子:
- 如果是 “無人”,你馬上翻成 “有人”,然后進去鎖門。
- 如果是 “有人”,你就等著,等里面的人出來把牌子翻回 “無人”。
優點:
- 原子性:檢查和設置牌子的動作是一體的(不可分割),不會出現兩個人同時看到 “無人” 而沖突的情況。
- 適用性廣:適用于多核 CPU,所有核都能通過這個指令競爭資源。
- 實現簡單:硬件直接支持(如 x86 架構的?LOCK TSL?指令)。
缺點:
- 忙等待(自旋鎖):沒搶到資源的線程會一直循環檢查牌子,浪費 CPU 時間(好比你盯著廁所門一直等,啥也不干)。
- 優先級反轉:如果低優先級的線程持有鎖,高優先級線程會一直等待,導致低優先級任務反而先執行。
- 公平性差:可能導致某些線程長期搶不到鎖(饑餓)。
適用場景:
- 鎖持有時間很短的場景(如緩存行的更新)。
- 多核系統中對性能要求極高的代碼。
三、Swap 方法(交換指令)大白話解釋:
還是公共廁所的例子,但這次規則變了:你進門時必須和門上的牌子交換狀態。
- 如果牌子是 “無人”,你把自己的 “有人” 牌子和它交換,然后進去鎖門。
- 如果牌子是 “有人”,你把自己的 “無人” 牌子和它交換,發現對方是 “有人”,就繼續等。
優點:
- 原子性:交換操作是原子的,不會出現沖突。
- 與 TSL 類似:同樣適用于多核 CPU,實現簡單。
缺點:
- 同樣的忙等待問題:沒搶到鎖的線程會一直循環交換,浪費 CPU。
- 可能更差的緩存效率:頻繁交換會導致緩存失效,性能不如 TSL。
適用場景:
- 與 TSL 類似,但某些硬件架構可能更適合用 Swap 指令(如早期的 ARM 架構)。
對比總結
方法 | 優點 | 缺點 | 適用場景 |
中斷屏蔽 | 簡單、單核有效 | 危險、多核無效 | 內核短時間關鍵操作 |
TestAndSet | 多核支持、原子性 | 忙等待、公平性差 | 短時間鎖、多核高性能場景 |
Swap | 多核支持、原子性 | 忙等待、緩存效率低 | 特定硬件架構(如早期 ARM) |
補充說明:
現代操作系統通常結合多種方法(如用 TSL 實現基礎鎖,再用條件變量解決長等待問題),以平衡性能和公平性。
知識點(互斥鎖)
進程互斥:鎖
咱們的這個鎖呢,只有一把。通過acquire()獲取 與 release()釋放。
知識總綱(信號量機制)
信號量機制:
大概就是說了一下wait()與signal()。他們也等于P(S)、V(S) -荷蘭語變成的呢。
信號量機制(整形信號量)
字如其意,通過一個變量表示。
整形信號量會導致 “讓權等待” 無法完成。
信號量機制(記錄型信號量)
詳解:
記錄型信號量,通過一個記錄型數據結構表示(包含資源數的變量 與 等待隊列)
應用:
知識回顧與重要考點
知識總覽(互斥、同步、前驅關系)
經過我的學習,互斥呢就是,通過P()、V()進行鎖操作
前驅關系是為了解決同步問題。(上一個進程(前驅) 釋放了某一個某種資源,本進程才能開始)
信號量機制實現進程互斥
一個簡單的互斥實現
信號量機制實現進程同步
簡單的進程同步的,示意圖。(不用看圖片啦,聽我說:就是暫停一個進程,去等待另一個進程釋放資源),看圖2更合適。
1、
2、
信號量實現前驅關系
知識回顧與重要考點
很有趣。
進程互斥是先P后V。
進程同步是先V后P。
知識大綱(生產者-消費者問題)
問題分析:
就是一個簡單的對緩沖區的 生產、讀寫 操作。
如何實現:
如何實現,對緩沖區互斥的進行生產與消費。
思考:能否改變相鄰P、V操作的順序?
改變P、V操作后,可能會導致死鎖。
知識回顧與重要考點
基于semaphore(記錄型信號量)實現的full(非空閑緩沖區)、empty(空閑緩沖區),與mutex。
知識大綱(生產者-多消費者問題)
問題描述
只有一個緩存區,肯定不夠吶。
如何實現
知識回顧與重要考點
知識大綱(讀者-寫者問題)
就是對一個和緩存區or文件。讀-寫進程操作 / 讀-讀 / 寫 - 讀 / 寫-寫
分析-找思路-做題
如何實現:
為了保證寫優先
知識回顧與重要考點
知識大綱(哲學家進餐)
有n個人、n根筷子。
防止死鎖的方法:
1、最多同時允許有4個人拿起筷子。
2、在1的基礎上,奇數拿左邊的筷子,偶數拿右邊的
知識回顧與重要考點
哲學家最重要的問題,就是不死鎖就行,其他都好
知識大綱(管程)
為什么要引入管程
引入管程的目的就是簡化設計流程---信號量機制麻煩、易錯。如下:
管程的定義和基本特征
1、一個共享數據結構
2、對數操作的一組過程(函數)
3、可初始化
拓展1:用管程解4決生產者消費者問題
通過用類代碼形式、幫助理解。
拓展2:Java中類似于管程的機制
知識回顧與重要考點
基本特征:
1、進程/線程 只能通過管程提供的特定入口才能訪問
2、每次 僅能允許一個進程在管程內 執行某一個內部過程(類似調用函數)
知識大綱(死鎖的概念)
什么是死鎖?
1、
2、
死鎖、饑餓、死循環的區別
共同點:都是進程 走不下去了
不同點:
死鎖:拿不到繼續走下去的資源
饑餓:拿不到cpu使用權,被涼了很久
死循環:bug 或者 刻意設計的
死鎖產生的必要條件:
四大條件:互斥、不可剝奪、請求和保持、循環等待
什么時候會發生
死鎖的處理策略
防范于未然:(1.預防死鎖、2.避免死鎖)
緊急處理:(死鎖檢測與解除)
知識回顧與重要考點
知識大綱(預防死鎖產生)
破壞互斥條件:
就是將互斥的條件設計成共享資源。但是存在局限性
破壞不可剝奪條件
設置成強行剝奪,但是可能會造成過多的資源消耗。
破壞請求和保持
等收集到所有需要的資源后(標記而不占用),再開始。
破壞循環等待
通過為資源標序號,各個進程按順序取。
知識回顧與重要考點
知識大綱(避免死鎖)
什么是安全序列
引出銀行家算法
安全、不安全序列、死鎖的聯系
銀行家算法
1、
2、
3、
具體:
知識回顧與重要考點
1、檢測申請得最大數
2、檢查此時系統剩余的可用資源是否還能滿足這次請求
3、試探著分配,更改各數據結構
4、用安全性算法檢查此次分配是否會導致系統進入不安全狀態。
知識大綱(死鎖的檢測和解除)
就倆(檢測/解除)
死鎖的檢測
就是用一種數據結構而已(不斷簡化、簡化、簡化。直到死鎖or到達最簡)
死鎖定理
就是對這種行為,起了個名字而已
死鎖的解除
1、資源剝奪
2、撤銷
3、進程回退
知識回顧于重要考點
(檢測
(數據結構:資源分配圖,算法:死鎖檢測算法)+解除(3大種)
借鑒:
1、王道操作系統
學習日記:?
6.9(周一) | 休息+有課 |
學習了進程的管理,進程的通信, 整理了進程的組成、轉換等知識點 | |
學習了虛擬機,對特權/非特權指令,內核態,用戶態,虛擬機有了更清晰的認知。 一道算法題整了一半 | |
6.10(周二) | 學習了線程管理,創建 |
在一個人做項目時,最好前后端都能看懂,才能更好的做下去 | |
學校考試而已 | |
6.11(周三) | |
分享會,玉龍學長分享的很清晰 | |
最近快考試了,課有點多 | |
6.12(周四) | |
前端作品,復習完畢 | |
答辯結束,結果還不錯。 書在讀、算法刷的有點少 | |
6.13(周五) | 復習了線程的管理、組織、信號、多線程模型 處理機的高級、中級、低級調度。并整理至筆記 |
學習了線程的調度算法(先來先服務、最優調度... | |
書有讀、那道算法終于拿下,以后數組排序類的題,還是要將下標標注下來 | |
6.14(周六) | 四級考試結局 |
學習了操作系統,進程調度的6中算法 fcfs、cc、sjf、短作業優先、優先級調度算法、多級調度隊列 何為進程同步/互斥 | |
還好 | |
6.15(周日) | 學習了進程互斥的單/雙標記法、Peterson算法。 了解硬件方面的中斷屏蔽、TLS、Swap。 學習了信號量機制的,鎖-(整型 / 記錄型型號) |
算法相比上一周,有一點點進步 學習了鎖互斥理論、了解同步與前驅的相互依存 生產者與消費者通過緩存區交流數據 | |
很OK | |
6.16(周一) | 多個消費者從緩存區中取資源,為讀者-寫者問題打基礎 復習哲學家進餐問題--專門用于解決死鎖問題。 初步了解管道-為了簡化編程設計與步驟 |
上午知識點已總結 管程的發明就是為了簡化設計 死鎖有四種原因造成,有三大類方法去避免(預防/避免/檢測和死鎖) 其中,預防的是破壞那四種形成條件 避免是通過銀行家算法避免 | |
簡書互評已完成 | |
6.17(周二) | 雜事,已經處理完畢 死鎖的檢測 和 解除, 運用了資源分配圖與死鎖檢測算法 解除共有三種方式:強行剝奪、回退、撤銷 |
學習內存基礎、了解了指令。學習裝入(靜態裝入、動態裝入、重定位裝入) 與鏈接(與裝入類似)的三種方法。 并在內存管理中學習了內存分配(下方三種)、地址轉換、內存保護 并且還了解,地址分配是由第一地址分配、固定地址分配、動態分配)三種分配 其中動態分配可由四個算法實現: 首次適應算法(綜合性最好)、最佳適應算法(從小到大、需排序)、最壞適應算法(從大到小、需排序)、鄰近適用算法(鏈表) 其中在學習,分頁式儲存管理時,學習到了: 頁、頁框、頁框號.... | |
.... |