文号
t78458
阅读
8889
回复
6
收藏
5
在工作中实现高效的上下文切换
2016/01/04
IP:广东
上下文切换这个概念,源于英文的context switching。在多线程操作系统中,每个线程可以看做一个顺序执行的程序;所谓上下文,指的就是程序执行到了哪里、各个寄存器的值是什么。简而言之,上下文就是一个线程的“工作状态”,只要CPU知道目前的工作状态,就能决定下一步要做什么。在现代微型计算机系统中,每个CPU核心往往同时承载着成千上万的线程,它们通过不断地进行上下文切换实现互不干扰的顺序执行,使得计算机可以用单个核心同时运行多个任务。


虽然人脑和计算机是完全不同的,但在工作中,我们人类也需要上下文。当我们用键盘输入一篇文章的时候,我们需要随时查看之前输入的内容;当我们用PS绘制一张画作的时候,我们需要随时查看之前完成的面积;当我们用matlab对数组进行变换的时候,我们也需要看到之前输入的命令历史。这些例子无不说明:我们需要计算机(或者其他工作媒介)为我们保存和呈现上下文,因为人脑的上下文资源实在是太宝贵了。如果我们把例子从计算机中扩展到现实生活中,这个结论仍然是成立的:为了拍摄产品照片,需要搭建摄影棚;为了进行化学试验,需要搭建实验室。基本上,我们需要为几乎每一种工作(以及其他人类活动)指定上下文,然后不断切换之。


进行上下文切换是需要消耗时间和能量的。在最简单的嵌入式操作系统中,上下文切换意味着将当前线程的所有寄存器内容存入内存,然后从内存载入下一个线程所有寄存器的内容,整个过程通常是纳秒或者微秒级的。相比之下,人类活动的上下文切换问题严重的多:在北上广,上千万的人每天花费1-2小时在上班路上,因为他们工作和生活的上下文,在地理距离上过于遥远。上班族们往往很少参加运动(除了赶车),因为切换到体育运动的成本同样很高(上下文包括球场、服装、器材等)。但他们没有更好的选择,因为大城市已经是降低各项活动上下文切换成本的局部最优解了。

如果我们不能为不同的工作指定现实生活中不同的上下文,我们就需要将这些上下文缓存在大脑中。而大脑并不擅长做这个:我们和冯诺依曼机一样,只适合单线程地思考问题。现实生活中的上下文可以帮助我们省去大部分对上下文的记忆,以避免大脑犯浑。如果我同时进行一个物理实验和一个化学实验,我肯定会把它们摆在不同的桌子上,和配套的仪器设备堆在一起——不然我肯定会在过程中搞错步骤。

由此可以看到,上下文切换的效率,决定了我们进行各类活动的效率。
这里我想谈的,是面对计算机进行工作时的上下文切换。我目前的工作95%的时间要对着显示器,而且往往涉及多种不同的上下文(代码,脚本,文档,网页,命令行),如何在众多上下文之间高效切换,成了我最关心的问题。
novakon作者
10年11个月前IP:广东
802982
1楼
常见应对方式如下。

1. 增加工作区域面积
  目前我使用两个相同大小的1920x1080显示器,这样我便有足够的空间将不同的上下文摊开,避免手动切换。
2. 使用高效的上下文切换技巧
  对于win7系统而言,Alt-Tab 和 Win-Tab都是很糟糕的设计,因为它们并不便于在多于两种上下文之间进行切换。双屏时只在一个屏幕上显示任务栏也是败笔。相比之下,Macbook Pro的触摸板多指扫动切换桌面,就是非常优秀的设计,它以人脑容易接受的方式(左右侧滑动对应左右侧的桌面,如同真实的桌面一样)呈现上下文,可惜微软一辈子都没学会。

正因如此,Macbook Pro目前已经成为Web程序员以及所有非Windows栈程序员的标配。在此提出一个评价操作系统用户界面的新标准:界面上下文切换效率。
引用
评论
novakon作者
10年11个月前IP:广东
802983
2楼
未来,一个人从事多种工作,利用机器存储工作上下文以减少脑力开销,将是绝对趋势。我的电脑除非需要更新,一般一个月不会关一次机,因为我需要它为我保持上下文,睡醒之后可以马上开始继续昨天的工作。然而我仍然需要从大脑中载入大量上下文以对前一天的问题进行下一步思考;相信在未来,这样的脑力开销将有一部分被机器学习分担。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的