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