PTT推薦

[請益] 排程相關的演算法(優先佇列)

看板Soft_Job標題[請益] 排程相關的演算法(優先佇列)作者
ntpuisbest
(阿龍)
時間推噓11 推:11 噓:0 →:35

目前工作大概一年多

想問一下各位關於排程相關的算法

https://i.imgur.com/DBthnys.png

圖 排程相關的演算法(優先佇列)

我在書上觀看這個高性能定時器的章節

他提到每一秒掃描整張大表的壞處有二

1.任務的約定執行時間可能跟當前時間距離很久,所以掃描是徒勞的

2.如果列表很大,這會很徒勞

關於這兩點我都可以理解 每秒掃描會有這兩個壞處

也理解優先佇列可以避免這些問題

但我的問題是,這真的要動用到優先佇列嗎?

我對電腦底層不熟悉

沒有辦法直接去設定說

假設每個任務只要做十分鐘就一定可以做完好了

八點做A任務

九點做B任務

十點做C任務

我看很多框架都有支援這種方式

我朋友是跟我說那些框架可能底層也是靠priority queue來做的

我是不太理解,如果都可以每隔某段時間做某件事

電腦應該也可以指定時間做事吧?

為何一定要依靠每秒輪詢polling 或是 priority queue來做

這是我查到的排程相關算法的資料,每秒輪詢應該就是下面的

Round Robin (RR)

https://data-flair.training/blogs/scheduling-algorithms-in-operating-system/

希望各位版友可以解惑

謝謝

--

※ PTT留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.160.137.197 (臺灣)
PTT 網址

itoni10/21 20:39不管怎麼樣你總該有地方放所有預定的工作吧 那要用什麼資料

itoni10/21 20:39結構存 比一下就是PQ最適合啊

aa0669710/21 20:41PQ已經是蠻底層的資料結構了吧 再更底層你是想用硬體去做

aa0669710/21 20:41

我的問題是用list或是陣列去存時間也可以吧 但是書上說的好像 要每秒去go through 整個array 看有沒有發生 現在時間等於array[i]的時間 但是沒有其他更簡單的做法嗎?除了pq外

※ 編輯: ntpuisbest (118.160.137.197 臺灣), 10/21/2022 20:45:10

itoni10/21 20:55用LL或array存 那新增task的時間就會要O(n)

lwoody8485710/21 21:03電腦沒法指定時間,會有潤秒問題

lwoody8485710/21 21:03搞懂wall clock和monolithic clock,你大概就能解惑

lwoody8485710/21 21:03其他高級一點的做法像是timing wheel,但底層也是p

lwoody8485710/21 21:03olling+pq的實現

gasbomb10/21 21:07電腦的世界沒有魔法 你看到的便利功能都是人家刻出來的

gasbomb10/21 21:07想到之前有人問說刪資料夾一定要跑recursive嗎?

gasbomb10/21 21:08windows都可以一鍵刪除整個資料夾耶

gasbomb10/21 21:08可是windows的刪除功能也是下去跑recursive啊

MyNion10/21 21:09你可以用LinkedList配合二元樹去做,這樣取排程就是O(1)

MyNion10/21 21:10取完排程再插回去就是O(log n)

GTR1253410/21 21:20你講的東西相比之下不夠底層

longlongint10/21 21:30你的假設套PQ不適合

longlongint10/21 21:31你如果把派任務給你的人想成你主管 會比較好像

longlongint10/21 21:31比較好想像 (前面打錯字

longlongint10/21 21:32一直抽插任務 一下很急一下又取消

longlongint10/21 21:32然後一直改順序+要你多工顧多個任務

longlongint10/21 21:33然後跟你說哪個任務重要也不知道 你想辦法讓客戶爽

longlongint10/21 21:35這時候OS就要猜優先度+用PQ(linux是CFS 紅黑樹)

longlongint10/21 21:35看要排什麼事情做,然後又不能單一任務做太久

Apache10/21 21:38問就是去看底層

Apache10/21 21:39電腦裡面沒有小精靈

Apache10/21 21:39要動時間不是polling就是timer interrupt

Apache10/21 21:42這東西跟排程無關 有機會去看單片機實現排程的方式

lovdkkkk10/21 21:47用 map 日期時間字串當 key value 放該時間要跑的東西就

lovdkkkk10/21 21:47不用掃全部了?

xam10/21 21:51用map不是更瞎忙.....

lovdkkkk10/21 21:53好像是耶 push 然後 loop 省事

OriginStar10/21 22:17原PO把許多問題混在一起了。用舉例解釋,就PO開會等老

OriginStar10/21 22:18闆但拉肚子想跑廁所,一直看手錶(scan)也沒用。書中少

OriginStar10/21 22:20少提到預估時間這件事,而電腦中多數Task的執行時間是

OriginStar10/21 22:25很難預估的,受到很多因素影響,所以電腦要在特定時間

OriginStar10/21 22:26執行特定功能也無法保證

enthos10/21 22:28玩 Javascript RTS: Screeps 就會有實際的感受

wulouise10/21 23:17一定十分鐘是怎麼保證的?

wulouise10/21 23:19很多東西都是沒辦法預測的,要是可以預測大家早就做了

Zerocks10/21 23:45設定cronjob 其實就是以最小時間單位下去檢查是不是該tr

Zerocks10/21 23:45igger

Zerocks10/21 23:46有queue 在檢查的時候只要看queue 就好

Zerocks10/21 23:48電腦只有指令週期的概念 沒有時間的概念 時間是前人做出

Zerocks10/21 23:48來的方便東西

GoalBased10/22 12:28你說的可以,但怎麼實現的?