中断、进程调度、进程切换、系统调用,模式切换

提示:风萧声动,玉壶光转,一夜鱼龙舞


前言

本文内容主要参考以下几个博文中学得
进程与线程(中)的2.2.7
进程切换VS模式切换(一)
任务切换:进程切换,线程切换的区别
中断、进程调度、进程切换、系统调用之间的关系
以及网上搜索的一些小的知识点

中断

中断是指CPU在执行当前程序时系统出现了某种状况,使得CPU必须停止当前程序,而去执行另一段程序来处理的出现的紧急事务,处理结束后CPU再返回到原先暂停的程序继续执行,这个过程就称为中断。

进程调度

进程调度是指在多进程并发的环境中,确定在任意时刻由哪个进程执行,哪些进程不执行的过程。在单个CPU下,每个时刻只能有一个进程处于执行状态,其他进程处于非执行状态。进程调度是进程管理的一个重要组成部分。
进程调度包括几种类型:长程调度(作业调度)、中程调度(换入/换出)、短程调度(进程调度)和I/O调度(决定可用I/O设备处理哪个进程挂起的I/O请求)。长程调度决定将哪些进程加入待执行进程池中,中程调度决定处理器执行哪些位于内存中的进程集合,短程调度决定处理器执行哪个可运行进程,而I/O调度决定可用I/O设备处理哪个进程挂起的I/O请求。
在进程调度中,优先级调度算法是一种常见的调度策略。该算法为每个进程赋予一个优先级,每次需要进程切换时,选择优先级最高的进程进行调度。这样可以确保高优先级的进程不会饥饿,即长时间得不到执行的情况。短任务优先算法本身就是一种优先级调度算法,它给予短进程更高的优先级。

进程切换

对于CPU来讲,进程切换的本质就是CPU状态的切换,就是指CPU从一个程序中的状态切换到另一个程序的状态。再具体一点,CPU状态指的就是CPU寄存器和程序计数器的状态。而寄存器和程序计数器又可以称为CPU上下文。
对于进程切换方案,一个简单的方法就是:
1,保存当前状态,把当前CPU的状态保存到一个地方。
2,重新加载CPU状态,把新任务的状态加载进CPU运行。
假设计算机运行着A,B两个进程,当前运行A进程,准备要切换到B进程,然后再切换回A进程,这个过程是这样:
1,先把CPU当前的状态,也就是把进程A的状态保存到一个指定的内存地址,这个地址我们叫它C;
2,假设进程B的状态保存在内存地址D中,那我们就去内存地址D中获取进程B的状态并把它加载进CPU中运行,到此第一次进程切换就已经完成了。
3,当再次切换回进程A的时候,那就先把当前进程B的状态保存到内存地址D中,然后从内存地址C中获取进程A的状态然后重新加载到CPU中运行,这时第二次进程切换已经完成,CPU又恢复到了进程A的状态。
上下文切换通常是计算密集型的,即它需要相当可观的CPU时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间,所以上下文切换对系统来说意味着消耗大量的CPU时间。有些处理器提供多个寄存器组,这样,上下文切换就只需要简单改变当前寄存器组的指针。
(下面这一段需要其他预备知识,不看也没有关系)
我们知道不同的进程的虚拟地址空间是完全独立的,地址空间分为内核地址空间和用户地址空间。对于内核空间,不同进程是共用同一个内核空间,只有用户空间才是各用各的。所以在进程切换时,地址空间切换的时候只需要切换用户空间就可以了
程序要访问物理内存,需要通过内存管理单元来将虚拟地址转换成物理地址, 而内存管理单元MMU需要通过分页机制和页表来完成虚拟地址到物理地址的转换。每个进程都有独立的地址空间,为了这个进程独立完成映射,这就需要每个进程都有独立的进程页表。也就是说进程切换的时候需要进行页表切换。这里需要引入一个页表基址寄存器,所以不是把所有的地址空间都进行保存替换

线程切换

