Context Switches上下文切换性能详解
来源:互联网 发布:windows10怎么下载软件 编辑:程序博客网 时间:2024/06/05 05:18
Context Switches 上下文切换,有时也被称为进程切换(process switch)或任务切换。是一个重要的性能指标。
CPU从一个线程切换到另外一个线程,需要保存当前任务的运行环境,恢复将要运行任务的运行环境,必然带来性能消耗。
Context Switches 上下文切换简介
操作系统可以同时运行多个进程, 然而一颗CPU同时只能执行一项任务,操作系统利用时间片轮转的方式,让用户感觉这些任务正在同时进行。 CPU给每个任务都服务一定的时间, 然后把当前任务的状态保存下来, 在加载下一任务的状态后, 继续服务下一任务。任务的状态保存及再加载, 这段过程就叫做上下文切换。
时间片轮转的方式使多个任务在同一颗CPU上执行变成了可能, 但同时也带来了保存现场和加载现场的直接消耗。
上下文切换的性能消耗
Context Switchs过高,导致CPU就像个搬运工一样,频繁在寄存器(CPU Register)和运行队列(run queue)之间奔波,系统更多的时间都花费在线程切换上,而不是花在真正做有用工作的线程上。
直接消耗包括: CPU寄存器需要保存和加载, 系统调度器的代码需要执行, TLB实例需要重新加载, CPU 的pipeline需要刷掉。
间接消耗:多核的cache之间得共享数据。间接消耗对于程序的影响要看线程工作区操作数据的大小。
性能分析查看Context Switches的方法
linux中可以通过工具vmstat, dstat, pidstat来观察CS的切换情况。vmstat, dstat只能观察整个系统的切换情况,而pidstat可以更精确地观察某个进程的上下文切换情况。
windows中可以使用查看进程的神器processxp,进程列表中可以添加Context Switchs和Context Switchs Delta列,另外进程属性Threads标签页可查看线程对应的Context Switchs。
另windows中还可以使用“性能计数器”监控Context Switchs的变化趋势,方便性能分析。添加System\Context Switches/sec或Thread(_Total)\Context Switches/sec计数器即可。
引起上下文切换的原因
对于我们经常使用的抢占式操作系统来说, 引起上下文切换的原因大概有以下几种:
1. 当前执行任务的时间片用完之后, 系统CPU正常调度下一个任务
2. 当前执行任务碰到IO阻塞, 调度器将挂起此任务, 继续下一任务
3. 多个任务抢占锁资源, 当前任务没有抢到,被调度器挂起, 继续下一任务
4. 用户代码挂起当前任务, 让出CPU时间
5. 硬件中断
转载请注明出处:6san.com
原文地址: http://www.6san.com/469/
- Context Switches上下文切换性能详解
- Context Switches上下文切换性能详解
- Context Switches上下文切换性能详解
- 上下文切换(Context Switch)
- Preemption Context Switches 和 Synchronization Context Switches
- 上下文切换详解
- 上下文切换详解
- Android Context应用上下文详解
- Context Switch Definition:上下文切换的定义
- Linux进程上下文切换(process context switch)
- MySQL and Linux Context Switches
- [转]Android Context应用上下文详解
- 线程上下文切换的性能损耗测试
- Context(上下文)
- Context上下文
- Context 上下文
- Context---上下文
- Context上下文
- JavaScript 数据结构(5):单链表 LinkList
- Race
- Android 输入系统之InputDispatcher2ViewRootImpl篇----终
- 视频马赛克的实时检测
- 多线程问题
- Context Switches上下文切换性能详解
- CUDA 的 Threading:Block 和 Grid 的設定與 Warp
- iOS对文件的操作(沙盒)
- org.hibernate.hql.internal.ast.ErrorCounter reportError
- 黑马程序员——C基础——关键字、常量、变量、运算符
- lintCode刷题--最长上升连续子序列
- Error:org.gradle.api.internal.changedetection.state.DefaultF
- JAVA 正则表达式 (超详细)
- Android studio中getVersionName一直都是1.0