操作系統-鎖/內存/中斷/IO

文章目錄

          • 自旋鎖
          • 互斥鎖
          • 悲觀鎖和樂觀鎖
        • 內存管理
          • 物理/虛擬內存
          • 頁表
          • 段表
          • 虛擬內存布局
          • 寫時復制copy on write
          • brk,mmap
          • 頁面置換算法
        • 中斷
          • 中斷分類
          • 中斷流程
        • 網絡I/O
          • I/O模型
          • 服務器處理并發請求

自旋鎖

自旋鎖是一種基于忙等待(Busy-Waiting)的同步機制。

通過 CPU 提供的 CAS 函數),完成加鎖解鎖操作:

第一步:查看鎖的狀態,為空,則執行第二步

第二步:將鎖設置為當前線程持有

這兩步是原子指令,要么一次性執行完,要么都不執行。

當線程嘗試獲取鎖失敗時,它會循環檢查鎖的狀態(“自旋”),直到它拿到鎖。

等待時間較短的情況下效率較高,因為避免了線程上下文切換的開銷。但長時間等待會導致CPU資源的浪費。

適用于多核系統,且臨界區代碼執行時間非常短的場景。

互斥鎖

在訪問共享資源前對互斥量進行加鎖,在訪問完成后釋放互斥量上的鎖,確保同一時間只有一個線程訪問共享資源。

自旋鎖和互斥鎖的區別

工作機制:自旋鎖在獲取不到鎖時會一直循環檢查,而互斥鎖會讓線程進入睡眠(掛起)狀態,調度其他線程運行。

適用場景:自旋鎖適合保護執行時間極的代碼段,自旋的代價可能小于線程切換的代價。互斥鎖適合保護執行時間較的代碼段

性能影響:自旋鎖無上下文切換開銷,但一直占用CPU,互斥鎖掛起喚醒線程產生下上文切換開銷,但等待期間CPU執行其他任務,資源利用率更高.

實現復雜度:自旋鎖依賴CAS原子操作,不需要操作系統調度,而互斥鎖復雜度高,依賴操作系統調度

悲觀鎖和樂觀鎖

悲觀鎖先加鎖,再操作

認為并發操作一定會發生沖突,因此每次訪問數據時都會加鎖,比如synchronized和ReentrantLock

適用寫多的場景。

舉個例子:出門時鎖門(默認有小偷)

樂觀鎖先操作,提交時再檢查沖突

認為并發操作很少發生沖突,只在提交操作時檢查是否沖突,比如CAS操作,數據庫的樂觀鎖和Java中的Atomic類。

適用讀多寫少。

舉個例子:

1.購物車結算時才檢查庫存(默認沒人搶購)

2.或者在網上訂票,系統顯示還有1個座位,你點擊預訂,系統會先讓你填寫信息,然后提交的時候檢查是否還有座位。如果有,預訂成功;如果沒有,提示你重新選擇

內存管理

計算機系統的核心功能之一,其目標是高效、安全地管理物理內存和虛擬內存資源,確保多個進程能共享內存且互不干擾

物理/虛擬內存
  • 物理內存

    計算機硬件中的實際內存芯片,容量固定,由硬件決定,直接由CPU通過物理地址訪問,是程序運行的真實存儲空間

  • 虛擬內存

    操作系統為每個進程提供的邏輯地址空間,獨立于物理內存,通過通過頁表、MMU(內存管理單元,負責管理內存訪問和地址轉換)、缺頁中斷等機制管理,將虛擬地址映射到物理地址或磁盤空間。

    • 虛擬內存允許程序使用比物理內存更大的地址空間

    • 每個進程擁有獨立的虛擬地址空間,彼此無法直接訪問對方內存,避免惡意或錯誤操作。

      在這里插入圖片描述

頁表

在這里插入圖片描述

操作系統與硬件(如MMU)協作實現虛擬內存的核心數據結構,負責記錄虛擬地址到物理地址的映射關系。

核心作用

  1. 地址映射
    將進程的虛擬頁號 映射到物理內存的物理頁號
  2. 權限控制
    通過頁表項的權限位(讀/寫/執行)限制內存訪問。
  3. 狀態標記
    記錄頁是否在物理內存中、是否被修改過等狀態信息。

