简单说,库函数(library function)调用是语言或应用程序的一部分,而系统API调用是操作系统的一部分,系统调用是在操作系统内核发现一个“trap(自陷)”或中断后进行的。毫无疑问,两者都是用相同的编程语言编写的。
库函数调用 | 系统API调用 |
在所有的ANSI C编译器版本中,C函数库是相同的 | 各个操作系统的系统调用是不同的 |
调用的是函数库中的一个程序 | 调用的是系统内核的服务 |
与用户程序相联系 | 是操作系统的一个进入点 |
在用户地址空间执行 | 在内核地址空间执行 |
它的运行时间属于“用户”时间 | 它的运行时间属于“系统”时间 |
属于过程调用, 开销较小 | 需要切换到内核上下文环境然后切换回来,开销较大 |
在C函数库libc中有大约300个程序 | 在UNIX中有大约90个系统调用 |
典型的C函数库调用: system, fprintf,malloc | 典型的系统调用: chdir, fork, write,brk |
用文件指针(file pointer)来标识文件 | 用文件描述符(file descriptor)来标识文件 |
库函数调用通常比行内展开的代码(也就是inline函数)慢,因为它需要付出函数调用的开销。但系统调用比库函数调用还要慢很多,因为它需要把上下文环境切换到内核模式。在SPARC工作站上,一个库函数调用大约是半微秒。系统调用所需要的时间大约是库函数调用的70倍(35微秒)。纯粹从性能上考虑,你应该尽可能地减少系统调用的数量。但是,你必须记住,很多C函数库中的程序通过系统调用来实现功能。
ref:
Perter Van Der Linden《Expert C Programming Deep C Secrets》
-End-
联系客服