2012-03-10 31 views
11

我有很多優先ABC的傳入任務,我想用多核CPU上的線程池來處理任務。應使用70%的CPU來處理'類型A'任務,'類型B'任務的CPU的20%和'類型C'任務的CPU的10%。在一個線程池中處理具有不同優先級的任務

但是,如果只有'C'類型的任務到達,那麼100%的CPU應該專門用於它們。如果唯一任務BC arirve然後66%的proccess任務B和33%的任務C等..

你將如何在Java中實現這一點?

p.s: 優先級隊列將不起作用,因爲那樣只會輸入一個任務將被處理。此外,爲線程分配優先級不會工作,因爲它不準確。

+2

你經常會在面試問題,它們沒有什麼用處。(只是想看看你如何看待一個新問題,但它是新的,因爲沒有很好的理由你會這樣做)我會確保我明白真正的商業需求是什麼,因爲我懷疑他們真正想要達到的目標是什麼做一個更好的方法。例如,強制執行上述方案可能會減慢所有任務的速度(開銷),並且可能會以更簡單的方式獲得更好的結果。 – 2012-03-10 16:46:35

回答

3

也許你應該使用3個線程池。 1個任務包含7個線程池,B任務包含2個線程池,C任務包含1個線程池。

編輯:即使只有C任務有並行性(或者,如果您有多個處理器,如果您只有B和C任務),請將每個池中的線程數乘以處理器數,或者處理器的數量+ 1,或者您喜歡的任何其他更大的因素。

+1

如果所有任務都是「C」類型,那麼只有1個'C'線程如何實現任何並行? – 2012-03-10 14:03:24

+0

將每個池中的線程數乘以處理器數(或處理器數+ 1或其他任何因素)。我編輯了我的答案,確實考慮到這個非常有效的反對意見。 – 2012-03-10 14:10:24

+1

如果輸入'C'任務使池中的數據達到飽和狀態,然後出現'A'類型的任務,這仍然不起作用。這不僅僅是線程數...... – 2012-03-10 14:17:58

0

假設CPU上沒有其他進程正在運行,請創建3個線程池,每種類型的任務都有一個線程池,每個池的線程數與CPU上的核數相同(以便整個CPU可以由任務使用任何類型的任務,如果只有該類型的任務正在運行)。每個新任務都必須通過一段代碼,記錄每種類型的任務運行的次數。如果CPU上有空閒內核,請立即啓動新任務。如果沒有空閒插槽,則從優先級低於新任務的最低優先級池開始,如果需要,可以使用此掃描移至下一個優先級最高的池:中斷/暫停正在運行的線程(假定任務旨在可中斷/暫停)如果當前池超出其比例核心使用限制,則等待該任務完成(另一個任務可能會先完成,這同樣好)。在適當的池中啓動新任務。如果新任務無法啓動,它將排隊等待另一個線程完成,釋放新的插槽。當一個新插槽被釋放時,剛完成類型的任務獲得釋放插槽的第一優先級,如果沒有這樣的任務正在等待,則啓動具有最高優先級的等待任務。

0

這實際上是一個相當困難的問題。基本上,您需要實現一個自定義阻塞隊列,該隊列不僅跟蹤掛起的作業,而且還會跟蹤當前正在運行的作業。對於待處理的工作,我會爲各個優先級別保留單獨的列表。此外,您應該跟蹤每個優先級別的運行計數。當從隊列中請求新作業時,需要檢查當前正在運行的作業的比例,並從最高適用的優先級中選擇下一個可用作業(如果沒有可用的優先級,則推遲到其他優先級)。顯然,您需要將反饋放入此隊列中以用於正在運行的作業,因此您可能希望將包含實際作業的作業與運行實際作業的包裝器Runnable包裝在一起,然後在作業完成時更新隊列。

0

編寫一個預測引擎,用於統計確定給定任務在高優先級任務到達之前完成的可能性。通過可接受的置信度閾值進行參數化。所需信心越高,使用CPU的可能性就越大。閾值越低,您就越可能將太多的CPU給予較低優先級的任務。

0

既然這是一個採訪問題,我只是建議一個算法如何解決這個問題。

假設我們有三個單獨的隊列用於三種類型的任務,這意味着我們有三個隊列一個用於TypeA,另一個用於TypeB,其他用於Typec。

我們可以有一個queueToprocess讓我們說它是Qp。

有一個調度程序,它監視Qa,Qb,Qc並填充Qp。

可以說每個Qa,Qb,Qc中的任務將有一個特殊字段,表示完成任務所需的CPU週期數。

假設Qa有三項任務,其中第一項任務需要1個時鐘週期,第二項任務需要三個時鐘週期,第三項需要3個時鐘週期。

假設Qb有一個任務需要2個時鐘週期,Qc有一個任務需要1個時鐘週期。

調度器將任務T分成Qp中的小任務和enques。然後,Qp看起來像Tc,Tb,Ta1,Ta2,Ta2,Ta2,Ta3,Ta3,Ta3。

處理器可以讓隊列Qp執行並執行任務。

如果有人找到改進此算法的方法,請更正。

0

你真正需要的是在這裏實現共享...您的層次結構看起來像這樣的分層調度:

  CPU 
      | 
------------------------- 
|   |   | 
A (70)  B (20)  C (10) 
      | 
     --------------- 
     | | | | | | 
     T1 T2 T3 T4 T5 T6 

請注意,我不顯示A和C的整個層級,但我相信你有想法。現在要走的路是實現一個非常簡單的基於虛擬時間的調度程序,讓我們說Goyal啓動時公平隊列(SFQ)來處理A,B和C之間的調度。

這樣的調度程序是保守的,這意味着如果只有來自C的任務存在,那麼C作爲一個整體將採取整個事情。

現在要處理第二級調度,您有兩種方法......您可以實現HSFQ,它是SFQ的分層版本,或者在A,B和C之下的線程之間執行簡單的循環,以便每個線程都可以獲得其池中可用週期的「公平」份額。

我會小心使用循環法,因爲公平性不是很好,如果您將人口與突發線程和非常貪婪的線程混合在一起......循環法不會確保它們使用相同數量的循環,除非你進入循環計數,或多或少歸結爲SFQ。

你也可以看看跨越計劃更具體的分層版本...

希望它能幫助,

相關問題