回顾:在前面学的用户接口时,我们学习了两种,一是允许用户直接使用的命令接口,二是允许用户通过程序间接使用的程序接口,而程序接口就是由一组程序调用组成的
“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务
问题:为什么需要“系统调用”功能?
在现实生活中,在打印店打印东西,你按下了打印按钮,在你的东西打印到了一半的时候,另外的一个同学页按下了打印按钮,但是最后你们打印的东西没有混在一起,都是按照顺序打印出来的。
思考如果没有系统调用的话,每个进程能够随意访问系统资源的话,会出现什么情况,就会使得两位同学的需要打印的东西混在一起。
而这个的解决方法就是使用系统调用。
系统调用:操作系统提供“系统调用”功能,用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统发出请求。操作系统会对各个请求进行协调管理。(保证系统的安全性和稳定性)
系统调用和库函数:
普通应用程序:可直接进行系统调用,也可使用库函数。有的库函数涉及系统调用,有的不涉及。
编程语言:向上提供库函数。有时会将系统调用封装成库函数,以隐藏系统调用的一些细节,使上层进行系统调用更加方便。
操作系统:向上提供系统调用
不涉及系统调用的库函数:eg:“取绝对值”函数(简单的运算)
涉及系统调用的库函数:eg:“创建一个新文件”函数(会运用到资源)
系统调用过程:
传递系统调用参数->执行陷入指令(用户态)->执行系统调用相应服务程序(核心态)->返回用户程序
注意:
1.陷入指令是用户态执行的,执行陷入指令之后立即引发一个内中断,从而CPU进入核心态
2.发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
3.陷入指令是唯一一个只能在用户态下执行,而不能在核心态下执行的指令