导读:在实际项目的开发中我们经常会接触到多线程编程,大多数人可能会觉得开启多个线程并行地执行任务一定会比单个线程执行速度要快、花费的时间更少。然而实际情况是,多线程之间需要竞争IO设备、竞争锁资源等,往往可能导致执行效率还不如单个线程高。下面本文将主要其中一个讨论影响多线程执行效率的因素----上下文切换。
一、上下文的切换的定义
简单来说,上下文切换是指CPU从一个进程或线程切换到另一个进程或线程。
上下文是CPU寄存器和程序计数器在任何时间点上的内容。寄存器是cpu内部的一小部分非常快的内存(与cpu外部较慢的ram主存相反),它通过提供对常用值(通常是在计算过程中的值)的快速访问来加快计算机程序的执行。程序计数器是一种专用寄存器,它指示CPU在其指令序列中的位置,并根据具体的系统,保存正在执行的指令的地址或将要执行的下一条指令的地址。
上下文切换可以更详细地描述为操作系统的内核对CPU上的进程(包括线程)执行以下活动
- 使一个进程停止执行,并将该进程的CPU状态(即上下文)存储在内存中的某个位置。
- 从内存中检索下一个进程的上下文并将其还原到CPU的寄存器中。
- 返回到程序计数器指示的位置(即返回到进程中断时的代码行),以恢复进程。
上下文切换是多任务操作系统的一个基本特性。多任务操作系统是指多个进程在一个cpu上同时执行而不相互干扰的操作系统。这种并发性的错觉是通过上下文切换来实现的,上下文切换是快速连续发生的(每秒数十次或数百次)。这些上下文切换是进程自愿放弃其在cpu中的时间的结果,或者是调度程序在进程用完其cpu时间片时进行切换的结果。
二、上下文切换的代价
上下文切换通常是计算密集型的,也就是说对于每秒(有可能是纳秒)内数十或数百的上下文切换将需要相当长的CPU时间。因此,就CPU时间而言,上下文切换对系统来说是一个巨大的成本,并且可能是操作系统上成本最高的操作。
在多线程编程中,线程是由CPU进行调度的,CPU的一个时间片内只执行一个线程,当CPU从执行线程A切换到执行线程B的过程中会发生一系列的操作,这些操作主要有
- 终止线程A的执行
- 保存线程A的上下文
- 然后载入线程B的上下文
- 执行线程B
这个过程就称为“上下文切换”,这个上下文切换过程会占用不少的CPU时间,如果没有必要的情况下,应该尽量减少上下文切换的情况发生。
三、最后
多线程虽然往往可以提高程序性能,但是有时候使用多线程不一定就比单线程程序运行得快。多线程带来好处的同时也会带来如:程序设计更复杂、上下文切换的开销、增加资源消耗等问题。所有我们需要结合实际应用场景分析对比多线程带来的性能提升与开销。一个良好合理的并发设计才能真正地提升程序的性能。
感谢您的阅读,如果喜欢本文欢迎关注和转发,本头条号将坚持原创,持续分享IT技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步。
参考文章:http://www.linfo.org/context_switch.html