如果你们消息通达,善于在字里行间找线索,相信你们已经知道我写的是什么。但即使这样你们也会发现这个故事很有趣。所以拿起一杯咖啡,坐下,请我讲故事。

这篇故事很长,很长,很长……,我也仅能建议大家读完这篇文章,一句话证明你读了这篇文章:我们在实验一种新的初始化系统,它很有趣。

代码在这里,故事在这里。

进程号为一的进程

在每一个Unix系统中都存在一个有着特定进程识别号为1的进程。它由内核启动,并在其他所有进程优先启动。它是所有进程的父进程,特别是那些没有孩子的进程(子进程)。并且它也对其他进程不管的事多管闲事,例如在启动时开启并维护用户空间。

曾经在Linux中扮演PID为1的进程的角色由古老的演员sysvinit扮演,虽然它已年老珠黄。许多人试图取代它,有一个真的成功了:Upstart,它现在在许多的主流发行版中已经入户。

就像我们提到的那样,一个初始化系统的主要责任在于启动用户空间。一个好的初始化系统会快速的完成它。不幸的是,传统的SysV初始化系统并不很快。

一次快速并有效的启动,两件事非常重要。

  • 少启动

  • 并行的启动更多

什么意思?少启动意味着启动更少的服务或者延迟它们直到这些服务真的被需要。有一些服务它们早晚会被用到,例如syslog,D-Bus,等等,但大多数其他的服务并不是这样。例如,bluetoothd并不需要直到一个蓝牙适配器被插入或者一个程序想要与它的D-Bus接口沟通。对于打印系统也是这样,除非计算机真的与打印机相连,或者一个程序想要打印的点什么,否则CUPS服务没必要开启。如果计算机未与网络相连,那就没必要开启Avahi服务,除非程序想要使用它的API。SSH也是一样,没人想要连接你的机器,那就没必要开启它,只要它在第一次连接时被开启就好。(但是你得承认,大多数sshd服务开启的机器会一直监听,虽然他们每个月被连接一次,或更久)

并行的启动更多意味着如果我们不得不启动一些东西,我们不应该序列化启动他们(sysvinit就是这样做的),而应同时启动他们,这样可用的CPU和磁盘IO带宽就会被最大化利用,而整体的启动时间就会降为最低。

动态的改变硬件与软件

现代的系统(尤其是通用系统)因为他们的配置和用途而特别的动态化:它们是移动的,不同的软件启动或停止,不同的硬件拔出或插入。一个初始化系统应有一个服务监控着软硬件的改变。当运行一个程序或启用一个硬件,它需要动态的开始(有时停止)服务。

当前大多数系统尝试并行化启动系统仍然需要同步服务的启动:对于D-Bus和Avahi,Avahi需要D-Bus,因此D-Bus需要先启动,当D-Bus发信号他已准备就绪,Avahi才会同时启动。其他服务也是一样:libvirtd和X需要HAL(好吧,我在这里单讲Fedora13,不考虑HAL其实是独立的),因此HAL先被启动,在libvirtd和X之前。Libvirtd同时需要Avahi,因此它也要等待Avahi。同时他们都需要syslog,在syslog被启动并初始化前,它们只有等着。

如此循环。

并行化套接字服务

这种启动同步导致启动进程的一个很重要部分的序列化。我们不能避免这种同步和序列化带来的开销吗?可以。那样,我们就需要明白每一个后台进程到底要从其他进程身上扒什么皮,并且为什么它们的启动被滞后。对于传统的Unix后台进程,只有一个答案:他们在等待其他后台进程提供的套接字已准备好。通常对于一个文件系统存在一个AF_UNIX套接字,但它也可以是AF_INET[6]。例如,D-Bus的客户端等待着/var/run/dbus/system_bus_socket可以被连接,syslog的客户端等待着/dev/log,CUPS的客户端等待着/var/eun/cups/cups.sock,NFS的挂载等待着/var/run/rpcbind.sock和portmapper的IP端口。例子还有很多。想想吧,这是他们真的等着的东西。

那么,如果这就是他们在等着的东西,如果我们接管这些套接字使他们可以早点被连接,并让他们等待这个过程而不是完整的服务启动,那么我们就可以加速启动并并行启动更多进程。怎么做?事实上在类Unix系统上很简单,我们可以在我们真正启动服务之前创建监听套接字,并在针对他们的exec()传递套接字。这样,我们就可以对所有服务创建一个套接字,然后启动服务。如果一个服务还需要其他的套接字,并且他还没有完全的被启动。放轻松,连接会在提供者服务中排队,客户端会被暂时阻隔,并只在那个请求上被阻隔。同时,服务之间的依赖不再需要被配置以允许恰当的并行启动,我们启动所有的套接字,一个服务需要连接的话,它一定会连上。

这是后续步骤的核心,请允许我用不同的措辞再说一遍:如果你同时启动了syslog服务和syslog的不同客户端,在这个例子中,客户端的消息会存储在/dev/log套接字缓存中。只要缓存未满,客户端就不需等待直接进行启动。Syslog启动完成后,他会处理队列中的消息。再举一例:我们同时启动D-Bus和几个客户端。如果一个同步消息被发出,同时希望收到一个回应,这个客户端就会进入阻塞状态,仅有一个客户端,直到D-Bus能够处理它后才会解除。