工作流程

  1. 把虛擬內存地址,切分成頁號和頁內偏移量
  2. 根據頁號,從頁表里面,查詢對應的物理頁號
  3. 直接拿物理頁號,加上前面的偏移量,就得到了物理內存地址。

如果在頁表中沒有相應頁號,觸發缺頁中斷。此時進入系統內核空間分配物理內存、更新進程頁表,最后再返回用戶空間,恢復進程的運行。

段表

在這里插入圖片描述

虛擬地址也可以通過段表與物理地址進行映射的

  1. 程序的內存空間被劃分為多個邏輯段,每個段代表一個邏輯單元
  2. 每個段有獨立的基址(起始地址)和界限(長度)
  3. 段的大小可變,與程序邏輯直接對應(例如代碼段大小取決于代碼量)
  4. 物理地址 = 段基址 + 段內偏移
虛擬內存布局

在這里插入圖片描述

1. 代碼段

  • 位置:低地址起始(如0x400000)。
  • 內容:編譯后的機器指令(可執行代碼)。
  • 權限:只讀+可執行(防止代碼被篡改)。
  • 示例:main函數、庫函數的指令。

2. 數據段

  • 位置:緊接代碼段。
  • 內容:已初始化的全局變量和靜態變量
  • 權限:可讀寫,不可執行。
  • 示例:int global_var = 42;

3. BSS段

  • 位置:緊接數據段。
  • 內容:未初始化的全局變量和靜態變量
  • 權限:可讀寫
  • 示例:int uninitialized_var;

4. 堆

  • 位置:BSS段之上,向高地址增長。
  • 管理:通過mallocfree動態分配內存。
  • 特點:碎片化問題常見,需手動管理(或依賴垃圾回收)。
  • 示例:int *arr = malloc(100 * sizeof(int));

5. 文件映射區域

  • 位置:堆與棧之間。
  • 內容:
    • 共享庫(如libc.solibm.so)。
    • 內存映射文件(通過mmap映射的文件)。
    • 匿名映射(用于大塊內存分配,如malloc可能使用mmap)。
  • 權限:按需設置(如可讀寫、可執行)。

6. 棧

  • 位置:高地址區域(如0x7FFFFFFFFFFFF000),向下增長
  • 內容:函數調用棧幀(局部變量、返回地址、函數參數)。
  • 管理:自動分配/釋放內存,由編譯器控制。
  • 限制:棧大小固定(默認幾MB,可通過ulimit調整)。
  • 示例:int local_var = 10;

7. 內核空間

  • 位置:虛擬地址空間的高位(如64位Linux中高128TB)。
  • 權限:僅內核態可訪問,用戶進程無權直接讀寫。
  • 內容:內核代碼、數據結構、設備內存映射等。
寫時復制copy on write

COW,一種內存管理優化技術,延遲數據的物理拷貝,直到真正需要修改數據時才進行復制。

在這里插入圖片描述

  • 問題場景
    假設父進程和子進程共享同一物理內存頁(未復制),且子進程修改了某個變量。如果此時父進程讀取該變量,會發現值被意外改變。

    • 示例
      父進程定義變量 int x = 42,子進程修改 x = 100。若未復制,父進程的 x 也會變為 100,導致邏輯錯誤。
  • COW 的解決方案
    當子進程嘗試寫入 x 時,觸發復制,子進程獲得獨立的物理頁副本。

    • 父進程的 x 保持 42,子進程的 x 變為 100,兩者互不影響。

具體步驟:

  • 步驟1:共享內存頁
    調用 fork() 時,子進程與父進程共享所有物理內存頁,頁表項標記為只讀
  • 步驟2:觸發復制
    • 當父進程或子進程嘗試寫入共享頁時,觸發缺頁中斷
    • 操作系統捕獲中斷,檢查觸發原因是 COW,執行以下操作:
      1. 分配新的物理頁,復制原頁內容到新頁。
      2. 更新觸發寫入的進程的頁表項,指向新物理頁,并標記為可寫
      3. 另一進程仍指向原物理頁(保持只讀,直到其寫入時觸發復制)。
  • 步驟3:后續操作
    • 修改后的頁獨立于原頁,后續寫入不再觸發復制。

