操作系统运行机制

文章目录

  • 操作系统运行机制
    • 特权指令VS非特权指令
    • 内核态VS用户态
    • 中断和异常
      • 内中断(异常)
      • 外中断
      • 中断机制基本原理
      • 中断处理过程
    • 系统调用
      • 系统调用和库函数的区别
      • 为什系统调用时必须的?
      • 什么功能需要用到系统调用
      • 系统调用的过程
      • 小结
    • 操作系统内核


操作系统运行机制

特权指令VS非特权指令

“指令”就是CPU能识别、执行的命令,和Linux的命令不一样,Linux的命令是交互式的命令行,也就是前面所提到的联机命令接口

应用程序:普通程序员写的就是普通“应用程序”,应用程序只能使用非特权指令,如:加法指令、减法指令等

内核程序:比如windows或者是苹果公司写的操作系统内核,由很多内核程序组成操作系统内核。操作系统内核作为“管理者”,有时会让CPU执行一些“特权指令”,这些指令影响巨大,只允许“管理者”操作。这些操作系统内核程序具有原子性

在CPU设计和生产的时候就划分了特权指令和非特权指令,因此CPU执行一条指令前就能判断出指令类型。

内核态VS用户态

CPU有两种状态:内核态用户态

  • 处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令
  • 处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令

在CPU中有一个寄存器叫做程序状态字寄存器(PSW),其中有个二进制位,用1和0分别表示内核态和用户态。

在这里插入图片描述

CPU在什么时候会进行切换状态?

  1. 在刚开机的时候,操作系统要进行初始化,此时CPU处于内核态,操作系统内核程序先上CPU运行
  2. 开机完成后,用户可以启动某个应用程序
  3. 操作系统内核程序在合适的时候会主动让出CPU,让该应用程序上CPU上运行(此时操作系统内核在让出CPU之前,会用一条特权指令把PSW的标志位设置为用户态
  4. 应用程序运行在用户态

在这里插入图片描述

  1. 假设此时有黑客在应用程序中植入了一条特权指令,企图破坏操作系统
  2. CPU发现接下来要执行的这条指令是特权指令,但是自己此时又处于用户态
  3. 这个非法事件会引发一个中断信号CPU检测到中断信号后,会立即变为核心态,并停止运行当前的应用程序,转而运行处理中断信号的内核程序)
  4. 中断使操作系统再次夺回CPU的控制权
  5. 操作系统会对引发中断的事件进行处理,处理完了再把CPU使用权交给别的应用程序

在这里插入图片描述

也就是说:

内核态到用户态的转换:执行一条特权指令,修改PSW的标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权

用户态到内核态:由中断引发,硬件自动完成转换过程,触发中断信号意味着操作系统将强行夺回CPU的使用权。除了非法使用特权指令之外,但凡需要操作系统介入的地方,都会触发中断信号访管指令仅能在用户态下使用,执行访管指令可以将用户态转变为核心态

中断和异常

CPU上会运行两种程序,一种是操作系统内核程序(整个系统的管理者),一种是应用程序

中断是让操作系统夺回CPU使用权的唯一途径,如果没有中断机制,一旦应用程序上CPU运行,CPU就会一直运行这个应用程序。

内中断(异常)

内中断:内中断也被称为异常、陷入(trap),与当前执行的指令有关,中断信号来源于CPU内部

比如说CPU执行一条非法指令就发生内中断,比如说企图在用户态执行特权指令,或者说执行除法时发现除数为0,都会引发一个中断信号。

又比如说有时候应用程序向请求操作系统内核的服务,此时会执行一条特殊的指令(陷入指令),该指令会引发一个内部中断信号,再由处理中断信号的内核程序来处理这个中断信号。所谓的系统调用就是由陷入指令完成的。

内中断其实是在CPU内部执行的指令发生了异常,比如地址越界、算数溢出,而且异常不能被屏蔽,一旦出现应该立即处理

外中断

外中断:与当前执行的指令无关,中断信号来源于CPU外部

比如说:时钟中断(由时钟部件发来的中断信号),通过这个时钟中断信号就可以时间多道程序并发运行。假设时钟部件每50ms会发送一条中断指令。

有两个应用程序分别在运行,需要执行对应指令。假设程序1的指令现在CPU上执行,执行了两条指令后已经50ms了,此时时钟部件就会向CPU发送一个中断信号,这个中断信号是和CPU无关的,也就是说是在CPU外部的.

在这里插入图片描述

