1700495729
1700495730
谚语
1700495731
1700495732
走的越急,就落得越远。
1700495733
1700495734
埃伦·厄尔曼
1700495735
1700495736
程序员不说话,因为他们不能被打断……与其他人同步(电话、蜂鸣器和门铃)只能意味着打断思路。中断就意味着会发生一些错误。你不能中途下车。
1700495737
1700495738
所以,调度理论还是告诉人们一个合理而又鼓舞人心的道理。解决许多调度问题时,有最简单和最优算法,而要解决的这些问题都已经非常接近我们在日常生活中遇到的情况。但是,在现实世界中,当涉及实际操作的单机调度问题时,事情就会变得复杂。
1700495739
1700495740
首先,人们和计算机操作系统都面临着一个奇怪的挑战:正在进行调度的机器和将要进行计划的机器是同一个。要想理顺你的待办事项清单上的项目,需要你的待办事项列表本身进行优先处理和调度。
1700495741
1700495742
其次,抢占也不是随意的。每当你转换任务时,你都要付出代价,这在计算机科学领域被称为上下文切换。当计算机处理器把注意力从给定的程序上转移时,总要付出一定的代价。它需要有效地标记该任务的位置,并将其所有相关信息放置一边,然后找出它下一步运行的程序。之后,必须取得该程序的所有相关信息,找到它在代码中的位置,最后进入该档位。
1700495743
1700495744
这种来回切换并不是“真正的工作”,也就是说它们都没有实际提高计算机所切换的程序的状态。这是无用功,每一次上下文切换都在浪费时间。
1700495745
1700495746
人类在上下文切换时也会付出代价。对于这一点,我们在以下时刻会有所体会,我们将办公桌上的文件拿来又拿走,电脑上的文件关闭又打开,走进房间却不记得我们要来做什么,甚至我们会大喊:“我在哪里?”“我在说什么?”心理学家的研究表明,对于我们来说,任务切换的影响可以包括延迟和错误,影响时间会是几分钟而不是几微秒。任何一个人,如果你在一小时内被中断几次,那么你就有这一个小时什么都做不成的危险。
1700495747
1700495748
就个人而言,我们已经发现,编程和写作需要考虑整个系统的状态,所以其进行切换的成本就非常大。我的一位编程的朋友说,正常的一周工作时间不适合他的工作,因为对他来说,一天工作16小时的效率是每天8小时的两倍多。对于布瑞恩来说,他认为写作是一种锻造。金属在具有可塑性之前都要一段时间来加热。他发现,写不到90分钟就不会有什么成果,因为前半个小时几乎出不了成果,除了将“我在做什么?”这个大问题装进他的大脑。匹兹堡大学的调度专家柯克·普鲁斯,也有同样的经历。“如果只有不到一个小时是时间,我就去做些简单的小差事,因为我要花35分钟才能真正弄清楚我想做什么,然后我可能就没有时间去做这件事了。”
1700495749
1700495750
英国作家吉卜林在其1910年创作的著名的诗《如果》最后高度呼吁对时间的管理:“如果你能惜时如金,那就利用每一分钟不可追回的光阴……”
1700495751
1700495752
真希望是这样。但事实是,我们总会将大量时间花在无用的工作上,比如考虑如何记账和任务管理。这是调度的基本权衡之一。你承担的越多,花费的时间就越多。在极端的噩梦中,这变成一个被称为颠簸的现象。
1700495753
1700495754
1700495755
1700495756
1700495758
算法之美:指导工作与生活的算法 颠簸状态
1700495759
1700495760
《社交网络》
1700495761
1700495762
盖齐:扎克伯格先生,你现在是完全专心地在听吗?
1700495763
1700495764
扎克伯格:你只吸引了我的部分注意力——只有最低限额。
1700495765
1700495766
计算机多任务处理的过程被称为“线程”,你可以想象为在玩一组球。就像一个杂耍者一次只能投掷一个球,而同时其他的球都在空中,计算机中央处理器一次也只能处理一个程序,但可以快速地切换(以1/1000秒为单位),像放电影、浏览网页,或立即提醒你收到的电子邮件。
1700495767
1700495768
20世纪60年代,计算机科学家开始思考如何在不同的任务和用户之间实现计算机资源共享的自动化过程。“这是一个激动人心的时刻。”皮特·丹宁说道。他现在是计算机多任务处理的顶级专家,当时正在麻省理工学院攻读博士学位。令人兴奋又不确定的是:“你会如何划分一个主内存之间的大量工作?如果它们中的某些想变大,某些可能要缩小,而且它们会相互影响,试图窃取‘记忆’和所有东西……你如何管理这整套的任务?没有人知道该怎么做。”
1700495769
1700495770
一点儿都不奇怪,由于研究人员并不真正清楚他们在做什么,他们付出的努力便遇到了困难。有一件事引起了他们的注意。丹宁说,在一定条件下一个戏剧性的问题“就会出现,由于你不断给多任务处理增加更多工作,在某个时刻,当你超过一个临界阈值时(这个值的准确位置在你未到达之前很难预测),你就会知道。因为这时,系统似乎突然死了”。
1700495771
1700495772
想想之前的杂耍者形象。当一个球被抛在空中时,杂耍者有足够的时间将另一个球抛向空中。但如果再加一个球他能处理吗?如果他不把那个球抛向空中,那其他所有的球都会掉到地上。很明显,整个系统就会崩溃。正如丹宁所说:“多增加一个程序就会造成服务的崩溃……这两个例子之间显著的差异最初是违背直觉的,这可能使我们在新程序被引入到拥挤的内存时对服务的期望逐步下降。”相反,这却是灾难性的。虽然我们可以理解一个不知所措的杂耍者,但究竟是什么让这样的事情发生在一个机器上的呢?
1700495773
1700495774
这里的调度理论与缓存理论交叉。缓存理论的全部思想就是保持所需项目“工作集”可用,以便快速访问。这其中的一个方法就是让计算机正在使用的信息保存在快存上,而不是在慢存硬盘上。但是,如果一项任务需要跟踪很多事情,那它们就无法被全部存入内存,那么你可能会花更多的时间在内存上录入和提取信息,而没有时间做实际工作。更重要的是,当你切换任务时,新活动的任务可能要给正在进行中的工作集腾出空间,即从内存中删除部分工作组。即将被激活的下一个任务,将重新获得其工作集的部分空间,将它们重新放回内存,这也将再次取代其他信息。这一问题(相互窃取空间的问题)在处理器和内存之间具有层次结构的高速缓存系统中会变得更糟。皮特·泽吉尔斯达是Linux操作系统的调度程序的主要开发者之一,他说:“缓存对目前的工作量来说还是很柔和的,当你进行上下文切换时,几乎所有缓存都会失效。而这带来的伤害很大。”在极端情况下,一个程序可以运行足够长的时间,把它所需要的项目转换成内存,然后再让路给另一个程序运行,该程序会再运行足够长的时间以覆盖之前的信息。
1700495775
1700495776
这就是颠簸:系统全速运行,却一事无成。丹宁第一次诊断出这种现象是在内存管理领域,但计算机科学家现在使用的“颠簸”这一术语是指任何情况下的系统停止,因为它完全被无用功占据。颠簸的电脑不是逐渐停下来,而是像从悬崖上掉下来的。“真正的工作”已经降到了零,这也意味着要走出这种困局几乎是不可能的。
1700495777
1700495778
颠簸对于人类来说是一个非常好辨识的状态。如果你曾经有过这样一个时刻,例如你想停止手头上的事情,以便有机会写下所有你应该做的事,但并没有多余的时间,由此你就陷入颠簸状态。对于计算机来说,原因是一样的:每一个任务都基于我们有限的认知资源。如果记住一切我们需要记住的事情就已经占据我们全部的注意力了,或者优先考虑每个任务就已经消耗掉这些任务所需要完成的所有时间,或者我们的思绪在被转化为行动之前就常被打乱,那么这种感觉很令人恐慌。这就是颠簸,电脑对这一点很清楚。
[
上一页 ]
[ :1.700495729e+09 ]
[
下一页 ]