COW有什么好?

fork()的時候,子進程不需要復制父進程的物理內存,只需要復制父進程的頁表,避免了不必要的內存復制開銷,這時候父子進程的頁表指向的都是共享的物理內存。

只有當父子進程任何有一方對這片共享的物理內存發生了修改操作,這時候才會復制發生修改操作的物理內存。

brk,mmap

int *arr = malloc(100 * sizeof(int))

這里的動態分配內存malloc():

1.如果請求分配的內存<128KB,則通過brk()申請

2.如果請求分配的內存>128KB,則通過mmap()申請

  • brk:修改指針,向高地址移動,獲得新內存空間

    在這里插入圖片描述

  • mmap:從文件映射區申請一塊內存

    在這里插入圖片描述

如果物理內存不足

當使用malloc()申請虛擬內存時,如果虛擬內存還沒有映射到物理內存,CPU產生缺頁中斷,缺頁中斷函數查看是否有空閑物理內存,有則建立虛擬與物理內存的映射,如果沒有,則開始回收內存(頁面置換/丟棄/終止)

回收內存,包括:

  1. 頁面置換
  • 將部分物理內存頁換出到磁盤(Swap空間),釋放物理內存供其他進程使用。
  1. 釋放可丟棄的干凈頁
  • 直接丟棄未被修改的頁(如代碼段、文件緩存頁),無需寫回磁盤。
  1. 終止進程(OOM Killer)
  • 強制終止占用內存過多的進程,釋放其所有內存(極端情況下的最后手段)。

1.后臺內存回收:喚醒 kswapd 內核線程來回收內存(異步,不阻塞進程執行)

2.直接內存回收:如果異步回收速度跟不上申請內存速度,則直接回收(同步,阻塞進程執行)

哪些內存可以被回收?

  • 文件頁

內核緩存的磁盤數據(Buffer)和內核緩存的文件數據(Cache)都叫作文件頁。需要讀時,重新讀取磁盤即可。而如果修改過但還沒寫入磁盤的數據(臟頁)需要先寫進磁盤,才進行回收。

  • 匿名頁

無實際載體,所以不能直接釋放內存。會把不常訪問的內存先寫到磁盤,再釋放這些內存。

如果經過上面的步驟物理內存仍不滿足,則觸發Out-Of-Memory Killer

  • OOM根據算法殺死一個占用物理內存較高的進程,釋放其內存資源
  • 如果依然不滿足,繼續殺死,直至釋放足夠物理內存
頁面置換算法

頁面置換,內存回收的核心手段之一。

選擇一個物理頁面換出到磁盤,然后把需要訪問的頁面換入到物理頁。

  • 最佳頁面OPT

    思想:置換出在未來長時間不會使用的頁面

    在這里插入圖片描述

  • 先進先出FIFO

    思想:換出在內存中占用時間最長的頁面

    在這里插入圖片描述

  • 最近最久未使用LRU

    思想:換出前面長時間沒有訪問過的頁面

    在這里插入圖片描述

  • 時鐘頁面LOCK

    思想:將所有頁面存在環形鏈表,每頁需要一個訪問位(0:未訪問1:已訪問)

    初始:所有頁訪問位為0

    缺頁時,指針移動,

    ? 訪問位為1:重置為0,指針后移

    ? 訪問位為0:選擇,換出內存

    ? 在這里插入圖片描述

  • 最不常用LFU

    思想:對每個頁面增加一個訪問計數器,被訪問一次,計數器+1,發生缺頁中斷時,換出訪問次數最少的頁面,

中斷

計算機系統響應外部或內部事件的機制,允許 CPU 暫停當前任務,轉而處理緊急或異步事件(如鍵盤輸入)。處理完后回來繼續執行剛才的任務。

中斷機制是操作系統實現多任務、設備管理、錯誤處理等功能的基礎

中斷分類

外部中斷(硬件中斷)

  • 觸發源:外部設備(如鍵盤、磁盤、定時器)。
  • 類型:
    • 可屏蔽中斷:可通過中斷屏蔽位(如 IF 標志)暫時關閉,可隨時處理,甚至不處理。
    • 不可屏蔽中斷:必須立即處理(如硬件故障、內存校驗錯誤)。

