澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:上下文交换,进程的切换

2019-10-05 作者:澳门新萄京官方网站   |   浏览(145)

澳门新萄京官方网站 1

上下文交换,上下文切换

澳门新萄京官方网站 2

上下文交换(context switch),又称环境切换,电脑术语,是一个储存和重建CPU的状态 (内文),因此令多个进程(process)可以分享单一CPU资源的计算过程。要交换CPU上的进程时,必需先行储存目前进程的状态,再将欲执行的进程之状态读回CPU中。

 

CPU调度(CPU scheduling)

调度是什么?
在计算机中,调度是分配完成一个工作所需资源的方法。工作可指诸如线程threads进程processes或者数据流data flows这样的虚拟计算元素,这些虚拟计算元素将会被调度按照一定顺序(in turn)分配到诸如处理器processors,又称CPU网络链路network links或者扩展卡expansion cards这样的硬件资源上。
调度器scheduler就是执行调度工作的程序。调度器使得整个计算机系统的资源处于忙碌状态(又叫负载均衡load balancing),允许多用户有效地共享系统资源,或者达到指定的服务质量。调度器使得在单处理器(a single central processing unit,CPU)上通过多任务处理,从而让其执行多个进程成为可能。
一个调度器根据目的不同而有多种不同的设计,如:吞吐量最大化、响应时间(response time)和等待时间(wait time)最小化、最低延迟等等。而实践中,这些目的往往是互相冲突的,因此调度器会曹勇一个权衡利弊的折中方案进行设计,其侧重点取决于用户需求。

转自:

上下文交换(context switch),又称环境切换,电脑术语,是一个储存和重建CPU的状态 (内文),因此令多个进程(process)可以分享单一CPU资源的计算过程。要交换CPU上的进程时,必需先行储存目前进程的状态,再将欲执行的进程之状态读回CPU中。

何时交换?

有三种可能的情况会发生上下文交换,分别为:

操作系统中调度器的种类

调度器是操作系统的一个模块,能够选择将被CPU处理的下一个作业或者说下一个进程。操作系统提供三种调度器:长期调度器(long-term scheduler)、中期调度器(medium-term scheduler)、短期调度器(short-term scheduler),其名称中的“长、中、短”显示执行其功能的相对频率。

进程调度器 Process scheduler
是操作系统的一部分,决定了某个进程何时被CPU执行。通常它能暂停一个正在运行的进程,并将这个进程转到运行队列running queue中,转而开始执行另一个进程,这样的调度器称为“抢占式调度器”,否则就是“协同调度器”。

澳门新萄京官方网站 3

系统内部实现三级调度

  1. 长期调度器long-term scheduler
    又叫“准入调度器(admission schedular)”、“作业调度器”或者“高级调度器”,决定了任务或进程是否被允许载入就绪队列(ready queue)中(即主存内)。换句话说,这种调度将已进入系统并处于后背状态的作业按某种算法选择一个或一批,为其建立进程,并进入主机,当该作业执行完毕时,还负责回收系统资源【注:正在执行的程序即进程】。因此,这类调度器掌控着能在系统上运行的程序、决定并发的程度(是否要同时执行多个或少数进程,以及如何分配I/O密集型和CPU密集型进程)。
    通常,大多数程序可以归为I/O密集型CPU密集型I/O密集型程序将大多数时间花在了I/O操作而不是运算上,而CPU密集型程序正好相反,它将大多数时间花在了运算上,而很少产生I/O操作。如何组合这两种类型的程序对于长期调度器来说非常重要:如果全是I/O密集型程序,那么就绪队列几乎一直都是空的使得调度器无所事事;另一方面,若全是CPU密集型程序,会导致I/O等待队列处于空队状态,使得一些设备没人用,这样一来系统资源分配就不均衡。
  2. 中期调度器Medium-term scheduler
    又称为“交换调度器”或者“中级调度器”,主要负责暂时将主存中的进程转移到二级存储设备(比如说硬盘),我们通常把这种行为称为“交换swapping”。
    详细说,它将进程从主存或CPU竞争中移出来,从而降低多道程序设计的麻烦程度,这些被移出来的进程后面能被再次载入主存,并从中断的地方继续执行,看得出来,这样的操作可以随时调整进程在主存中的存在数量和时机。
    从状态上说,中级调度就是按照给定的原则和策略,将处于外存交换区中就绪状态或等待状态的进程调入主存,或把处于主存就绪状态或主存等待状态的进程交换到外存交换区。
    澳门新萄京官方网站 4 从状态上看三级调度
