操作系統(三)| 進程管理下 經典進程問題分析 線程 死鎖

文章目錄

  • 6.經典進程同步問題
    • 6.1 生產者-消費者問題 (既有同步又有互斥)
    • 6.2 讀者-寫者問題
    • 6.3 哲學家進餐問題
    • 6.4理發師問題
  • 7. 進程之間通信
    • 7.1 共享存儲區
    • 7.2 消息傳遞
    • 7.3 管道
  • 8.線程
    • 8.1 線程的實現機制
  • 9 進程調度
    • 9.1 調度方式
    • 9.2 常見算法
      • 先來先服務 FCFS
      • 短進程優先 SPN
      • 最高相應比優先算法
      • 時間片輪轉 RR
      • 基于優先級的調度
      • 多級反饋隊列
  • 10 死鎖
    • 10.1 基本概念
      • 資源分類
    • 10.2 如何處理死鎖
      • 10.2.1 死鎖檢測
      • 10.2.2 何時檢測

6.經典進程同步問題

6.1 生產者-消費者問題 (既有同步又有互斥)

生產者往緩沖區寫數據,滿了的話就不能寫了

消費者從緩沖區取數據,空的話就不能取了

一次只能有一個生產者或消費者取讀數據

總結要求

(1)不能向滿的緩存區寫數據

(2)不能向空的緩存區取數據

(3)任何時刻,僅允許一個1個生成者或1個消費者訪問

? 意味著消費者之間互斥,生成者之間互斥,消費者和生產者之間互斥

full:記錄緩沖區中非空的槽數,初始值=0

empty:記錄緩沖區中空的槽數,初始值=N

mutex:確保進程不同時訪問緩沖區,初始值=1

解決(1)(2)