当CPU检测到一个中断信号后,它就会先暂定此时正在执行的应用程序,然后去执行一个处理时钟中断的内核程序,所以CPU就会对时钟中断信号进行处理,同时从用户态转换为内核态。

在这里插入图片描述

在内核态下CPU开始执行这个内核程序来处理刚才时钟部件发送的中断信号,这个内核程序执行的过程当中发现应用程序1刚刚已经执行了50ms的时间了,为了公平起见,于是这个内核程序就会把CPU的使用权交给第二个程序。

此时就又会切换为用户态,第二个应用程序就开始执行对应指令。

在这里插入图片描述

但第二个应用程序执行了一系列指令之后,如果又过了50ms,那么时钟部件则又会给CPU发送一个中断信号,和上面类似就又会切换成内核态,同时执行对应于的内核程序,又会发现程序2已经执行了50ms了就又会把CPU的使用权交给程序1。

这样就实现了应用程序的并发执行

除此之外还有来自一些输入输出设备发来的中断信号,比如说打印机。比如说world这个应用程序请求打印机的打印服务,那么打印机输出完成之后就会向CPU发送中断信号,来通知CPU的任务已经完成,接下来CPU会使用相对应的内核程序来对这个中断信号进行处理。这些都是CPU外部的中断,和CPU内部没有关系。CPU在每条指令执行完毕之后,都会例行的检查一下是否有外部中断需要处理。

在这里插入图片描述

中断机制基本原理

CPU会根据不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询中断向量表,以此来找到相应的中断处理程序在内存中的存放位置,中断处理程序运行在内核态的。

在这里插入图片描述

中断处理过程

  1. 关中断:CPU响应后中断后,首先要保护程序的现场状态,在保护现场的过程中,CPU不应响应更高级中断源的中断请求。否则若现场保存不完整,在中断服务程序后,也就不能正确地恢复并继续执行先行程序
  2. 保存断点:为保证中断服务程序执行完毕后,能正确返回到原来程序,必须将原来的程序的断点(程序计数器)保存起来
  3. 引出中断服务程序:取出中断服务程序的入口地址送入程序技术器PC
  4. 保存线程和屏蔽字:进入中断服务后,首先要保存现场,现场信息一般是指程序状态字寄存器PSWR和某些通用寄存器的内容
  5. 开中断:允许更高级中断请求得到响应
  6. 执行中断服务程序:中断请求目的
  7. 关中断:保证在恢复现场和屏蔽字恢复到原理的状态
  8. 恢复现场和屏蔽字:中断服务程序的最后一条指令,通常是一条中断返回指令,使其返回到原程序的断点处,以便继续执行原程序。

系统调用

操作系统作为用户和计算机硬件直接的接口,需要向上提供一些简单易用的服务。主要包括命令接口,其中,程序接口由一组系统调用组成。

应用程序可以通过系统调用请求获得操作系统内核的服务,这个过程会发送用户态和内核态的切换

系统调用和库函数的区别

普通应用程序可以直接进行系统调用,也可以使用库函数。有的库函数涉及到系统调用(创建文件),有的不涉及(获取最大值)。

编程语言,向上提供库函数,有时候会将系统调用封装成库函数,以影藏系统调用的一些细节,是程序员编程更加方便。

操作系统,向上提供系统调用,使得上层程序能请求内核的服务。

在这里插入图片描述

为什系统调用时必须的?

生活场景:去学校打印店打印论文,你点击了 Word 的“打印”选项,打印机开
始工作。
你的论文打印到一半时,另一位同学点击了了 浏览器的的“打印”按钮,开始打印他
自己的论文。
如果两个进程可以随意地、并发地共享打印机资源,会发生什么情况?
两个进程并发运行,打印机设备交替地收到WPS和Wrd 两个进程发来的打印请
求,结果两篇论文的内容混杂在一起了…

在这里插入图片描述

解决方法:由操作系统内核对共享资源进行统一的管理,并向上提供**“系统调用”**,用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求。内核会对各个请求进行协调处理。

什么功能需要用到系统调用

应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理等)都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。

系统调用的过程

假设有一个应用程序在执行一些指令,此时这个CPU在用户态,但这个应用程序想要执行系统调用的指令的时候,就需要用传参数的指令给CPU的寄存中传递一些必要的参数,传递的参数可能会有多条,主要看的是这个系统调用需要传递几个参数。操作系统会根据传递的参数来判断应用程序到底需要哪种类型的服务

在这里插入图片描述