內部中斷(軟件中斷)

  • 觸發方式:由程序執行特定指令或發生異常。
    • 異常:同步觸發,由 CPU 執行指令時檢測到錯誤(如缺頁、除零)交由故障處理程序處理。
    • 陷阱:一般是在編寫程序時故意設下的陷阱指令,而后執行到陷阱指令后,CPU將會調用特定程序進行相應的處理,處理結束后返回到陷阱指令的下一條指令。
    • 終止:發生致命錯誤,不可修復,程序無法繼續運行,直接終止。
中斷流程
  • 發生中斷:設備或程序觸發中斷,發送信號到 CPU 的中斷控制器

  • 中斷響應:保存上下文,CPU 暫停當前任務,將程序計數器(PC)、寄存器等壓入內核棧,保存當前執行現場,以便處理完中斷后恢復執行。

  • 中斷處理:CPU根據中斷向量表找到對應中斷處理程序入口地址,進行中斷處理

  • 恢復上下文:繼續執行之前的程序

網絡I/O
I/O模型

網絡I/O模型定義了應用程序如何管理輸入和輸出操作,尤其是在處理多個并發連接時如何高效利用資源

  1. 阻塞I/O
    • 工作原理:
      應用程序發起I/O操作后,進程會被阻塞,直到數據就緒或操作完成。在此期間,進程無法執行其他任務
    • 優點:
      實現簡單,代碼直觀,適合低并發場景。
    • 缺點:
      每個連接需獨立線程/進程,資源消耗大,無法支撐高并發。
    • 適用場景:
      簡單的客戶端應用或低負載服務(實時性要求不高)。
  2. 非阻塞I/O
    • 工作原理:
      I/O操作立即返回結果(成功或錯誤),不會被阻塞。若數據未就緒,返回錯誤,應用需輪詢檢查狀態。
    • 優點:
      單線程可管理多個連接,避免線程阻塞。
    • 缺點:
      輪詢消耗CPU資源,延遲較高。
    • 適用場景:
      需要同時處理少量連接且對延遲不敏感的場景(多路復用)。
  3. I/O多路復用
    • 工作原理:
      使用selectpollepoll(Linux)等系統調用,同時等待多個I/O操作,當任一I/O準備就緒時通知應用處理。
    • 優點:
      單線程處理高并發連接,資源利用率高。
    • 缺點:
      事件通知后仍需同步處理I/O,編程復雜度較高。
    • 適用場景:
      Web服務器(如Nginx)、即時通訊等高并發服務。
  4. 信號驅動I/O
    • 工作原理:
      發起I/O請求后繼續做其他事情,當I/O操作就緒時,內核發送信號通知處理,應用執行I/O操作
    • 優點:
      避免輪詢,減少CPU占用。
    • 缺點:
      信號處理復雜,可能丟失事件,多線程中難以管理。
    • 適用場景:
      需要異步I/O通知的場景,提高系統并發能力。
  5. 異步I/O
    • 工作原理:
      應用發起I/O請求后立即做其他事情,內核完成整個I/O操作后通知應用。
    • 優點:
      無阻塞,資源利用最優,適合高吞吐場景。
    • 缺點:
      實現復雜,需操作系統和庫支持,調試困難。
    • 適用場景:
      高并發,高性能場景,減少系統調用,提高系統效率。
服務器處理并發請求
  1. 單線程web服務器

    一次處理一個請求,性能低

  2. 多進程/多線程web服務器

    服務器生成多個進程/線程并行處理多個用戶請求,消耗大量系統資源

  3. I/O多路復用web服務器

    只用一個線程處理多個用戶請求

  4. 多路復用多線程web服務器

    避免一個進程服務于過多用戶請求,生成多個進程,一個進程生成多個線程,每個線程處理一個請求

在這里插入圖片描述
考完操作系統不久,結合小林Coding寫了些筆記,感謝大家的點贊收藏>W<

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

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

相關文章

割點與其例題

