系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思,面向的事硬件。
库函数调用则面向的是应用开发,相当于应用程序的api。
采用这样的方式有很多原因:
-
双缓冲技术的实现。
-
可移植性。
-
底层调用本身的一些性能方面的缺陷。
-
让api也可以有了级别和专门工作面向。
系统调用发生在内核空间
系统调用通常用于底层文件访问,例如在驱动程序中对设备文件的直接访问。
系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。
库函数对文件的操作实际上是通过系统调用来实现的。例如 c库函数 fwrite() 就是通过 write() 系统调用来实现的。
系统调用会有用户空间到内核空间切换的开销。
使用库函数也有系统调用的开销,为什么不直接使用系统调用呢?
这是因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言)。这时,使用库函数就可以大大减少系统调用的次数。
这一结果又源于缓冲区技术,在用户空间和内核空间对文件操作都使用了缓冲区,例如用 fwrite() 写文件,都是先将内容写到用户空间缓冲区,当用户空间缓冲区满或者写结束时才将内核缓冲区内容写到文件对应的硬件媒介。
由于库函数对文件的操作最终是通过系统调用实现的,因此,每打开一个文件所获得的 file 结构指针都是一个内核空间的文件描述符 fd 与之对应。
系统调用是用户空间与内核空间之间交互的接口,用户空间不能直接访问内核空间,而必须通过系统调用才可访问,这是为了保证内核空间的稳定性和安全性
阅读(2362) | 评论(0) | 转发(0) |