根据Linux 内核剖析Linux内核有五个子系统:进程管理、内存管理、网络、VFS、设备。
其中两个必不可少:1.进程管理2.内存管理
基本的 Linux 内核子系统是用来处理网络、VFS、设备的吗?
Linux内核中进程管理和内存管理的目的是什么?
我还试图找到 Linux 内核子系统(如 VFS、网络、设备)的用途,这些子系统存在于其他 Linux 内核子系统(如进程管理和内存管理)旁边。
如果VFS、网络、设备由进程管理、内存管理来处理,那么在Linux内核中将VFS、网络、设备作为子系统是否合乎逻辑?
如果用户在用户空间中运行程序,则进程管理和内存管理就会出现。这个程序可以有与VFS或网络或设备相关的东西吗?
进程管理和内存管理如何与其他 Linux 内核子系统配合?
答案1
注意:Linux 内核没有正式定义或使用术语“进程管理”。考虑“流程管理”是可以的,但人们可能不同意它到底包含什么。
这个答案有点复杂,因为我想给你一些常见的定义和关键词来寻找。可悲的是,有些词在不同的地方有不同的含义。
请仔细阅读,并积极仔细检查每个单词的用法。写作时,请确保提供一些背景信息。不要假设每个人都使用完全相同的定义。
与往常一样,这个答案是一个简化:-)。
“流程管理
您的计算机具有处理器或“CPU”来执行代码。您的计算机可能有 2 个 CPU。 Linux CPU 调度程序管理 CPU,以提供一个更有用的概念:它在之间共享 CPU任何数字运行“进程”或执行“线程”。调度程序强制在线程之间切换。每秒切换多次。
调度程序还会定期考虑是否需要将线程分配给不同的CPU。也就是说,它可以“平衡”分配给每个CPU的线程数量。
传统上,CPU 调度程序有时被称为“进程调度程序”。然而,那时每个用户级进程只有一个执行线程。如今,一个 UNIX 进程可能有许多线程。在内核内部,简单地称为“调度程序”是很常见的。
调度程序使用“任务”一词来指代内核线程概念。即便如此,内核经常使用“进程”来表示“任务”(线程)。当差异很重要时,您必须仔细检查上下文并尽量不要混淆:-)。
中的核心调度算法kernel/sched/
不取决于您使用的 CPU 系列(CPU“架构”)。进程之间切换的细节由特定于 arch 的代码处理,位于arch/*/
.
进程管理的另一个方面是进程何时等待事件。例如,当进程进行系统调用以从设备读取数据时,它可能必须等待设备在数据准备就绪时发出信号(中断信号)。在此之前,该进程将从运行队列中删除,其他进程可以在 CPU 上进行调度。
内存管理
再次,首先考虑硬件:物理 RAM。硬件提供一个存储器,由以下部分组成字节。每个字节都有一个数字地址,我们可以单独访问它。您的计算机可能有大约 1,000,000,000 字节的 RAM。
一Linux内存管理的一个方面是为每个用户进程提供自己的虚拟内存。我们再次划分硬件资源,并将其中的一部分分配给不同的目的。目的是提供一种新的概念,使工作更加愉快。
要了解虚拟内存为何如此有用,请考虑一下如果没有虚拟内存会发生什么。所有进程都可以访问整个物理内存。这意味着整个系统可能会被一个正在运行的程序破坏,如果它有一个简单的错误,或者是恶意的。
当虚拟内存被添加到原始 UNIX 中时,它使系统变得更加健壮。内存保护与被迫上面的任务切换(也称为“抢占式”多任务处理)。抢占式多任务意味着,如果一个用户进程在您唯一的 CPU 上运行连续循环,系统仍将允许其他进程运行并响应您的输入。
如上所述,UNIX 进程可能有许多线程。但在该进程内部,所有线程都访问相同的虚拟内存。
我指的是 UNIX 进程的概念,因为 Linux 特定的功能在技术上可以允许许多不同的可能组合。额外的组合很少使用。最好从可移植 UNIX 概念的角度来思考。
硬件细节如何内存管理单元支持在特定于架构的代码中处理虚拟内存。但里面还是有很多内存管理代码mm/
,所有CPU架构上都会用到。
您可以看到调度程序代码和 VM 代码之间存在一些协作!当内核将CPU切换到不同的执行线程时,它必须更新关联的MMU,以便线程将在正确的虚拟内存空间中运行。
如果用户在用户空间中运行程序,则进程管理和内存管理就会出现。这个程序可以有与VFS或网络或设备相关的东西吗?
总的来说,“是”。最准确、最有用的答案是“是”。
打开()是对 VFS ( fs/
) 的系统调用。它向调用进程返回一个“文件描述符”。这只是一个数字。对于每个进程,内核都会保存一个打开文件的表。例如当你打电话时关闭(),您只需传递文件描述符,内核就会在表中查找它。
您可以尝试说您正在浏览 拥有的表task_struct
,因此您实际上正在经历“进程管理”,而不是直接访问 VFS。但我不同意。和系统open()
调用close()
定义在文件系统/open.c。它们是用数字文件描述符调用的,并且必须自己查找。
您传递到的文件名open()
可能是设备节点。在这种情况下,对返回的文件描述符(包括close()
)的操作最终将与设备驱动程序(drivers/
)进行通信。
网络连接也由文件描述符表示。在大多数情况下,文件描述符不是通过open()
文件系统上的路径获得的。socket()
被用来代替。 (内核源码目录net/
:)