割點 定義&#xff1a; 若一個點在圖中被去掉后&#xff0c;圖的連通塊個數增加&#xff0c;那么這個點就被稱為“割點”。如下圖所示紅點。 定義說白了就是若去掉一個點&#xff0c;圖被“斷開”的點稱為割點。 樸素算法&#xff1a; 枚舉每個點 u。遍歷圖&#xff0c;如果…

圖卷積神經網絡(Graph Convolutional Network, GCN)

最近看論文看到了圖卷積神經網絡的內容&#xff0c;之前整理過圖神經網絡的內容&#xff0c;這里再補充一下&#xff0c;方便以后查閱。 圖卷積神經網絡&#xff08;Graph Convolutional Network, GCN&#xff09; 圖卷積神經網絡1. 什么是圖卷積神經網絡&#xff08;GCN&#…

安裝win11硬盤分區MBR還是GPT_裝win11系統分區及安裝教程

最近有網友問我,裝win11系統分區有什么要求裝win11系統硬盤分區用mbr還是GPT&#xff1f;我們知道現在的引導模式有uefi和legacy兩種引導模式&#xff0c;如果采用的是uefi引導模式&#xff0c;分區類型對應的就是gpt分區(guid)&#xff0c;如果引導模式采用的是legacy&#xf…

服務培訓QDA 的安裝調試方法,硬件模塊的講解和軟件控制臺使用及系統測試

#服務培訓##質譜儀##軟件控制##硬件模塊# 以下是關于Waters QDa單桿液質質譜儀的安裝調試、硬件模塊講解以及軟件控制臺使用培訓的相關內容&#xff1a; 安裝調試 場地準備&#xff1a;用戶需要提前準備好實驗室&#xff0c;確保實驗室環境符合儀器的要求&#xff0c;如溫度、…

在K8S集群中部署EFK日志收集

目錄 引言環境準備安裝自定義資源部署ElasticsearchMaster 節點與 Data 節點的區別生產優化建議安裝好以后測試ES是否正常部署Fluentd測試filebeat是否正常推送日志部署Kibana獲取賬號密碼&#xff0c;賬號是&#xff1a;elastic集群測試 引言 系統版本為 Centos7.9內核版本為…

polarctf-web-[rce1]

考點&#xff1a; (1)RCE(exec函數) (2)空格繞過 (3)執行函數(exec函數) (4)閉合(ping命令閉合) 題目來源&#xff1a;Polarctf-web-[rce1] 解題&#xff1a; 這段代碼實現了一個簡單的 Ping 測試工具&#xff0c;用戶可以通過表單提交一個 IP 地址&#xff0c;服務器會執…

【串流VR手勢】Pico 4 Ultra Enterprise 在 SteamVR 企業串流中無法識別手勢的問題排查與解決過程(Pico4UE串流手勢問題)

寫在前面的話 此前&#xff08;用Pico 4U&#xff09;接入了MRTK3&#xff0c;現項目落地需要部署&#xff0c;發現串流場景中&#xff0c;Pico4UE的企業串流無法正常識別手勢。&#xff08;一體機方式部署使用無問題&#xff09; 花了半小時解決&#xff0c;怕忘&#xff0c;…

ES(Elasticsearch)的應用與代碼示例

Elasticsearch應用與代碼示例技術文章大綱 一、引言 Elasticsearch在現代化應用中的核心作用典型應用場景分析&#xff08;日志分析/全文檢索/數據聚合&#xff09; 二、環境準備(前提條件) Elasticsearch 8.x集群部署要點IK中文分詞插件配置指南Ingest Attachment插件安裝…

臨床決策支持系統的提示工程優化路徑深度解析

引言 隨著人工智能技術在醫療領域的迅猛發展,臨床決策支持系統(CDSS)正經歷從傳統規則引擎向智能提示工程的范式轉變。在這一背景下,如何構建既符合循證醫學原則又能適應個體化醫療需求的CDSS成為醫學人工智能領域的核心挑戰。本報告深入剖析了臨床決策支持系統中提示工程的…

火山RTC 8 SDK集成進項目中

一、SDK 集成預備工作 1、SDK下載 https://www.volcengine.com/docs/6348/75707 2、解壓后 3、放在自己項目中的位置 1&#xff09;、include 2&#xff09;、lib 3)、dll 暫時&#xff0c;只需要VolcEngineRTC.dll RTCFFmpeg.dll openh264-4.dll&#xff0c; 放在intLive2…

