应用程序启动流程

应用程序启动流程

为什么当我单击打开应用程序(例如 Firefox 或 VLC)时,它会在大约 5 或 10 秒后启动?我可以加快启动时间吗?通常要等待 10 秒钟才能打开浏览器或任何其他应用程序(如软件中心)吗?这取决于什么?我有赛扬双核 CPU 1007u 和 Ivy Bridge 显卡。我认为它适合正常使用,例如上网或看电影。提前谢谢。

答案1

这个答案更像是一个 Wiki,在尝试使用 Preload 或 Prelink 之前应该先阅读并理解它。

我们首先需要了解 Linux 下应用程序是如何启动的,我不会对 Windows 进行评论。Linux 在设计上是安全的,那么我们真正的意思是什么呢?

应用程序启动流程

Linux 程序通常由引用多个共享库的二进制可执行文件组成。这些库被加载到内存中一次并由多个可执行文件共享。为了实现这一点,动态链接器(即 ld.so)需要更改内存中的二进制文件,以便库对象的任何地址都指向内存中的正确位置。对于具有许多共享库的应用程序(例如 GUI 程序),该过程可能需要一些时间。对于大多数小型程序,这种动态链接非常快。但是当启动较大的程序时,它可能需要时间。我的意思是相当长的时间。

Linux 使用 ASLR 来随机化内存中的地址。地址空间布局随机化 (ASLR) 背后的理念之一是每次运行程序或加载库时随机化这些位置,以便恶意程序无法轻松且可重复地预测地址

让我们通过 Context 来理解什么是预加载、什么是预链接,以及它们如何帮助减少应用程序启动时间。

首先让我们看一下预加载。

预加载是将目标文件放入并保存到 RAM 中的行为。这样做的好处是,预加载的应用程序启动速度更快,因为从 RAM 读取的速度总是比从硬盘读取的速度快。但是,部分 RAM 将专用于此任务,但不会比您保持应用程序打开时占用更多空间。因此,预加载最适合用于大型且经常使用的应用程序,例如 Firefox 和 LibreOffice。

Preload 是一个自适应的预读守护程序。它会在一段时间内观察应用程序的启动情况。了解应用程序的启动行为。它会收集信息并根据这些信息开始将程序所需的库预加载到设备 RAM 中。因此,在一段时间内,应用程序的启动时间会大大减少,应用程序的启动速度也会更快。

由于 Preload 需要内存来存储程序代码,因此系统无论如何都应该有超过 1GB 的内存。

速度提升最多可达 55%。不过,这在安装后无法立即检测到。Preload 需要几天或一两周的时间才能生成可靠的统计数据。该统计数据使用 Preload 将相应程序的代码加载到内存中。

现在让我们看看预链接

在大多数系统中,库不会经常更改,并且当程序运行时,每次链接程序的操作都相同。Prelink 利用了这一点,通过执行链接并将其存储在可执行文件中,实际上是对其进行预链接。

理想情况下,它取消了地址的随机化,这意味着很容易预测库的存储位置,因此可以快速访问库。这反过来又大大减少了启动时间。

预链接背后的理念相当简单:通过提前执行并存储结果来减少动态链接器执行这些地址重定位所需的时间。预链接程序处理 ELF 二进制文件和共享库的方式与 ld.so 大致相同,然后将特殊的 ELF 部分添加到描述重定位的文件。当 ld.so 加载预链接的二进制文件或库时,它会检查这些部分,如果库已加载到预期位置并且库未发生更改,它就可以更快地完成其工作。

这意味着在变化不大的系统中。库在很长一段时间内保持不变,例如 Ubuntu LTS/RHEL/CentOS/Debian 基本固定版本的发行版,Prelink 将运行得更好并提供出色的结果。

只有一个 Caviat。

预链接需要安排时间,它需要在库/程序升级后运行,因为库正在发生变化。可以使用简单的 Cron 作业来实现这一点,也可以偶尔手动运行它。

因此,我们可以从技术上将 Preload 和 Prelink 结合起来。然而,prelink 仍然像是一种 Hack,但您的里程可能会有所不同。无论如何,我都会尝试一下。如果我使用的是 Debian 或 CentOS 之类的系统,我肯定会同时使用 Preload 和 Prelink。

更多信息请参考。

http://sysmagazine.com/posts/108454/

https://wiki.archlinux.org/index.php/Preload

https://wiki.archlinux.org/index.php/Prelink

http://lwn.net/Articles/341244/

https://wiki.gentoo.org/wiki/Prelink

答案2

一个简单的建议是禁用不太重要的附加组件。这对我很有效。

相关内容