原文地址,译文地址,译者: 董明鑫,校对:郑旭东网络
上下文切换(有时也称作进程切换或任务切换)是指 CPU 从一个进程或线程切换到另外一个进程或线程。
进程(有时候也称作任务)是指一个程序运行的实例。在 Linux 系统中,线程就是能并行运行而且与他们的父进程(建立他们的进程)共享同一地址空间(一段内存区域)和其余资源的轻量级的进程。
上下文是指某一时间点 CPU 寄存器和程序计数器的内容。寄存器是 CPU 内部的数量较少可是速度很快的内存(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。寄存器经过对经常使用值(一般是运算的中间值)的快速访问来提升计算机程序运行的速度。程序计数器是一个专用的寄存器,用于代表指令序列中 CPU 正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置,具体依赖于特定的系统。
稍微详细描述一下,上下文切换能够认为是内核(操做系统的核心)在 CPU 上对于进程(包括线程)进行如下的活动:(1)挂起一个进程,将这个进程在 CPU 中的状态(上下文)存储于内存中的某处,(2)在内存中检索下一个进程的上下文并将其在 CPU 的寄存器中恢复,(3)跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。
上下文切换有时被描述为内核挂起 CPU 当前执行的进程,而后继续执行以前挂起的众多进程中的某一个。尽管这么说对于澄清概念有所帮助,可是这句话自己可能有一点使人困惑。由于经过定义能够知道,进程是指一个程序运行的实例。因此说成挂起一个进程的运行可能更适合一些ide
。性能
上下文切换与模式切换操作系统
上下文切换只能发生在内核态中。内核态是 CPU 的一种有特权的模式,在这种模式下只有内核运行而且能够访问全部内存和其余系统资源。其余的程序,如应用程序,在最开始都是运行在用户态,可是他们能经过系统调用来运行部份内核的代码。系统调用在类 Unix 系统中是指活跃的进程(正在运行在 CPU 上的进程)对于内核所提供的服务的请求,例如输入/输出(I/O)和进程建立(建立一个新的进程)。I/O 能够被定义为任何信息流入或流出 CPU 与主内存(RAM)。也就是说,一台电脑的 CPU和内存与该电脑的用户(经过键盘或鼠标)、存储设备(硬盘或磁盘驱动)还有其余电脑的任何交流都是 I/O。
这两种模式(用户态和内核态)在类 Unix 系统中共存意味着当系统调用发生时 CPU 切换到内核态是必要的。这应该叫作模式切换而不是上下文切换,由于没有改变当前的进程。
上下文切换在多任务操做系统中是一个必须的特性。多任务操做系统是指多个进程运行在一个 CPU 中互不打扰,看起来像同时运行同样。这个并行的错觉是因为上下文在高速的切换(每秒几十上百次)。当某一进程自愿放弃它的 CPU 时间或者系统分配的时间片用完时,就会发生上下文切换。
上下文切换有时也因硬件中断而触发。硬件中断是指硬件设备(如键盘、鼠标、调试解调器、系统时钟)给内核发送的一个信号,该信号表示一个事件(如按键、鼠标移动、从网络链接接收到数据)发生了。
英特尔的 80386 和更高级的 CPU 都支持硬件上下文切换。然而,大多数现代的操做系统经过软件实现上下文切换,而非使用硬件上下文切换,这样可以运行在任何 CPU 上。同时,使用软件上下文切换能够尝试得到更好的性能。软件的上下文切换最早在 Linux 2.4 中实现。
软件上下文切换号称的一个主要优势是,硬件的机制保存了几乎全部 CPU 的状态,软件可以有选择性的保存须要被保存的部分并从新加载。然而这个行为对于提高上下文切换的性能到底有多重要,还有一点疑问。其拥护者还宣称,软件上下文切换有提升切换代码的可能性,它有助于提升正在加载的数据的有效性,从而进一步提升性能。线程
上下文切换的消耗调试
上下文切换一般是计算密集型的。也就是说,它须要至关可观的处理器时间,在每秒几十上百次的切换中,每次切换都须要纳秒量级的时间。因此,上下文切换对系统来讲意味着消耗大量的 CPU 时间,事实上,多是操做系统中时间消耗最大的操做。
Linux相比与其余操做系统(包括其余类 Unix 系统)有不少的优势,其中有一项就是,其上下文切换和模式切换的时间消耗很是少。进程