CHS_03.1.3.3+系统调用

CHS_03.1.3.3+系统调用

  • 系统调用
    • 什么是系统调用,有何作用?
    • 系统调用又和普通的库函数的调用又有一定的区别
    • 为什么系统调用是必须的
    • 系统调用 按功能分类 可以分为这样的一些系统调用
    • 系统调用过程
  • 这个小节的全部内容

系统调用

在这里插入图片描述

相关的知识 我们会为大家介绍什么是系统调用 它和库函数的区别 并且用一个小例子

来直观的感受到系统调用为什么是必须的 最后我们会介绍哪些功能需要由系统调用实现 系统调用背后的过程
是什么样的 那首先来看第一个问题 什么是系统调用
这个其实我们在第一个小节当中就有介绍过

什么是系统调用,有何作用?

在这里插入图片描述

操作系统 它作为用户和计算机之间的接口 它需要向上提供一些简单的应用的服务

那么给用户使用的就是命令接口Gui 而程序接口又由一堆系统调用组成

所以 其实系统调用就是应用程序程序员来请求操作系统内核服务的一个途径

它和我们平时编程的时候使用的函数调用其实是很类似的 但是呢

系统调用又和普通的库函数的调用又有一定的区别

在这里插入图片描述

其实我们在写程序的时候 是可以用会编语言的方式来直接请求这个系统调用服务的

但是现在的编程更多的是使用高级语言来编程 所以我们一般会直接使用那些高级语言提供的库函数

但是 这些高级语言的库函数在底层其实也会用到操作系统提供的系统调用功能

来请求操作系统的服务 所以系统调用应该是比高级语言的库函数更为底层的一个接口

我们的逻辑之上是操作系统 操作系统向上层提供的接口是系统调用

使上面的这些库函数应用程序能够通过系统调用的方式来请求操作系统的内核的服务

然后 在操作系统之上 各种各样的高级编程语言会用库函数的方式来封装这些系统调用 然后像更上层的这些应用程序的程序员来暴露一些更好用的编程接口

不过呢 并不是所有的库函数在底层都会使用系统标用很多库函数 比如说像c语言里的math.h 里边就会提供很多取决对值啊之类的数学运算相关的库函数

这些库函数的功能不需要特选指令也可以完成 所以像这一类的库函数 它在底层

也并不需要使用系统调用 但是又有的库函数 比如说像创建一个新文件这个事情 必须请求操作系统内核的服务才可以完成 所以对于创建新文件这样的库函数来说 它在底层就肯定需要使用操作系统提供的系统调用服务

所以这是系统调用和库函数的一个区别 那接下来我们用一个小粒子来感受一下

为什么系统调用是必须的

在这里插入图片描述

来看 一个这样的场景 你去学校的打印店去打印论文 然后用w p s这个程序点下了打印按钮

之后打印机就会开始工作 但是当你的论文打印到一半的时候 另一个同学用word也按下了打印按钮

请求打印他自己的论文 那么我们知道 wps和word在这个电脑里 这个系统当中其实是两个

正在并发运行的进程 所以如果这两个进程能够随意的并发的来共享使用打印机资源的话 就会发生这样的情况

由于两个进程交替的并发的向打印机提出打印的请求命令 那么打印机设备就会交替的收到这两个进程发来的打印请求

那这样的话 打印机就会把这两篇论文的内容给混杂在一起打印 先打印一行这个 再打印行这个 那这显然不是我们想要得到的结果

所以 由于系统当中有各种各样的病发的进程 而这些病发的进程又需要的共享的使用类似于打印机设备这样的共享资源 但是这样的共享资源其实是需要各个进程互斥的共享的

那怎么实现对共享资源的互斥访问呢 最好的方式就是让操作系统内核 也就是这个系统的管理者来对共享资源进行统一的管理

然后 上层的那些应用程序只能通过系统调用的方式来请求操作系统给他分配这种资源

之后这个进程才可以对这种共享资源进行使用和访问 而各个进程的请求会由操作系统内核来协调处理 保证他们并发运行的时候不会发生这种

奇奇怪怪的事情 因此从这个例子当中 我们就可以看到 系统调用的功能是必须存在的

