操作系統進行線程切換時進行的動作
1. 保存當前線程的上下文
- 寄存器狀態:保存 CPU 寄存器(如通用寄存器、程序計數器 PC、棧指針 SP 等)到當前線程的?線程控制塊(TCB)?中。
- 內核棧信息:如果線程在內核態運行(例如因系統調用或中斷進入內核),需保存內核棧指針。
- 浮點 / 向量寄存器:若線程使用了浮點運算或 SIMD 指令,需保存相關寄存器狀態。
2. 更新線程狀態與調度隊列
- 將當前線程狀態從?運行態(Running)?改為?就緒態(Ready)(例如時間片耗盡)或?阻塞態(Blocked)(例如等待 I/O)。
- 將其 TCB 移動到對應的調度隊列(如就緒隊列、阻塞隊列)。
3. 調度器選擇下一個線程
- 調度器根據算法(如時間片輪轉、優先級)從?就緒隊列?中選擇一個線程,分配 CPU 使用權。
4. 恢復新線程的上下文
- 從新線程的 TCB 中加載其保存的寄存器狀態(包括 PC、SP),恢復 CPU 執行環境。
- 切換內核棧(如果是內核級線程)。
5. 切換內存地址空間(可選)
- 同一進程內的線程切換:無需切換地址空間(共享同一進程的頁表)。
- 跨進程的線程切換(如某些系統允許線程跨進程):需更新?內存管理單元(MMU),切換頁表,刷新 TLB。
6. 更新系統狀態
- 更新當前運行線程的指針(例如 Linux 的?
current
?宏)。 - 更新 CPU 的統計信息(如線程運行時間、調度次數)。
7. 執行新線程
- 通過恢復的程序計數器(PC)跳轉到新線程的代碼位置,繼續執行。
觸發線程切換的典型場景
- 主動讓出 CPU:線程調用?
yield()
?或等待鎖 / I/O。 - 時間片耗盡:時鐘中斷觸發調度器介入。
- 高優先級線程就緒:搶占式調度強制切換。
什么是用戶態和內核態
1. 用戶態(User Mode)
- 權限:低權限模式,限制對硬件的直接訪問。
- 執行主體:普通應用程序(如瀏覽器、文本編輯器)。
- 關鍵限制:
- 無法直接操作硬件(如磁盤、網絡設備)。
- 內存訪問受限:只能訪問進程分配的虛擬內存,無法讀寫內核空間。
- 特權指令禁用:如修改頁表、關閉中斷等指令會被 CPU 拒絕執行。
- 目的:防止用戶程序破壞系統或干擾其他進程。
2. 內核態(Kernel Mode)
- 權限:最高權限模式,可完全控制硬件和系統資源。
- 執行主體:操作系統內核(如處理中斷、管理進程、驅動硬件)。
- 核心能力:
- 直接訪問硬件:如讀寫磁盤、配置網絡設備。
- 管理內存:修改頁表、分配物理內存。
- 執行特權指令:如開關中斷、修改 CPU 運行模式。
- 目的:保障操作系統對資源的絕對控制,確保系統安全。
切換時呈現8字型
進程間通信的方式有哪些
操作系統中的進程有幾種狀態
進程的調度算法
進程和線程的區別
進程是操作系統資源分配的基本單位,而線程是處理器任務調度和執行的基本單位.?
什么是軟中斷什么是硬中斷
硬中斷是由外部設備產生的中斷信號,具有強制中斷、快速響應等特點;軟中斷是由軟件指令觸發的中斷,具有軟件觸發、靈活性高、處理機制復雜等特點。
為什么要有虛擬內存
-
突破物理內存限制
當程序需要的內存超過實際物理內存時,系統將暫時不用的數據轉移到硬盤的「交換空間」,騰出物理內存供急需的程序使用,避免內存耗盡導致崩潰。 -
支持多任務并行
允許同時運行多個大型程序(如視頻剪輯 + 游戲),即使總內存需求遠超物理內存,也能通過動態調度保持流暢。 -
內存隔離與安全
每個進程擁有獨立的虛擬地址空間,程序 A 和程序 B 使用相同的虛擬地址時,實際映射到不同物理地址,防止數據篡改或越界訪問。 -
簡化開發與兼容性
程序員無需關注物理內存碎片化問題,虛擬內存提供連續的邏輯地址空間,降低開發復雜度;同時統一內存管理策略,提升跨硬件平臺的兼容性。
分段與分頁
分段(Segmentation)
定義:將程序的邏輯地址空間按功能劃分為不同大小的段(如代碼段、數據段、堆棧段等),每個段代表一個邏輯單元,可獨立分配和管理。
特點:
- 邏輯劃分:段與程序結構對應(如函數、模塊),便于程序開發與保護。
- 動態大小:段長度由程序需求決定,靈活但易產生外部碎片。
- 二維地址:邏輯地址由段號 + 段內偏移組成(如?
段A: 0x100
)。
示例:
程序被劃分為代碼段(存放指令)、數據段(存放變量)、堆棧段(函數調用棧),每個段獨立加載到內存的不同位置。
分頁(Paging)
定義:將邏輯地址空間和物理內存劃分為固定大小的頁(如 4KB),通過頁表映射實現非連續內存分配。
特點:
- 物理劃分:頁是固定大小的物理單位(如 4KB),消除外部碎片。
- 一維地址:邏輯地址由頁號 + 頁內偏移組成(如?
頁3: 0xFF
)。 - 硬件支持:頁表由硬件加速地址轉換,但可能產生內部碎片。
示例:
程序被切分為多個 4KB 的頁,分散存儲在物理內存的頁框中,操作系統通過頁表記錄頁與頁框的映射關系。
分段與分片
1. 分段(Segmentation)—— 傳輸層(TCP)
定義:TCP 協議將應用層數據分割為適合網絡傳輸的較小單元(稱為?TCP 段 / Segment),每個段添加 TCP 頭部(含端口號、序列號、校驗和等)。
目的:
- 適配網絡傳輸的合理數據大小(避免數據過大導致底層分片)。
- 實現可靠傳輸:每個段獨立編號,便于確認重傳和按序重組。
過程示例:
假設應用層發送?3000 字節?的數據,TCP 根據?MSS(最大報文段長度,通常約 1460 字節)?將其分為 3 個段:
- 段 1:0~1459 字節(序號 = 0)
- 段 2:1460~2919 字節(序號 = 1460)
- 段 3:2920~3000 字節(序號 = 2920)
特點:
- 由傳輸層(TCP)完成,對應用透明。
- 接收端按序號重組數據,保證順序。
2. 分片(Fragmentation)—— 網絡層(IP)
定義:IP 協議將網絡層數據包切割為更小的?IP 分片 / Fragment,以適應底層網絡的?MTU(最大傳輸單元,如以太網 MTU=1500 字節)。
觸發條件:當數據包大小超過某段鏈路的 MTU 時,路由器或主機進行分片。
目的:
- 解決不同網絡鏈路 MTU 不一致的問題(如從以太網到 PPPoE 鏈路)。
- 分片后的數據包可獨立傳輸,但重組由接收端完成。
分片示例:
若 IP 層收到一個?4000 字節?的數據包(IP 頭部 20 字節 + 數據 3980 字節),而鏈路 MTU=1500 字節,則分片為:
- 分片 1:20 字節頭 + 1480 字節數據(總 1500 字節,標志 MF=1,偏移 = 0)
- 分片 2:20 字節頭 + 1480 字節數據(MF=1,偏移 = 185)
- 分片 3:20 字節頭 + 1020 字節數據(MF=0,偏移 = 370)
特點:
- 由網絡層(IP)處理,對傳輸層和應用層透明。
- 分片可能發生在傳輸路徑中的任何路由器。
- 重組僅在最終接收端進行,中間設備不重組。
- 分片會降低網絡效率(丟失任一分片需重傳整個包)。
cpu的使用率和cpu的負載分別是什么,它們有什么關系
CPU 使用率
定義:CPU 在某一時間段內實際執行任務的時間占比(如 80% 表示 CPU 有 80% 時間在工作)。
核心意義:反映 CPU 的忙碌程度。
CPU 負載(Load Average)
定義:系統在單位時間內,正在運行和等待 CPU 資源的平均任務數(如負載為 4 表示平均有 4 個任務需處理)。
核心意義:反映系統的任務隊列壓力,與 CPU 核心數相關(如 4 核 CPU 負載臨界值約 4)。
為什么網絡IO會被阻塞(多角度)
什么是reactor
Reactor(反應器模式)?是一種事件驅動的編程模型,核心目的是高效處理高并發 I/O 請求。它通過非阻塞 I/O 多路復用(如?epoll
/select
)監聽多個事件源(如網絡連接),當事件觸發時自動分發到對應的處理程序(回調函數),實現單線程 / 少量線程管理大量連接
IO模型有哪些
模型 | 數據準備階段 | 數據復制階段 | 同步 / 異步 | 適用場景 |
---|---|---|---|---|
阻塞 I/O | 阻塞 | 阻塞 | 同步 | 簡單客戶端 |
非阻塞 I/O | 非阻塞(輪詢) | 阻塞 | 同步 | 低并發 + 實時性要求 |
I/O 多路復用 | 阻塞(多路等待) | 阻塞 | 同步 | 高并發服務(Nginx、Redis) |
信號驅動 I/O | 非阻塞(信號通知) | 阻塞 | 同步 | 特殊設備監控 |
異步 I/O | 非阻塞 | 非阻塞 | 異步 | 高性能服務器(需內核支持) |
select、poll、epoll 的區別
特性 | select | poll | epoll |
---|---|---|---|
底層數據結構 |
|
| 紅黑樹 + 就緒鏈表 |
最大描述符數量 | 默認 1024(可修改但效率下降) | 無限制(由系統內存限制) | 無限制(由系統內存限制) |
事件觸發模式 | 水平觸發(LT) | 水平觸發(LT) | 支持水平觸發(LT)和邊緣觸發(ET) |
內核 - 用戶數據拷貝 | 每次調用需拷貝整個? | 每次調用需拷貝整個? | 通過? |
時間復雜度 | O (n),遍歷所有 fd | O (n),遍歷所有 fd | O (1),僅處理就緒事件 |
CFS(linux)
CFS 是 Linux 內核的默認進程調度器,自 2.6.23 版本(2007 年)引入,用于管理普通進程(非實時進程)的 CPU 時間分配。其核心目標是公平性,即讓所有進程按優先級和權重公平共享 CPU 資源,避免單個進程長時間獨占 CPU。
核心機制
-
虛擬運行時間(vruntime)
- 作用:跟蹤每個進程的 “虛擬 CPU 使用時間”,公平性由?
vruntime
?決定。 - 計算方式:
- 實際運行時間 × 權重因子(權重由進程的?
nice
?值決定)。 nice
?值越小(優先級越高),權重越大,vruntime
?增長越慢,進程更易被調度。
- 實際運行時間 × 權重因子(權重由進程的?
- 調度規則:選擇紅黑樹中?
vruntime
?最小的進程運行。
- 作用:跟蹤每個進程的 “虛擬 CPU 使用時間”,公平性由?
-
紅黑樹(Red-Black Tree)
- 作用:高效管理所有可運行進程,按?
vruntime
?排序。 - 優勢:插入、刪除、查找的時間復雜度為?O(log N),確保高并發下調度效率。
- 作用:高效管理所有可運行進程,按?
-
動態時間片
- 目標延遲(sched_latency_ns):默認 24ms,保證所有進程在此周期內至少運行一次。
- 最小粒度(sched_min_granularity_ns):默認 3ms,避免頻繁上下文切換。
- 時間片計算:根據進程數和權重動態調整(如 4 個進程時,每個分到 6ms)。
-
優先級與權重
nice
?值范圍:-20(最高優先級)到 +19(最低優先級)。- 權重表:內核通過?
prio_to_weight
?數組將?nice
?值映射為權重值(如?nice=0
?對應權重 1024)。
阻塞模式和非阻塞模式
-
阻塞模式
- 適用簡單場景(如單線程順序處理),編程簡單。
- 缺點:高并發下效率低(線程因等待 I/O 被掛起)。
-
非阻塞模式
- 必須配合?多路復用(
select
/epoll
)?或?輪詢?使用,否則頻繁檢查會浪費 CPU。 - 邊緣觸發(ET)模式必須使用非阻塞,否則可能因未讀完 / 寫完數據導致永久阻塞。
- 優點:支持高并發,線程不會因 I/O 等待被阻塞。
- 必須配合?多路復用(
?
?2.?send
?發送數據
場景 | 阻塞模式 | 非阻塞模式 |
---|---|---|
發送緩沖區有空間 | 將數據復制到內核緩沖區,返回實際寫入的字節數(通常是全部數據)。 | 同左。 |
發送緩沖區無空間 | 線程掛起,直到緩沖區有足夠空間。 | 立即返回?-1 ,設置?errno=EAGAIN/EWOULDBLOCK ;或返回已成功復制的部分字節數。 |
部分空間可用 | 等待直到緩沖區剩余空間足夠容納全部數據(可能被中斷)。 | 立即復制盡可能多的數據,返回實際復制的字節數。 |
?