致力于自动化测试技术,性能测试技术的研究,测试技术培训以及项目实施,做一个技术与实施的主导者。

操作系统CPU上下文切换

上一篇 / 下一篇  2012-06-08 11:43:43 / 个人分类:Linux

进程切换51Testing软件测试网-qT RcGN/u K5G

进行进程切换就是从正在运行的进程中收回处理器,然后再使待运行进程来占用处理器。 这里所说的从某个进程收回处理器,实质上就是把进程存放在处理器 的寄存器中的中间数据找个地方存起来,从而把处理器的寄存器腾出来让其他进程使用。那么被中止运行进程的中间数据存在何处好呢?当然这个地方应该是进程的 私有堆栈。   51Testing软件测试网kXu @L*E

让进程来占用处理器,实质上是把某个进程存放在私有堆栈中寄存器的数据(前一次本进程被中止时的中间数据)再恢复到处理器的寄存器中去,并把待运行进程的断点送入处理器的程序指针PC,于是待运行进程就开始被处理器运行了,也就是这个进程已经占有处理器的使用权了。   51Testing软件测试网P:[+k1s I2Trp

这就像多个同学要分时使用同一张课桌一样,说是要收回正在使用课桌同学的课桌使用权,实质上就是让他把属于他的东西拿走;而赋予某个同学课桌使用权,只不过就是让他把他的东西放到课桌上罢了。   51Testing软件测试网Lk/D:`F.t9Z-a(A

在切换时,一个进程存储在处理器各寄存器中的中间数据叫做进程的上下文,所以进程的 切换实质上就是被中止运行进程与待运行进程上下文的切换。在进程未占用处理器时,进程 的上下文是存储在进程的私有堆栈中的。  

r+I/j'_}*qhh7KS:n \0

从上面的叙述可知,调度器进程切换的代码应有如下功能:   

P ZS[y"^B%e0

●保存处理器PC寄存器的值到被中止进程的私有堆栈;  51Testing软件测试网an*U'W?PK

●保存处理器PSW寄存器的值到被中止进程的私有堆栈;  

B2Ci Wg0

●保存处理器SP寄存器的值到被中止进程的进程控制块; 

xQ5o ^ P0

●保存处理器其他寄存器的值到被中止进程的私有堆栈; 

&Ju1?7SI6M(Az} n0

●自待运行进程的进程控制块取SP值并存入处理器的寄存器SP;  

9e:C6uz[W.Sm0

●自待运行进程的私有堆栈恢复处理器各寄存器的值;   

F? MQW_`r.a0

●自待运行进程的私有堆栈中弹出PSW值并送入处理器的PSW;

TG8] f&G6ZG0

●自待运行进程的私有堆栈中弹出PC值并送入处理器的PC。 

2`GI7I$B*D9Q"N O$J0

  显然,进程的切换可以用中断技术来实现,即当调度器获得了待运行进程的控制块之后,应立即用软 中断指令来中止当前进程的运行,并保存当前进程的PC值和PSW值。其后,使 用压栈指令把处理器其他寄存器的值压入进程私有堆栈。接下来,就从待运行进程的进程控 制块中取出私有堆栈指针的值并存入处理器的寄存器SP,至此SP就指向了待运行进程的私 有堆栈,于是下面就自待运行进程的私有堆栈中弹出上下文进人处理器。最后,利用中断返回指令来实现自待运行进程的私有堆栈中弹出PSW值和自待运行进程的 私有堆栈中弹出PC值的功能。   

(W4R,D C1Bhz"V.x3]0

这是一个完整的软中断处理过程,只不过在保护现场和恢复现场工作中,保护的是被中止 运行进程的现场,恢复的是待运行进程的现场,这一切都依赖于堆栈指针的切换。51Testing软件测试网(u-beEh'_Fn7BCe

'pu(u8R)c K!{~9~7e E0

nTo2Ag!qA0

进程调度51Testing软件测试网j8nF;tv1V#L-p

1:进程类型:

!IX(A:NGc0

linux调度算法中,将进程分为两种类型。即:I/O消耗型和CPU消耗型。例如文本处理程序与正在执行的Make的程序。文本处理程序大部份时间都 在等待I/O设备的输入,而make程序大部份时间都在CPU的处理上。因此为了提高响应速度,I/O消耗程序应该有较高的优先级,才能提高它的交互性。 相反的,Make程序相比之下就不那么重要了。只要它能处理完就行了。因此,基于这样的原理,linux有一套交互程序的判断机制。51Testing软件测试网4qyPU/CPuh0q

在task_struct结构中新增了一个成员:sleep_avg.此值初始值为100。进程在CPU上执行时,此值减少。当进程在等待时,此值增加。最后,在调度的时候。根据sleep_avg的值重新计算优先级。51Testing软件测试网+D jw)D,K3eS;TGB

2:进程优先级51Testing软件测试网Mit DG'Z

正如我们在上面所说的:交互性强的需要高优先级,交互性弱的需要低优先级。在linux系统中,有两种优先级:普通优先级和实时优先级。

[$z3| OL%[p1M0

3:运行时间片

4xEv4tH3H0Uqb^0

进程的时间片是指进程在抢占前可以持续运行的时间。在linux中,时间片长短可根据优先级来调度。进程不一定要一次运行完所有的时间片可以在运时的中途被切换出去。

1zIwD|@t u0S*I0

4:进程抢占

b5w&AH F\E*`0|0