OkHttp用法-Java調用http服務

特點&#xff1a;高性能&#xff0c;支持異步請求&#xff0c;連接池優化 官方文檔&#xff1a;提供快速入門指南和高級功能&#xff08;如攔截器、連接池&#xff09;的詳細說明&#xff0c;GitHub倉庫包含豐富示例。 社區資源&#xff1a;中文教程豐富&#xff0c;GitHub高…

python中常用的參數以及命名規范

以下是 Python 中常見的命名規范、參數用法及在大型項目中常用的操作模式&#xff0c;供記錄參考&#xff1a; 1. 命名規范&#xff08;Naming Conventions&#xff09; 前綴/形式含義示例_age單下劃線&#xff1a;弱“私有”標記&#xff08;可訪問但不建議外部使用&#xff…

第五十七篇 Java接口設計之道:從咖啡機到智能家居的編程哲學

目錄 引言&#xff1a;生活中的接口無處不在一、咖啡機與基礎接口&#xff1a;理解抽象契約1.1 咖啡制作的標準接口 二、智能家居與策略模式&#xff1a;靈活切換實現2.1 溫度調節策略場景 三、物流系統與工廠模式&#xff1a;標準接口下的多樣實現3.1 快遞運輸接口設計 四、健…

第二十六天打卡

全局變量 global_var 全局變量是定義在函數、類或者代碼塊外部的變量&#xff0c;它在整個程序文件內都能被訪問。在代碼里&#xff0c; global_var 就是一個全局變量&#xff0c;下面是相關代碼片段&#xff1a; print("\n--- 變量作用域示例 ---") global_var …

聯合查詢

目錄 1、笛卡爾積 2、聯合查詢 2.1、內連接 2.2、外連接 1、笛卡爾積 笛卡爾積&#xff1a; 笛卡爾積是讓兩個表通過排列組合的方式&#xff0c;得到的一個更大的表。笛卡爾積的列數&#xff0c;是這兩個表的列數相加&#xff0c;笛卡爾積的行數&#xff0c;是這兩個表的行…

【HTML5學習筆記2】html標簽(下)

1表格標簽 1.1表格作用 顯示數據 1.2基本語法 <table><tr> 一行<td>單元格1</td></tr> </table> 1.3表頭單元格標簽 表頭單元格會加粗并且居中 <table><tr> 一行<th>單元格1</th></tr> </table&g…

window 顯示驅動開發-分頁視頻內存資源

與 Microsoft Windows 2000 顯示驅動程序模型不同&#xff0c;Windows Vista 顯示驅動程序模型允許創建比可用物理視頻內存總量更多的視頻內存資源&#xff0c;然后根據需要分頁進出視頻內存。 換句話說&#xff0c;并非所有視頻內存資源都同時位于視頻內存中。 GPU 的管道中可…

《C 語言指針高級指南:字符、數組、函數指針的進階攻略》

目錄 一. 字符指針變量 二. 數組指針變量 三. 二維數組傳參 3.1 二維數組的本質 3.2 訪問方式與地址計算 3.3 二維數組的傳參方式 3.4 深入解析 *(*(arri)j) 與 arr[i][j] 的等價性 四. 函數指針變量 4.1 函數指針變量的創建 4.2 函數指針變量的使用 4.3 兩段"…

Unity:場景管理系統 —— SceneManagement 模塊

目錄 &#x1f3ac; 什么是 Scene&#xff08;場景&#xff09;&#xff1f; Unity 項目中的 Scene 通常負責什么&#xff1f; &#x1f30d; 一個 Scene 包含哪些元素&#xff1f; Scene 的切換與管理 &#x1f4c1; 如何創建與管理 Scenes&#xff1f; 什么是Scene Man…

內容中臺重構企業知識管理路徑

智能元數據驅動知識治理 現代企業知識管理的核心挑戰在于海量非結構化數據的有效治理。通過智能元數據分類引擎&#xff0c;系統可自動識別文檔屬性并生成多維標簽體系&#xff0c;例如將技術手冊按產品版本、功能模塊、適用場景進行動態標注。這種動態元數據框架不僅支持跨部…