首頁  >  文章  >  Java  >  多執行緒概念部分飢餓

多執行緒概念部分飢餓

Linda Hamilton
Linda Hamilton原創
2024-10-22 06:09:03719瀏覽

歡迎來到我們的多線程系列的第 2 部分!在第 1 部分中,我們探討了原子性不變性

在這一部分中,我們將深入了解飢餓,因為它對於工程師來說至關重要,因為它確保了公平性和系統性能。透過認識飢餓風險,工程師可以設計優先考慮公平性、防止資源壟斷並確保所有執行緒獲得必要的 CPU 時間和資源以實現最佳運作的系統。

遊戲大廳中永無止境的等待

想像一下您正在玩線上多人遊戲,並且您正在嘗試加入流行遊戲模式的大廳,例如團隊戰鬥。你已經在大廳等待了一段時間,但每次比賽開始時,一批網速更快或技能排名更高的新玩家都會優先添加到遊戲中。你看到比賽一遍又一遍地開始,但你似乎從來沒有進去過!

從技術上講,您已經在隊列中,但由於響應時間更快或排名更高的其他玩家不斷先進入遊戲,因此您將無限期地留在大廳中。儘管擁有功能完美的系統,但由於匹配演算法不公平地優先考慮其他人,您被剝奪了玩遊戲的機會。

Multithreading Concepts Part  Starvation

1. 飢餓

飢餓是指進程不斷被拒絕存取其繼續運作所需的資源,即使這些資源可用。此行程保持等待狀態,因為較高優先順序的行程或其他資源分配策略阻止它取得必要的資源。與死鎖不同,資源並不是完全不可用,而是進程由於調度不公平而無法存取它們。

2. 原因

  • 優先權反轉:當較高優先權行程正在等待較低優先權行程所持有的資源時,如果其他較高優先權行程正在等待較低優先權進程的CPU 時間,則較低優先權進程可能會缺乏CPU 時間。進程不斷到達。

  • 資源分配策略:某些調度演算法可能會偏向某些流程(通常是優先權較高的行程),導致優先權較低的行程很少被分配資源。

  • 設計不良的演算法:如果資源分配演算法不平衡或不公平,可能會導致某些流程不斷被忽略。

  • 高資源需求:如果少數進程需要過多的資源,它們可能會透過獨佔這些資源而導致其他進程挨餓。

  • 等待時間長:經常被搶佔或發現自己在競爭有限資源的進程可能會遇到飢餓。

3. 防止飢餓

  • 公平地使用 ReentrantLock

Java 的 ReentrantLock 提供了一個強制公平的選項。透過使用帶有 true 參數的 ReentrantLock 建構函數,我們可以確保線程以先來先服務 (FCFS) 的方式獲取鎖,從而防止飢餓。

private final Lock lock = new ReentrantLock(true); // Fair lock
  • 使用訊號量實現公平資源共享

信號量用於控制對有限數量資源的存取。透過使用啟用公平性的信號量,我們可以確保執行緒以公平的順序取得許可,避免飢餓。

private final Semaphore sp = new Semaphore(1, true); // Fair semaphore

Semaphore(1, true) 是一種只有一個許可且啟用公平性的信號量。

  • 避免生產者-消費者問題中的飢餓(使用 BlockingQueue)

在傳統的生產者-消費者問題中,如果生產者壓倒消費者或消費者被拒絕存取共享資源,則可能會發生飢餓。 BlockingQueue 可以防止這種情況發生,因為它會自動處理生產者和消費者之間的同步。當隊列已滿或為空時,生產者和消費者分別被阻塞。這確保了兩者之間的公平平衡,並防止其中一個壓倒另一個,從而避免飢餓。

  • 使用Java的ForkJoinPool進行公平任務調度

在多個任務被 fork 和 join 的場景中,Java 中的 ForkJoinPool 提供了一種在執行緒之間公平地平衡工作的方法。它確保工作竊取,防止不太活躍的線程出現飢餓現象。 Java 的 ForkJoinPool 可以有效地處理任務分割和平衡,確保沒有執行緒因工作而餓死。這是透過使用工作竊取演算法來實現的,其中空閒線程從繁忙線程中竊取任務,以保持一切順利進行

4. 作業系統如何防止飢餓

作業系統(OS) 使用各種技術來避免飢餓,即由於較高優先順序的任務佔據主導地位,某些進程或執行緒長時間無法獲得必要的資源(例如CPU 時間、記憶體或I/O訪問)的情況。以下是一些作業系統防止飢餓的常見方法:

No. Method Description Prevents Starvation By
1 Aging Gradually increases priority of waiting processes. Prevents long waits by adjusting priority based on wait time.
2 Round-Robin Scheduling Allocates CPU time in a fixed cyclic order. Ensures all processes get CPU time, avoiding starvation.
3 Completely Fair Scheduler Allocates CPU based on fairness, independent of priority. Ensures fair distribution of CPU time.
4 Priority Boosting Temporarily raises the priority of starved processes holding important resources. Prevents priority inversion and ensures high-priority tasks get needed resources.
5 Multilevel Feedback Queues Dynamically adjusts process priorities based on behavior. Promotes long-waiting processes to higher-priority queues.
6 Semaphores with Fairness Ensures fair access to resources through FIFO queues. Prevents low-priority tasks from being perpetually blocked by higher-priority tasks.
7 Fair Resource Allocation Distributes system resources like CPU and memory based on process demand and need. Prevents resource-hogging processes from starving others.
8 Fair I/O Scheduling Prioritizes I/O requests to ensure timely completion for all processes. Prevents disk I/O starvation for processes making low-priority requests.

透過實施這些策略,作業系統可以確保沒有進程或執行緒無限期地缺乏資源,從而促進更公平、更有效率地使用系統資源。

軟體工程師的要點

  • 飢餓是一個進度問題,其中進程不斷被拒絕存取資源,但不一定涉及其他進程在死鎖循環中阻塞它。往往是因為調度或資源分配不公平所造成的。
  • 飢餓即使它需要的資源可用,也會發生,但它永遠沒有機會獲得它。
  • 即使系統沒有死鎖,飢餓也會發生。
  • 飢餓可能是死鎖預防的副作用(例如,優先考慮某些進程以避免死鎖),因此平衡公平性與避免死鎖策略至關重要。

參考

非常感謝線上文件、社群和所有可用資源,使本文成為可能。

  1. 多執行緒概念第 1 部分:原子性與不變性
  2. Stackoverflow
  3. 資訊圖形

以上是多執行緒概念部分飢餓的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn