算法優化人生之 —— 調度算法

原文地址: https://geekplux.com/2019/03/18/schedule-algorithm-and-life

算法優化人生之 —— 調度算法

電腦就是人腦的復刻,這是我大學時學《操做系統》這門課時的感覺。最近在複習調度算法,又重拾了這種感受,他倆太像了,電腦就是模仿人腦的機制製造出來的,但如今咱們能夠反過來從它身上學習一些優秀的算法,反哺自身(可能早已遺忘的)作事方法。html

什麼是調度算法

調度,你就理解成安排吧,你們應該都懂,懂的同窗,這一節就直接跳過吧。程序員

我來舉個常見的栗子——電梯。聽說每一個程序員坐電梯的時候都會想電梯調度算法,我也不例外……算法

最簡單的調度方法是什麼呢?固然是「誰先按的誰先坐」,這個在計算機裏叫先來先服務(FCFS-First Come First Serve)算法,無論你是在幾樓按的電梯,電梯都是按順序去接人、送人。你能夠想象一下,一我的在 1 樓按了去 20 樓,而後第 2 我的在 2 樓按了去 5 樓,第 3 我的在 21 樓按了要去 1 樓。這時候電梯它首先會跑去 1 樓把第 1 我的送到 20 樓,再跑去 2 樓把第 2 我的送到 5 樓,最後再跑去 21 樓把第 3 我的送到 1樓。負載均衡

是否是很蠢?它明明能夠在送完第 1 我的以後去 21 樓接上第 3 我的,把他送到 1 樓後再去 2 樓接第 2 我的,這一會兒能省多少電費啊!?學習

因此有了第二種調度算法:最短尋找樓層時間優先(SSTF-Shortest Seek Time First) 算法,用人話說就是優先停到最近的樓層。這樣仍是剛纔那個例子就會如咱們所願,在電梯送第 1 我的到 20 樓以後,就會找到最近的須要停的樓層 21 樓。可是這個算法有一個問題,好比有第 4 我的又在 20 樓按了電梯要下去,但第 5 我的是在 5 樓按的要下去,第 6 我的是在 1 樓按的……以此類推總之都是在低樓層。因爲它們第樓層距離都比去 20 樓近,因此第 4 我的好慘,等到天荒地老也等不來電梯……優化

還有一種調度算法是掃描算法(SCAN),就是電梯不停的從最底層到最高層,再從最高層到最底層,遇到有須要停的地方停就行了,是否是很像咱們如今見到的電梯第樣子了?還存在什麼問題嗎?其實還有個小問題,好比高樓層不多人去的話,那麼是否是就不必非要掃描到最高層。因此查找算法(LOOK)就是對它的改進版,當發現當前運行方向以後沒有須要停的樓層了,那麼就直接改變方向。spa

其實剛纔說的還只是一個電梯的調度,假如這個大樓裏每層有 6 部電梯呢,如何最大程度的利用電梯?假如這個大樓 3 樓和 10 樓是最頻繁使用電梯的樓層,你有什麼辦法對特定樓層優化呢?再假如 12 點和 18 點是吃飯下班高峯期,要怎麼調度才能最大程度節省人們等電梯的時間呢?……好了,你能夠坐電梯的時候想一想。操作系統

總之如今你對調度應該是理解了。設計

調度算法和咱們有什麼關係

咱們如今每一個人都很忙,天天面對的信息量、要處理的事務都超級多,如何更好地分配任務、管理進度,這都是對咱們時間的調度,如何切分目標、規劃將來,這些是對咱們人生的調度。按理來講電腦是模仿人腦發明的,但我這篇文章卻用電腦的機制往人腦上套,有點本末倒置的意思,:) 可是沒辦法,誰讓我只學過計算機科學,沒學過腦科學。code

接下來我會結合操做系統的調度算法,舉的都是現實生活中作事的例子,來看看咱們有什麼能夠借鑑的地方,每一個算法都是層層遞進的。

