我有一个运行 Linux 的嵌入式设备。
我正在尝试加快启动顺序。用 C 语言重写大部分启动顺序是否会加快速度?
例如,我有很多脚本可以测试这个或那个,然后挂载这个或那个。这是 /etc/rcS.d/S03sysfs
#!/bin/sh
if [ -e /proc ] && ! [ -e /proc/mounts ]; then
mount -t proc proc /proc
fi
if [ -e /sys ] && grep -q sysfs /proc/filesystems; then
mount sysfs /sys -t sysfs
fi
exit 0
我猜测如果它是用 C 语言编写的,那么速度会快得多,对吗?
我的问题:
为什么它还没有用 C 语言编写?
用 C 语言编写会提高速度吗?
答案1
这将是有些在 C 中速度更快,但语言选择并不是影响性能的最大因素。并行执行各种任务通常比等待每个任务按顺序完成(如更简单的 init 系统那样)更有效。例如,sshd和httpd可以同时启动,因为它们都不需要对方已经运行。
没有单一的“Linux 启动顺序”。每个发行版都有自己的启动顺序;它们甚至没有一个共同点。它能可以用 C、Perl、Haskell 或任何语言编写;唯一的要求是名为的可执行文件/init
必须存在于 initramfs 或/sbin/init
根文件系统中。
该/etc/rc?.d
方案只是 20 年前甚至 30 年前 Unix 启动过程的扩展。最早的 Unix 系统很少重新启动,因此它们会有一个简单的脚本/etc/rc
或类似的东西,由在里面并依次启动各个守护进程。
即使在今天SysV 初始化用于启动所有此类脚本,尽管具体方法可能有所不同。最初,系统会按/etc/rc?.d
顺序启动所有脚本;目前 Debian 使用 Makefile 样式的依赖关系。
一些发行版(Ubuntu、Chrome OS、Fedora v14 及以上版本)已切换到暴发户,它是用 C 编写的,并且是“基于事件的”,允许守护进程并行启动。另一个 init 系统,systemd,似乎正在迅速流行起来——它是 Fedora 和 OpenSuSE 的默认语言。它也是用 C 编写的。(这两个系统仍然读取文本配置文件来决定要启动哪些守护进程。)
那些仍然坚持使用 SysVinit 的发行版通常是为了“简单”;最常听到的[需要引用]论点似乎是关于 shell 脚本比等效的 C 代码更容易维护(尽管所述 shell 脚本 90% 都是复制粘贴的),以及对引入额外库依赖性的极度恐惧[主观]。你可以自己看看这,这,这和这自 2012 年 5 月起,Debian 邮件列表上的讨论主题。
(免责声明:我是systemd用户自己。
答案2
为什么它还没有用 C 语言编写?
为了跨平台兼容性,也因为它允许使用 sh 文件来描述启动过程。用 C 维护启动脚本会很麻烦。
用 C 语言编写这个程序会提高速度吗?
不多。虽然有些部分会更快,但整体速度提升幅度很小。大多数启动过程都是严格顺序的,特别是 init 1 和 2 中的步骤。从 init 3 开始,可以使用类似以下方法并行化启动过程运行,这将为你带来巨大的速度提升。
答案3
它大部分的时间都在等待一个又一个的事情:文件系统、网络等等。
如果你想要真的快速启动顺序,使用 init=/bin/sh 启动 - 即时命令提示符!如果是嵌入式系统,您可以让它直接启动到您的应用程序中。