目录
1、系统调用
什么是系统调用?有何作用?
系统调用是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务
系统调用与库函数的区别:
不涉及系统调用的库函数:如"取绝对值"的函数
涉及系统调用的库函数:如"创建一个新文件"的函数
下面是具体的内容:
系统调用(System Call)和库函数(Library Function)是在编程中常见的两个概念,它们有以下区别:
- 定义和实现:系统调用是操作系统提供的接口,用于访问操作系统的功能和服务。它们是操作系统内核中的一部分,以底层的方式实现。库函数是由编程语言或第三方库提供的函数,用于执行特定的任务。它们是在用户空间实现的,通常是通过调用系统调用来实现其功能。
2.访问权限:系统调用提供了对底层操作系统的功能的访问权限,例如文件操作、进程管理、网络通信等。它们通常需要特定的权限和系统级别的访问。库函数提供了更高级别的功能,封装了对底层系统调用的调用,并提供更简洁和易用的接口,供开发者在应用程序中使用。
性能开销:由于系统调用涉及从用户空间切换到内核空间,涉及上下文切换和内核态与用户态之间的切换,因此执行系统调用会有一定的性能开销。相比之下,库函数是在用户空间执行的,通常具有更低的开销。
使用场景:系统调用通常用于访问操作系统底层的功能和服务,例如创建进程、读写文件、网络通信等。库函数则提供了更高级别的功能,如字符串操作、数学计算、图形界面等。开发者可以根据具体需求选择使用系统调用或库函数。
总的来说,系统调用提供了对操作系统底层功能的直接访问,而库函数提供了更高级别、更易用的接口,封装了对系统调用的调用。在编程中,我们可以根据需求选择使用系统调用或库函数,以实现所需的功能。
那么用户一般什么情况下使用库函数而不使用系统调用?一般什么情况下使用系统调用而不使用库函数呢?
**一般情况下,**开发者更倾向于使用库函数而不直接使用系统调用 ,原因如下:
1. 方便性和易用性:库函数提供了更高级别、更易用的接口,封装了对系统调用的调用。使用库函数可以简化开发过程,减少编码量,并提供更友好的编程接口。
2. 跨平台兼容性:库函数通常是跨平台的,可以在不同的操作系统上使用,而系统调用的接口和语法可能因操作系统的不同而有所差异。使用库函数可以提高代码的可移植性。
3. 性能优化:库函数通常会进行一些优化,以提高执行效率。库函数的实现可能会使用一些算法和技巧,以减少系统调用的次数或提高系统调用的效率。
然而,有些情况下,开发者可能需要直接使用系统调用,例如:
1. 需要底层功能:某些特定的功能可能只能通过系统调用来实现,例如底层的文件操作、进程管理、网络通信等。在这种情况下,直接使用系统调用可以获得更精确的控制和更底层的功能。
2. 对性能要求较高:在某些性能敏感的场景下,直接使用系统调用可以避免库函数的额外开销和封装,从而提高执行效率。
3. 定制需求:某些特定的需求可能无法通过库函数满足,需要直接调用系统调用来实现定制化的功能。
需要注意的是,直接使用系统调用需要对操作系统的接口和语法有一定的了解,并需要处理底层的细节和错误处理。因此,在一般情况下,使用库函数是更为常见和推荐的做法。只有在特定的需求和场景下,才需要直接使用系统调用。
为什么系统调用是必须的?
去学校打印店打印论文,你按下了WPS的打印选项,打印机开始工作;当你的论文打印到一半时,另一位同学按下了Word的打印按钮开始打印自己的论文。
如果两个进程可以随意地,并发地共享打印机资源,会发生什么情况?
两个进程并发运行,打印机设备交替地接收到WPS和Word两个进程发来的请求,结果两篇论文论文地内容混杂在一起了......
解决办法:由操作系统内核对共享资源进行统一的管理,并向上提供"系统调用",用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求,内核才会对各个请求进行协调处理。
什么功能要用到系统调用?
应用程序通过系统调用请求操作系统的服务,而系统中的各种共享资源都由操作系统内核统一管理,因此凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成,这样就可以保证系统的稳定性和安全性,防止用户进行非法操作。
系统调用的过程:
总结就是:应用程序先发出请求:多个传参指令(让cpu知道我用cpu干什么)+陷入指令(让cpu进入内核态),进入内核态后:系统调用程序通过之前的指令,调用相应的服务,服务完成,转回用户态
注意事项:
1、陷入指令是在用户态执行的,执行陷入指令后立即引发一个内中断,使CPU进入核心态
2、发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
本节思维导图:
~over~