函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分,不管是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类似于一个中断处理函数所有的系统调用都与上边的情况类似,靠中断机制切换到内核模式实现。
系统调用通常比库函数要慢,因为要把上下文环境切换到内核模式。