void producer(void){while (True) {produce(); //生產1項P(empty); //申請1個空槽P(mutex); //請求進入臨界區append(); //加入緩沖區V(mutex); //離開臨界區V(full); //遞增非空槽}
}void consumer(void){while (TRUE) {P(full); //申請1個非空槽P(mutex); //申請進入臨界區remove(); //從緩沖區移出1項V(mutex); //離開臨界區V(empty); //遞增空槽數consume(); //消費數據}
}

解決死鎖問題

6.2 讀者-寫者問題

多個Reader進程,多個Writer進程,共享文件F
要求:
允許多個Reader進程同時讀文件
不允許任何一個Writer進程與其他進程同時訪問(讀或寫)文件

我的方案

read_count=N 初始值N,空額的值

write_count=0

void reader(void){while (True) {P(read_count)if(writer==0)read();//讀操作V(read_count)P(write_count)read();V(write_count)}
}void writer(void){while (True) {P(write_count)write();V(write_count)}
}

標答

write

WriteMutex = 0 讀寫操作的互斥訪問
Rcoun = 0 正在讀操作的讀者數目
CountMutex = 0 讀者計數的互斥訪問

void reader(void){while (True) {P(CountMutex);if (Rcount == 0)P(WriteMutex);++Rcount;V(CountMutex);read;P(CountMutex);--Rcount;if (Rcount == 0)V(WriteMutex);V(CountMutex);}
}void writer(void){while (True) {P(WriteMutex);write;V(WriteMutex);}
}

6.3 哲學家進餐問題

6.4理發師問題

注意對于共享變量,一定要加PV臨界操作

7. 進程之間通信

P,V操作實現的是進程之間的低級通信,所以P,V操作是低級通訊原語,即不能傳遞大量的信息

所以我們引入進程間高級通訊方式

7.1 共享存儲區

相互通信的進程間設有公共的內存區,每個進程既可向該公共內存中寫,也可從公共內存中讀,通過這種方式實現進程間的信息交換。
把同一個物理內存區域同時映射到多個進程的內存地址空間的通信機制

7.2 消息傳遞

源進程發送消息,目的進程接受消息。所謂消息,就是一組數據。

(1)消息隊列(message Queue)或消息緩沖
發送者發消息到一個消息隊列中;
接收者從相應的消息隊列中取消息。
消息隊列所占的空間從系統的公用緩沖區中申請得到。
(2)郵箱(mailbox)
發送者發消息到郵箱,接收者從郵箱取消息。
郵箱是一種中間實體,一般用于非實時通信。

7.3 管道

首創于Unix。用于連接一個讀進程、一個寫進程,以實現它們之間通信的共享文件,稱為pipe文件。

管道分為下列2種:
有名管道
無名管道

8.線程

為什么引入線程

線程是進程的1條執行路徑。

1個進程可以有多個線程,其中至少有1個主線程(primary thread)。

1個進程內的多個線程在同一個地址空間內(共享該進程的地址空間)。

每個線程有自己的線程控制塊TCB(Thread Control Block),包含自己的堆棧和狀態信息。TCB比PCB小得多。

8.1 線程的實現機制

用戶級線程

? 由在用戶空間執行的線程庫來實現,OS對此一無所知。 
線程庫提供線程創建、撤消、上下文切換、通信、調度等功能。

? 用戶級線程是自己實現的線程創建,刪除

? 但是這樣的話操作系統分配的是進程為單位的,容易阻塞

? 但是性能高,無需陷入內核

核心級線程

? 用戶級線程是自己實現的線程創建,刪除

? 但是這樣的話操作系統分配的是線程為單位的

? 但是性能低,需要陷入內核

進程和線程是操作系統中用于實現并發執行的兩個基本概念,它們之間有許多重要區別,包括以下幾點:

  1. 定義:

    • 進程(Process)是一個獨立的執行單元,擁有獨立的內存空間和系統資源,它代表了一個正在運行的程序的實例。每個進程都有自己的地址空間,堆棧和數據段,相互之間不共享這些資源。
    • 線程(Thread)是進程內的一個輕量級執行單元,線程共享進程的地址空間和系統資源,包括堆棧和文件描述符。多個線程可以在同一進程中并發執行,它們之間共享相同的內存空間。
  2. 創建和銷毀開銷:

    • 進程的創建和銷毀通常比較耗費系統資源,因為每個進程都有獨立的內存空間,需要進行全新的資源分配和銷毀。
    • 線程的創建和銷毀相對較輕量,因為它們共享進程的資源。創建一個線程通常比創建一個新進程要快速和經濟。
  3. 通信:

    • 進程之間通信通常需要使用進程間通信(Inter-Process Communication,IPC)機制,例如管道、消息隊列、共享內存等,來傳遞數據和信息。
    • 線程之間通信可以更容易地實現,因為它們共享相同的內存空間。線程可以通過共享變量等方式直接進行通信。
  4. 并發性和并行性:

    • 進程通常具有更高的并發性,因為不同進程之間相互獨立,可以在不同的處理器上并行執行。多進程可以更好地利用多核處理器。
    • 線程在同一進程內并發執行,它們共享進程的資源,因此在多核處理器上并行執行的程度有限。但線程之間的切換比進程切換更快,因為不涉及進程資源的切換。
  5. 安全性:

    • 由于線程共享進程的內存空間,因此多個線程之間的錯誤可能更容易導致進程崩潰或數據損壞。
    • 進程之間的安全性更高,因為它們擁有獨立的內存空間,一個進程的錯誤通常不會影響其他進程。
  6. 編程模型:

    • 多進程編程相對較復雜,因為需要處理進程間通信和同步問題。
    • 多線程編程相對較簡單,因為線程之間共享數據,但需要小心處理共享資源的同步問題。

9 進程調度

為什么進程調度

多個進程就緒時候,OS決定先執行哪一個

我們進程調度要達到的目的

? CPU利用率高,吞吐量大,周轉時間少,等待時間短,公平

? 很多時候都是在權衡!很多時候很難兼顧所有的目的

什么時候會切換進程呢?

? 硬件中斷,進程異常,或者該進程請求IO,這些都會讓CPU閑下來,我們就要給CPU找活干了

一些概念

  • 周轉時間 = 作業完成時刻 - 作業到達時刻
  • 帶權周轉時間 = 周轉時間 / 服務時間
  • 平均周轉時間 = 作業周轉總時間 / 作業個數
  • 平均帶權周轉時間 = 帶權周轉總時間 / 作業個數

9.1 調度方式

非搶占方式

? 一旦某進程被調度,直到完成或因某事件而阻塞,才會切換到其他進程

搶占方式

? 允許暫停正在運行的進程,切換到其他進程

搶占原則:

? 時間片原則:時間片到時搶占

? 優先級原則:優先級高者到時搶占

9.2 常見算法

先來先服務 FCFS

按照進程就緒的先后次序來調度進程,非搶占式方式

優點:實現簡單

缺點:
(1)平均等待時間波動很大
短進程、長進程到達時間是隨機的
(2)有利于CPU繁忙型進程,不利于I/O繁忙型進程
(3)有利于長進程,不利于短進程

短進程優先 SPN

最高相應比優先算法

時間片輪轉 RR

將所有的就緒進程按FCFS原則排成一個隊列,
規定一個時間片為進程每次使用CPU的最長時間,
每次選擇隊首進程運行,
當時間片到時,剝奪該進程的運行,將其排在隊尾

基于優先級的調度

多級反饋隊列

10 死鎖

10.1 基本概念

死鎖

一個進程集合中的每個進程都在等待只能由該集合中的其它進程才能引發的事件,這種狀態稱作死鎖。一組競爭系統資源的進程由于相互等待而出現“永久”阻塞

例如,2個進程A、B,都需要資源R1、R2

若A:擁有R1,申請R2

若B:擁有R2,申請R1

如何?

資源分類

可重用資源

資源不能被刪除且在任何時刻只能有一個進程使用

進程釋放資源后,其他進程可重用

消耗資源

10.2 如何處理死鎖

由OS處理

? 檢測死鎖并恢復

? 分配資源時避免死鎖

? 假裝沒看見(鴕鳥策略):多數OS對待死鎖的策略

? 死鎖了怎么辦,開機重啟

由應用程序本身預防死鎖

?

實際中檢測死鎖恢復是可能的,但是代價太大

10.2.1 死鎖檢測

E[M]:總資源數;E[i]:資源i的個數

A[M]:當前可用資源數;A[i]:資源i的可用數

C[N][M]:當前分配矩陣;C[i][j]:進程i對資源j的占有數

? 第i行是進程i當前占有的資源數

R[N][M]:申請矩陣;R[i][j]:進程i對資源j的申請數

? 第i行是進程i申請的資源數

F[N]:進程標記;F[i]取0/1,為1表示進程i能夠執行

算法

? 看當前是否有進程可以執行,可以執行的話,該進程F[N]設置為1,同時釋放他的資源

? 依次進行

? 兩種情況

? 一, 所有進程都可以執行,則不死鎖

? 二,存在某一種情況所有的進程都無法執行,則死鎖

10.2.2 何時檢測

1)每當有資源請求時;

2)周期性檢測;

3)每當CPU的使用率降到某一閾值時。

