有一些用例,我不能有很多ram,有时由于基于docker的服务并不总是提供超过512mb/1gb的ram,或者如果我运行多个基于rust的gui应用程序,如果每个应用程序通常占用100mb的ram,我如何实现交换文件/虚拟ram超过分配的ram?此外,操作系统级别的交换文件不允许用户选择哪个应用程序可以使用实际内存和哪个交换文件,所以这也可能成为一个问题。我希望尽可能多地使用swap文件,如果可能的话,甚至不要使用真正的ram。用户和托管服务通常提供大量存储空间(通常超过10gb),所以这也是使用可用存储空间的好方法!如果交换文件或类似的东西是不可能的,我想知道是否有任何不同的速度和cpu消耗之间的缓存数据在ram;应用程序和"在文件中缓存数据,并在需要时读取";应用程序。如果后者通常很慢,没有swap文件那么高效,我想知道操作系统是如何使swap文件比apps更高效的。
应用程序无法控制它们分配的内存是在实际RAM上分配的,还是在交换分区上分配的,还是在其他地方分配的。你只需要请求内存,操作系统负责找到可用的内存给你。
除此之外,请注意使用swap(有时称为交换)非常坏的属性。具体多少取决于你的硬件,但大约是三个数量级。如果您正在与用户交互,这一点甚至会被放大:如果一个程序需要等待一分钟来获取一些资源,而不是因为系统负载很重而等待几毫秒,那么它就不会太麻烦了,但是用户通常不会那么耐心。还要注意,在交换时,操作系统不会随机选择哪个应用程序获得更快的RAM和哪个应用程序获得交换内存。它将尝试根据配置(至少对于Linux内核)确定哪个应用程序应该优先考虑多少等等,所以实际上,最终是用户决定哪些应用程序获得最多RAM(当然,提前:他们不会每次内核都用一个小弹出框提示他们做出决定…)。
最后,现代操作系统允许多个应用程序分配重叠的内存,只要每个应用程序没有完全使用它所要求的内存(这是一种常见的),允许您运行理论上需要比实际拥有更多内存的应用程序。
这是在操作系统部分:现在到应用程序部分。通常,当您编写程序(其目的与ram无关)时,您不应该真正关心内存消耗(在一定程度上),特别是在Rust中。这不仅通常是由操作系统处理的,以防你使用了太多的内存,而且在可能的情况下,大多数人更喜欢用更多的内存使用(甚至更多)来换取更好的CPU性能,因为RAM比CPU便宜得多。
当然,也有例外,在这种情况下,内存消耗是如此之高,以至于您不能真的不注意。在这些情况下,你要么让用户处理这个问题(即。众所周知,这个应用程序会消耗大量内存,因为没有其他方法可以做到这一点,所以如果你想使用它,就像电子游戏一样,或者你重新考虑你的应用程序,以减少内存使用,以提高CPU效率。例如当你处理完成图很大你甚至不能在所有世界的硬盘存储它们(在这种情况下,您的应用程序必须足够聪明能够工作图的一小部分),或最终你正在与一个大资源但可以存储在硬盘上,所以你把它写在一个文件和访问它chunks-by-chunks,一些数据库经理一样。