Linux内核进程有几个系统?

说实话,当我第一次开始摆弄 Linux 内核的五个主要子系统时,感觉就像走进了一个迷宫。
每个子系统都很有趣,但理解它们如何协同工作需要一些努力。

我们来谈谈进程调度(SCHED)。
我有一个朋友当时写了一个小工具,发现Linux的调度算法其实很聪明。
他已经测试过,使用nice值较低的后台进程实际上可以使前台应用程序运行得更快。
有趣的是,Linux使用CFS(完全公平调度)算法,而不是简单的循环或优先级队列。
我记得在调试CPU使用情况时,我发现内核会根据进程的历史性能动态调整其权重。
我自己没有跑过,但是从数据上记得,权重调整的时间粒度可以达到微秒级,还是比较准确的。

内存管理(MM)比较复杂。
我曾经遇到过一次系统死机的情况,最终确定是内存碎片问题。
Linux使用分段分页机制来管理内存,其中虚拟内存部分确实令人惊叹。
我曾经用VMware跑过一个虚拟机,主内存只有4 G。
结果,我打开了几个大型应用程序,系统仍然稳定地使用交换空间。
说白了,Linux的内存交换算法(Swap)相当聪明,会优先考虑最近没有访问过的页面。
与硬件无关的部分和与硬件相关的部分是分开设计的,考虑得很周到。
否则,每次都必须重做内存管理模块以支持新的硬件。

我认为VFS(虚拟文件系统)是最优雅的设计之一。
以前,当使用不同的Linux发行版时,您必须更改驱动程序才能挂载NTFS和ext4 现在VFS已经统一了接口,非常方便。
我曾经调试过一个挂载NFS的问题,最终发现是VFS层的锁定机制的bug。
VFS 将逻辑文件系统与设备驱动程序断开。
这种设计思想后来被许多现代系统所采用。

对于网络接口(NET),我跑过很多实际场景。
当我使用嵌入式系统时,我正在调试 WLAN 驱动程序。
我花了很长时间才搞清楚网络协议栈和驱动程序交互的细节。
Linux网络协议栈是模块化的,动态加载协议支持,特别方便。
我记得当时测试 TCP/IP 性能,发现内核的套接字缓存机制显着改善了延迟。

我对IPC(进程间通信)接触不多,但是写过一些信号量同步的小例子。
Linux的共享内存机制 我帮助同事调试了多个进程写入同一个文件导致的数据混乱问题。
最后我发现信号量没有正确使用来保护临界区。
如今有了Systemd这样的框架,IPC可能用的比较少了,但是内核原生的IPC机制还是相当扎实的。

把这五个子系统放在一起看,说实话,Linux内核的设计理念非常明显——解耦、模块化、性能优先。
每个子系统都暴露了底层的复杂性,但核心隐藏了这些复杂性,上层应用程序开发人员只需要关注业务逻辑。
当然,这种设计也需要维护成本,并且不同子系统之间的界限有时会变得模糊。
例如,内存管理必须与进程调度交互,网络协议栈必须与IPC交互。
但最终这种复杂性是需要权衡的灵活性和强大的可扩展性,这也是Linux能够保持活力的关键。

深入理解Linux Kernel内核架构(图文详解)

深入理解Linux内核架构必须从其复杂的模块和子系统开始。
我熟悉Linux内核很多年了,每次想起它的架构,就像想起一个熟悉却又难相处的朋友。

我们先来谈谈主要特点。
Linux 内核充当通用管家。
它负责调度房子的各种机器(CPU)、分配房间(内存)、满足来访客人的各种需求(输入输出设备)。
它通过一系列系统调用封装了基本操作,允许顶层应用程序(例如计算机上的浏览器或游戏)轻松使用这些硬件资源。

简单来说,整体架构分为五个主要子系统,每个子系统各司其职。

首先是进程调度子系统,它充当房子的管家,保证每个(进程)都有机会使用客厅(CPU)。
它包括调度策略、特定于CPU的调度器、独立于CPU的调度器和系统调用接口。

然后是内存管理子系统,它负责分配房间(内存),也照顾一些特殊的需求,比如虚拟内存,让房间看起来比实际大。

VFS是一个虚拟文件系统。
就像家里的公共空间一样。
无论你想拯救什么,还是找到什么,你都必须经历它。
它使所有文件系统相同,具有统一的界面并且用户友好。

网络子系统负责家庭网络的运行,就像家庭宽带一样,它必须保证网络的顺利运行。

最后还有进程间通信(IPC),它类似于家庭电话系统,允许不同的房间(进程)相互通信。

每个子系统都有很多子模块,比如进程调度子系统的调度策略模块、内存管理的内存映射器模块、VFS的设备驱动模块、堆栈模块等网络协议。
这些模块协同工作,保证了整个系统的稳定运行。

Linux内核源代码的目录结构也很有趣,房子里的不同房间也是如此。
比如include/是头文件,kernel/是主要代码,mm/是内存管理,fs/是文件系统,net/是网络,这些都是主要的房间。
另外,driver/是设备驱动程序,lib/是库函数,crypto/是加密模块。
这些都是辅助用房。

总之,Linux内核就像一座巨大的建筑,每一部分都是不可替代的。
理解这一点就像理解整个操作系统是如何工作的。
虽然很难,但是一旦理解了,就会发现它极其微妙。

Linux内核分析:理解Linux操作系统的核心

嘿嘿,别说这些废话了。
听我告诉你我当时陷入的陷阱。

当时,我刚刚接手我们公司的旧服务器,运行的是Linux。
机器比较旧,只有1 G内存,单核CPU。
结果,客户抱怨网站访问速度极慢,有时甚至无法连接。
起初我以为是客户端网络问题。
折腾了好几天,换了好几个路由器,都没用。

后来实在是无计可施,所以决定进内核看看。
我是一名应用程序开发人员,我真的对内核一无所知。
我找到了一位以前在国企工作过的同事,对Linux略知一二。
朋友给我打了个手势,说,看看你的进程,满了,CPU像狗一样跑。

我当时就很困惑,这是一个什么流程?中央处理器?我该如何理解这一点?后来朋友给我举了个例子,说就像开个小店一样。
客户来了(流程),你要接待他们,你要安排人工作(CPU)。
你的店里顾客很多,每个人都很忙。
当然,顾客会惊慌地等待。

我一听,心想,啊,就这样吧!我快速浏览了我们的服务器进程。
事实证明,伙计们,几十个进程在争夺CPU,所以CPU当然会很忙。
那时我学到了一个新词,叫“计划过程”。

后来我就想办法减少一些不必要的进程,然后我把重要的进程调到了高优先级。
嘿嘿,别告诉我,服务员马上就高兴了。
客户也很高兴,并向我发送了一封电子邮件赞扬我的技能。

所以你看,虽然Linux内核很复杂,但是只要了解它是如何工作的,就可以更好地利用它。
正是通过这个例子,我才真正明白了流程管理的重要性。

如果你也想学习Linux内核,我建议你多找一些实际案例来研究,而不是只看理论。
不管你学了多少理论,都不如实际案例来得实用。
像我当年,如果没有遇到客户访问网站速度慢的问题,我可能永远不会去研究流程管理。

希望我的经验可以帮助到你,不要像我当年那样纸上谈兵。
只有实践了,才能真正领会Linux内核的精髓。