死鎖檢測會占用大量的CPU時間

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160395.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160395.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160395.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++之常用的排序算法

C之常用的排序算法 sort #include<iostream> using namespace std; #include<vector> #include<algorithm> #include<functional> void Myptint(int val) {cout << val << " "; }void test() {vector<int> v;v.push_back(…

打破應用孤島,低代碼平臺效力幾何?

關于低代碼開發平臺&#xff0c;爭論有很多。有人認為它是第四代編程語言&#xff0c;有人認為它是開發模式的顛覆&#xff0c;有人認為它是企業管理模式的變革&#xff0c;也有人認為它空有其表。 不過&#xff0c;至少在目前看來&#xff0c;低代碼無疑是火爆的&#xff0c;…

整理MLAI學習路徑圖

干貨分享&#xff1a; 下面給出一個筆者自己整理的GitHub倉庫&#xff1a;https://github.com/isLinXu/awesome-road-map&#xff0c;里面包含了一些可供參考的學習路徑和思維導圖&#xff0c;并整理微軟、meta、谷歌、Kaggle以及華為、百度、阿里、騰訊、訊飛等相關的學習資源…

一文搞懂什么是 GNU/Linux 操作系統

Author&#xff1a;rab 目錄 前言一、UNIX二、Linux三、GNU 前言 你是否經常看見或聽說過這么一句話&#xff1a;這是一個類 Unix 的 GNU/Linux 操作系統&#xff0c;你是怎么理解這句話的呢&#xff1f;想要搞懂這句話的含義&#xff0c;你需要了解以下三點基本常識。 一、U…

