区别有:1、替换性不同;2、调用接口不同;3、运行空间不同;4、返回值不同;5、移值性区别;6、运行时间区别;7、调用开销区别。系统调用通常不可替换,而库函数通常可替换。普通的库函数调用由函数库或用户自己提供,因此库函数是可以替换的。
1、替换性不同
系统调用通常不可替换,而库函数通常可替换。普通的库函数调用由函数库或用户自己提供,因此库函数是可以替换的。例如,对于存储空间分配函数malloc,如果不习惯它的操作方式,我们完全可以定义自己的malloc函数。
2、调用接口不同
系统调用通常提供最小接口,而库函数通常提供较复杂功能。例如sbrk系统调用分配一块空间给进程,而malloc则在用户层次对这以空间进行管理。
3、运行空间不同
系统调用运行在内核空间,而库函数运行在用户空间。因为系统调用属于内核,和库函数不属于内核。因此,如果当用户态进程调用一个系统调用时,CPU需要将其切换到内核态,并执行一个内核函数。
4、返回值不同
内核调用都返回一个整数值,而库函数并非一定如此。在内核中,整数或0表示系统调用成功结束,而负数表示一个出错条件。而出错时,内核不会将其设置在errno,而是由库函数从系统调用返回后对其进行设置或使用。
5、移值性区别
POSIX 标准针对库函数而不是系统调用,判断一个系统是否与POSIX需要看它是否提供一组合适的应用程序接口,而不管其对应的函数是如何实现的。因此从移值性来讲,使用库函数的移植性较系统调用更好。
6、运行时间区别
系统调用运行时间属于系统时间,库函数运行时间属于用户时间。
7、调用开销区别
调用系统调用开销相对库函数来说更大。很多库函数本身都调用了系统调用,那为什么直接调用系统调用的开销较大呢?这得益于双缓冲的实现,在用户态和内核态,都应用了缓冲技术,对于文件读写来说,调用库函数,可以大大减少调用系统调用的次数。而用户进程调用系统调用需要在用户空间和内核空间进行上下文切换,开销较大。如此以来,库函数的开销也就会比直接调用系统调用小了。另外一方面,库函数同样会对系统调用的性能进行优化。
延伸阅读:
什么是库函数
库函数(Library function)是将函数封装入库,供用户使用的一种方式。方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。调用的时候把它所在的文件名用#include<>加到里面就可以了。一般是放到lib文件里的。
一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数。
由于版权原因,库函数的源代码一般是不可见的,但在头文件中你可以看到它对外的接口库函数简介。
C语言的语句十分简单,如果要使用C语言的语句直接计算sin或cos函数,就需要编写颇为复杂的程序。因为C语言的语句中没有提供直接计算sin或cos函数的语句。又如为了显示一段文字,我们在C语言中也找不到显示语句,只能使用库函数printf。
C语言的库函数并不是C语言本身的一部分,它是由编译程序根据一般用户的需要编制并提供用户使用的一组程序。C的库函数极大地方便了用户,同时也补充了C语言本身的不足。事实上,在编写C语言程序时,应当尽可能多地使用库函数,这样既可以提高程序的运行效率,又可以提高编程的质量。
文章标题:系统调用和库函数有什么区别,发布者:小编,转载请注明出处:https://worktile.com/kb/p/38290