当一个进程被设为TASK_RUNING状态时。它会判断它的优先级是否高于正在运行的进程。如果是,则设置调度标志位,调用schedule()执行进程的调度。当一个进程的时间片为0时,也会执行进程抢占。51Testing软件测试网 R)c6M&kjYx5P

51Testing软件测试网7m j A){_$W ovl

51Testing软件测试网T1TB ?"`UO

51Testing软件测试网7\:}'IY_4G s,|+X \6n&q
 51Testing软件测试网6y s8Ra y5X-S9f

关于CPU,有3个重要的概念:上下文切换(context switchs),运行队列(Run queue)和使用率(utilization)。

/p*l1P:M6d"la0

上下文切换:
vt$pT$p(yO0
   目前流行的CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程(包括多核CPU),Linux内核会把多核的处理器当作多个单独的CPU来识别。
5t T4M6j1_-l1mS0
   一个标准的Linux内核可以支持运行50~50000个进程运行,对于普通的CPU,内核会调度和执行这些进程。每个进程都会分到CPU的时间片来运 行,当一个进程用完时间片或者被更高优先级的进程抢占后,它会备份到CPU的运行队列中,同时其他进程在CPU上运行。这个进程切换的过程被称作上下文切 换。过多的上下文切换会造成系统很大的开销。51Testing软件测试网U'L~ n~^
51Testing软件测试网 n8@w4nN'_8Tw
运行队列
(`1VM/Pe*d}8D0
  每个CPU都会维持一个运行队列,理想情况下,调度器会不断让队列中的进程运行。进程不是处在sleep状态就是run able状态。如果CPU过载,就会出现调度器跟不上系统的要求,导致可运行的进程会填满队列。队列愈大,程序执行时间就愈长。51Testing软件测试网3S&hy'w'`0mr
51Testing软件测试网2|)D2X5y dPpL2ZR
51Testing软件测试网'p vQ_-C5ns`
关于时间片和动态优先级
xm(y"o"m cW"{u%^0
   时间片对于CPU来说是很关键的参数,如果时间片太长,就会使系统的交互性能变差,用户感觉不到并行。如果太短,又会造成系统频繁的上下文切换,使性能 下降。对于IO Bound的系统来讲并不需要太长的时间片,因为系统主要是IO操作;而对于CPU Bound的系统来说需要长的时间片以保持cache的有效性。
:M`5B"k5Sf?&T/t8f0
  每一个进程启动的时候系统都会给出一个默认的优先级,但在运行过程中,系统会根据进程的运行状况不断调整优先级,内核会升高或降低进程的优先级(每次增加或降低5),判断标准是根据进程处于sleep状态的时间。51Testing软件测试网7ATDlE
  51Testing软件测试网v @0yH1}0cC6eop*V
   IO Bound进程大部分时间在sleep状态,所以内核会调高它的优先级,CPU Bound进程会被内核惩罚降低优先级。因此,如果一个系统上即运行IO Bound进程,又运行CPU Bound进程,会发现,IO Bound进程的性能不会下降,而CPU Bound进程性能会不断下降。

~q%Q/[AH\ d0

K @T2?+]#@7RX0

经验总结:
]NzB-C#t:ism0
1. 对于每一个CPU来说运行队列不要超过2,例如,如果是双核CPU就不要超过4
w8TA}y`0}R1n\~0
2. 如果CPU在满负荷运行,应该符合下列分布,51Testing软件测试网p;J g*C3F-Wt
a) User Time:65%~70%51Testing软件测试网4g1G!GO5c
b) System Time:30%~35%51Testing软件测试网fa A _n/@2\Q5X4p
c) Idle:0%~5%51Testing软件测试网e(lzxLX&emHZ
3. 对于上下文切换要结合CPU使用率来看,如果CPU使用满足上述分布,大量的上下文切换也是可以接受的。

+uC7aIM0

TAG:

 

评分:0

我来说两句

vprince

vprince

6年软件测试经验,TIB自动化测试工作室核心成员,ATF框架核心设计和开发人员,熟悉软件自动化测试、性能测试,多年从事软件项目的自动化测试和性能测试,对自动化测试的框架设计开发、框架搭建以及实施有较为丰富的实战经验。 目前关注开源自动化测试领域、 基于Selenium构建Web自动化测试框架,为多家企业进行自动化测试培训、实施自动化测试项目。

日历

« 2024-04-23  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 67384
  • 日志数: 49
  • 建立时间: 2009-09-09
  • 更新时间: 2012-12-14

RSS订阅

Open Toolbar