linux ld 鏈接器學習筆記

ld鏈接器筆記 1. 首先編寫一段匯編代碼 這里的匯編語法時 AT&T語法,是gcc原生支持的語法,底層使用 gas(gnu assembler) 完成匯編,相較于 Intel x86語法, AT&T 語法要更加古老,因此大多數人更加偏向于使用 Intel 的語法. nasm 編譯器支持x86語法.自從2.10版本&#xf…

MySQL 事務的底層原理和 MVCC(二)

7.2. undo 日志 7.2.1. 事務回滾的需求 我們說過事務需要保證原子性&#xff0c;也就是事務中的操作要么全部完成&#xff0c;要么什么也不做。但是偏偏有時候事務執行到一半會出現一些情況&#xff0c;比如&#xff1a; 情況一&#xff1a;事務執行過程中可能遇到各種錯誤&a…

ORB-SLAM3在windows11下的編譯使用

01 寫在前面 近期在學習SLAM&#xff0c;想部署一下ORB-SLAM3&#xff0c;但是自己電腦是win11系統&#xff0c;因此就想著在win11上部署一下。但是網上看了一些教程&#xff0c;有一些博客&#xff0c;但是可能不適合我這種情況把&#xff0c;就很糾結。先說下結果&#xff0…

【python基礎(三)】操作列表:for循環、正確縮進、切片的使用、元組

文章目錄 一. 遍歷整個列表1. 在for循環中執行更多操作2. 在for循環結束后執行一些操作 二. 避免縮進錯誤三. 創建數值列表1. 使用函數range()2. 使用range()創建數字列表3. 指定步長。4. 對數字列表執行簡單的統計計算5. 列表解析 五. 使用列表的一部分-切片1. 切片2. 遍歷切片…

【并發編程】ThreadLocal詳解與原理

&#x1f4eb;作者簡介&#xff1a;小明Java問道之路&#xff0c;2022年度博客之星全國TOP3&#xff0c;專注于后端、中間件、計算機底層、架構設計演進與穩定性建設優化&#xff0c;文章內容兼具廣度、深度、大廠技術方案&#xff0c;對待技術喜歡推理加驗證&#xff0c;就職于…

【電路筆記】-電流源

電流源 文章目錄 電流源1、概述1.1 理想電流源1.2 實際電流源1.3 連接規則 2、依賴電流2.1 壓控電流源2.2 電流控制電流源 3、總結 本文為前面文章 電壓源的延續&#xff0c;我們將在本文介紹電流源。 與電壓源的情況類似&#xff0c;我們將首先介紹理想電流源的概念&#xff…

MySQL 8.2 Command Line Client打開時一閃而過閃退問題

MySQL8.2安裝成功后&#xff0c;發現打開MySQL 8.0 Command Line Client時出現一閃而過&#xff0c;打不開的情況。 解決方案&#xff1a; 1、打開MySQL 8.2 Command Line Client文件位置 2、右鍵選擇屬性 3、復制它的目標 4、我復制下來的目標路徑是這樣的&#xff0c;"…

