上下文切换(进程切换/Task切换)是指CPU从一个进程或线程切换到另外一个。
进程(Task)是一个正在运行着的程序。在Linux中,线程是能够并行运行并与主进程共享内存空间和其余资源的轻量级进程。
上下文(context)是指在任意时刻CPU寄存器和程序计数器的内容。寄存器是CPU内部的速度很是快的内存单元,它经过提供对计算过程当中的经常使用值的极速访问来提升计算速度。程序计数器是一个指向CPU指令位置的特殊寄存器,这个位置要么是指向须要执行的指令地址要么指向下一条须要执行指令的地址,取决于系统。
上下文切换能够被描述为:系统内核在CPU上执行关于进程/线程的如下操做:(1)中止当前进程,并把它的相关状态信息存到内存的某个地方。(2)从内存里拿出下一个进程的状态信息并放入寄存器里。(3)从程序计数器里取出这个进程须要运行的指令,开始继续执行这个进程。
Context Switches and Mode Switches
进程切换只会发生在内核模式下。内核模式是CPU的特权模式,在这个模式下只有内核能够运行而且能够访问全部内存位置和其余系统资源。其余的程序只能运行在用户模式下,可是他们能够经过系统调用(system call)来运行内核模式中的一部分功能。系统调用是类Unix系统中正在运行进程对内核提供的服务的一个请求,好比IO或建立新进程。IO能够被认为是(CPU与主内存结合体)的任意数据转移,包括移入和移出。也就是说这个结合体与用户(如键盘输入),存储(磁盘),或其余电脑的数据转移。
类Unix系统里的这两种模式意味着当系统调用致使CPU须要变为内核态时一个相似又简单的操做(切换)是必须的。这是模式切换而不是上下文切换,由于它没有去运行其余进程。
上下文切换是多任务操做系统的必备属性。多任务操做系统是指多个进程执行在单个CPU上看起来像是同时运行而且不互相妨碍。这种假象是经过快速的上下文切换来完成的(每秒上千次)。
硬件中断也会引起上下文切换,硬件中断是指硬件设备产生发出一个信号给内核,告诉内核发生了一个事件(好比键盘输入,鼠标点击,网络数据到达,系统时钟)。
Intel80386和更高级的CPU提供了对上下文切换的硬件支持。然而大多数现代的操做系统更趋向于使用软件上下文切换,它能够在任何CPU上使用,而不使用硬件上下文切换,用于提升性能。软件上下文切换最早是在Linux2.4版本内核中实现的,用于适配Intel-compatible系列CPU。
软件上下文切换的一个主要好处是,硬件设备保存了几乎全部的CPU状态信息,而软件能够更有选择性,只保存真正须要保存和从新加载的部分。然而问题是这种作法对提高上下文切换效率到底有多重要?它的倡议者还声称软件上下文切换提供了改进切换代码可能,从而提升效率,它能够对已经加载的数据进行更好的控制。
The Cost of Context Switching
上下文切换一般是增强计算的。就是说,它须要考虑处理器的时间,对每秒上千次的切换这个时间须要精确到纳秒。所以上下文切换会对系统CPU时间产生大量开销,而且可能成为系统里最大的开销。
因此操做系统在设计时一个主要的点是怎么避免不须要的上下文切换。然而这是实践中是很难实现的。实际上,尽管上下文切换对CPU时间的开销已经降低了,单它主要经过提升CPU时钟速度而不是提升上下文切换自己。
相比其余操做系统包括类Unix系统,Linux上下文切换和内核模式切换代价很是小。
网络