操作系統學習筆記——[特殊字符]超詳細 | 如何喚醒被阻塞的 socket 線程?線程阻塞原理、線程池、fork/vfork徹底講明白!

💡超詳細 | 如何喚醒被阻塞的 socket 線程?線程阻塞原理、線程池、fork/vfork徹底講明白!

    • 一、什么是阻塞?為什么線程會阻塞?
    • 二、socket線程被阻塞的典型場景
      • 🧠 解法思路:
    • 三、線程的幾種阻塞狀態和喚醒方式一覽
    • 四、如何判斷線程是繁忙還是阻塞?
    • 五、就緒狀態線程在等待什么?
    • 六、如何實現線程池?
      • 🏗 線程池原理:
      • 💡 Java 中線程池核心類:
    • 七、fork 和 vfork 的區別?
      • 🧠 補充:寫時復制(COW)
    • 八、進階:寫時復制(COW)原理
    • 九、Server 阻塞狀態示意
    • 🔚 總結

一、什么是阻塞?為什么線程會阻塞?

線程阻塞是一種等待某個事件發生的狀態。比如等待 I/O 完成、鎖釋放、條件滿足、子線程結束等。

常見導致線程阻塞的情況有:

阻塞方式常見場景喚醒方式
Thread.sleep(ms)讓出 CPU 一段時間時間到了自動喚醒
Object.wait()等待被 notify()notify() / notifyAll() 喚醒
Thread.join()主線程等待子線程結束子線程執行完畢自動喚醒
LockSupport.park()顯式掛起線程調用 unpark(Thread) 喚醒
socket accept() / read()阻塞等待客戶端連接/數據客戶端連接/發送數據
synchronized 鎖競爭等待鎖資源鎖釋放后參與競爭

二、socket線程被阻塞的典型場景

舉個最常見的 ServerSocket 場景:

ServerSocket server = new ServerSocket(8888);
Socket client = server.accept(); // 這里會阻塞直到有客戶端連接

當執行 accept() 時,線程會阻塞等待客戶端連接,直到有連接進入,線程才會被喚醒繼續執行。

📌 問題:如果我想手動喚醒這個被阻塞的 accept() 怎么辦?

🧠 解法思路:

  1. 關閉 socket:關閉 ServerSocket,會拋出異常從 accept() 中跳出。
  2. 使用 selector/epoll 實現非阻塞,比如 NIO
  3. 新建連接觸發 accept() 返回:可以在本地建立一個 loopback 連接觸發 accept() 返回。
// 觸發喚醒 server.accept()
Socket socket = new Socket("localhost", 8888);

三、線程的幾種阻塞狀態和喚醒方式一覽

阻塞方式描述喚醒方式示例
Thread.sleep()睡眠,釋放 CPU,不釋放鎖時間到Thread.sleep(1000)
Object.wait()等待 notify,釋放鎖notify()/notifyAll()obj.wait()
Thread.join()等待其他線程結束子線程結束t.join()
Thread.suspend()(已棄用)掛起線程resume()慎用
LockSupport.park()顯式掛起unpark()常用于 AQS
socket.accept()阻塞等待連接有連接到來 / 被關閉

四、如何判斷線程是繁忙還是阻塞?

  • Linux 可用 ps -e -o pid,state,cmd 查看線程狀態:
狀態碼描述
RRunning(可運行)
SSleeping(可中斷阻塞)
DUninterruptible sleep(不可中斷阻塞)
ZZombie
TStopped(暫停)

👀 繁忙線程處于 Running 狀態
😴 阻塞線程常見為 Sleeping 或 D 狀態


五、就緒狀態線程在等待什么?

就緒(Runnable)狀態的線程,已經滿足了運行條件,但等待操作系統調度器為它分配 CPU 才能執行。它處在一個“搶票”的階段。


六、如何實現線程池?

線程池是一種線程復用機制,用于提高系統并發能力和資源利用率。基本思路如下:

🏗 線程池原理:

  1. 初始化 N 個工作線程,進入等待狀態
  2. 維護一個任務隊列(生產者-消費者模型)
  3. 有任務時喚醒線程執行,執行完畢后重新等待
  4. 沒任務時線程阻塞等待

💡 Java 中線程池核心類:

ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> doTask());

自己實現線程池的基本結構如下:

// 工作線程不斷從任務隊列中拉取任務
while (true) {Runnable task = taskQueue.take(); // 阻塞等待任務task.run();
}

七、fork 和 vfork 的區別?

特性fork()vfork()
共享地址空間? 否? 是
復制頁表? 復制(寫時復制)? 不復制
父子并發? 并發? 父進程阻塞等待子進程執行完
安全性高(地址獨立)低(共享,容易出錯)
速度稍慢更快(節省內存)