我们知道,要访问物理地址需要去查页表,而页表往往是多级的,比如说64位的Linux操作系统默认是采用4级页表,也就是说这个过程需要多次访问内存才能找到对应的物理地址。为了加快页表查找,操作系统会把一些页表项加入到一个高速缓存–TLB(translation Lookaside Buffer)。只有在TLB中找不到对应的页表项,才会到内存中查询页表,这样就减少了由于页表查询导致的处理器性能下降。但是在进程切换的时候,当我们进行地址空间切换后,TLB高速缓存中的数据就会失效。缓存失效就会导致命中率降低(cache miss),那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢。同样的道理,除了TLB,由于地址空间切换也会导致CPU其它的高速缓存(L1,L2等)失效。而线程切换并不需要切换地址空间,所以就不会有缓存失效这个问题。

模式切换

模式切换时,CPU逻辑上可能还在执行同一进程。用户进程最开始都运行在用户态,若进程因中断或异常进入核心态运行,执行完后又回到用户态刚被中断的进程运行。用户态和内核态之间的切换称为模式切换

所以他们有什么关系?

中断是指CPU接受到的来自硬件或软件的信号,提示CPU发生了某件事情并中止现行程序的执行。中断信号分为内中断信号和外中断信号两种。内中断信号又叫异常,与当前执行指令有关,来自CPU内部;外中断信号,与当前执行指令无关,来自CPU外部。
因为中断是一种由CPU接收的信号,那我们就不得不了解一下CPU。CPU有两种工作状态,一种是用户态(又叫目态),另一种是核心态(又叫管态)。单核CPU一次只能执行一个程序,运行在CPU核心态的程序我们把它成为内核程序,运行在CPU用户态的程序我们把它称为应用程序。
OK,了解完上述基础概念后,我们就能来认识一下系统调用了。维基百科上说,系统调用是指运行在用户态的程序向操作系统内核(操作系统的内核程序运行在核心态)请求需要更高权限运行的服务,也就是说系统调用是一种由用户态程序发出的请求。用户态的程序通过进程调用的方式,向操作系统提出服务请求,由操作系统代为完成。
这种请求是通过内中断信号告诉操作系统的,因此系统调用本质上就是一种内中断信号:用户程序传递系统调用参数,在用户态下执行访管指令(访管指令是唯一一个只能在用户态下进行,不能在核心态执行的指令),执行访管指令后,进程发出一个内中断信号。CPU收到内中断信号后,立刻从用户态切换为核心态(注意:中断是使CPU从用户态进入核心态的唯一途径),CPU的使用权限交给操作系统,操作系统内核程序负责对中断信号进行处理。中断信号告诉操作系统刚刚运行的程序想要更高权限的服务(与资源有关的服务,如当前父进程想创建一个子进程),操作系统处理系统调用的相关代码运行在核心态。
了解完系统调用,我们再了解一下进程调度与进程切换。在了解这两个概念之前,我们需要先知道什么是进程。进程最简单的理解就是一个程序的执行过程,则进程就会像CPU一样有若干种状态。在这里我们只简单说明进程其中的三种状态:就绪态(除CPU外的其他资源都有,只差一个CPU就能执行),运行态(此进程正在运行,其他资源与CPU都有),阻塞态(既没其他资源又没CPU)。
就绪态的进程组成一个就绪队列,等待处理机调度。
进程调度是指按照某种算法从处于就绪态就绪队列的进程中选择一个为其分配处理机,进程切换是指换一个进程让处理机处理。是不是觉得这两个概念很相似,狭义的进程调度指的是在选择进程的时候,当前选中的进程可能是刚执行完的进程,也可能是另一个进程。进程切换指的是换一个进程让处理机处理,那么选择进程的时候,当前选中的进程必然不是刚刚被中断的进程,而是就绪队列中的另一个进程。广义的进程调度包括选择一个进程与进程切换两个步骤。举个例子:进程调度类似大家开会选领导班子,进程切换是真正的上任,新旧交接的过程。先开会再上任。开会结果表示你是主席,不代表开完会你就是了,只是先决条件有了,流程还是要走的(真正上任)。
进程切换的过程主要完成了:1.对原来运行数据的保存(对原来官员的政绩不能抹去) 2.对新进程数据的输入(对新官员能力的介绍)
进程切换意味着当前运行程序要离开CPU,离开CPU的原因有两种:主动离开,如等待I/O设备,进程从运行态进入阻塞态;被动离开,当前进程被分配的时间片已到,换另一个进程上处理机(进程切换),进程从运行态进入就绪态,注意:进程不管出于哪种原因离开CPU,都需要硬件(如I/O设备,计时部件)或软件(如当前运行的进程)发出中断信号告知CPU,CPU的使用权限被交给操作系统,由操作系统介入完成对中断信号的处理。这也就意味着进程切换必然导致CPU从用户态进入核心态。
那么,中断和进程切换有什么关系呢?
答:中断是进程切换的必要不充分条件,即发生进程切换一定发生了中断,但发生中断不一定发生了进程切换。
解释这个答案之前,我们需要先知道中断是如何影响进程切换的。假设CPU正在运行一个程序,如果没有中断,那么CPU只能一直运行这一个进程,如果来了一个中断信号,CPU就会派操作系统执行中断信号对应的中断程序(核心态),处理完后,CPU就执行另一个程序或原先被暂停的程序(用户态)。现代操作系统通过时钟部件为进程切换提供时机,时钟部件和CPU是独立的两个部件(目前CPU都内置计时器,但我们就认为时钟部件是个外部硬件),时钟部件通过计数器(计时器)定期向CPU发出外中断信号。在CPU执行指令时,计数器同时在计时,当计数器溢出,就向CPU申请中断,如果CPU响应中断,CPU就转到核心态对中断进行处理(也就会进行模式切换),执行完了再返回原程序或另一个程序。时钟中断需要满足两个条件:1.允许中断源(时钟部件等)申请中断 2.允许CPU响应(搭理)中断。举个例子,你在上课,相当于主程序,这时下课铃响了,你就不读书了,跑出去玩了(离开CPU)。你上课(执行程序)和打铃(时间部件)没关系,并不是你让打铃的,学校的时钟不停地走,到了时间自动打铃,同样不受你上课的影响。但是如果你把耳朵堵上(不允许CPU响应(搭理)中断),就是铃打碎了你也不知道要下课了,你就一直读书(执行)。要让你停止读书有两个条件:1.允许铃声响 2你听得到铃声。
OK,那为什么说发生了进程切换就一定发生了中断?假设在T1到T2的某个时刻发生了进程切换,则在T1-T2时刻一定发生了处理机调度程序(分配处理机的程序,发生在核心态),(中断在前,处理机调度程序在后,这与中断处理时无法进行处理机调度并不矛盾(因为中断恢复所需要的所有数据都保存在被中断进程的内核栈中,如果发生进程切换就找不到之前被中断的进程的数据了,使得被中断的程序无法恢复))说明在T1到T2时刻之间处理机曾由用户态转换到核心态。由于中断是使CPU从用户态进入核心态的唯一途径,所以T1到T2必然发生了中断。发生中断后,操作系统对中断程序处理完后,不一定会执行另一个进程,而是执行原先被暂停的进程。所以中断是进程切换的必要不充分条件。
同样,中断也是进程调度的必要不充分条件,即发生中断并不一定会导致进程调度。
中断是一种异步事件,当中断发生时,CPU 需要暂停当前执行的进程,转而处理中断请求。中断处理完成后,操作系统需要决定如何继续执行进程。在这个过程中,操作系统可能会进行进程调度,也可能不会:1. 如果操作系统处理完中断后,仍然认为原来的进程具有执行的优先权,那么操作系统会继续执行原来的进程。在这种情况下,虽然操作系统确实进行了决策(进行了进程调度),但因为选择的仍然是原来的进程,所以可以认为没有发生进程调度。
2. 如果操作系统处理完中断后,认为其他进程具有更高的优先权,那么操作系统会进行进程调度,选择一个新的进程来执行。
所以,发生中断并不一定会导致进程调度。这取决于操作系统在处理完中断后,如何评估各个进程的优先级和执行需求。

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值