2011-05-22 42 views
1

什么是内存中函数调用?有人可以请我指点一些资源,讨论这种技术及其优点。我需要更多地了解他们,目前不知道该去哪里。谷歌似乎没有帮助,因为它把我带到了认知和神经系统等领域。内存中函数调用

+1

你能更好地指定你的意思吗?你在哪里读过这个词? – sarnold 2011-05-22 23:48:54

+0

尽我所知:如果一个程序或一组程序非常大,在运行时,它们被分配的内存被认为是按功能分配的。这意味着,对于一组活动的程序,某些功能在内存中(这意味着调用很快),而其他功能则不在内存中,因此调用速度较慢。这个想法是以某种方式只能调用(尽可能)一次在内存中的函数。 – Ketan 2011-05-23 00:31:24

+0

6个问题,没有被接受的答案? – Joe 2011-05-23 01:58:02

回答

1

假设你的解释性评论是正确的(我必须看到你的问题的原始来源以确保.. )这可能是(a)函数绑定时间或(b)demand paging的问题。

功能绑定

当一个程序启动时,连接器/加载器发现不属于文件中解析可执行文件中的所有函数引用。它搜索所有链接库以查找缺失的函数,然后进行迭代。至少Linux ld.so(8)链接器/加载器支持两种操作模式:LD_BIND_NOW强制所有符号引用在程序启动时解析。这非常适合查找错误,这意味着首次使用函数和重复使用函数没有任何损失。它可以大大增加应用程序加载时间。如果没有LD_BIND_NOW,功能将根据需要进行解析。这对于与大型库链接的小程序非常有用,因为它只能解决所需的少量功能,但对于较大的程序,这可能需要在程序生命周期内从磁盘重新加载库,而且可以显着影响影响应用程序运行的响应时间。

按需分页

现代操作系统内核耍弄更virtual memory物理存储器。无论机器中安装的物理内存的实际数量多少,每个应用程序都认为它可以访问4 GB内存(对于32位应用程序)或更多内存(对于64位应用程序)的整个机器。每页内存需要一个备份存储,如果页面必须在内存压力下从物理内存中移出,将用于存储该页面的驱动器空间。如果它是纯粹的数据,它将被存储在交换分区交换文件中。如果它是可执行代码,那么它将被简单地删除,因为如果它需要是,它可以在未来从文件中重新加载。请注意,这不会在逐个功能的基础上发生 - 相反,它发生在,这是一个与硬件相关的功能。在大多数32位平台上考虑4096个字节,或许在其他架构上可能或多或少,并且使用特殊的框架,大于2兆字节或4兆字节。如果缺少页面的引用,memory management unit将发出page fault的信号,内核将从磁盘加载丢失的页面并重新启动进程。

+0

嗨,我很好奇,如果一个可执行文件编写得不好,它有很多像外部函数(比如.so文件)引用类似函数的死代码,但只有100个这样的函数在运行时被实际调用,LD_BIND_NOW = 1会比LD_BIND_NOW没有设置?因为过程连接表将包含900个无用的功能地址?在内存占用和性能的意义上更糟(因为我不知道查找是否为O(n))。提前致谢! – Hei 2017-12-19 00:58:37

+0

@Hei,最好问这是一个新问题,以获得获得高质量答案的最佳机会。我怀疑这种情况下的LD_BIND_NOW性能与需求绑定相比会非常痛苦,但LD_BIND_NOW的安全性好处可能使得它的价值完全相同。 – sarnold 2018-01-05 00:40:35

+0

谢谢。刚刚开始另一篇文章:https://stackoverflow.com/questions/48109146/ld-bind-now-can-make-the-executable-run-slower – Hei 2018-01-05 07:37:26