***那究竟什么时候中期调度器工作呢?***  
比如主存中某个进程不咋活跃或者其优先级低(后面在二级存储设备中存在某个程序亟待运行),又或者是那些总是产生错误,发出Error的家伙,还或者是某个进程占用了大量的主存空间,这时中期调度器就会把他们放入交换区,以便腾出一些主存空间给其他需求更为迫切的进程使用。而当系统主存空间充足的时候,亦或者某个进程不在阻塞队列(即这个进程所需要的资源都已经准备好)中时,中期调度器又会将刚刚放入交换区中的进程重新载入主存(进入运行队列)中。  
现在的许多系统支持将虚拟地址空间映射到二级存储设备中而不是交换区,中期调度器便可以通过将二进制文件视为“交换出去的进程swapped
out
processes”来扮演长期调度器的角色。这样,当需要二进制文件的一部分时,可以按需交换(又称“懒散加载lazy
loaded”)。
  1. 短期调度器Short-term scheduler
    常常又被称为“CPU 调度器”、“进程调度器”、“微观调度器”或者“低级调度器”(我们通常说得调度就是指这个),决定了在一个时钟中断、I/O中断、系统调用其他种类信号之后,哪一个正处于就绪队列中且在主存中的进程能被CPU执行(将CPU控制权交给这个进程)。因此,短期调度器做出决定的频率比前两种调度器更加频繁——每隔一段非常短的时间片都得做出一次决定。这种调度器可以是抢占式的,即能够强行把一个正在CPU中执行的进程拽出(中断),然后把CPU分配给其他进程;也可以是非抢占式的。
    抢占式调度器需要一个处于内核态kernel mode、能被中断处理程序捕获的可编程间隔定时器才能实现。

澳门新萄京官方网站 5

三级调度示意图

  1. 分派程序Dispatcher
    与CPU调度功能相关的另一个部分是分派程序。分派程序是一个模块,用来把CPU的控制权交给由短期调度器选出来的进程。它通常具有下面的功能:
    1)上下文切换context switches,当短期调度器选出一个新进程时,分派程序就立马保存现场(即当前正在被CPU执行的进程/线程的状态),接着马不停蹄地对被选中的新进程进行初始化或者加载这个新进程原先被保存的状态。
    2)从内核模式切换到用户模式。
    3)跳转到用户程序的合适位置,以便重新启动程序。
    分派程序应该尽可能快,因为在每次进程切换时都会使用它。其实在进程切换期间,CPU实际上空闲了一段时间,为了提高CPU利用率,应该避免不必要的上下文切换。这段时间又被叫做“分派延迟dispatch latency”。

陈民禾 原创作品转载请注明出处 《Linux内核分析》MOOC课程 

 

多工

最常见的,在一些排程(scheduling)算法内,其中行程有时候需要暂时离开CPU,让另一个行程进来CPU运作。在先占式多工系统中,每一个行程都将轮流执行不定长度的时间,这些时间段落称为时间片。如果行程并非自愿让出CPU(例如执行I/O操作时,行程就需放弃CPU使用权),当时限到时,系统将产生一个定时中断,操作系统将排定由其它的行程来执行。此机制用以确保CPU不致被较依赖处理器运算的行程垄断。若无定时中断,除非行程自愿让出CPU,否则该行程将持续执行。对于拥有较多I/O指令的行程,往往执行不了多久,便需要让出CPU;而较依赖处理器的行程相对而言I/O操作较少,反而能一直持续使用CPU,便形成了垄断现象。此即Convoy效应。

