为什么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的设计哲学。

  1. 职责分离

    进程的生命周期管理(如创建、调度)由内核负责,而决定哪些进程需要启动及其配置由用户空间的init进程管理。这样可以让内核保持简洁,减少复杂性。

  2. 灵活性

    通过init或其他替代方案,用户可以动态调整系统初始化逻辑,例如定义不同运行级别或自定义服务启动顺序(systemctl)。而将这些逻辑交给内核则会限制这种灵活性。

  3. 避免内核代码膨胀

    如果内核直接负责启动所有用户进程,它将不得不处理大量复杂的逻辑,例如服务依赖、配置文件解析等。这会导致内核代码变得庞大且难以维护。


2. 职责分离与模块化设计

UNIX操作系统遵循职责分离的设计哲学,将不同的功能模块化处理:

  • init负责: 高层逻辑,比如系统初始化和服务管理, 决定哪些服务或进程需要启动以及启动的顺序。
  • 内核负责: 提供底层机制(如forkexec)来实现进程创建和调度。

通过将进程管理的高层逻辑交由用户空间中的init进程负责,内核可以保持专注于底层资源管理,简化了自身的设计和实现。


3. 灵活性和可配置性

init进程是用户空间的程序,可以被系统管理员配置或替换为其他初始化系统(如systemdupstart)。这种灵活性使得不同的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进程启动其他进程?的更多相关文章

  1. Chromium的GPU进程启动流程

    转载请注明出处:http://www.cnblogs.com/fangkm/p/3960327.html 硬件渲染依赖计算机的GPU,GPU种类繁多,兼容这么多种类的硬件,稳定性是个大问题,虽然Chr ...

  2. Linux进程启动/指令执行方式研究

    1. 通过glibc api执行系统指令 0x1:system() glibc api system是linux系统提供的函数调用之一,glibc也提供了对应的封装api. system函数的原型为: ...

  3. Android 跨进程启动Activity黑屏(白屏)的三种解决方案

    原文链接:http://www.cnblogs.com/feidu/p/8057012.html 当Android跨进程启动Activity时,过程界面很黑屏(白屏)短暂时间(几百毫秒?).当然从桌面 ...

  4. Android系统init进程启动及init.rc全解析

    转:https://blog.csdn.net/zhonglunshun/article/details/78615980 服务启动机制system/core/init/init.c文件main函数中 ...

  5. Linux---从start_kernel到init进程启动

    “平安的祝福 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” ini ...

  6. 使用gdb跟踪Linux内核启动过程(从start_kernel到init进程启动)

    本次实验过程如下: 1. 运行MenuOS系统 在实验楼的虚拟机环境里,打击打开shell,使用下面的命令 cd LinuxKernel/ qemu -kernel linux-/arch/x86/b ...

  7. 实验三:gdb跟踪调试内核从start_kernel到init进程启动

    原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...

  8. Android系统启动流程(一)解析init进程启动过程

    整体流程大致如下:     1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...

  9. Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动

    姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...

  10. ARM-Linux移植之(三)——init进程启动流程分析

    我们通常使用Busybox来构建根文件系统的必要的应用程序.Busybox通过传入的参数来决定执行何种操作.当init进程启动时,实际上调用的是Busybox的init_main()函数,下面我们来分 ...

随机推荐

  1. .NET云原生应用实践(六):多租户初步

    本章目标 多租户简介 实现public租户下的用户数据隔离 出于开发进度考虑,本章暂不会完全实现多租户的整套体系,而是会实现其中的一小部分:基于默认public租户的数据隔离,并在本章节中会讨论多租户 ...

  2. Django之gunicorn部署

    安装: pip install gunicorn 启动应用: gunicorn -w 3 -k gthread -e DJANGO_SETTINGS_MODULE=settings.prod Serv ...

  3. 【架构】整理了一份通用的MVP框架示例代码

    最近回顾了一下MVP框架,结合阅读到的几篇不错的博客,自己整理了一份可用于实际工作的MVP框架示例代码,这里做个记录,也顺便和网友们分享一下. 代码示例演示的是一个输入员工号查询员工信息并显示的场景, ...

  4. 销讯通CRM系统如何管理医药代表的销售过程

    医药行业的销售代表与其他行业的销售代表在专业知识要求.客户群体.销售流程.以及行业特性等方面都存在明显的区别,他们必须具备更高的专业素养和综合能力. CRM(客户关系管理系统)在医药行业中对于管理医药 ...

  5. NET 6 中新增的LINQ 方法

    .NET 6 中添加了许多 LINQ 方法. 下表中列出的大多数新方法在 System.Linq.Queryable 类型中具有等效方法. 欢迎关注 如果你刻意练习某件事情请超过10000小时,那么你 ...

  6. 一款可以完整保留排版的PDF翻译,GitHub增长第一

    最近看论文较多,顺手给大家推荐一个用下来觉得不错的开源PDF翻译工具:PDFMathTranslate 目前这款开源项目在GitHub上已经收获了7.6K Star,而且由于一直处于增长趋势榜第一的位 ...

  7. 通过云主机调用API,一键训练部署商品问答模型

    本文分享自华为云社区<[开发者空间实践指导]CodeArts IDE调用API训练商品问答模型>,作者:开发者空间小蜜蜂. 一.案例介绍 在电子商务领域,售前和售后服务是确保客户满意度和提 ...

  8. 【Spring】【MyBatis】Spring整合MyBatis01

    这是一个Spring整合MyBatis的第一次尝试,对于文件的命名和存放位置,也许有些不太合理,请见谅 需要数据库的请查阅[Mybatis]学习笔记01:连接数据库,实现增删改 - 萌狼蓝天 本文档使 ...

  9. sudo: source: command not found

    在Ubuntu上配置了jdk(非root用户),要使它的配置生效,在执行 sudo source /etc/profile 的时候提示 ,sudo: source: command not found ...

  10. Qt开发经验小技巧276-280

    对MDI窗体区域设置背景颜色透明,会发现 QMdiArea{background:transparent;} 无效,哪怕是指定颜色 QMdiArea{background:#ff0000;} 或者 Q ...