那我们的书上给出了

系统调用 按功能分类 可以分为这样的一些系统调用

在这里插入图片描述

什么设备管理 文件控制等等等等 这个就不再展开 大家自己看一下 有个印象就可以 然后有兴趣的同学可以去百度搜索一下

linx的系统调用 可以看一下linx操作系统向上提供了哪些系统调用 那到底哪些功能需要用系统调用的方式对外提供呢

其实都有一个共同的特点 凡事和共享资源有关的操作 比如说像对内存的这种

分配与回收内存是一种共享资源 l设备也是一种共享资源 文件也是共享资源

总之 只要是对共享资源的访问 那肯定是需要通过系统调用来进行

因为这些共享资源是有限的 所以操作系统会对这些共享资源进行统一的管理和分配

因此 应用程序在使用这些资源的时候 就必须通过系统调用的方式请求操作系统内核来帮他进行接下来的处理

这样的话 我们就可以保证系统的稳定性和安全性 防止非法操作 相信通过之前打印机的例子大家能够有

系统调用过程

在这里插入图片描述

比较直观的体会 那么假设一个应用程序想要进行系统调用 它在背后需要做一些什么事情呢 我们来看一下

一个应用程序 它运行在用户台 然后这个应用程序的各个指令会被cpu依次执行

当他想要发出系统调用的时候 他需要用传参数的指令给cpu的寄存器当中传递一些必要的参数

比如说在某一个寄存器当中放入了一个参数一这个参数一是指明了我此次要进行哪种类型的系统调用

比如说像linax里面的fork系统调用 那传递参数的指令可能会有多条 主要要看我们的这个系统调用需要传递几个参数

操作系统会根据应用程序提供的这些参数来判断他想要的到底是哪种类型的服务

那当这些参数都放到了寄存器当中之后 应用程序就会执行一条特殊的指令 叫做陷入指令 这个我们在上一小节中也有简单的提及这个陷入指令

的执行会引发一个内中断 那cpu在检测到这个内部中断信号之后

他发现这个内部中断信号是由trip指令引起的 于是这个cpu接下来就会暂停运行这个应用程序

转而去执行处理陷入指令的那个处理程序 那这个程序就是系统调用入口程序

显然 接下来要执行的这个程序肯定是属于内核程序 因此它需要在内核太下运行

我们也可以说这个程序其实也是某一种中断处理程序 只不过它处理的是由陷入指令引发的那个内中断

那接下来这个系统掉入口 程序会检查寄存器里的这些参数 通过第一个参数他会知道

此时这个应用程序他想要的是这种类型的系统对应服务 于是接下来这个入口程序就会调用

与特定的系统调用类型所对应的处理程序 然后让这个程序上cpu运行

那这个系统调用处理程序在执行的时候 就可以根据应用程序传递的其他的参数来看一下他所需要的

具体是哪些服务 那当这个系统调用被处理完了之后 cpu又会转回用户台

然后接着执行之前的这个应用程序 那通过刚才的这个过程 相信大家对系统调用背后的过程应该是有了

比较直观的体会 那我们再把之前的库函数系统调用 把它给串一串
在这里插入图片描述

我们普通的程序员可以用高级的编程语言来写我们自己的代码 然后在我们的代码中可以调用这个高级编程语言提供的一些库函数

但是 有的库函数内部其实是使用到了操作系统提供的系统调用的

具体来说 一个系统调用的过程是需要先传递系统调用所需要用的参数

接下来 要执行一条很特殊的指令 叫做陷入指令 执行了陷入指令之后 就意味着这个应用程序把cpu的控制权主动的交还给了

操作系统的内核用这样的方式来请求操作系统内核的服务 所以陷入指令执行了之后 就会产生一个内中断 然后cpu会转向执行一个处理系统调用的内核程序 而这个内核程序显然是需要运行在核心态 当这个系统调用处理完了之后

他又会返回原先的这个应用程序 让应用程序接着往下执行 那我们需要注意一些

可能会作为考点的小细节 第一这个陷入指令 它其实是在用户台下执行的

他是一个很特殊的指令 但是他并不是特权指令 他是一个非特权指令

