打字猴:1.700495764e+09
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
1700495793 算法之美:指导工作与生活的算法 [:1700494153]
1700495794 算法之美:指导工作与生活的算法 中断合并
1700495795
1700495796 使实时调度变得如此复杂和有趣的部分原因是,它本质上是两个完全不兼容的原则之间的协调。这两个原则被称为反应速度和吞吐量:是指你能多快地进行反应,以及你可以做多少。任何曾经在办公室工作过的人都可以很容易地体会到这两个指标之间的紧张关系。对那些工作是接电话的人来说,这就是部分原因:他们反应速度越快,其他人的吞吐量就越大。
1700495797
1700495798 同样,生活更困难时你必须像一台电脑一样在反应速度和吞吐量之间做出自己的权衡。但矛盾的是,要想把事情做好,最好的策略就是慢下来。
1700495799
1700495800 操作系统的调度程序通常被定义为一个“周期”,其中的每个程序至少要保证运行自己的那部分任务,这样系统就给每个程序提供该周期的其中一个“切片”。程序运行得越多,这样的一片就越小,每一期发生的上下文切换就越多,这样就要以吞吐量为代价保持反应速度。然而,如果不加以控制,这种保证在每个周期中每一进程至少都会得到一些关注的策略,可能导致灾难。当有足够多的程序运行时,任务切片就会缩得极小,以至系统会将整个切片都花费在上下文切换上,而不是切换到下一个任务上。
1700495801
1700495802 罪魁祸首是硬反应保证。因此,现代操作系统实际上为其程序切片设置了一个最小长度,若长度达到该最小值,系统将拒绝再进行细分。(例如,在Linux系统中,这个最小切片的值被设定为一毫秒,但就人类而言,现实中这一时间可能至少要几分钟。)如果添加了超越这一数字的进程,周期就会变得更长。这意味着那些进程将不得不等待更长的时间才能轮到被处理,但它们所等待的时间至少要足够做一些事情。
1700495803
1700495804 设置花在任何一个任务上的最低时间量,有助于防止过于强调反应速度而完全忽视吞吐量:如果系统最小切片时间比其上下文切换的时间长,则系统永远不会进入一种只进行上下文切换的状态。这也是一个很容易转化为人类生活建议的原则。如“时间盒子”或“番茄时钟”等方法(你随便设置一个厨房定时器或承诺做一个任务)就是这一思想的体现。
1700495805
1700495806 但是你应该设置多长时间呢?面对在执行重复任务之间要等待多长时间这样一个问题,比如检查你的电子邮件,从吞吐量的角度来看,答案很简单:尽可能长的时间。但这并不是故事的结尾,毕竟更高的吞吐量也意味着更低的反应能力。
1700495807
1700495808 对于你的电脑来说,它必须定期检查的恼人干扰并不是邮件,而是你。你可能不会把鼠标移动几分钟或几个小时,但当你移动鼠标时,你会期望看到屏幕上的指针立即移动,这意味着机器为了跟上你的步伐将耗费大量的努力。检查鼠标和键盘的频率越高,它在输入时就能反应得越快,但是它需要做的上下文切换就越多。因此,计算机操作系统在决定花多长时间来完成一些任务的时候,所遵循的规则很简单:用尽可能长的时间,以免用户感到紧张或迟钝。
1700495809
1700495810 当我们离开家去做一件快速完成的差事时,我们可能会说:“你甚至不会注意到我已经离开了。”而当我们的机器进行上下文切换去做计算时,在我们发现系统已经切换走之前,其必须由我们所控制。为了找到这个平衡点,操作系统的程序员便转向心理学方面进行研究,心理物理学研究能精确地计算出人类大脑滞后或延迟时所需的毫秒数。比这更密切地关注于用户是没有意义的。
1700495811
1700495812 多亏了这些努力,当操作系统工作正常时,你甚至不会注意到你的计算机正在发挥着多么大的作用。即使你的处理器在全速运转,你也可以继续在屏幕上顺畅地移动你的鼠标。顺畅性可能会导致吞吐量的下降,但这是由系统工程师设计的一个权衡:你的系统会尽可能多地花时间与你交流,然后及时刷新鼠标。
1700495813
[ 上一页 ]  [ :1.700495764e+09 ]  [ 下一页 ]