一.关于进程调度的基本知识

何时交换?

有三种可能的情况会发生上下文交换,分别为:

中断处理

在接受到中断(Interrupt)的时候,CPU必须要进行上下文交换。

      进程的几种不同分类:第一种分类:类型一:I/O-bound:频繁的进行I/O,通常会花费很多的时间等待I/O操作的完成;类型二:CPU-bound:计算密集型 ,需要大量的CPU时间进行运算第二种分类:类型一:批处理进程 ;类型二:实时进程;类型三:交互式进程。

多工

最常见的,在一些排程(scheduling)算法内,其中行程有时候需要暂时离开CPU,让另一个行程进来CPU运作。在先占式多工系统中,每一个行程都将轮流执行不定长度的时间,这些时间段落称为时间片。如果行程并非自愿让出CPU(例如执行I/O操作时,行程就需放弃CPU使用权),当时限到时,系统将产生一个定时中断,操作系统将排定由其它的行程来执行。此机制用以确保CPU不致被较依赖处理器运算的行程垄断。若无定时中断,除非行程自愿让出CPU,否则该行程将持续执行。对于拥有较多I/O指令的行程,往往执行不了多久,便需要让出CPU;而较依赖处理器的行程相对而言I/O操作较少,反而能一直持续使用CPU,便形成了垄断现象。此即Convoy效应。

用户态或者内核态的交换

当用户态和内核态交换发生的时候,并不需要进行上下文交换;并且用户态和kernel mode的交换本身并不是一个上下文交换。不过,根据操作系统的不同,有时候会在此时进行一次上下文交换的步骤。

      调度策略:是一组规则,它们决定什么时候以怎样的方式选择一个新的进程运行,Linux的调度基于分时和优先级:随着版本的变化,分时技术在不断变化,Linux既支持普通的分时进程,也支持实时进程,Linux中的调度是多种调度策略和调度算法的混合。

中断处理

在接受到中断(Interrupt)的时候,CPU必须要进行上下文交换。

上下文交换:具体步骤

在一次交换中,第一个行程的状态要被纪录在某个地方,这样当排程器(scheduler)要回到这个行程时,才可以重建这个行程并且继续运算。

澳门新萄京官方网站,这里所谓“行程的状态”,包含了这个行程使用的所有暂存器(register),特别是程式计数器;加上所有操作系统可能需要的特定资料。这些资料一般以名为行程控制表(process control block,PCB)的数据结构储存起来。

     Linux的进程根据优先级排队:根据特定的算法计算出进程的优先级,用一个值表示,这个值表示把进程如何适当的分配给CPU。

用户态或者内核态的交换

当用户态和内核态交换发生的时候,并不需要进行上下文交换;并且用户态和kernel mode的交换本身并不是一个上下文交换。不过,根据操作系统的不同,有时候会在此时进行一次上下文交换的步骤。

上下文交换:由软件或硬件实现

上下文交换可分为主要由软件实现或由硬件实现。部分中央处理器,比如Intel 80386或同系列更高阶的处理器,就具备支持上下文交换的硬件设计。

我们的公共号

澳门新萄京官方网站 6