在执行了这个指令之后 会主动的引发一个内中段 让cpu进入核心态运行内核程序

第二点需要注意的是 我们发出系统调用请求 这个动作是在用户态下进行的

但是对系统调用的相应处理是在核心态下完成的 那最后我们还需要注意陷入指令另外两种名称

它又可以称为trap指令 房管指令在不同教材当中可能使用的这个术语不一样

但是要知道他们指的其实都是同一个东西好的 那么这个小节当中 我们介绍了系统调用相关的知识

大家要能够理解系统调用和库函数它们的区别 另外呢 大家需要注意在系统当中有各种各样并发的进程 这些进程会增强着使用

各种各样的系统资源 那这些资源应该由系操作系统来统一的掌管

所以 只要是对共享资源的访问操作 就肯定需要用系统调用的方式来实现

那这一点大家随着之后的那几个章节的学习体会会越来越深 这儿不需要死记硬背

那我们在这个小节当中还需要重点掌握的是系统调用背后的一个过程 那需要注意一条很特殊的指令陷入指令 或者叫trap指令防管指令 如果一个应用程序执行了陷入指令 就意味着这个应用程序主动的把cpu的控制权还给了操作系统

然后用这种方式来请求操作系统的服务

这个小节的全部内容

在这里插入图片描述

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在visual studio中调试时无法查看std::wstring

1.问题 在调试的时候发现std::wstring类型的变量查看不了,会显示(error)|0,百思不得其解。 2.解决方法 参考的:vs2015调试时无法显示QString变量的值,只显示地址_vs调试qstring的时候如何查看字符串-CSDN博客 在工具/选项/调试…

Q-BENCH: A BENCHMARK FOR GENERAL-PURPOSEFOUNDATION MODELS ON LOW-LEVEL VISION

继续分享Q系列文章,今天分享Q-BENCH。 简单来说,作者对MLLMs在lowlevel领域中的评价提出了一个测试基准,主要分三点进行讲述。 有点类似于综述,显然作者团队在MLLM的lowlevel领域属于开山之作了。 第一个基准叫感知Perception 简…

Python从入门到网络爬虫(OS模块详解)

前言 本章介绍python自带模块os,os为操作系统 operating system 的简写,意为python与电脑的交互。os 模块提供了非常丰富的方法用来处理文件和目录。通过使用 os 模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强…

论文阅读《Generalizing Face Forgery Detection with High-frequency Features》

高频噪声分析会过滤掉图像的颜色内容信息。 本文设计了三个模块来充分利用高频特征, 1.多尺度高频特征提取模块 2.双跨模态注意模块 3.残差引导空间注意模块(也在一定程度上体现了两个模态的交互) SRM是用于过滤图像的高频噪声 输入的图…

【C++期末】酒店住宿信息管理系统(含easyX)

诚接计算机专业编程作业(C语言、C、Python、Java、HTML、JavaScript、Vue等),如有需要请私信我,或者加我的企鹅号:1404293476 本文资源:https://download.csdn.net/download/weixin_47040861/88725363 目录 1.题目要求 2.实现效…

Vue3:Axios配置及使用

Axios官方 一、安装: //使用 npm: $ npm install axios//使用 bower: $ bower install axios//使用 yarn: $ yarn add axios 在package-lock.json文件可以查看axios版本 二、配置: milliaAxios.js 配置axios import axios from axios // 创建一个 ax…

element的Table表格组件树形数据与懒加载简单使用

目录 1. 代码实现2. 效果图3. 解决新增、删除、修改之后树节点不刷新问题。&#xff08;[参考文章](https://blog.csdn.net/weixin_41549971/article/details/135504471)&#xff09; 1. 代码实现 <template><div><!-- lazy 是否懒加载子节点数据 --><!-…

美信科技盘古信息智能车间项目成功验收,打造电子元器件数字化工厂标杆

作为一家深耕于磁性元器件领域近二十年的制造企业&#xff0c;广东美信科技股份有限公司&#xff08;以下简称“美信科技”&#xff09;始终秉承着“为电磁赋能&#xff0c;创工业至美”的企业使命&#xff0c;为中国制造卓越发展贡献力量。在当今数字化时代&#xff0c;制造企…