操做系統的調度算法

1. 先來先服務調度算法(FCFS)

最簡單的算法,剛纔咱們介紹電梯算法的時候已經說過了。如今不少人都用 To-Do 清單來管理本身的任務,老闆每交代你一個新的任務,你就把它寫到清單的最下面,而後你按照從上到下的順序去一件一件完成這些事,這就是 FCFS 算法。你應該明顯能感受到這裏面的問題,咱們作事是要分輕重緩急的,並且不少事你不知道完成它到底須要多久,萬一一直沒完成,你單子裏下面的事是否是也跟着都完成不了,這顯然是不行的,明天估計就被開除了。

因此來看看第二種算法:

2. 短做業優先調度算法(SJF)

老闆給你安排事情之後,你確定要預估一下每件事的完成時間,哪件事用的時間最短就最早作哪件事,這就是 SJF 算法。這裏又有明顯的問題了,萬一這件事用時很長但又很重要,那你可能永遠都沒機會去完成,好了別說了,明天你又被開除了……

爲啥這些算法這麼傻呢?別急,這只是開胃菜,畢竟設計操做系統的人一開始也沒想的那麼完備。

3. 優先權調度算法(FPF)

很好理解,就是哪件事的優先級最高先去作哪件事。這下你學會了,老闆給你安排任務以後,你不只預估了時間,還預估了一下這件事的重要程度,列了個優先級。按找優先級來一件件完成,這樣這下總沒錯了吧。

然鵝,又有問題了,你原本在作用戶調研,結果老闆明天要去開會讓你今晚把參會演講的 PPT 幫忙作一下(我不是黑老闆們不親自作 PPT 哈),顯然這個 PPT 的優先級更高,可是呢調研剛作了一小半也很重要,這時候就要分兩種狀況了:若是你就一根筋要先作完一件事才能再作下一件事,那麼你就得今天把用戶調研先趕完,而後加班去作 PPT,很慘。第二種狀況,你思路靈活,確定先給老闆作 PPT 要緊啊,三下五除二把 PPT 作完了,結果老闆一看,「不行,這裏得改」,結果你改了一天,加班……很慘。原本想着說次日把調研作完,沒想到老闆又讓你去一同參會,顯然這件事情的優先級又比調研高,那你又思路靈活的去參會了,沒想到回來當天老闆問你要調研報告,你拿不出來,好了,你被開除了,again!

很慘,通過第三次被開除你明白:優先權調度算法的問題就在於你要作的那件事頗有可能一直被優先級更高的事情搶佔。

4. 高響應比優先調度算法(HRRN)

這個算法能夠說是採前 3 種之長,兼顧了任務的優先級,也不會讓任務有一直拖着沒完成的狀況。具體來講,除了任務自己的優先級以外,還經過「響應比」來計算任務的優先級,不要怕這個名詞,能夠把計算響應比的公式通俗化一下:

響應比 =(已經拖了多久 + deadline)/ deadline

能夠看出,你拖的越久,這個任務的優先級越高,頗有可能就超過你當前任務的優先級。仍是剛纔那個栗子,你發現用戶調研報告拖了 3 天了,優先級已經比參會更重要,因此你參會當天就抽時間擠時間去作報告,晚上免不了加班,很慘,但總算沒被開除。

5. 時間片輪轉調度算法(RR)

通過剛纔的 4 個算法,你已經對任務如何排序得心應手,很快升職加薪迎娶白富美當上了高管,這時就又有問題了……假如你相同優先級的事有不少呢?畢竟大老闆了,手底下 10 個團隊,你確定都要兼顧,任務齊頭並進的時候,你怎麼辦?時間片輪轉法你能夠試一下。

