【发布时间】:2012-09-27 17:12:29
【问题描述】:
我想知道是否有任何 libc 函数不调用任何 syscall()?例如,对于 libc 函数“strcpy()”,它是否有任何系统调用(让我们考虑所有可能的 linux 系统)。
【问题讨论】:
标签: posix libc system-calls strcpy
我想知道是否有任何 libc 函数不调用任何 syscall()?例如,对于 libc 函数“strcpy()”,它是否有任何系统调用(让我们考虑所有可能的 linux 系统)。
【问题讨论】:
标签: posix libc system-calls strcpy
系统调用在性能方面非常重要,因为它们意味着将上下文切换到内核。因此,对于像strcpy 这样的简单库函数(其功能实际上等同于while(*d++ = *s++),但可能针对架构进行了优化),系统调用没有任何意义。
请注意,复制期间的页面错误可能会导致内核上下文切换和系统调用的出现,但这不是strcpy 直接调用系统调用的结果。
【讨论】:
系统调用有点像从用户空间(程序运行的地方)到内核空间的接口。当你在做只有内核才能做的事情时需要它们,比如与硬件通信(例如从网卡读取字节,启动进程,甚至通过 malloc 分配内存(使用brk)等)。
另一方面,像strcpy 这样的Userland 函数没有缩进来执行系统调用。他们不需要特殊的权限来做他们所做的事情,他们只是在用户空间中对进程的内存进行操作。
由于系统调用会带来重大的性能损失(将模式从用户模式切换到内核模式并返回代价高昂),因此从设计的角度来看,将它们放在像 strcpy 这样经常调用的函数中是没有意义的,因此不太可能被看到。
【讨论】: