【操作系统】第二章--进程的描述与控制--深入与解释(1)
生活随笔
收集整理的這篇文章主要介紹了
【操作系统】第二章--进程的描述与控制--深入与解释(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
深入解釋之前可以先看相應的筆記理解→【操作系統】第二章–進程的描述與控制–筆記與理解(1)
文章目錄
- 第二章--進程的描述與控制--深入與解釋(1)
- 從操作系統的角度認識進程
- OS為什么要引入進程
- 到底什么是進程
- 為什么說動態性和并發性是進程的主要特征,其他特征如何體現
- 進程和程序之間到底是什么樣的關系
- 為什么要引入進程的狀態
- 狀態之間的轉換說明了什么
- Linux在描述進程狀態上有什么特色
- 設想你是OS的設計者,你要如何設計進程的PCB
- 用思維導圖對進程控制塊進行全面的描述
- 進程控制塊的方方面面
- 理解其雙向鏈表的定義
- 理解第一宏
- 進程/線程創建及其線程模型
- 為什么引入線程
- 為什么說線程只擁有棧和少量寄存器,其他資源都共享進程的資源
- 用戶級線程和內核級線程的區別和聯系(Linux角度)
- 進程和線程到底共享哪些資源,哪些不能共享
- 線程共享變量+1操作
- 展示代碼和有出錯的運行結果
- 展示原子操作的相關代碼和結果
- 展示加鎖操作的相關代碼和結果
- 進程同步
- 什么是進程同步,為什么要引入進程同步
- 同步機制應該遵循的原則
- 什么是信號量,為什么引入信號量機制
- 給出記錄型信號量wait()和signal()操作的實現代碼
- 用wait()signal()實現司機和售票員的同步
第二章–進程的描述與控制–深入與解釋(1)
從操作系統的角度認識進程
OS為什么要引入進程
- 整體來說:為了使程序在多道程序環境下能并發執行,并能對并發執行的程序加以控制和描述,從而在操作系統中引入了進程概念;
- 從狀態發展需要來說:在多道程序環境下,執行時需要共享系統資源,從而導致各程序在執行過程中出現相互制約的關系,此時程序的執行表現出了間斷性(執行-暫停-執行)的特征,這些特征在程序執行的過程中發生就產生了動態性,而傳統的程序本身就只是一組指令的集合,是靜態的概念,而靜態無法描述程序執行的情況。此時,我們根本沒有辦法從程序的表面看出程序執行、停頓的狀態,更沒辦法看出程序之間的關系,所以為了在靜態的概念上深刻描述程序動態性的執行過程與程序并發執行的過程,引入了具有動態性的進程;
- 從并發特性與獨立特性來說:程序因為沒有建立PCB而不能參與并發執行,所以引入進程就是為了使其進程實體等和其他進程實體并發執行;同樣,沒有建立PCB的程序不能作為一個獨立的單元參與運行,因而引入能獨立運行、獨立獲得資源、獨立接收調度的進程作為基本單位;
到底什么是進程
- 嚴格定義:傳統OS中進程定義:進程是進程實體的運行過程,是系統進行資源分配的調度的一個獨立單位;
- 其余典型定義:①進程是程序的一次執行;②進程是一個程序及其數據在處理機上順序執行時所發生的活動;③進程是具有獨立功能的程序在一個數據集合上運行的過程,他是系統進行資源分配和調度的一個獨立單位;
為什么說動態性和并發性是進程的主要特征,其他特征如何體現
- 動態性:相比于程序的“不滅不死,不變不動”(靜態,指令的集合),進程作為一種實體進行執行是具有生命周期的,他由創建而產生、由調度而執行、由撤銷而消亡。就像是網購的物品訂單,他不是你買的東西,他只能代表數據整體,只有你對物品下單了,物品從廠商運出倉庫被創建出來、經過國家物流的調度以及傳輸中轉被執行最終到自己手里的才是物品本身,倘若你突然不想這個東西了,或者你已經拿到這個東西了,那么此時的訂單就已經完成或者無效了,就是整個物品的因你而存在的創建傳輸執行過程就撤銷消亡了;
- 并發性:OS本身重要的特性就有并發性,而在進程這里再一次提到,不僅僅是因為操作系統,更是因為進程作為程序的實例的運行過程。從程序的角度看,每個程序之間都是平行關系,不存在并發的特質;而當有了進程之后,每個程序的進程就可以通過對CPU以及資源的切換執行,即體現出了并發特性;
- 獨立性:獨立性是指進程實體是一個能獨立運行、獨立獲得資源獨立接受調度的基本單位。因為每個進程被創建出來的時候,就是獨立創建的,創建出來后進行調度以及執行也都是已經賦予好的,就像是網購下單好的東西從發貨到遞送到收貨的過程中,不用再去聯系廠商或者做其他額外的事情才能保證他的正常執行,這就是獨立性;
- 異步性:是指各進程各自獨立、各自以不可預知的速度向前推進。也就是各個進程之間就算同時被創建進行執行,也不能確定到底是哪個進程率先完成執行。就像是同時網購下單的物品也不一定是哪一個先到,因為他各自的速度是不可預知的;
進程和程序之間到底是什么樣的關系
- 進程和程序關系理解:我認為可以類比到書本知識(程序)和程序設計(進程),書本中有的信息不過是一個一個的干條條、一個一個的知識點羅列、一篇一篇章節的介紹和解釋(數據的集合),他是靜的(靜態),知識就那樣印在書本里不管你理解沒理解看沒看,都不會對書有什么影響;而程序設計卻是用到了書本中的各個知識,他將書本中的知識通過代碼段或者電路設計通過我們的思維與理解(CPU調度)呈現出來,他就是書本知識框架與聯系的一個體現;而程序設計時,可能用到了不止一個課本及參考書,多個書本的知識(多個程序),通過我們對其的總和理解(并發性)完成出的設計大多比用一個書本做出來的更為全面。
為什么要引入進程的狀態
- 引入狀態原因:因為進程是動態的,而且是具有生命周期的,而他的生命周期就可以劃分為一組狀態,通過這組狀態對整個進程的刻畫,我們更能直觀的感受到進程的生命狀態;
狀態之間的轉換說明了什么
- 狀態之間轉換:
- 整體性:說明進程各個狀態之間的觸發以及執行都受到系統的調度,也從側面說明我們對計算機的操作實際上是通過我們對各個進程的操作實現的;
- 具體轉換:
- 就緒態>>運行態:CPU空閑時間被調度選中一個就緒進程執行,說明了系統的多道批處理以及分時處理,不會讓CPU有空閑的時間,提高CPU的利用率;
- 運行態>>阻塞態:等待使用資源或某事發生,比如鍵盤輸入、外設傳輸等,說明了我們操作計算機是通過操作進程來實現的,也是操作系統進程圖像的體現;
- 阻塞態>>就緒態:等待得到滿足或某事已經發生,如人工干預結束,說明了盡管我們通過進程與計算機進行交互,進程的執行過程仍然是要按照系統規定好的步驟完成,體現計算及運行過程的嚴謹性;
- 運行態>>就緒態:運行時間片到,或出現更高優先級,一個說明了CPU會為每個進程單獨提供一個時間片,可使用的時間就是這么多,不能因為某一個程序的停滯或者異常影響其他進程的執行,體現了獨立性;一個說明進程的優先級的高低可以影響到使用CPU以及資源的優先權限;
Linux在描述進程狀態上有什么特色
- Linux查看進程狀態:$ ps -l 其中第二列的S代表這個進程的狀態;
- 各個狀態描述:
- R (Running)— TASK_RUNNING(可執行狀態)
- S (Sleep)— TASK_INTERRUPTIBLE(可中斷的睡眠狀態)
- D(Deep sleep) — TASK_UNINTERRUPTIBLE(不可中斷的睡眠狀態)
- T (Stopped)— TASK_STOPPED或TASK_TRACED(暫停狀態或跟蹤狀態)
- Z (Zombie stop)— TASK_DEAD - EXIT_ZOMBIE(退出狀態,成為僵尸進程)
- X (Dead)— TASK_DEAD - EXIT_DEAD(退出狀態,進程即將被銷毀)
- t(tracing stop)—跟蹤狀態
- 進程狀態特色:不僅表明了進程此時正處于的狀態,也說明了進程的操作權限(比如S和D)
- 啟發:相比于操作系統的進程狀態,Linux的進程狀態表述更加的細致,但并不是說操作系統的進程狀態表示就沒有Linux的進程表述清晰,狀態的表述要根據其所處的位置而變化,或細化、或寬泛,就想根據不同學生的特質因材施教一樣。
設想你是OS的設計者,你要如何設計進程的PCB
- 分析:PCB是進程管理快,他是操作系統中最重要的記錄性數據結構,對進程進行管理與控制,所以設計出來的PCB必須可以描述進程的所有信息以及所有狀態,即是什么?在干什么?
- 設計:
- 信息:
- ID:每個進程自己獨有的唯一的可以表示自己的ID,就像公司中的工號,可以唯一代表自己;
- 特征信息:每個進程都需要有自己的進程所屬,就像工作中,我們每個人所屬的部門;
- 狀態信息:進程目前所處的狀態(就緒、阻塞、運行),就像在工作時的狀態,或是正常上班、或是出差在外、在家休假等;
- 優先級信息:每個進程可以獲得CPU控制的大小,就像是在工作中你的職位薪水能力越高,就越有可能優先代表公司出差交涉;
- 進程調度信息:進程當前等待或者已執行的時間,就像是出差人員離交涉開始的時間或者已經交涉了的時間;
- 事件信息:進程由執行到阻塞所發生的事件嗎,就像是出差過程中交涉中斷的原因;
- 通信信息:進程之間的通信關系,就像是各個公司派去代表公司開集體會議時,各個代表之間的關系;
- 資源需求,分配控制信息:進程執行做需要的資源以及各個進程的分配情況,就像是派去出差所需要的材料以及各個出差項目分配到的人員情況;
- 進程實體信息:程序路徑名稱和進程數據所在位置的信息,就像是出差去的路線以及開會時所在的地點
- 控制:
- 現場保護區:保護處在阻塞狀態的進程空間,就像是出差人員對外交涉突然中斷時,公司會為提供休息區;
- 工作區:進程執行時的空間,就像是出差開會交涉的會議廳
用思維導圖對進程控制塊進行全面的描述
進程控制塊的方方面面
理解其雙向鏈表的定義
- 進入源代碼:https://elixir.bootlin.com/linux/latest/source/tools/include/linux/list.h#L351
- 正是因為這個鏈表和我們平時使用的鏈表不一樣,他只有指針域,沒有數據域,才提供給我們了很大的方便,讓我們很方便的去拓展他,我們也只需要自己定義一種數據類型,指定自己的數據域,只用這里的指針域就可以創建出多種結構:
- 雙向鏈表:在原本就有前驅和后繼的結構鏈表中加入數據域,就形成了雙向鏈表;
- 雙向循環鏈表:在雙向鏈表的基礎上,將頭節點的前驅指向尾節點、尾節點的后繼指向頭結點,就形成了雙向循環鏈表;
- 單鏈表:在雙向鏈表的基礎上減少一個指針域,就退化成了單鏈表;
- 隊列:在雙向鏈表的基礎上先實現單鏈表,再在單鏈表的基礎上只允許在鏈表的首尾進行插入刪除操作,就形成了隊列;
- 棧:在雙向鏈表的基礎上先實現單鏈表,再在單鏈表的基礎上只允許在鏈表的頭進行插入和刪除操作,就形成了棧;
- 樹狀結構:以樹舉例:在雙向鏈表的基礎上改變前驅和后繼的依賴關系,對他人為地賦予一種意思,就可以轉化為樹結構,比如樹中每一個節點的前驅都指向他的第一個孩子,后繼都指向他的兄弟結點,就實現了用雙向鏈表結構用孩子兄弟表示法思想的樹結構;而在這個數結構的基礎上,將前驅的指向解釋為左孩子、后驅的指向解釋為右孩子,則就將剛剛的樹結構轉化為二叉樹的結構進行表示;
理解第一宏
進程/線程創建及其線程模型
為什么引入線程
- 線程具有許多進程所具有的特征,所以線程又被稱為“輕量級進程”,所以線程的引入必然和進程脫不開干系,于是從線程與進程入手,理解一下,引入線程的原因:
- 直接動機:
- 減少進程切換操作時的較大時空開銷:由于進程是資源的擁有者,所以在創建、撤銷、切換操作中需要較大的時空開銷,限制了并發成都的進一步提高。為了減少進程切換的開銷,運用分治(分而治之)的思想,把進程作為資源分配單位和調度單位這兩個屬性分開處理,即進程還作為資源分配的單位,但是不作為調度的基本單位,把調度執行與切換的責任交出去,重新設定一個來完成調度執行和切換,此時就出現了“線程”來承擔這項任務。打個比方,公司(操作系統)最開始各個部門的人手都不是很多,可能有一個人身兼雙職(進程兩大基本屬性)的情況,但是這時公司發現這樣不行,要把工作按照類別分開(分治思想),各自負責各自的項目,才能提高公司辦事效率,于是就告訴身兼兩職的可以自己進行招納助手,替自己分擔任務,于是助手(線程)的出現提高了各項的效率。
- 增加并發度:舉個例子來說,QQ可以視頻通話,在視頻通話同時,還能進行文字聊天,同時還能傳送文件。但是進程是程序的一次執行,顯然,QQ可以同時進行的這些功能并非由一個程序順序處理就能實現。所以說,有的進程是需要“同時”處理很多事情的,但傳統的進程只能串行地執行一系列程序,基于此,就引入了線程,來增加并發度。
- 線程自身的優勢:
- 占用較少的系統資源, 線程的創建、撤銷和切換花費的時空間開銷都小,尤其是在切換方面,傳統的進程間并發,需要切換進程的運行環境,系統開銷很大,但是線程間并發的話,如果是同一進程內的線程切換,則不需要切換進程環境,系統開銷小;
- 提高了并發度:傳統進程機制中,只能進程之間并發,但是引入線程后,各線程間也能并發,這就提高了并發度;
- 提高了性能、效率和響應度:同一進程內的線程共享內存和文件, 它們之間相互通信無需調用內核, 效率高。如果對一個交互程序采用多線程,那么即使其部分阻塞或執行較冗長的操作,該程序仍能繼續運行,從而增加了對用戶的響應程度。例如,多線程web瀏覽器在用一個線程裝入圖像時,能通過另一個線程與用戶交互。
- 使多處理機效率更高:在多處理機系統中,傳統的單線程進程,不管有多少處理機,該進程只能運行在一個處理機上,但是有了線程之后,有了多線程進程,就可以將一個進程中的多個線程分配到多個處理機上,使它們并行執行,由此加速了進程的完成。打個比方,以前為公司出差只有這個一個人(單線程進程),那就只能一次去一個地方出差(一臺處理機),但是當他有了助手(線程)之后,他就可以將任務分配開,各個出差的地點都可以去,各地的出差任務也可以同時進行(多處理機),必然加速了任務的完成。
- 改善了程序的結構。
為什么說線程只擁有棧和少量寄存器,其他資源都共享進程的資源
用戶級線程和內核級線程的區別和聯系(Linux角度)
進程和線程到底共享哪些資源,哪些不能共享
- 共享:地址空間、全局變量、打開的文件、子進程、即將發生的定時器、信號與信號處理程序、賬戶信息、文件描述符表等;
- 不共享:線程的程序計數器、寄存器、堆棧、狀態,進程中的信號屏蔽字等。
線程共享變量+1操作
展示代碼和有出錯的運行結果
展示原子操作的相關代碼和結果
展示加鎖操作的相關代碼和結果
進程同步
什么是進程同步,為什么要引入進程同步
同步機制應該遵循的原則
- 同步機制應遵循原則:空閑讓進,忙則等待,有限等待,讓權等待;
- 空閑讓進:當進程處于臨界區時,表明臨界資源處于空閑狀態,應允許一個請求進入臨界區的進程立即進入自己臨界區,以有效地利用臨界資源;
- 忙則等待:當已有進程進入臨界區時,表名臨界資源正在被訪問,因此其他試圖進入臨界區的進程必須等待,以保證對臨界資源的互斥訪問;
- 有限等待:對要求訪問臨界資源的進程,應保證在有效時間內能進入到自己的臨界區,以免造成“死等”狀態;
- 讓權等待:當進程不能進入自己的臨界區時,應立即釋放處理機,以免進程陷入“忙等”狀態;
- 舉一個簡單的例子:假如說今晚是平安夜,很多人都和家人情侶小伙伴出去吃火鍋了。但是火鍋店的位子是有限的,你要想執意在這兒吃,你就得排隊等候。當一個桌的顧客吃完離開,就空出了位置,此時,排隊最前面的就能進去用餐,也就是“空閑讓進”;這個人和他的小伙伴占了那個位置,然后火鍋店的位置又滿了,其他人還是得繼續等待,這就是“忙則等待”;但是排隊的人等待也不是永遠的等待,他肯定會在有限的時間內等到的,不可能讓人家永遠餓下去啊,這就是“有限等待”;但是你突然發現你沒帶錢也沒帶手機,你等也是白等,就算排到了你沒帶錢也沒辦法去吃火鍋啊,那么就得及時退出,不要白費時間,白占位置,這就是“讓權等待”。
什么是信號量,為什么引入信號量機制
給出記錄型信號量wait()和signal()操作的實現代碼
用wait()signal()實現司機和售票員的同步
總結
以上是生活随笔為你收集整理的【操作系统】第二章--进程的描述与控制--深入与解释(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统 实时调度
- 下一篇: html如何实现文章分类功能,HTML文