为什么UNIX使用init进程启动其他进程?
为什么UNIX使用init进程启动其他进程?
在UNIX系统中,当系统启动时,内核完成初始化后会启动第一个用户空间进程,通常是init进程。init进程负责启动和管理其他用户空间进程,而内核本身并不直接处理这些任务。为什么UNIX采用这样的设计,而不是让内核直接负责启动所有进程?本文将从多个角度分析这种设计的背后逻辑与优点。
0. UNIX是否真的使用init进程?
RTFS,通过观察Linux内核源代码(这里),可以发现这段代码:
if (!try_to_run_init_process("/sbin/init") ||
!try_to_run_init_process("/etc/init") ||
!try_to_run_init_process("/bin/init") ||
!try_to_run_init_process("/bin/sh"))
return 0;
panic("No working init found. Try passing init= option to kernel. "
"See Linux Documentation/admin-guide/init.rst for guidance.");
这说明Linux真的会尝试启动一个init进程,甚至如果启动失败就“罢工”了。
同时观察pstree的输出:
VM: ~ > pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─acpid
├─2*[agetty]
├─dbus-daemon
├─mysqld───48*[{mysqld}]
├─nginx───2*[nginx]
├─sshd───sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
...
的确可以发现所有的进程都是由systemd“生长分化”(fork)出来的。
1. 为什么内核不直接启动所有进程?
尽管内核拥有启动进程的能力,但让内核直接启动所有进程并不符合UNIX的设计哲学。
职责分离
进程的生命周期管理(如创建、调度)由内核负责,而决定哪些进程需要启动及其配置由用户空间的init进程管理。这样可以让内核保持简洁,减少复杂性。灵活性
通过init或其他替代方案,用户可以动态调整系统初始化逻辑,例如定义不同运行级别或自定义服务启动顺序(systemctl)。而将这些逻辑交给内核则会限制这种灵活性。避免内核代码膨胀
如果内核直接负责启动所有用户进程,它将不得不处理大量复杂的逻辑,例如服务依赖、配置文件解析等。这会导致内核代码变得庞大且难以维护。
2. 职责分离与模块化设计
UNIX操作系统遵循职责分离的设计哲学,将不同的功能模块化处理:
init负责: 高层逻辑,比如系统初始化和服务管理, 决定哪些服务或进程需要启动以及启动的顺序。- 内核负责: 提供底层机制(如
fork、exec)来实现进程创建和调度。
通过将进程管理的高层逻辑交由用户空间中的init进程负责,内核可以保持专注于底层资源管理,简化了自身的设计和实现。
3. 灵活性和可配置性
init进程是用户空间的程序,可以被系统管理员配置或替换为其他初始化系统(如systemd或upstart)。这种灵活性使得不同的UNIX系统可以根据需求自定义其初始化逻辑,而无需更改内核。
> ls /usr/sbin/init -l
lrwxrwxrwx 1 root root 20 Dec 17 04:23 /usr/sbin/init -> /lib/systemd/systemd
- 内核的任务: 启动第一个用户空间进程(PID为1的
init)。 init的任务: 配置系统、启动服务、管理运行级别。
这种设计避免了将系统初始化的逻辑写入内核,使得系统更易于维护和扩展。
4. 总结
UNIX选择通过init进程启动和管理其他进程,而不是由内核直接完成,这是为了实现职责分离、增强灵活性、简化内核设计并提高系统的可维护性。
这种设计不仅遵循了UNIX的模块化哲学,还为系统的扩展性和灵活性提供了基础,体现了UNIX设计的简洁与优雅。
为什么UNIX使用init进程启动其他进程?的更多相关文章
- Chromium的GPU进程启动流程
转载请注明出处:http://www.cnblogs.com/fangkm/p/3960327.html 硬件渲染依赖计算机的GPU,GPU种类繁多,兼容这么多种类的硬件,稳定性是个大问题,虽然Chr ...
- Linux进程启动/指令执行方式研究
1. 通过glibc api执行系统指令 0x1:system() glibc api system是linux系统提供的函数调用之一,glibc也提供了对应的封装api. system函数的原型为: ...
- Android 跨进程启动Activity黑屏(白屏)的三种解决方案
原文链接:http://www.cnblogs.com/feidu/p/8057012.html 当Android跨进程启动Activity时,过程界面很黑屏(白屏)短暂时间(几百毫秒?).当然从桌面 ...
- Android系统init进程启动及init.rc全解析
转:https://blog.csdn.net/zhonglunshun/article/details/78615980 服务启动机制system/core/init/init.c文件main函数中 ...
- Linux---从start_kernel到init进程启动
“平安的祝福 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” ini ...
- 使用gdb跟踪Linux内核启动过程(从start_kernel到init进程启动)
本次实验过程如下: 1. 运行MenuOS系统 在实验楼的虚拟机环境里,打击打开shell,使用下面的命令 cd LinuxKernel/ qemu -kernel linux-/arch/x86/b ...
- 实验三:gdb跟踪调试内核从start_kernel到init进程启动
原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...
- Android系统启动流程(一)解析init进程启动过程
整体流程大致如下: 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...
- Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动
姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...
- ARM-Linux移植之(三)——init进程启动流程分析
我们通常使用Busybox来构建根文件系统的必要的应用程序.Busybox通过传入的参数来决定执行何种操作.当init进程启动时,实际上调用的是Busybox的init_main()函数,下面我们来分 ...
随机推荐
- .NET云原生应用实践(六):多租户初步
本章目标 多租户简介 实现public租户下的用户数据隔离 出于开发进度考虑,本章暂不会完全实现多租户的整套体系,而是会实现其中的一小部分:基于默认public租户的数据隔离,并在本章节中会讨论多租户 ...
- Django之gunicorn部署
安装: pip install gunicorn 启动应用: gunicorn -w 3 -k gthread -e DJANGO_SETTINGS_MODULE=settings.prod Serv ...
- 【架构】整理了一份通用的MVP框架示例代码
最近回顾了一下MVP框架,结合阅读到的几篇不错的博客,自己整理了一份可用于实际工作的MVP框架示例代码,这里做个记录,也顺便和网友们分享一下. 代码示例演示的是一个输入员工号查询员工信息并显示的场景, ...
- 销讯通CRM系统如何管理医药代表的销售过程
医药行业的销售代表与其他行业的销售代表在专业知识要求.客户群体.销售流程.以及行业特性等方面都存在明显的区别,他们必须具备更高的专业素养和综合能力. CRM(客户关系管理系统)在医药行业中对于管理医药 ...
- NET 6 中新增的LINQ 方法
.NET 6 中添加了许多 LINQ 方法. 下表中列出的大多数新方法在 System.Linq.Queryable 类型中具有等效方法. 欢迎关注 如果你刻意练习某件事情请超过10000小时,那么你 ...
- 一款可以完整保留排版的PDF翻译,GitHub增长第一
最近看论文较多,顺手给大家推荐一个用下来觉得不错的开源PDF翻译工具:PDFMathTranslate 目前这款开源项目在GitHub上已经收获了7.6K Star,而且由于一直处于增长趋势榜第一的位 ...
- 通过云主机调用API,一键训练部署商品问答模型
本文分享自华为云社区<[开发者空间实践指导]CodeArts IDE调用API训练商品问答模型>,作者:开发者空间小蜜蜂. 一.案例介绍 在电子商务领域,售前和售后服务是确保客户满意度和提 ...
- 【Spring】【MyBatis】Spring整合MyBatis01
这是一个Spring整合MyBatis的第一次尝试,对于文件的命名和存放位置,也许有些不太合理,请见谅 需要数据库的请查阅[Mybatis]学习笔记01:连接数据库,实现增删改 - 萌狼蓝天 本文档使 ...
- sudo: source: command not found
在Ubuntu上配置了jdk(非root用户),要使它的配置生效,在执行 sudo source /etc/profile 的时候提示 ,sudo: source: command not found ...
- Qt开发经验小技巧276-280
对MDI窗体区域设置背景颜色透明,会发现 QMdiArea{background:transparent;} 无效,哪怕是指定颜色 QMdiArea{background:#ff0000;} 或者 Q ...