系统调用简单介绍

概述

简单理解就是操作系统给我们提供的函数接口,当我们的程序需要执行一些只有操作系统才能完成的工作的时候,我们就要调用操作系统给我们提供的接口来实现这些功能,这些接口就是系统调用。


那什么样的操作是只有操作系统才能完成呢? 

比如: 当我们需要申请内存,或者申请使用硬件资源的时候,这些操作我们都需要通过操作系统来完成,也就需要使用系统调用了。

比如我们熟悉的输出函数printf(),它并不是系统调用,但是它是通过对系统调用进行封装才实现的,因为我们将数据输出到控制台,是需要使用到硬件资源的,所以必须调用系统调用,printf()是为了我们使用更加方便在系统调用的基础上进行了封装。

write()和read()函数是操作系统提供的IO系统调用,来将对应文件中的数据读取或者写入,也就是说,printf()只是在write()之上进行了封装,也就是说逐层跟踪,你就会发现sprintf的本质就是调用了write()。

 

为什么要有系统调用,而不是我们自己控制 

因为对于一些操作是比较复杂的,而且稍有不慎可能会导致严重的问题,存在很大的安全性问题。为了安全,这些相应的操作通过操作系统进行管理,而不是我们认为直接写代码来控制或者使用这些功能,操作系统只是向外界提供接口,我们在使用的时候只是调用这些接口,并不知道内部怎么交互,防止了我们误操作,增加了安全性。 

 

系统调用有开销

操作系统帮助我们申请空间等,但是操作系统也是软件,其也需要代码去执行。也就是说,当我们使用使用系统调用的时候, 回去执行操作系统中相应位置的代码,但是执行代码是需要cpu来执行的。
 

cpu会给我们刚才执行的代码(就是调用系统调用的那段代码)保存一个快照,保存在栈内存中(操作系统管理的区域,方便后续进行检索 -- 对于多线程的程序,一个线程的时间片结束,也是通过保存快照的方式来记录程序的执行状态的),也就是保留当前的执行状态,然后将操作系统相应的代码导入cpu进行执行,执行结束之后,检索之前的快照(也就是程序执行的变量数据,以及地址信息等)让之前的程序继续运行。

所以,执行系统调用是有一定的系统开销的。(可以结合动态开辟内存来理解,动态开辟内存也需要操作系统开辟空间,所以也会有系统调用,所以也是导致动态开辟内存速度慢的原因)

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

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

相关文章

SQLServer:从数据类型 varchar 转换为 numeric 时出错。

1.工作要求 计算某两个经纬度距离 2.遇到问题 从数据类型 varchar 转换为 numeric 时出错。 3.解决问题 项目版本较老,使用SQLServer 2012 计算距离需执行视图,如下: SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO ALTER view vi_ord…

与传统RNN相比,AI模型当红大神Transformer有什么新魔法呢?

在上一篇文章“AI模型大宗师Transformer的Encoder工具”里面提到“自注意力机制”,有些伙伴可能不太理解,今天我再用个例子细说一下。 下面,我们用一个实际的文本处理例子来看看传统的循环神经网络(RNN)和引入自注意力…

ai智能电销机器人系统稳不稳,效果好不好

智能ai电销机器人好不好用?智能AI电销机器人系统现如今已经不是一个新名词了,在人工智能这个新趋势的风潮下,一些企业已经在电销部门引入了智能AI机器人系统。我一起来看看ai智能电销机器人系统稳不稳。 1.数据有效 通常我们需要收集潜在用…

【坚果识别】果实识别+图像识别系统+Python+计算机课设+人工智能课设+卷积算法

