`
mmdev
  • 浏览: 12848464 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

操作系统CPU上下文切换

 
阅读更多

进程切换

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

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

这就像多个同学要分时使用同一张课桌一样,说是要收回正在使用课桌同学的课桌使用权,实质上就是让他把属于他的东西拿走;而赋予某个同学课桌使用权,只不过就是让他把他的东西放到课桌上罢了。  

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

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

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

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

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

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

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

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

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

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

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

这是一个完整的软中断处理过程,只不过在保护现场和恢复现场工作中,保护的是被中止运行进程的现场,恢复的是待运行进程的现场,这一切都依赖于堆栈指针的切换。

进程调度

1:进程类型:

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

在task_struct结构中新增了一个成员:sleep_avg.此值初始值为100。进程在CPU上执行时,此值减少。当进程在等待时,此值增加。最后,在调度的时候。根据sleep_avg的值重新计算优先级。

2:进程优先级

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

3:运行时间片

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

4:进程抢占

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


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

上下文切换:
  目前流行的CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程(包括多核CPU),Linux内核会把多核的处理器当作多个单独的CPU来识别。
  一个标准的Linux内核可以支持运行50~50000个进程运行,对于普通的CPU,内核会调度和执行这些进程。每个进程都会分到CPU的时间片来运行,当一个进程用完时间片或者被更高优先级的进程抢占后,它会备份到CPU的运行队列中,同时其他进程在CPU上运行。这个进程切换的过程被称作上下文切换。过多的上下文切换会造成系统很大的开销。

运行队列
  每个CPU都会维持一个运行队列,理想情况下,调度器会不断让队列中的进程运行。进程不是处在sleep状态就是runable状态。如果CPU过载,就会出现调度器跟不上系统的要求,导致可运行的进程会填满队列。队列愈大,程序执行时间就愈长。


关于时间片和动态优先级
  时间片对于CPU来说是很关键的参数,如果时间片太长,就会使系统的交互性能变差,用户感觉不到并行。如果太短,又会造成系统频繁的上下文切换,使性能下降。对于IOBound的系统来讲并不需要太长的时间片,因为系统主要是IO操作;而对于CPUBound的系统来说需要长的时间片以保持cache的有效性。
  每一个进程启动的时候系统都会给出一个默认的优先级,但在运行过程中,系统会根据进程的运行状况不断调整优先级,内核会升高或降低进程的优先级(每次增加或降低5),判断标准是根据进程处于sleep状态的时间。
  
  IOBound进程大部分时间在sleep状态,所以内核会调高它的优先级,CPUBound进程会被内核惩罚降低优先级。因此,如果一个系统上即运行IOBound进程,又运行CPUBound进程,会发现,IOBound进程的性能不会下降,而CPUBound进程性能会不断下降。

经验总结:
1.对于每一个CPU来说运行队列不要超过2,例如,如果是双核CPU就不要超过4;
2.如果CPU在满负荷运行,应该符合下列分布,
a)UserTime:65%~70%
b)SystemTime:30%~35%
c)Idle:0%~5%
3.对于上下文切换要结合CPU使用率来看,如果CPU使用满足上述分布,大量的上下文切换也是可以接受的。


分享到:
评论

相关推荐

    Linux操作系统通过实战理解CPU上下文切换.pdf

    Linux操作系统通过实战理解CPU上下文切换.pdf

    Linux操作系统性能监测:CPU篇

    要想监测和理解 CPU 的性能需要知道一些的操作系统的基本知识,比如:中断、进程调度、进程上下文切换、可运行队列等。这里 VPSee 用个例子来简单介绍一下这些概念和他们的关系,CPU 很无辜,是个任劳任怨的打工仔,...

    嵌入式操作系统.ppt

    嵌入式系统的进程管理:进程调度、上下文切换...... 非抢占式调度算法常用于那些任务需要按照预先确定的顺序进行执行,且只有当任务主动放弃CPU资源后,其他任务才能得到执行的情况。常用的非抢占式调度算法是时间片...

    操作系统相关的部分面试题

    * 切换:线程上下文切换比进程上下文切换要快得多。 * 拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源。 * 系统开销: 创建或撤销进程时,系统都要为之分配或回收系统...

    INtime for Windows Real-Time Extend

    当实时活动必须发生时,计算机上下文将切换到该实时操作系统。当这些活动完成后,计算机上下文将切换回Windows 操作系统。 因为INtime实时操作系统独立于 Windows 操作系统软件,所以可以增强运行实时进程的环境,...

    linux操作系统性能监控优化–CPU、Memory、IO、Network

     上下文切换:与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的。  可运行队列:每个处理器的可运行队列<=3个线程。  2、监控工具 vmstat $ vmstat 1 procs ———–...

    操作系统的作用.doc

    操作系统的作用:1.管理系统中的各种资源。2.为用户提供友好的界面。 操作系统的定义:操作系统是位于硬件之上、所有其他系统软件层之下的一个系统软件 ,使得管理系统中的各种软件和硬件资源...上下文切换快 2.系统

    深入理解Python 多线程

    利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是个单线程,所以说他是假的单线程。 那么什么时候用多线程呢? 首先要知道: io操作不占用CPU 计算操作占CPU,像2+5=5 Python的多线程...

    操作系统教程孙钟秀主编 习题解答

    当系统中发生了一个事件,如I/O结束事件,CPU便可把运行进程的上下文保存到专用硬件寄存器指针指向的PCB中保护起来,然后,CPU转向中断向量表,找到设备中断处理程序入口,让专用硬件寄存器指针指向(设备)中断服务例程,...

    Linux系统清除缓存的方法总结

    缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率。 CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后...

    ctOS:基于6502的打字稿操作系统

    ctOS - 中央操作系统 ctOS 是为 Marist OS 2014 类制作的 TypeScript 操作系统,基于 Bob Nisco 和 Alan Labouseur 的的分支。... 实验 5 活动:实现调度程序和上下文切换 实验 6 活动:具有基本和限制跟踪的内存

    好用的协程库libfiber-master

    协程是用户级线程,由用户来管理,解决了CPU 上下文切换的开销,协程不适用于计算密集型的项目,因为计算密集型cpu会很少切换,所以协程的优点也就不存在,反而还增加了开发难度,但对于一个web服务器来说,其优势是...

    Python中协程用法代码详解

    本文研究的主要是python中协程的相关问题,具体介绍如下。...其实不然, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统

    CPU调度中的Round Robin调度算法分析-研究论文

    在本文中,我们分析了传统 Round Robin 算法的六种现有变体,并对其进行了比较,以通过实现它们来挑选出在减少平均周转时间 (TAT)、等待时间 (WT) 和上下文切换次数方面哪个是最佳的,并且不同场景下的测试。

    Linux内核proc文件系统实验

    问题A: 提取 1、cpu类型 2、内核版本 问题B: 1、启动以来经历的时间,以dd:hh:mm:ss报告 问题C: 1、cpu执行用户态、系统态、空闲态所用时间 2、多少次磁盘请求 3、多少次上下文切换 4、启动了多少次进程 实验问题D:...

    c++多线程 Linux版本

    在操作系统设计上,从进程演化出线程,最主要的目的就是更好地支持多处理器,并且减少进程上下文切换的开销。 2.进程和线程的关系 线程和进程的关系:线程是属于进程的,线程运行在进程空间内,同时进程所产生的线程...

    rlarm.rar_KEIL V4_RL-RTX_keil RL-tcpnet_keil mdk_rtx keil

    RL-RTX 描述了RL-ARM实时操作系统的结构,包括任务优先级、上下文切换、单个CPU下如何管理多个任务以及在RL-RTX中用到的其他一些 RTOS特性。 RL-FlashFS 描述了 RL-ARM中Flash文件系统的结构,包括文件创建、保存、...

    Multithreading

    在每个上下文切换中,特定于过程的状态都存储在PCB中,而PCB则在内存本身中。 使流程上下文切换变得昂贵的原因是: 寄存器必须存储。 虚拟内存映射必须被存储。 还原它们非常昂贵。 CPU缓存已刷新,因此新进程...

    简单了解python协程的相关知识

    协程是python种一种实现多任务的方式,他是一种比线程更加小的单元,占用更小的执行单元(资源),为啥说他是一个执行单元,因为他自带CPU上下文,这样在合适gr的时机,可以把一个协程切换到另一个协程,只要在这个...

    RL-ARM 实时库用户指南----RTX-API.zip

    RL-RTX 描述了RL-ARM实时操作系统的结构,包括任务优先级、上下文切换、单个CPU下如何管理多个任务以及在RL-RTX中用到的其他一些 RTOS特性。 RL-FlashFS 描述了 RL-ARM中Flash文件系统的结构,包括文件创建、保存、...

Global site tag (gtag.js) - Google Analytics