函数库调用和系统调用的区别

函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分,不管是java还是python的I/O最后都是通过read和write这样的系统调用来完成的
 
系统调用是用户程序和内核交互的接口
| 函数库调用                                  | 系统调用                                     |
|---------------------------------------------+----------------------------------------------|
| 在所有的ansi c编译器版本中,c库函数是相同的 | 各个操作系统的系统调用时不同的               |
| 它调用函数库中的一个程序                    | 它调用系统内核的服务                         |
| 与用户程序相联系           important        | 是操作系统的一个入口点                       |
| 在用户地址空间执行         important        | 在内核地址空间执行                           |
| 它的运行时间属于用户时间    important       | 它的运行时间属于系统时间                     |
| 属于过程调用,开销较小      important       | 需要切换到内核上下文环境然后再切换回来开销大 |
| 在C函数库libc中有大约300个程序              | 在unix中有大约90个系统调用(MS-DOS)中少一些   |
 
自己总结
| 函数库调用             | 系统调用             |
|------------------------+----------------------|
| 通常提供比较复杂的功能 | 通常提供一种最小界面 |
 
system是一个库函数 strlen并不调用任何系统调用
 
int main()
{
    int fd = create("filename",0666);
    exit(0);
}
 
在执行main函数时,是在user mode下执行,当遇到create函数时,继续在user mode下执行,然后将filename和0666两个参数压入栈中寄存器,接着调用库函数create,系统仍然处于user mode。这里的库函数create实际上调用了内核的系统调用create,执行到这里后,系统将create系统调用的unique number压入寄存器,然后执行指令trap使系统进入kernel mode(执行int $0x80产生中断)。这时系统意识到要进行系统调用的invoke,于是从刚才的寄存器中取出create系统调用的unique number,从系统调用表中得知要invoke的系统调用是create,然后执行。执行完毕返回库函数create的调用,库函数负责检查系统调用的执行情况(检查某些寄存器的值),然后库函数create根据检查的结果返回响应的值。
 
这里trap指令类似于一个系统中断并且是软中断,而系统调用create类似于一个中断处理函数所有的系统调用都与上边的情况类似,靠中断机制切换到内核模式实现。
 
系统调用通常比库函数要慢,因为要把上下文环境切换到内核模式。
原文地址:https://www.cnblogs.com/qianye/p/2786352.html