Linux内核进程有几个系统?

哦,是的,是的,Linux 内核,五个大块。

第一个是进程调度(SCHED)。
谁允许CPU运行并不重要。
你必须选择一个“值得”的人。
有什么值得的?就等着CPU了。
如果您正在等待其他东西,例如硬盘驱动器,那么它就不算数。
Linux 使用简单的基于优先级的算法。
到了2 02 2 年,这个算法已经变得非常流行。
后来我才意识到这就像有人试图劫持一辆公共汽车来看看你是否着急。

第二,内存管理(MM)。
允许多个进程使用相同的内存,但它们必须是安全的。
它支持虚拟内存,虚拟内存是程序所占用的空间,如代码、数据、堆栈等,可以比内存更大。
该怎么办?操作系统将当前使用的数据保存在内存中。
如果不需要,只需将其放在硬盘上即可。
如果您迫切需要它,请从硬盘驱动器中更换它。
这很烦人。
到2 02 2 年,内存管理仍然是一个令人头疼的问题。
它在逻辑上分为两部分。
一部分不关心硬件,流程是怎么规划的,怎么换到硬盘上;一部分不关心。
另一部分管理硬件并处理存储设备。

第三个系统,虚拟文件​​系统(VFS)。
这些事情非常重要。
它隐藏了所有类型的设备,让您感觉所有设备都是一样的。
它支持很多文件系统,比如ext2 、FAT等。
还有设备驱动程序,专门管理这些设备。

第四个是网络接口(NET)。
管理不同的网络标准和不同的网络设备。
它分为两部分,第一部分是网络协议,比如TCP/IP,这些协议必须实现;另一个是网络设备驱动程序,它负责与网卡和特定设备进行对话。

第五,进程间通信(IPC)。
这就是进程说话的方式。
机制是什么?信号、共享内存等。

就是这样。

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

说到内核架构,我在搞Linux的时候,真是摸着石头过河。

我记得是2 004 年或者2 005 年的时候,我在北京,我公司的项目恰好使用的是Linux服务器。
当时我对内核了解甚少,所以觉得它很神秘。
后来一位同为开发人员的朋友给我讲了内核的大致架构。
我真正喜欢的是他给我画了一张照片。
只是一张手绘图,上面画了几个大块:进程调度、内存管理、文件系统、网络、IPC。
他说,你看,心里就那么几个大块,各自做着自己的事情。

以进程调度为例。
我在写程序的时候,总感觉CPU没有得到充分利用。
后来我发现,时间安排没有调整好。
我很长一段时间以来一直在尝试将调度策略从默认轮换更改为其他策略,但有时会变得更加困难。
我当时真的很困惑。
后来慢慢看源码的时候,才发现里面有很多方法。
我记得为了理解这一点,我花了一个周末在宿舍里写代码,看屏幕文档。
实在是太惨了。

内存管理比较复杂。
当时我们的服务器只有少量内存。
我们正在运行许多大型程序,并且总是内存不足。
我想知道如何让程序更有效地使用内存。
后来了解了虚拟内存,很有趣。
程序以为消耗了大量内存,但实际上物理内存可能很少,经常需要转移到硬盘上。
我尝试自己写一个小程序,并使用mmap之类的系统调用来直接填充内存,但它搞砸了。
程序崩溃并且内存已损坏。
这真的让我震惊,从那时起我就对内存管理感到敬畏。

我在文件系统方面有很多经验。
当时Linux并不支持很多文件系统,尤其是ext3 我们的项目需要挂载一些特殊格式的光盘,所以我们使用了VFS。
VFS的优点是它可以保护底层文件系统的差异。
上层软件无论是ext3 还是以下,都使用一组接口来工作。
我当时就想,VFS设计得真是巧妙。
然而,有陷阱。
有时候,VFS和特定的文件系统配合不好,会导致数据丢失,这真是让人头疼。

网络方面,我们的项目需要处理大量的网络请求,所以我们使用Linux网络子系统。
当时的TCP/IP协议栈非常复杂。
我花了很多时间看网络子系统的源代码,才明白套接字是如何工作的,以及数据包是如何传输的。
我记得有一次,网络延迟非常高。
我们调试了很久,最后发现是某个网络模块写得不好,导致数据包卡在队列里。
意识到这一点后,我松了一口气。

我不太喜欢 IPC,因为它很少被使用。
但后来了解到像信号量、共享内存之类的东西都是IPC实现的。
当时我们项目中最常用的是管道和信号,简单实用。

总的来说,Linux内核架构并不能用一两句话说清楚。
这些年来,我经历了很多陷阱,也学到了很多东西。
如果你想深入理解,我建议你多练习,自己编译内核,修改代码,跑测试,慢慢就会明白的。
但不要过多参与。
有时有一个粗略的想法就足够了。
不要参与其中。

这都是我的亲身经历,绝对真实。
如果您还有任何其他问题,请提出,我会尽力为您解答。
但有一些很深的东西我没有完全理解,所以我就说:我以前没有接触过这个,所以不敢乱说。