系统调用简单介绍

概述

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


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

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

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

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

 

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

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

 

系统调用有开销

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

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

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

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值