当这些参数都放入CPU的寄存器之后,应用程序就会执行一条特殊的指令,叫做陷入指令。而这个陷入指令的执行会引发一个内中断信号,CPU在检测到这个内中断信号后返现这个信号是trap指令发出的,此时就会先暂停这个应用程序,再去执行处理陷入指令的内核程序,而这个程序就是系统调用入口程序,而这个程序是操作系统内核程序,CPU就会转换为内核态进行运行。

在这里插入图片描述

而这个系统调用入口程序,就会检查CPU寄存器中的参数,来判断应用程序需要哪种类型的系统调用。

在这里插入图片描述

知道应用程序需要执行哪种类型的系统调用程序后,操作系统就会去执行对应的系统调用程序。

小结

  1. 陷入指令是非特权指令,它是在用户态执行的,执行陷入指令后意味着应用程序把CPU的使用权主动的交还给了操作系统的内核,用这样的方式来请求操作系统的内核服务。
  2. 所以陷入指令执行之后,就会触发一个内中断,然后CPU会切换为内核态,转向的去执行一个处理系统调用的内核程序。
  3. 等这个内核程序执行完毕后,就会返回到原来的应用程序接着往下执行。
  4. 发出系统调用请求是在用户态,而对系统调用的相应的处理是在核心态下进行。
  5. 陷入指令就是trap指令/访管指令

操作系统内核

像时钟管理、中断处理这样的功能是在操作系统内核中完成的,而所谓的原语指的就是在运行过程中不能打断的,即使在运行的过程中有外部中断信号过来了,CPU仍然会先把原语执行完成再去处理中断信号。

像Centos和乌班图的开发团队,其主要工作是实现非内核的功能,它们发行的操作系统,其实都是使用的Linux内核。

在这里插入图片描述

内核是操作系统最基本、最核心的部分。实现操作系统内核功能的那些程序就是内核程序

大内核:如下图,把所有功能都包含在操作系统当中的就是大内核

微内核:如下图,如果内核中只是保留与硬件最接近的这些部分,就是小内核

在这里插入图片描述

需要注意的如果采用的是微内核的这种方式,不处于内核中的功能是运行在用户态,处于内核中的功能是运行在内核态的。这就会对系统的性能照成影响。

举个例子:

假设有一个应用程序想要请求操作系统的服务,这个服务的处理同时涉及到进程管理、存储管理和设备管理。

如果是大内核,只需要两次的状态转换,而微内核则需要6次的状态转换。

在这里插入图片描述

需要注意的是内核态和用户态之间的切换是会有开销的,需要消耗一定的系统资源和时间,频繁的进行内核态和用户态的切换是会降低系统性能的


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/109232.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 四种引用类型

