我通读了this very interesting q/a about how computers reboot,虽然我对操作系统开发知之甚少,但我想知道你是否可以部分关闭系统,然后从那时开始重新启动。
例如,在Linux上,如果我在关机期间正确读取输出,它会有点像这样:
启动顺序有点像:
那么我们可以在2之后关闭,然后从3开始重新开始吗?基本上我认为这应该重置进程和守护进程,同时将内核保留在内存中,从而在正常(重新)启动时节省内核加载时间。
答案 0 :(得分:3)
专注于Linux:
“重新启动”用户空间(以及一些硬件部分)
在启动这些服务,后台进程和程序的方式方面,您缺少引导序列中的内容。
在Linux上输入init
。 /sbin/init
的目的,可以是系统V init,upstart或systemd,正是启动所有这些其他过程。所有这些init实用程序都具有管理它们在其下运行的服务的功能。
现在,linux系统也有运行级别的概念,即:
0 = shutdown
1 = single user recovery mode, no networking
2 = ?
3 = multi user networking no X
4 = ?
5 = multi user networking X
?没有严格定义。无论如何,如果你现在su并root并输入init 3
,假设你在Linux上,X和每个x客户端将被终止。当然,如果在给定的运行级别上允许某些内容,它将不会被终止,但如果您只想重新启动某个进程,那么这可以很好地实现。重新启动系统守护程序的用例是为了响应更新,现在大多数程序包管理器实际上都会通过您选择的initscript工具为您执行此操作。
因此我们可以重新启动整个GUI,我们可以重启任何守护进程。我们也可以杀死任何其他进程。重装硬件驱动程序?我已经可以通过modprobe
动态执行此操作,因此,如果我想了解我的图形驱动程序的更新,我可以init 3
,删除旧的,插入新的并继续。
您的程序包管理器知道如何重新启动系统守护程序,您始终可以按照其建议注销并重新登录;因此,Linux在避免重新启动方面已经相当高效。
“重启”内核
所以基本上,我认为大多数Linux都可以“重新启动”而不需要实际重启。那么现在还剩下什么?
现在,问题是你如何重新加载内核?那么内核实际上并不是什么特别的魔法,它只是另一个复制到内存中的计算机程序,所以我们可以编写一个程序来编写内核并将执行传递给它......
这是否存在,信不信由你,并被称为kexec
。我将离开wikipedia page来总结问题:
与系统关闭不同,kexec不会为您自动停止文件系统或进程;你对此负责。虽然可行,但实施kexec等机制会带来两大挑战:
- 新内核将覆盖当前正在运行的内核,而它仍在执行
- 新内核通常希望所有物理设备都处于定义良好的状态(因为它们在系统重启后,当BIOS(或固件)将它们重置为“理智”状态时)。绕过真正的重启可能会使设备处于未知状态,新内核将不得不从中恢复。
醇>
所以你有它。根据您需要重新加载的部分,在Linux上,大部分都是可能的。
答案 1 :(得分:0)
大多数处理器/计算机制造商都有几种不同的电源状态,计算机可以处于这种状态。英特尔可能最适用于您的问题,这听起来像是关于通用计算机。看看这个链接:
要了解有关电源状态如何为intel工作的更多信息,在每个状态中保留哪些系统上下文等。通常,您输入的S状态越高,需要保留的系统上下文越少,因此系统退出该状态并返回S0(完全可操作)所需的时间越长。