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

操作系统基本概念.1

中断,异常,系统调用

先分析第一个:

中断的作用:中断会使CPU由用户态变为内核态,是操作系统重新夺回对CPU的控制权。

因为CPU上回运行两种程序,一个是操作系统的内核程序,另一个是应用程序。

在合适的情况下,操作系统的内核会把CPU的使用权主动让给应用程序。(这个在后面的时候会学到)。

“中断”是操作系统内核夺回CPU使用权的唯一途径。

如果没有“中断”机制,那么一旦在应用程序上CPU运行,CPU就会一直运行这个应用程序,也就是一直占用着,不想还给操作系统。这个显然是不对的,所以我们要采取“中断”强制夺回CPU的使用权。

中断的类型:

中断可以分为内中断和外中断。但是狭义的中断就是外中断,内中断也被称之为“异常”。

内中断:来源于CPU内部,与当前的指令有关。

例子:试图在用户态喜爱执行特权指令,执行除法指令时候发现除数为0,有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令——陷入指令(trap),该指令会引发一个内部中断的信号。

异常划分:

陷进,陷入,故障,终止。

陷进:由陷入指令引发,是应用程序故意引发。

故障:由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把CPU使用权还给应用程序,让它继续执行下去。如:缺页故障。(后续会补充)

终止:由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。 如:整数除0、非法使用特权指令。

外中断:和内中断对立,和当前执行的指令无关,中断信号来源于CPU外部。

例子:时钟中断——由时钟部件发来的中断信号,I/O中断——由输入/输出设备发来的中断信号。

中断的基本原理:

不同的中断信号,需要用不同的中断处理程序来处理,当CPU检测到中断信号后,会根据终端信号的类型去查询“中断向量表”,希望通过这样找到中段处理程序在内存中的存放位置。

补充:中断处理程序一定是内核程序,需运行在“内核态”。(为什么一定要运行在内核态呢?)

这里提个问题,在下一个文章会进行回答。

系统调用:

我们知道操作系统是计算机资源的管理者,那么是不是一位置应用程序不具备使用计算机的资源,但是如果有程序想使用硬件的时候应该怎么办?——系统调用。

个人理解:应用程序,通过提供参数,实现系统调用达到自己的目的,在此过程中会有安全措施正在进行防卫着,以防止非法的操作。

系统调用是操作系统提供给应用程序(编程人员/程序员)使用的接口,可以理解为一种可以供给应用程序调用的特殊的函数,应用程序可以通过系统调用来请求会的操作系统的内核服务。

系统调用和库函数的区别:

个人理解:库函数封装了一系列的系统调用,方便我们进行使用,同时还有为了避免我们直接对资源的管理,造成错误。

什么功能要用系统调用实现?

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

过程:

传递系统调用参数->执行陷入指令(用户态)->执行相关的请求内核程序处理系统调用(和心态)->返回应用程序。

陷入指令是指用户程序所依靠的指令,用于发起系统调用,请求操作系统提供服务。 陷入指令有其中一点特殊在于,其只能在用户态下执行,而不可以在核心态下执行。 用户程序执行陷入指令,相当于把CPU的使用权主动交给了操作系统内核程序(CPU状态会从用户态切换到核心态),之后操作系统内核程序再对系统调用请求做出相应的处理。处理完成后,操作系统内核程序又会把CPU的使用权还给用户程序(即CPU状态从核心态切换到用户态)。 总结一下:

  • 陷入指令是再用户态执行的,执行陷入指令之后,立即引发一个内中断,从而CPU进入核心态

  • 发出系统调用请求是再用户态,而对系统调用的相应处理是再核心态下进行

  • 陷入指令是唯一一个只能再用户态,而不可再核心态执行的指令

注意:陷入指令是在用户态执行的,执行陷入指令后立即引发一个内中断,是CPU进入核心态

发出系统调用请求是在用户态,而对系统调用的相应处理则是在核心态下进行的。

http://www.xdnf.cn/news/20171.html

相关文章:

  • Day 47 注意力热图可视化
  • 工作后的总结和反思4
  • SQL 入门指南:排序与分页查询(ORDER BY 多字段排序、LIMIT 分页实战)
  • 使用Shell脚本实现Linux系统资源监控邮件告警
  • 永磁同步电机 FOC 控制中 d、q 轴杂谈与角度偏移影响
  • 使用Ansible自动化部署Hadoop集群(含源码)--环境准备
  • 【Android】ViewPager2结合Fragment实现多页面滑动切换
  • 百度竞价推广:搜索竞价信息流推广代运营
  • ElementUI之Upload 上传的使用
  • C++语法之--多态
  • 了解Python
  • Ubuntu:Git SSH密钥配置的完整流程
  • 捷多邦揭秘超厚铜板:从制造工艺到设计关键环节​
  • 让字符串变成回文串的最少插入次数-二维dp
  • 单元测试详解
  • 基于树莓派与Jetson Nano集群的实验边缘设备上视觉语言模型(VLMs)的性能评估与实践探索
  • 【c++进阶系列】:万字详解AVL树(附源码实现)
  • ubuntu 系統使用過程中黑屏問題分析
  • 前端上传切片优化以及实现
  • 基于LLM开发Agent应用开发问题总结
  • equals 定义不一致导致list contains错误
  • SQL面试题及详细答案150道(81-100) --- 子查询篇
  • webrtc弱网-LossBasedBandwidthEstimation类源码分析与算法原理
  • 【Proteus仿真】定时器控制系列仿真——秒表计数/数码管显示时间
  • 【ComfyUI】混合 ControlNet 多模型组合控制生成
  • ANSYS HFSS边界条件的认识
  • 【LeetCode热题100道笔记】二叉树中的最大路径和
  • 9.FusionAccess桌面云
  • Spring的事件监听机制(一)
  • 03.缓存池