上下文交换( context switch),又称环境切换,电脑术语,是一个储存和重建CPU的状态 (内文),因此令多个进程(proce...

     Linux中进程的优先级是动态的:调度优先级会根据进程的行为周期性的调整进程的优先级:较长时间未分配到CPU的进程,通常上升;已经在CPU上运行了较长时间的进程,通常下降。挂起正在CPU上执行的进程,与中断时保存现场是不同的,中断前后是在同一个进程上下文中,只是由用户态转向内核态执行

上下文交换:具体步骤

在一次交换中,第一个行程的状态要被纪录在某个地方,这样当排程器(scheduler)要回到这个行程时,才可以重建这个行程并且继续运算。

这里所谓“行程的状态”,包含了这个行程使用的所有暂存器(register),特别是程式计数器;加上所有操作系统可能需要的特定资料。这些资料一般以名为行程控制表(process control block,PCB)的数据结构储存起来。

     进程上下文包含了进程执行所需要的所有信息。

上下文交换:由软件或硬件实现

上下文交换可分为主要由软件实现或由硬件实现。部分中央处理器,比如Intel 80386或同系列更高阶的处理器,就具备支持上下文交换的硬件设计。

我们的公共号

https://wuguiyunwei.com

澳门新萄京官方网站 7

          用户地址空间:包括程序代码,数据,用户堆栈等

          控制信息:进程描述符,内核堆栈等

          硬件上下文(注意中断也要保存硬件上下文只是保存的方法不同)

    Linux系统的一般执行过程分析:这时候我们可以有了一个条件来理解linux系统的一般运行状态,其中有一个用户态进程X需要切换到用户进程Y。从正在运行的用户态进程X切换到正在运行的用户态进程Y的过程

          1.正在运行的用户态进程X

          2.发生中断——save cs:eip/esp/eflags(current)to kernel stack,then load cs:eip(entry of a specific ISR)and ss:esp(point to kernel stack)

          3.SAVE_ALL//保存现场

          4.中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换

          5.标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)

          6.restore-all//恢复现场

          7.iret -pop cs:eip/ss:eip/eflags from kernel stack

          8.继续运行用户态进程Y

 

二.进程调度关键代码分析

      我们还有很多的系统调用可以实现进程的优先级,比如说以下的代码:

澳门新萄京官方网站 8

    nice 
    getpriority
    sched_getscheduler/sched_setscheduler
    sched_getparam/sched_setparam
    sched_yield
    sched_get_priority_min/sched_get_priority_max
    sched_rr_get_interval

澳门新萄京官方网站 9

      调度算法策略只是一个策略算法而已,不管使用什么策略,都是从队伍中选择了下一个进程来执行,将调度算法与其他部分耦合了。

      进程调度的时机须知道以下四点:中断处理过程(包括时钟中断、IO中断、系统调用和异常)中,直接调用schedule(),或者返回用户态的时根据need_resched标记调用schedule();内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程进行调度,也就是说内核线程作为一类特殊的进程可以主动,也可以被动调度;用户态进程无法实现主动调度,仅能通过陷入内核态的某个时机进行调度,即在中断处理过程中进行调度;用户态只能被动调度,内核线程是只有内核态没有用户态的特殊进程,内核线程可以主动调度也可以被动调度。

      schedule函数:schedule函数实现调度,目的:在运行队伍中找到一个进程,把CPU分配给它,调用方法:直接使用schedule();松散调用,根据need_resched标记

澳门新萄京官方网站 10

next = pick_澳门新萄京官方网站:上下文交换,进程的切换和系统的一般执行过程。next_澳门新萄京官方网站:上下文交换,进程的切换和系统的一般执行过程。task(rq, prev); //进程调度算法都封装这个函数内部

澳门新萄京官方网站 11

context_switch(rq, prev, next); //进程上下文切换

switch_to切换堆栈和寄存器的状态,利用了prev和next两个参数:prev指向当前进程,next指向被调度的进程

澳门新萄京官方网站 12

 进程上下文调度相关代码分析:在switch()中:

澳门新萄京官方网站 13

31#define switch_to(prev, next, last)                    
32do {                                 
33  /*                              
34   * Context-switching clobbers all registers, so we clobber  
35   * them explicitly, via unused output variables.     
36   * (EAX and EBP is not listed because EBP is saved/restored  
37   * explicitly for wchan access and EAX is the return value of   
38   * __switch_to())                     
39   */                                
40  unsigned long ebx, ecx, edx, esi, edi;                
41                                  
42  asm volatile("pushflnt"      /* save    flags */          //保存当前进程的flags
43           "pushl % 
		

本文由澳门新萄京官方网站发布于澳门新萄京官方网站,转载请注明出处:澳门新萄京官方网站:上下文交换,进程的切换

关键词: