0

Advanced Programming in the UNIX Environment 2nd Edition,第 01 章,第 11 节中,有一句话:

例如,printf 函数可能使用 write 系统调用来输出字符串,但 strcpy(复制字符串)和 atoi(将 ASCII 转换为整数)函数根本不涉及内核。

我不明白的是,为什么可能根本没有内核参与。不是所有的例程都需要内核支持吗?

另外,我可能会发现atoi只需要 CPU 计算。但是既然strcpy需要内存操作,为什么也不涉及内核支持呢?

一般来说,我怎样才能识别出一个函数不涉及内核?

4

2 回答 2

5

从那句话的上下文来看,这似乎意味着该函数不会通过说“不涉及内核”来导致系统调用。

于 2013-10-29T14:52:50.393 回答
3

我不明白的是,为什么可能根本没有内核参与。不是所有的例程都需要内核支持吗?

底层,是的,因为没有内核启动一个进程甚至都不存在,但这并不意味着内核参与每个操作。没有父母你就不会存在,但这并不意味着“没有父母的参与”你就不能穿衣服。

如果您在 C 中编写一个简单的函数,它只是取消引用它的参数,那是一个例程,它不需要内核的支持:

int func(int* p) { return *p; }

一些库函数,例如atoistrcpy,它们不会调用任何系统调用来使用内核提供的服务。

另外,我可能会发现atoi只需要 CPU 计算。但是既然strcpy需要内存操作,为什么也不涉及内核支持呢?

内核不用于在同一地址空间内将字节从一个地方复制到另一个地方。虚拟内存子系统可能涉及非常低的级别,将虚拟地址映射到物理地址,但几乎所有操作都是如此,即使(如果它不在寄存器中)读取或设置int!

反正atoi要读内存,为什么不考虑“需要内存操作”呢?

一般来说,我怎样才能识别出一个函数不涉及内核?

一般来说,如果不阅读函数的源代码,你就不能。但是,如果一个函数可以在纯 C 中实现,而不与内核提供的硬件或服务交互(例如派生新进程或与其他进程通信),那么它很可能不使用系统调用。一些操作系统提供了找出进程使用的系统调用的方法,例如strace实用程序,它会在进程调用系统调用时告诉您。您还可以通过插入来跟踪进程或拦截系统调用,但这非常复杂并且超出了此答案的范围。

于 2013-10-29T15:01:09.973 回答