【C++】深入了解构造函数之初始化列表

目录 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 2&#xff09;不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值…

世邦spon IP网络对讲广播系统任意文件上传漏洞

产品介绍 世邦通信IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统存在任意文件上传漏洞&#xff0c;攻击者可以通过构造特殊请求包上传恶意后门文件&#xff0c;从…

深入理解 Flink(一)Flink 架构设计原理

大数据分布式计算引擎设计实现剖析 MapReduce MapReduce 执行引擎解析 MapReduce 的组件设计实现图 Spark 执行引擎解析 Spark 相比于 RM 的真正优势的地方在哪里&#xff1a;&#xff08;Simple、Fast、Scalable、Unified&#xff09; DAG 引擎中间计算结果可以进行内存持…

掌握设计模式:深入了解命令模式的优雅调度与行为解耦

命令模式是一种行为设计模式&#xff0c;其目的是将请求发送者和接收者解耦&#xff0c;从而允许发送者发送请求&#xff0c;而无需知道请求的具体处理方式。在命令模式中&#xff0c;请求被封装为一个对象&#xff0c;这个对象包含了执行请求所需的所有信息&#xff0c;包括调…

解析器:request.body、request.POST、request.data

request.POST与request.body&#xff1a; django中的request.POST只能取到Content-Type(请求头)为application/x-www-form-urlencoded(form表单默认格式)的数据&#xff0c;如果请求头为application/json(json格式)&#xff0c;multipart/form-data(文件)等格式无法取到&#x…

世邦通信SPON IP网络对讲广播系统未授权访问

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统getuserdata.php存在未授权访问漏洞&#xff0c;攻击者可通过该漏洞在服务器端读取账户密码…

软件工程各种图

参考视频&#xff1a; 6 分钟学会 UML 类图_哔哩哔哩_bilibili 5 分钟学会 UML 时序图&#xff08;顺序图、序列图&#xff09;_哔哩哔哩_bilibili 3 分钟学会 UML 活动图_哔哩哔哩_bilibili 6 分钟学会 UML 用例图_哔哩哔哩_bilibili 是真的讲的非常好&#xff01;&#…

Aloha 机械臂的学习记录3——AWE:Pycharm运行代码记录

之前的博客创作了三偏关于Aloha_AWE的liunx终端指令运行代码的示例: Aloha 机械臂的学习记录——AWE&#xff1a;Bimanual Simulation Suite: https://blog.csdn.net/qq_54900679/article/details/134889183?spm1001.2014.3001.5502 Aloha 机械臂的学习记录1——AWE&#x…

Python 与 PySpark数据分析实战指南:解锁数据洞见

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 数据分析是当今信息时代中至关重要的技能之一。…

免费运维工具测评——深入使用牧云主机管理助手

作为一名运维&#xff0c;宝塔&#xff0c;Nezha 监控面板&#xff0c;WinSCP&#xff0c;Termius 都用过了&#xff0c;谈一下自己的感受&#xff1a; 安装绑定 微信扫码可直接登录&#xff0c;主页简洁清晰&#xff0c;即使是个人体验版也没有任何广告。 只需要复制命令在服…

基于神经网络的手写汉字提取与书写评分系统研究

相关源码和文档获取请私聊QQ:3106089953 论文目录结构 目 录 摘 要 I Abstract II 目 录 IV 第1章 绪论 1 1.1. 研究背景与意义 1 1.2. 国内外研究现状 2 1.2.1. 文本定位技术研究现状 2 1.2.2. 手写汉字识别研究现状 3 1.2.3. 汉字书写质量评价方法研究现状 4 1.3. 本文所做工…

Linux驱动开发(1)-最简单的字符设备驱动开发例子

1.简介 字符设备驱动&#xff1a;按照字节流进行读写操作的设备&#xff0c;例如点灯、按键、IIC、SPI、LCD。 Linux系统中一切皆文件&#xff0c;驱动加载成功&#xff0c;就会在/dev目录生成文件&#xff0c;对文件操作&#xff0c;则可实现对硬件操作。应用程序运行在用户…