一、介绍 坚果识别系统,使用Python语言进行开发,通过TensorFlow搭建卷积神经网络算法模型,对10种坚果果实(‘杏仁’, ‘巴西坚果’, ‘腰果’, ‘椰子’, ‘榛子’, ‘夏威夷果’, ‘山核桃’, ‘松子’, ‘开心果’, ‘核桃’&a…

CTO透露GPT-5内幕,OpenAI 以36亿美元收购数据库初创公司

目录 01 GPT-5 02 OpenAI收购Rockset 2.1 谁是Rockset? 2.2 OpenAI的目的是什么? 01 GPT-5 虽然GPT-4的视频通话功能尚未全面推广,但OpenAI的CTO已经对即将到来的GPT-5给出了新的暗示。 不久前,Mira回到母校达特茅斯工程学…

springboot 自定义的全局捕获异常失效

背景:springbootspringcloud 分布式微服务。 问题:公共模块在使用RestControllerAdvice全局捕获异常时,捕获不到子服务抛出的相应异常 首先看一下全局异常组件有么有被扫描到 如何查看,很简单只需要写一段类加载打印代码&#x…

高德离线地图OpenLayers实现添加标记点及标记点事件

要在使用高德离线地图数据的OpenLayers应用中添加标记点(通常称为"特征"或"要素")以及为这些标记点添加事件,你需要首先确保你的离线地图数据是以OpenLayers能够理解的格式提供的(如PNG瓦片用于底图&#xff…

剪映数字人口播原理终于搞清楚了

剪映版本升级了,新版本支持数字人定制,于是我赶紧申请了使用资格 目前的价格是49元单个价格/30天 支付49元之后剪映要求上传2.5至10分钟的视频 接着要阅读一段话并录制视频上传 第三步提交,提交完成之后大概两三个小时就会有一个特定数字人形象出现:

嵌入式c语言3——自定义数据类型

结构体struct,共用体union 结构体中定义变量,首尾地址相连 对于union,其包含变量对起始地址相同 由于其起始地址相同,则改变其中某一变量值时有可能使得另一个变量值发生改变 enum 枚举,可以用来定义一堆整形常量构成…

深入详解RocketMQ源码安装与调试

1.源码下载 http://rocketmq.apache.org/dowloading/releases/ 2. 环境要求 64位系统JDK1.8(64位)Maven 3.2.x

性价比蓝牙耳机怎么选?百元高性价比蓝牙耳机推荐

在现代社会中,蓝牙耳机已经成为人们日常生活中必不可少的配件之一。对于许多消费者来说,找到一款高性价比且价格在百元左右的蓝牙耳机是非常重要的。市面上有许多价格不菲的蓝牙耳机,性价比蓝牙耳机怎么选?如何在有限预算下找到性…

【Android面试八股文】优化View层次过深问题,选择哪个布局比较好?

优化深层次View层次结构的问题,选择合适的布局方式是至关重要的。以下是几点建议: 使用ConstraintLayout:ConstraintLayout是Android开发中推荐的布局,能够有效减少嵌套,提高布局性能。相比RelativeLayout,…

ODN网络弱光聚类定界与整治

01 ODN网络弱光运维现状 ODN网络是家庭宽带连接系统-无源光网络 (PON) 的重要组成部分,是连接局端 OLT 和用户 ONT 之间的光路通道,其质量直接影响整个PON系统的性能及可靠性。ODN光纤链路包括OLT PON口、ODF、主干光纤、一级分光器、分支光纤、二级分光…

Qt | QChart和QChartView配合实现面积图、条形图、折线图、饼图、曲线图、散点图,支持显示坐标值和坐标点。

01、重点内容公布 Qt | windows Qt6.5.3安装&安卓环境搭建&虚拟机调试和真机调试完美版(保姆级教程)第二章 Ubuntu22.04 Linux磁盘扩容/硬盘扩展教程

Unity Shader技巧:实现带投影机效果,有效避免边缘拉伸问题

这个是原始的projector 投影组件,边缘会有拉伸 经过修改shader 后边缘就没有拉伸了 (实现代码在文章最后) 这个着色器通过检查每个像素的UV坐标是否在定义的边界内,来确定是否应用黑色边框。如果UV坐标处于边缘区域,那么像素颜色会被强制设为黑色,从而在投影图像周围形成一…

240703_昇思学习打卡-Day15-K近邻算法实现红酒聚类

KNN(K近邻)算法实现红酒聚类 K近邻算法,是有监督学习中的分类算法,可以用于分类和回归,本篇主要讲解其在分类上的用途。 文章目录 KNN(K近邻)算法实现红酒聚类算法原理数据下载数据读取与处理模型构建--计算距离模型预测 算法原理 KNN算法虽…

日产X-Trail | 压电式喷油器故障

故障现象 冷启动正常,但超车或者发动机处于负荷状态时就会出现熄火。熄火后无法重新发动,要等发动机完全冷却下来才能再次启动。 有两个故障代码:“P2146:喷油器1和2电源对地短路” 和 “P2146:喷油器3和4电源对地短…

vscode python调试,找不到控制调试工具栏,被隐藏了

问题: 如图所示,最开始蓝框中的调试台被莫名其妙的隐藏了,没法进行调试。 解决办法: 打开设置输入调试点击调试(31)找到红框选的那个选项,选择floating

激活函数、向前传播、损失函数、梯度下降

激活函数 作用:主要引入了非线性。从而能解决很复杂的非线性关系。能更好地处理现实世界的数据和任务。 向前传播 向前传播描述了,神经网络中,输入层到输出层的信号传播和处理过程。输入层将特征数据输入,加权求和,…

Django QuerySet对象,all()方法

all()方法 在Django中,all()方法是QuerySet对象的一个方法,用于获取模型的所有实例。 当你调用ModelName.objects.all()时,Django会生成一个SQL查询,从数据库中获取该模型的所有记录,并返回一个QuerySet对象&#xf…