繁体   English   中英

为什么有些功能不涉及内核?

[英]Why some functions don't involve kernel?

《 UNIX环境第二版高级编程》第01章第11节中 ,有一句话:

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

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

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

通常,我如何识别某个函数不涉及内核?

从该句子的上下文看来,该功能似乎不会通过说“不涉及内核”来导致系统调用。

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

非常低的水平,是的,因为一个进程甚至不存在,但不启动它的内核,但是,这并不意味着在内核参与了每一项操作。 没有父母,您就不会存在,但这并不意味着您不能在没有父母参与的情况下穿好衣服。

如果您使用C语言编写了一个简单的函数,该函数只是取消引用了它的参数,那么这就是一个例程,并且不需要内核的支持:

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

一些库函数(例如atoistrcpy是这样的,它们不调用任何系统调用来利用内核提供的服务。

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

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

无论如何, atoi必须读取内存,为什么您也不认为“需要内存操作”呢?

通常,我如何识别某个函数不涉及内核?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM