我不明白的是,为什么可能根本没有内核参与。不是所有的例程都需要内核支持吗?
在最底层,是的,因为没有内核启动一个进程甚至都不存在,但这并不意味着内核参与每个操作。没有父母你就不会存在,但这并不意味着“没有父母的参与”你就不能穿衣服。
如果您在 C 中编写一个简单的函数,它只是取消引用它的参数,那是一个例程,它不需要内核的支持:
int func(int* p) { return *p; }
一些库函数,例如atoi
和strcpy
,它们不会调用任何系统调用来使用内核提供的服务。
另外,我可能会发现atoi
只需要 CPU 计算。但是既然strcpy
需要内存操作,为什么也不涉及内核支持呢?
内核不用于在同一地址空间内将字节从一个地方复制到另一个地方。虚拟内存子系统可能涉及非常低的级别,将虚拟地址映射到物理地址,但几乎所有操作都是如此,即使(如果它不在寄存器中)读取或设置int
!
反正atoi
要读内存,为什么不考虑“需要内存操作”呢?
一般来说,我怎样才能识别出一个函数不涉及内核?
一般来说,如果不阅读函数的源代码,你就不能。但是,如果一个函数可以在纯 C 中实现,而不与内核提供的硬件或服务交互(例如派生新进程或与其他进程通信),那么它很可能不使用系统调用。一些操作系统提供了找出进程使用的系统调用的方法,例如strace
实用程序,它会在进程调用系统调用时告诉您。您还可以通过插入来跟踪进程或拦截系统调用,但这非常复杂并且超出了此答案的范围。