当前位置: 首页 > news >正文

中断、进程调度、进程切换、系统调用,模式切换的那些事情

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

文章目录

  • 前言
  • 中断
  • 进程调度
  • 进程切换
  • 线程切换
  • 模式切换
  • 所以他们有什么关系?


前言

本文内容主要参考以下几个博文中学得
进程与线程(中)的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. 如果操作系统处理完中断后,认为其他进程具有更高的优先权,那么操作系统会进行进程调度,选择一个新的进程来执行。
所以,发生中断并不一定会导致进程调度。这取决于操作系统在处理完中断后,如何评估各个进程的优先级和执行需求。

相关文章:

中断、进程调度、进程切换、系统调用,模式切换的那些事情

提示:风萧声动,玉壶光转,一夜鱼龙舞 文章目录 前言中断进程调度进程切换线程切换模式切换所以他们有什么关系? 前言 本文内容主要参考以下几个博文中学得 进程与线程(中)的2.2.7 进程切换VS模式切换&#…...

使用web-view实现网页端和uni-app端是数据传输

要实现这个功能 第一步&#xff1a;要在vue的public文件夹下面引入 <script type"text/javascript" src"https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script> 第二步&#xff1a;建立一个新的空的uni-app项目…...

Ajax快速入门

Ajax Ajax就是前端访问服务器端数据的一个技术 还有主要就是异步交互 就是在不刷新整页面的情况下&#xff0c;和服务器交换部分我也数据 比如搜索的联想技术 同步和异步的概念 一个是客户端需要等待服务器完成处理&#xff0c;才能进行别的事 一个是客户端不需要等待服务器处…...

Google OAuth 2 authorization - Error: redirect_uri_mismatch 400

出现这个问题&#xff0c;一般是因为google授权origin地址和重定向redirect_uri地址没有匹配上。 请仔细检查重定向地址的url中origin部分和授权origin部分是否能够匹配&#xff1a;...

Qt 中操作xml文件和JSON字符串

文章目录 1、概述1.1、xml介绍1.2、json介绍 2、xml文件增删改查2.1、写xml文件内容2.2、读xml文件内容2.3、删除xml文件内容2.4、修改xml文件内容 3、构建JSON字符串3.1、JSON字符串排版4、剪切板操作 1、概述 1.1、xml介绍 XML 指可扩展标记语言&#xff08;EXtensible Mark…...

React 基础篇(二)

&#x1f4bb; React 基础篇&#xff08;二&#xff09;&#x1f3e0;专栏&#xff1a;React &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前主攻…...

springboot + shiro 下载文件时浏览器提示“无法下载-没有权限”或“无法下载-没有文件”问题

springboot shiro 下载文件时浏览器提示“无法下载-没有权限”或“无法下载-没有文件”问题 1. 预期效果2. 问题描述3. 问题排查4. 解决方案5. 总结 1. 预期效果 后端编写文件下载接口&#xff0c;前端通过浏览器的下载将文件保存到本地。 2. 问题描述 前后端代码在不同主机…...

ChatGLM-6B 部署与 P-Tuning 微调实战-使用Pycharm实战

国产大模型ChatGLM-6B微调部署入门-使用Pycharm实战 1.ChatGLM模型介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本…...

【雕爷学编程】MicroPython动手做(11)——搭建掌控板IDE开发环境四种

为了能够打好基础&#xff0c;系统学习MicroPython&#xff0c;特地入手了二块掌控板 知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通…...

uniapp android底部弹框

uniapp android底部弹框&#xff0c;带有动画效果 <view class"popup_box"><view class"bottom_more" click"handleClickCancel"><image src"/static/images/rescue/icon_more.png"></image></view><…...

hashedWheelTimer类

hashedWheelTimer类 目录概述需求&#xff1a; 设计思路实现思路分析1.hashedWheelTimer类 拓展实现 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait …...

【自动化测试】Selenium IDE脚本编辑与操作

之前&#xff0c;我们录制脚本时是录制鼠标和键盘的所有在浏览器的操作&#xff0c;那么脚本会出现多余的步骤&#xff0c;有时候我们需要手动填写脚本或修改脚本&#xff0c;所以我们有必要对selenium IDE脚本编辑与操作有所了解&#xff1b;&#xff08;采用录制的方式很容易…...

杭电多校2023“钉耙编程”中国大学生算法设计超级联赛(5)

1006Touhou Red Red Blue dp 设状态方程为前i个数中&#xff0c;当前第一个包里面的是0/1/2/3状态&#xff0c;第二个包里面是0/1/2/3状态 0代表着还没有颜色&#xff0c;1代表R&#xff0c;2代表G&#xff0c;3代笔B颜色 初始状态都没选择颜色所以都是状态0 没选择颜色只…...

Matlab进阶绘图第24期—悬浮柱状图

悬浮柱状图是一种特殊的柱状图。 与常规柱状图相比&#xff0c;悬浮柱状图可以通过悬浮的矩形展示最小值到最大值的范围&#xff08;或其他范围表达&#xff09;&#xff0c;因此在多个领域得到应用。 本文使用自己制作的Floatingbar小工具进行悬浮柱状图的绘制&#xff0c;先…...

【题解】链表中倒数最后k个结点、删除链表的倒数第n个节点

文章目录 链表中倒数最后k个结点删除链表的倒数第n个节点 链表中倒数最后k个结点 题目链接&#xff1a;链表中倒数最后k个结点 解题思路1&#xff1a;先找长度再找k对应的节点 首先遍历一遍链表找到链表的长度n 然后比较长度和k的大小关系&#xff0c;如果比k小&#xff0c;…...

网络安全大厂面试题

自我介绍 有没有挖过src&#xff1f; 平时web渗透怎么学的&#xff0c;有实战吗&#xff1f;有过成功发现漏洞的经历吗&#xff1f; 做web渗透时接触过哪些工具 xxe漏洞是什么&#xff1f;ssrf是什么&#xff1f; 打ctf的时候负责什么方向的题 为什么要搞信息安全&#xff0c;对…...

7.事件类型

7.1鼠标事件 案例-轮播图点击切换 需求&#xff1a;当点击左右的按钮&#xff0c;可以切换轮播图 分析: ①右侧按钮点击&#xff0c;变量&#xff0c;如果大于等于8&#xff0c;则复原0 ②左侧按钮点击&#xff0c;变量–&#xff0c;如果小于0&#xff0c;则复原最后一张 ③鼠…...

ts中声明引入未使用的报错——解决方案

在编写ts项目的时候&#xff0c;经常会出现如下报错&#xff1a; 导入声明中的所有导入都未使用 这是因为导入的模块暂时没有使用&#xff0c;ts给的一个提示信息 解决方案&#xff1a; 在ts.config.json中 把noUnusedLocals 设置为false即可 {"compilerOptions"…...

集团MySQL的酒店管理系统

酒店管理系统 概述 基于Spring Spring MVC MyBatis的酒店管理系统&#xff0c;主要实现酒店客房的预定、入住以及结账等功能。使用Maven进行包管理。 用户端主要功能包括&#xff1a; 登录注册、客房预订、客房评论&#xff08;编写评论和查看评论&#xff09; 后台管理主要…...

Kotlin基础(九):对象和委托

前言 本文主要讲解kotlin对象和委托。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 对象 在Kotlin中&#xff0c;对象&#xff08;Object&#xff09;是一个具有特殊用途的单例实例。它是一种创建单个实例的方式&#xff0c;确保在整个应用程序中只存在一个特…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...