關于 Docker

關于 Docker 1. 術語Docker Enginedockerd&#xff08;Docker daemon&#xff09;containerdOCI (Open Container Initiative)runcDocker shimCRI (Container Runtime Interface)CRI-O 2. 容器啟動過程在 Linux 中的實現daemon 的作用 Docker 是個劃時代的開源項目&#xff0c;…

[計算機網絡實驗]頭歌 實驗二 以太網幀、IP報文分析(含部分分析)

目錄 第1關&#xff1a;Wireshark基本使用入門 【實驗目的】 【實驗環境】 【本地主機、平臺虛擬機之間數據傳遞】 wireshark基本用法】 1、wireshark主界面 2、抓取分組操作 3、Wireshark窗口功能 4、篩選分組操作 【實驗操作】 ?編輯 第2關&#xff1a;Ethernet幀…

編程語言發展史:C++語言的發展和應用

預計更新 第一部分&#xff1a;早期編程語言 1.1布爾代數和機器語言 1.2匯編語言的出現和發展 1.3高級語言的興起 第二部分&#xff1a;主流編程語言 1.1 C語言的誕生及其影響 1.2 C語言的發展和應用 1.3 Java語言的出現和發展 1.4 Python語言的興起和特點 1.5 JavaScript語言…

基于Towers of Binary Fields的succinct arguments

1. 引言 Ulvetanna團隊Benjamin E. Diamond和Jim Posen 2023年論文《Succinct Arguments over Towers of Binary Fields》&#xff0c;開源代碼見&#xff1a; https://github.com/recmo/binius&#xff08;Rust Sage&#xff09;【基于plonky3等庫】 在該論文中&#xff1…

Apache POI簡介

三十二、Apache POI 32.1 介紹 Apache POI 是一個處理Miscrosoft Office各種文件格式的開源項目。簡單來說就是&#xff0c;我們可以使用POI在Java程序中對Miscrosoft Office各種文件進行讀寫操作。 一般情況下&#xff0c;POI都是用于操作Excel文件。 Apache POI 的應用場…

基于區域劃分的GaN HEMT 準物理大信號模型

GaN HEMT器件的大信號等效電路模型分為經驗基模型和物理基模型。經驗基模型具有較高精度但參數提取困難&#xff0c;特別在GaN HEMT器件工藝不穩定的情況下不易應用。相比之下&#xff0c;物理基模型從器件工作機理出發&#xff0c;參數提取相對方便&#xff0c;且更容易更新和…

火山引擎 ByteHouse 的增強型數據導入技術實踐

作為企業數字化建設的必備要素&#xff0c;易用的數據引擎能幫助企業提升數據使用效率&#xff0c;更好提升數據應用價值&#xff0c;夯實數字化建設基礎。 數據導入是衡量OLAP引擎性能及易用性的重要標準之一&#xff0c;高效的數據導入能力能夠加速數據實時處理和分析的效率。…

Sa-Token 整合Java17和SpringBoot

目錄 前言引入項目開啟登錄認證路由攔截鑒權解決兼容問題總結 前言 之前無意中發現Sa-Token權限認證框架&#xff0c;項目十分好用。 項目地址&#xff1a; https://github.com/dromara/sa-token 官網地址&#xff1a; https://sa-token.cc/doc.html#/start/example 我的個人…

如何輕松應對企業網絡管理挑戰,釋放網絡靈活性

企業在日常經營中&#xff0c;越來越依賴于云應用程序&#xff0c;分散的團隊和統一通信。這些變化使得保持網絡連接性不僅是必要的&#xff0c;而且對任務的成功完成至關重要。 傳統的廣域網&#xff08;WAN&#xff09;并不總能適應這些挑戰&#xff0c;因為它們往往無法提供…