惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

GeekPlux

一代人的博客,一代人的青春注脚 那些年我打过的日结工 来美国的两年后 2023 一蓑烟雨 在美国拥有一辆 Tesla 的成本 我的 Workspaces 十年进化史 How to Sync Logseq Plugins, Themes and Settings Across Multiple Devices Setting Up Umami as Your Google Analytics Alternative: A Step-by-Step Guide 迁移豆瓣读书记录到 goodreads Enhance Your Internet Privacy in 2023 Refactor your blog comments system with Webmention.io 来美国之后,如何快速安顿下来 Three Levels of Information Perception 疫情三年 与人聊天的美好 我获取信息的方法 2022 版 我是如何学会编程的 Legacy code best practice: how to take over an existing project smoothly 2020 恍如隔世 接外包的一些坑和小技巧 论交友 往返香港隔离指南 即将失明,还能继续做程序员吗 小谈我对新技术的态度 How to use tailwindcss with AMP in a Next.js project 远程工作如何提高效率 复式记账、财报、量化与图论 我为什么从阿里巴巴离职 2019 柳暗花明 YouTube 观看历史数据分析 投资被动型指数基金正在造成下一次金融泡沫? 三种主流的网赚套利,躺着赚钱? 色盲的世界 我是如何管理 21 张信用卡的 薅羊毛的最大意义:保持对规则的敏感度 来香港的两个月 数据可视化技术实现的关键点 不需要扫描仪,数字化归档自己的文件 如何找到时薪 80 美元的远程工作(二) 如何找到时薪 80 美元的远程工作(一) 如何打造真正的简历 浅思图数据可视化 舍本逐末的学习方式 给想转行作程序员的人泼一盆冷水 杭州最适合闲来溜达的几条路线 2018 平淡无奇 突闻金庸先生逝世有感 十年博客折腾历史 数据可视化之 Sankey 桑基图的实现 研究生生涯总结 如何在不规则多边形内均匀撒点的算法 Web 前端中的增强现实(AR)开发技术 参加 Google Summer of Code 的体验 netjsongraph.js – Google Summer of Code (GSoC) 2017 summary 如何在 GitHub 上获得数百 stars Markvis - 在 markdown 中生成可视化图表 D3 force layout and WebGL integration 文本数据可视化(下)——一图胜千言 文本数据可视化(上)——从 Wordle 谈起 我获取信息的渠道 数据可视化基础——视觉编码 数据可视化基础——数据模型 数据可视化基础——可视化流程 为什么要用 Emacs Vega-Lite: A Grammar of Interactive Graphics 如何搭建一个私人网盘 如何阅读一篇学术论文 超过十个人的微信群根本没有价值 毕业后的两年 建立索引式的学习方法 为什么我喜欢写代码 写文章的小技巧 为什么文章写得好的人都很厉害 人总要有点盲目的自信 如何管理好自己的密码 Backbone View 之间通信的三种方式 Vim - 适合自己的,才是最好的 轻松玩转 Ukulele 告别社交网络有多难 双拼学习记 CoffeeScript 编码风格指南(译) CoffeeScript 笔记 CSS 最核心的几个概念 响应式设计简易指南(译) 初识 TDD Collapsing margins——合并的外边距 菜鸟级 Mac 配置(二) 菜鸟级 Mac 配置(一) CSS 编写原则 Goodbye,我的大学 如何新建一个 Cocos2d-x 项目 Windows8.1 下 Cocos2d-x 环境搭建 Android 开发如何入门 如何绑定独立域名 写博客就用 FarBox 尝试改变微信公众账号消息的推送方式 情似流水 操作系统总结——存储器管理 操作系统总结——处理机管理 操作系统总结——引论
算法优化人生之 —— 调度算法
GeekPlux · 2019-03-18 · via GeekPlux

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

电脑就是人脑的复刻,这是我大学时学《操作系统》这门课时的感受。最近在复习调度算法,又重拾了这种感觉,他俩太像了,电脑就是模仿人脑的机制制造出来的,但现在我们可以反过来从它身上学习一些优秀的算法,反哺自身(可能早已遗忘的)做事方法。

什么是调度算法

调度,你就理解成安排吧,大家应该都懂,懂的同学,这一节就直接跳过吧。

我来举个常见的栗子——电梯。据说每个程序员坐电梯的时候都会想电梯调度算法,我也不例外……

最简单的调度方法是什么呢?当然是“谁先按的谁先坐”,这个在计算机里叫先来先服务(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)就是对它的改进版,当发现当前运行方向之后没有需要停的楼层了,那么就直接改变方向。

其实刚才说的还只是一个电梯的调度,假如这个大楼里每层有 6 部电梯呢,如何最大程度的利用电梯?假如这个大楼 3 楼和 10 楼是最频繁使用电梯的楼层,你有什么办法对特定楼层优化呢?再假如 12 点和 18 点是吃饭下班高峰期,要怎么调度才能最大程度节省人们等电梯的时间呢?……好了,你可以坐电梯的时候想想。

总之现在你对调度应该是理解了。

调度算法和我们有什么关系

我们现在每个人都很忙,每天面对的信息量、要处理的事务都超级多,如何更好地分配任务、管理进度,这都是对我们时间的调度,如何切分目标、规划未来,这些是对我们人生的调度。按理来说电脑是模仿人脑发明的,但我这篇文章却用电脑的机制往人脑上套,有点本末倒置的意思,:) 但是没办法,谁让我只学过计算机科学,没学过脑科学。

接下来我会结合操作系统的调度算法,举的都是现实生活中做事的例子,来看看我们有什么可以借鉴的地方,每个算法都是层层递进的。

操作系统的调度算法

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 分钟来完成,就把它列在清单里,之后抽专门的时间再统一分配。等等理念,我觉得还是很值得借鉴的。

调度算法有很多,这篇文章粗浅的介绍了一些操作系统常用的调度算法,还有很多其他方面的调度算法有待大家去探索(比如负载均衡之类的,就是你一个人实在忙不过来了怎么办)。最后的“多级反馈调度”算法目测是最符合我们人处理事情思维的,但还是要结合自己的习惯,变法很多很灵活,这里只是做个简介,具体的理解全看你了,当然只要你觉得有趣就好。另外,文章里面的例子与现实严重不符,迎娶白富美靠的是颜值,升职加薪靠的是运气,所以,提升颜值且积攒人品吧 :) 抖个机灵。

其实很多算法的思想,都可以运用在生活中,无论大事小事,比如贪心算法,分治法等,敬请期待算法优化人生系列的下一篇。