🧠 補充:寫時復制(COW)

現代 fork() 實現采用 Copy-On-Write 技術,父子進程共享內存頁,只有在子進程寫入內存時才真正復制,提高效率。


八、進階:寫時復制(COW)原理

  1. fork 后父子共享內存頁,只讀
  2. 子進程試圖寫內存 → 觸發頁保護異常
  3. 內核復制對應頁,子進程寫副本
  4. 父進程繼續使用原來的頁

🌟 優點:節省時間和內存,尤其適用于 fork 后馬上執行 exec 的情況


九、Server 阻塞狀態示意

Client                  Server|                       ||---- connect() ----->  | (accept 阻塞)|                       |====> 喚醒 accept()
  • Server 端 accept() 無客戶端連接時處于阻塞狀態
  • 被連接時喚醒進入 RUNNABLE
  • 若使用 epoll,Server 線程始終活躍,但非阻塞式等待事件

🔚 總結

本教程詳盡梳理了線程阻塞與喚醒機制,尤其是 socket 阻塞處理、線程池設計、fork/vfork 差異 等關鍵知識點。以下是學習建議:

  • 掌握阻塞類型:主動、被動、鎖等待、IO 等
  • 熟練使用 ps/top/jstack 等工具分析線程狀態
  • 實踐線程池模型:自己寫一個簡易線程池
  • 深入理解操作系統中的進程管理機制(fork, vfork, exec)

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

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

相關文章

第十六屆藍橋杯大賽軟件賽省賽 Python 大學 B 組 滿分題解

題面鏈接Htlang/2025lqb_python_b 個人覺得今年這套題整體比往年要簡單許多,但是G題想簡單了出大問題,預估50101015120860,道阻且長,再接再厲 代碼僅供學習參考,滿分為賽后洛谷中的測評,藍橋杯官方測評待…

若依代碼生成器原理velocity模板引擎(自用)

1.源碼分析 代碼生成器:導入表結構(預覽、編輯、刪除、同步)、生成前后端代碼 代碼生成器表結構說明: 若依提供了兩張核心表來存儲導入的業務表信息: gen_table:存儲業務表的基本信息 ,它對應于配置代碼基本信息和生成信息的頁…

如何制定有效的風險應對計劃

制定有效的風險應對計劃的核心在于: 識別潛在風險、評估風險的影響與概率、選擇合適的應對策略、建立動態監控和反饋機制。 其中,識別潛在風險是最為關鍵的第一步。只有準確識別出可能的風險,才能在后續的評估、應對、監控等環節中做到有的放…

A2A協議實現詳解及示例

A2A協議概述 A2A (Agent2Agent) 是Google推出的一個開放協議,旨在使AI智能體能夠安全地相互通信和協作。該協議打破了孤立智能體系統之間的壁壘,實現了復雜的跨應用自動化。[1] A2A協議的核心目標是讓不同的AI代理能夠相互通信、安全地交換信息以及在各…

【中級軟件設計師】前趨圖 (附軟考真題)

【中級軟件設計師】前趨圖 (附軟考真題) 目錄 【中級軟件設計師】前趨圖 (附軟考真題)一、歷年真題三、真題的答案與解析答案解析 復習技巧: 若已掌握【前趨圖】相關知識,可直接刷以下真題; 若對知識一知半解,建議略讀題目&#x…

調節磁盤和CPU的矛盾——InnoDB的Buffer Pool

緩存的重要性 無論是用于存儲用戶數據的索引【聚簇索引、二級索引】還是各種系統數據,都是以頁的形式存放在表空間中【對一個/幾個實際文件的抽象,存儲在磁盤上】如果需要訪問某頁的數據,就會把完整的頁數據加載到內存中【即使只訪問頁中的一…

springboot和springcloud的區別

1. ?目的與功能? ?1)Spring Boot?: 主要用于快速構建獨立的、生產級的 Spring 應用程序。它通過自動配置和嵌入式服務器等特性,簡化了微服務的開發、啟動和部署,使開發者能夠專注于業務邏輯而非繁瑣的配置。?Spring Boot是一個快速開發的框架,旨在簡化Java應用程序的開…

耘想WinNAS:以聊天交互重構NAS生態,開啟AI時代的存儲革命

一、傳統NAS的交互困境與范式瓶頸 在傳統NAS(網絡附加存儲)領域,用戶需通過復雜的圖形界面或命令行工具完成文件管理、權限配置、數據檢索等操作,學習成本高且效率低下。例如,用戶若需搜索特定文件,需手動…

在斷網的時候,websocket 一直在CLOSING 狀態

