什么是系统调用
简单的说,系统调用就是一些供用户程序使用的,用于对系统内核进行访问的接口。
从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统内核提供,运行于内核态;而普通的函数调用由函数库或用户自己提供,运行于用户态。
系统调用是怎么工作的?
一般的,进程是不能访问内核的。它不能访问内核所占内存空间也不能调用内核函数。CPU硬件决定了这些(这就是为什么它被称作”保护模式”)。系统调用是这些规则的一个例外。其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。在Intel CPU中,这个由中断0x80实现。硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统的内核—–所以你就可以为所欲为。
进程可以跳转到的内核位置叫做sysem_call。这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程(或到其他进程,如果这个进程时间用尽)。
系统调用与库函数调用的区别
库函数调用是语言或应用程序的一部分,而系统调用是操作系统的一部分。
函数库调用 | 系统调用 |
---|---|
在所有的ANSI C编译器版本中,C库函数是相同的 | 各个操作系统的系统调用是不同的 |
它调用函数库中的一段程序(或函数) | 它调用系统内核的服务 |
与用户程序相联系 | 是操作系统的一个入口点 |
在用户地址空间执行 | 在内核地址空间执行 |
它的运行时间属于“用户时间” | 它的运行时间属于“系统”时间 |
属于过程调用,调用开销较小 | 需要在用户空间和内核上下文环境间切换,开销较大 |
在C函数库libc中有大约300个函数 | 在UNIX中大约有90个系统调用 |
典型的C函数库调用:system fprintf malloc | 典型的系统调用:chdir fork write brk |
库函数调用通常比行内展开的代码慢,因为它需要付出函数调用的开销。但系统调用比库函数调用还要慢很多,因为它需要把上下文环境切换到内核模式。
系统调用耗时
关于系统调用耗时,可参考
https://www.cnblogs.com/syntax/archive/2012/11/05/2755129.html
参考:
1.《C专家编程》附录A
2.https://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/index.html