转载于:https://blog.51cto.com/tiaonmmn/1674238

Systemd:再一次的,回归第一进程相关推荐

  1. sql 分组后按时间降序排列再取出每组的第一条记录

    sql 分组后按时间降序排列再取出每组的第一条记录 原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时 ...

  2. 计算机广东大专院校排名2018,重磅!广东85所专科院校官方排名刚刚出炉,这所高职回归第一!...

    来源:高考直通车综合自广东省教育厅一个大专院校办学质量如何?广东教育部门组织的"创新强校工程"考核是一个重要的参考评价.就在昨天(29日),广东省教育厅就公布了2020年度高等职业 ...

  3. SnnGrow快讯:微软 Win7/8.1 今日结束支持,不会再获得安全更新、AI工程化进程加速,人工智能需要怎样的数据?

    1.换人了.裁员了.洗牌了,中国云计算十大变局 2022年是云计算产业的变阵之年,行业走势.产业格局.技术架构.政策背景都在悄然发生剧变,影响每一个产业人.这一年,全球科技行业寒潮下的大裁员波及云计算 ...

  4. 对抗样本攻防战,清华大学TSAIL团队再获CAAD攻防赛第一

    最近,在全球安全领域的殿堂级盛会 DEF CON 2018 上,GeekPwn 拉斯维加斯站举行了 CAAD CTF 邀请赛,六支由国内外顶级 AI 学者与研究院组成的队伍共同探讨以对抗训练为攻防手段 ...

  5. Windows 8.1 应用再出发 - 创建我的第一个应用

    转眼间Windows 8.1已经发布了四个多月,之前因为开发需要对Windows 8.1新特性进行过零散的学习和使用,一直没有静下心来系统的学习过.近日部门有几名新同事加入,需要进行Windows 商 ...

  6. OK6410开发板资源介绍---嵌入式回归第一篇

    一晃时隔大半年了,今天起重新开始学习国嵌的OK6410 精通嵌入式课程,之前学到第四季老大视频没更完,而且更的实在太慢了,大学那会刚开始学的时候也走了不少弯路,不过当时充满了学习的激情,前面的更的视频 ...

  7. BTS环球俱乐部,去中心化价值回归第一站

    投资大师股神巴菲特曾说过,"人生就像滚雪球,关键是要找到足够长的坡和足够湿的雪".从投资的维度来讲,这里的"长坡"可以理解为投资标的物的长期价值,而" ...

  8. linux 初始化工作进程 systemd简介

    从 init 系统说起 linux 操作系统的启动首先从 BIOS 开始,接下来进入 boot loader,由 bootloader 载入内核,进行内核初始化.内核初始化的最后一步就是启动 PID ...

  9. UNIX再学习 -- 守护进程(转)

    参看:守护进程 一.什么是守护进程 守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程.它是一个生存期较长的进程,通常独立于控制 ...

最新文章

  1. RHEL6网络相关配置
  2. 路由器OSPF协议配置命令一
  3. 第三次学JAVA再学不好就吃翔(part95)--Collections工具类
  4. c++ 构造函数数组_从 JS 数组操作到 V8 array.js
  5. Kaggle初体验之泰坦尼特生存预测
  6. 了解这12个概念,让你的JavaScript水平更上一层楼
  7. python容易出错的地方_Python中try-except出错后如何从try出错地方继续执行?
  8. 商业计划书范文3000_凤城编写商业计划书范文模板格式
  9. java面试题--java基础--迈达斯篇
  10. casue usb kb 找不到驱动程序_手把手教你安装喷墨打印机驱动程序
  11. Nifi 常用Processor
  12. pymysql长时间连接自动断开解决方案
  13. 计算机cmd测试,电脑cmd命令怎么测试网速详细步骤
  14. 昆明理工大学计算机考研资料汇总
  15. 启发式算法 Heuristic Algorithm
  16. ExtJs自学教程(1):一切从API开始
  17. 树梅派 raspberrypi 更换清华源
  18. Deskpool云教室(云课堂)系列化配置
  19. 【STM32F429的DSP教程】第3章 Matlab简易使用之基础操作
  20. 使python脚本在运行时可以附带参数的方法

热门文章

  1. 领导和管理?你一定要分得清!
  2. 从SAP APO到SAP IBP:CIO如何实现最佳过渡?
  3. Python 之 Numpy (三)运算
  4. 这可能是十年来最酷的神经科学发现
  5. 【AI-CPS】【工业互联网】从观望到行动:全球工业物联网市场生态全景观察
  6. 白春礼:探究物质世界奥秘的一把金钥匙——纪念元素周期表发表150周年
  7. 解析|2G~5G与未来天线技术!
  8. 深度学习已经触底?这篇文章的观点令人信服吗?
  9. 物联网时代 人工智能如何与信息安全平衡发展?
  10. 机器人时代的资本主义:21世纪的工作,收入和财富