一週 5 天工做日,天天按上下午分的話,你正好有 10 整塊的時間。你的 To-Do list 裏列了 10 項任務分別是跟每一個團隊交涉,具體交涉須要的時長你無法預估,因此你就每一個半天,集中處理一個團隊的事情,這就是時間片輪轉算法,輪轉的是你清單裏的任務,「時間片」是一個半天,每一個時間片結束後若是任務沒有完成,就繼續把它放到清單的末尾,下次去輪轉。這樣就保證了每一個團隊每週都能有一個半天去協調安排工做(儘管可能存在沒有交涉完的狀況,但你保證了雨露均沾)。

例子裏我圖方便,時間片設成了半天,你固然能夠設置更細粒度的。好比,1980 年代由 Francesco Cirillo 提出的番茄工做法能夠用做時間片輪轉的形式。它的理念是把你的時間按每 30 分鐘分割,每 30 分鐘裏,25 分鐘集中用於工做,5 分鐘用於休息。感興趣的能夠看《番茄工做法圖解》這本書,比較玄學說什麼 25 分鐘時候大腦結構,更利於處理中斷等等,我這裏就不過多介紹了,早些年我也嘗試過,感受沒啥效果就不用了,25 分鐘集中工做不如調本身效率高的時候猛工做一下午。

6. 多級反饋隊列調度算法(MLFQ)

這個算法就厲害了,集上面因此算法優勢,還避免了它們的問題。具體是這樣的,它把任務分紅多個清單,而不是都通通扔進一個單子裏(隊列理解成任務清單就行)。這裏爲了好說,咱們採用衆所周知的艾森豪威爾法則

艾森豪威爾法則

設置四個任務清單,按照優先級分別是:重要緊急的,重要不緊急的,不重要緊急的,不重要不緊急的。

這裏有幾個點:

  • 直接給清單設置了優先級。
  • 同時,每一個清單還要設置時間片大小,隨着優先級的下降,時間片也越長。
  • 當你接到一個任務時,首先放到優先級最高的清單(放的順序你能夠參考前面的算法 4),若是該任務在一個時間片內沒有完成,那麼它自動放到優先級次高的清單。同理,若是一直沒完成就會被放到優先級最低的清單裏。
  • 僅當上一級清單清空以後,再去執行下一個優先級的清單任務。

是否是第三點你很疑惑,萬一放到最後一個清單,你事情豈不是一直完不成?你別忘了,優先級越低的清單時間片越長,你有更多的時間去集中攻克一個任務。

基本上 MLFQ 算法是兼顧各類因素的較好的算法了,保證了短任務很快完成、重要任務優先完成、拖延的任務能集中精力完成,是否是很完美。不知道你有沒有看過《無壓工做的藝術》這本書,這個算法和書中的內容幾乎契合。這本書中說 5 分鐘以內能作完的事,就趕忙作完,不讓它佔用大腦的「內存」,作完就能夠徹底置諸腦後。若是須要超過 5 分鐘來完成,就把它列在清單裏,以後抽專門的時間再統一分配。等等理念,我以爲仍是很值得借鑑的。

調度算法有不少,這篇文章粗淺的介紹了一些操做系統經常使用的調度算法,還有不少其餘方面的調度算法有待你們去探索(好比負載均衡之類的,就是你一我的實在忙不過來了怎麼辦)。最後的「多級反饋調度」算法目測是最符合咱們人處理事情思惟的,但仍是要結合本身的習慣,變法不少很靈活,這裏只是作個簡介,具體的理解全看你了,固然只要你以爲有趣就好。另外,文章裏面的例子與現實嚴重不符,迎娶白富美靠的是顏值,升職加薪靠的是運氣,因此,提高顏值且積攢人品吧 :) 抖個機靈。

其實不少算法的思想,均可以運用在生活中,不管大事小事,好比貪心算法,分治法等,敬請期待算法優化人生系列的下一篇。


本做品採用知識共享 署名-非商業性使用-禁止演繹 4.0 國際 許可協議進行許可。

相關文章
相關標籤/搜索