linux性能速查-CPU上下文切换(一)

该linux系列博客为自己速查问题而写,比较乱,仅供参考,如有问题,请参考权威书籍或文档,谢谢。

在导致平均负载升高的因素中,任务等待CPU就是其中一个。本质原因是:上下文切换

当然更准确的说是:过多的上下文切换是导致平均负载升高的凶手。正常的上下文切换是系统调度任务的必要手段

1.什么是上下文?

任务中的CPU寄存器程序计数器都是上下文,可以理解为任务执行的依赖环境。

寄存器:访问速度极快、容量很小的内存。

程序计数器:记录当前执行的指令位置或下一个将要执行的指令位置。

2.什么是上下文切换?

上下文切换是指保存前一个任务的寄存器和程序计数器,加载下一个任务的寄存器和程序计数器,并从程序计数器指定的位置运行新任务。

3.上下文切换分类?

linux将任务分为进程、线程、中断这几类。因此对应的上下文切换也分为:进程上下文切换,线程上下文切换,中断上下文切换。

进程上下文切换:linux按照特权等级,把进程的运行空间分为用户空间(ring3)和内核空间(ring0),运行在用户空间称之用户态,运行在内核空间称为内核态。ring0权限最高可以访问所有资源,而ring3只能访问受限的资源。用户态通过系统调用才可以陷入到内核态,需要注意的是,进程的上下文切换只能在内核态完成。一次系统调用对应两次CPU上下文切换,系统调用不同于进程上下文切换,系统调用在同一个进程内进行,而进程上下文切换是在多个进程之间进行。除此之外,进程上下文切换需要加载和保存的数据(虚拟内存,栈等等)比系统调用要多。

线程上下文切换:如果一个进程只有一个线程,可以把线程看成进程。我们知道:线程是操作系统进行调度和分配的基本单元,而进程是进行资源分配的基本单元。同一个进程中的多线程共享虚拟内存,全局变量等,因此线程的上下文切换不需要切换共用的资源如全局变量等。只需要切换线程私有的数据,如栈等。也就是说同一个进程的多线程上下文切换开销要小于多进程上下文切换;这也就是为什么使用多线程的原因之一。当然,不同进程之间的线程上下文切换可以看成是进程上下文切换。

中断上下文切换:硬件触发中断信号,导致中断处理程序被调用;需要注意的是,中断上下文切换由内核态完成,因此在同一CPU内,其优先级要高于另外两个;另外,中断程序的处理速度非常快以免影响其他任务的运行。

4.什么时候会引起上下文切换?

4.1.一个任务执行完成,另外一个任务被调度执行。

4.2.进程运行时系统资源不足时,需要挂起当前任务。

4.3.调用sleep使任务休眠。

4.4.更高优先级任务需要执行。

5.为什么频繁上下文切换引起平均负载升高?

因为CPU会把大量的时间浪费在虚拟内存,内核栈,寄存器数据的恢复和保存上,导致系统整体性能大幅度下降。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值