現象 websocket 先連接成功,然后斷網。 由于維護了一套心跳機制,前端發起心跳,如果一段時間內沒有收到服務端返回的心跳。則表示連接斷開。 用心跳的方式處理斷網的兜底情況。 然而,此時網絡是斷開的,在代碼中直接調…

基于AWS的大模型調用場景:10大成本優化實戰方案

大模型訓練與推理是AI領域的計算密集型場景,如何在AWS上實現高性能與低成本的雙重目標?本文從實例選型、彈性伸縮、存儲優化等角度,分享10個經過驗證的AWS成本優化策略,幫助企業節省30%以上成本。 一、大模型場景的成本痛點分析 計…

【網絡原理】TCP/IP協議五層模型

目錄 一. 協議的分層 二. OSI七層網絡協議 三. TCP/IP五層網絡協議 四. 網絡設備所在分層 五. 封裝 六. 分用 七. 傳輸中的封裝和分用 八. 數據單位術語 一. 協議的分層 常見的分層為兩種OSI七層模型和TCP/IP五層模型 為什么要協議分層? 在網絡通信中&…

科技快訊 | 阿里云百煉MCP服務上線;英偉達官宣:CUDA 工具鏈將全面原生支持 Python

李飛飛團隊最新AI報告:中美模型性能差距近乎持平 4月8日,斯坦福大學以人為本人工智能研究所發布《2025年人工智能指數報告》。報告顯示,2023年AI性能顯著提升,AI應用加速,投資增長,中美AI模型差距縮小。報告…

貓咪如廁檢測與分類識別系統系列【三】融合yolov11目標檢測

? 前情提要 家里養了三只貓咪,其中一只布偶貓經常出入廁所。但因為平時忙于學業,沒法時刻關注牠的行為。我知道貓咪的如廁頻率和時長與健康狀況密切相關,頻繁如廁可能是泌尿問題,停留過久也可能是便秘或不適。為了更科學地了解牠…

2025年燃氣證書:傳承與發展的行業紐帶

回溯歷史長河,能源的利用與人類文明的發展息息相關。從遠古時期的鉆木取火,到如今廣泛應用的燃氣能源,每一次能源的變革都推動著社會的巨大進步。而在現代燃氣行業蓬勃發展的背后,燃氣從業人員資格證書正扮演著傳承與發展的重要紐…

在Ubuntu下進行單片機開發是否需要關閉Secure Boot

1. Secure Boot的作用 功能:Secure Boot是UEFI的安全功能,旨在阻止未經驗證的驅動或操作系統啟動,防止惡意軟件篡改引導過程。 影響范圍:它主要限制的是操作系統啟動階段加載的內核級驅動(如顯卡驅動、虛擬化模塊&…

國達陶瓷重磅推出陶瓷羅馬柱外墻整裝尖端新產品“冠巖臻石”

近日,記者在佛山國達建材有限公司(以下簡稱國達陶瓷)董事長楊建平處了解到,該公司重磅推出的“冠巖臻石”新產品,是屬于陶瓷羅馬柱外墻整裝產品中的尖端產品。新產品自面市之后,深受高端用戶的青睞與認可。…

【分享】Ftrans文件擺渡系統:既保障傳輸安全,又提供強集成支持

【分享】Ftrans文件擺渡系統:既保障傳輸安全,又提供強集成支持! 在數字化浪潮中,企業對數據安全愈發重視,網絡隔離成為保護核心數據的關鍵防線,比如隔離成研發網-辦公網、生產網-測試網、內網-外網等。網絡…

實驗一 字符串匹配實驗

一、實驗目的 1.熟悉匯編語言編程環境和DEBUG調試程序的使用。 2.掌握鍵盤輸入字符串的方法和分支程序的設計。 二、實驗內容 編程實現:從鍵盤分別輸入兩個字符串,然后進行比較,若兩個字符串的長度…

添加登錄和注冊功能

先寫前端再寫后端 前提&#xff1a;ideavue3mybatisspringBoot3前后端分離實現對一張表的增刪改查&#xff08;完整代碼版&#xff09;-CSDN博客 項目地址 1.添加一個Login.vue視圖 <template><div class"login_container"><div class"login…

【Windows】系統安全移除移動存儲設備指南:告別「設備被占用」彈窗

Windows系統安全移除移動存儲設備指南&#xff1a;告別「設備被占用」彈窗 解決移動硬盤和U盤正在被占用無法彈出 一、問題背景 使用Windows系統時&#xff0c;經常遇到移動硬盤/U盤彈出失敗提示「設備正在使用中」&#xff0c;即使已關閉所有可見程序。本文將系統梳理已驗證…