文章目录 前言一、整体架构二、强引用(Reference)三、软引用(SoftReference)四、弱引用(WeakReference)五、虚引用(PhantomReference)六、引用队列(ReferenceQueue&#…

React Hooks 实战案例

文章目录 一、React Hooks 简介二、React Hooks 的基本用法1. 使用 useState 创建状态2. 使用 useEffect 添加副作用 三、React Hooks 的常见问题1. 循环引用问题2. 副作用问题 四、React Hooks 实战案例1. 使用 useReducer 和 Redux:2. 使用 useContext&#xff1a…

如何使用drawio画流程图以及导入导出

画一个基本的流程图 你可以在线使用drawio, 或者drawon创建很多不同类型的图表。 如何使用编辑器,让我们以一个最基本的流程图开始。 流程图,就是让你可视化的描述一个过程或者系统。 图形和很少部分的文字表达就可以让读者很快的理解他们需要什么。 创…

07、SpringCloud -- jmeter 压测

目录 jmeter 入门jmeter 安装测试步骤测试数据模拟多用户操作1、创建http请求2、添加http cookie 管理器3、并发获取当前登录用户数据的效果4、添加多个用户模拟并发请求5、访问方法6、jmeter添加 CSV Data Set Config7、高并发执行访问的效果8、总结流程高并发秒杀压测jmeter …

Python 日期和时间处理教程:datetime 模块的使用

Python 中的日期不是独立的数据类型,但我们可以导入一个名为 datetime 的模块来使用日期作为日期对象。 示例:导入 datetime 模块并显示当前日期: import datetimex datetime.datetime.now() print(x)日期输出 当我们执行上面示例中的代码…

springboot web项目中 Set-Cookie 失败 办法

1. 背景 目前有个项目 线上环境 使用spring session管理的登录 项目中有两个接口 一个用来登录的 登录成功后会设置cookie 后续请求就会使用该cookie (cookie的键值就是session Id 和 登录后的信息 例如菜单,权限等) 一个用来检查是否登录…

LeetCode热题100 旋转图像

题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9…

2022年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 运行下列程序,输出的结果是?( ) tup1 (苏炳添, 谷爱凌, 北京冬奥会, …

VSCode编写Unity代码自动补全配置

1.下载并安装.NET 7.0(C#插件需要)和.NET Framework 4.7.1(Unity需要) .NET 7.0下载链接:https://dotnet.microsoft.com/en-us/download .NET Framework 4.7.1下载链接:https://dotnet.microsoft.com/en-…

cmd基本命令

一、cmd黑框是什么 cmd 是 Windows 命令提示符(cmd.exe)是 Windows NT 及以后的 Windows 系统下的一个用于运行 Windows 控制面板程序或某些 DOS 程序的shell程序;或在 Windows CE 下只用于运行控制面板程序的外壳程序。 二、打开步骤 wind…

H5游戏源码分享-命悬一线

H5游戏源码分享-命悬一线 在合适的时机跳下绳子&#xff0c;能安全站到木桩上&#xff0c;就通过。 游戏源码 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta name&…

多线程---阻塞队列+生产者消费者模型

文章目录 阻塞队列自己实现一个阻塞队列&#xff08;三步&#xff09;标准库中的阻塞队列使用阻塞队列的优势 生产者消费者模型 阻塞队列 队列&#xff08;Queue&#xff09;是我们熟悉的一个数据结构&#xff0c;它是“先进先出”的。但是并不是所有的队列都是“先进先出”的…

RocketMq源码分析(八)--消息消费流程

文章目录 一、消息消费实现二、消息消费过程1、消息拉取2、消息消费1&#xff09;提交消费请求2&#xff09;消费消息 一、消息消费实现 消息消费有2种实现&#xff0c;分别为&#xff1a;并发消费实现&#xff08;ConsumeMessageConcurrentlyService&#xff09;和顺序消费实现…

pre-existing shared memory block

发生原因: 1.服务器cpu、内存进行扩容 2.非正常关闭,导致任在占用共享内存段 解决方案: 根据shmid进行关闭 ipcs -mipcrm -m xxx

Kotlin协程核心理解

一、协程是什么&#xff1f; 1.1 基本概念的理解 我们知道JVM中的线程的实现是依赖其运行的操作系统决定的&#xff0c;JVM只是在上层进行了API的封装&#xff0c;包含常见的有线程的启动方法&#xff0c;状态的管理&#xff0c;比如&#xff1a;Java中抽象出了6种状态&#x…

windows8080端口占用

查看端口占用 netstat -ano | findstr “8080”查看占用进程 tasklist | findstr “4664”关闭占用进程 taskkill /f /t /im httpd.exe

读图数据库实战笔记03_遍历

1. Gremlin Server只将数据存储在内存中 1.1. 如果停止Gremlin Server&#xff0c;将丢失数据库里的所有数据 2. 概念 2.1. 遍历&#xff08;动词&#xff09; 2.1.1. 当在图数据库中导航时&#xff0c;从顶点到边或从边到顶点的移动过程 2.1.2. 类似于在关系数据库中的查…

操作系统 --- 存储器管理

一、简答题 1.存储器管理的基本任务&#xff0c;是为多道程序的并发执行提供良好的存储器环境。请问好的存储器环境”应包含哪几个方面&#xff1f; 答&#xff1a; 2.内存保护是否可以完全由软件实现&#xff1f;为什么&#xff1f; 答&#xff1a;内存保护的主要任务是确保每…

C语言_断言assert详解

一、assert定义 assert() 的用法像是一种"契约式编程"&#xff0c;在我的理解中&#xff0c;其表达的意思就是&#xff0c;程序在我的假设条件下&#xff0c;能够正常良好的运作&#xff0c;其实就相当于一个 if 语句&#xff1a; if(假设成立) {程序正常运行&…

用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程

&#x1f9f8;注&#xff1a;不要看我的文件多&#xff0c;那是我的其他项目&#xff0c;这个项目所用的文件我会全部用红框框起来&#xff0c;没框的部分不用管&#xff0c;前端两个文件&#xff0c;后端一个文件 &#x1f4dc; 目录 首先&#xff0c;定义前后端交互接口 然…
最新文章