打字猴:1.700495743e+09
1700495743
1700495744 这种来回切换并不是“真正的工作”,也就是说它们都没有实际提高计算机所切换的程序的状态。这是无用功,每一次上下文切换都在浪费时间。
1700495745
1700495746 人类在上下文切换时也会付出代价。对于这一点,我们在以下时刻会有所体会,我们将办公桌上的文件拿来又拿走,电脑上的文件关闭又打开,走进房间却不记得我们要来做什么,甚至我们会大喊:“我在哪里?”“我在说什么?”心理学家的研究表明,对于我们来说,任务切换的影响可以包括延迟和错误,影响时间会是几分钟而不是几微秒。任何一个人,如果你在一小时内被中断几次,那么你就有这一个小时什么都做不成的危险。
1700495747
1700495748 就个人而言,我们已经发现,编程和写作需要考虑整个系统的状态,所以其进行切换的成本就非常大。我的一位编程的朋友说,正常的一周工作时间不适合他的工作,因为对他来说,一天工作16小时的效率是每天8小时的两倍多。对于布瑞恩来说,他认为写作是一种锻造。金属在具有可塑性之前都要一段时间来加热。他发现,写不到90分钟就不会有什么成果,因为前半个小时几乎出不了成果,除了将“我在做什么?”这个大问题装进他的大脑。匹兹堡大学的调度专家柯克·普鲁斯,也有同样的经历。“如果只有不到一个小时是时间,我就去做些简单的小差事,因为我要花35分钟才能真正弄清楚我想做什么,然后我可能就没有时间去做这件事了。”
1700495749
1700495750 英国作家吉卜林在其1910年创作的著名的诗《如果》最后高度呼吁对时间的管理:“如果你能惜时如金,那就利用每一分钟不可追回的光阴……”
1700495751
1700495752 真希望是这样。但事实是,我们总会将大量时间花在无用的工作上,比如考虑如何记账和任务管理。这是调度的基本权衡之一。你承担的越多,花费的时间就越多。在极端的噩梦中,这变成一个被称为颠簸的现象。
1700495753
1700495754
1700495755
1700495756
1700495757 算法之美:指导工作与生活的算法 [:1700494152]
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 颠簸对于人类来说是一个非常好辨识的状态。如果你曾经有过这样一个时刻,例如你想停止手头上的事情,以便有机会写下所有你应该做的事,但并没有多余的时间,由此你就陷入颠簸状态。对于计算机来说,原因是一样的:每一个任务都基于我们有限的认知资源。如果记住一切我们需要记住的事情就已经占据我们全部的注意力了,或者优先考虑每个任务就已经消耗掉这些任务所需要完成的所有时间,或者我们的思绪在被转化为行动之前就常被打乱,那么这种感觉很令人恐慌。这就是颠簸,电脑对这一点很清楚。
1700495779
1700495780 如果你的系统曾经陷入颠簸(如果你曾经在这样一种状态)那么你可能会想知道计算机科学是如何摆脱这种困局的。在丹宁20世纪60年代的一篇以此为主题的划时代的论文中,他指出,一盎司的预防胜过一磅的治疗。最简单的方法就是获得更多的内存,例如足够的RAM(随机存取存贮器)将所有运行中的程序工作集同时转换为内存,并减少切换所花费的时间。但这一预防颠簸的建议在你深陷其中时却不能帮你。此外,当涉及人类注意力时,我们就会陷入我们已有的事物之中。
1700495781
1700495782 另一种避免颠簸的方式是学会说“不”的艺术。丹宁举例说,如果一个系统没有足够的空余内存以保存其工作组,那就应该拒绝添加新的程序,这可以防止机器的颠簸。这是给所有任务繁多者的明智忠告。但这似乎也是一个遥不可及的奢侈品,我们中的一些人发现自己已经超负荷运转,或者无法缩减分配给我们的需求。
1700495783
1700495784 在这种情况下,显然已经没有办法工作得更努力,但你可以工作得更——笨。随着思考存储,上下文切换时无用功的一个最大来源就是选择下一步要做什么。这有时也会使实际工作陷入困境。例如在面对收件箱里满满的邮件时,我们从排序理论得知,重复搜索其中最重要的一个邮件进行回答,就会带来O(n2)多个操作步骤——n个邮件每个都要进行n次搜索。这就意味着,如果当你起床后发现收件箱里邮件的数量是平时的3倍,那你就要花比平时长9倍的时间去处理这些邮件。更重要的是,搜索那些电子邮件就意味着在你回复任何一个邮件之前,要将每一条消息都一个接一个地录入你的脑海里:解决存储颠簸的一个万全之策。
1700495785
1700495786 在颠簸的状态中,你基本上没有任何进展,所以即使以错误顺序做工作也比什么都不做要强。不是首先回复最重要的邮件(这需要对整体进行评估,因此可能要比工作本身花更多时间),也许你应该回避这种二次时间流沙,而只是以随机顺序或者屏幕上显示的任何顺序来回复电子邮件。同样的,Linux操作系统的核心团队在几年前,用一个不太“聪明”的调度师代替了原来的调度师,这位新调度师可能没那么精于优先处理计算,却计算得更快。
1700495787
1700495788 然而,如果你仍然想保持你的优先事项,你还可以争取另一个,甚至更有趣的交易,以重获你的工作效率。
1700495789
1700495790
1700495791
1700495792
[ 上一页 ]  [ :1.700495743e+09 ]  [ 下一页 ]