我的理解是
- 进程始终在用户模式下运行并且仅使用用户空间,并且
- 内核始终在内核模式下运行并且仅使用内核空间。
但看了下面两本书后,我觉得我的观点可能不正确。如果我错了你能纠正我吗?
在 Maurer 的 Linux 内核架构中,术语“系统进程”和“用户进程”在没有定义的情况下使用,例如,当引入虚拟地址空间划分为内核空间和用户空间时:
每一个用户进程系统中有自己的虚拟地址范围,从 0 延伸到 TASK_SIZE 。上面的区域(从 TASK_SIZE 到 2 32 或 2 64 )专门为内核保留 — 并且不能被用户进程访问。 TASK_SIZE 是一个特定于体系结构的常量,它以给定的比例划分地址空间 - 例如,在 IA-32 系统中,地址空间以 3 GiB 划分,因此每个进程的虚拟地址空间为 3 GiB;由于虚拟地址空间的总大小为 4 GiB,因此内核可用 1 GiB。尽管实际数字因架构而异,但一般概念却没有差异。因此,我在进一步的讨论中使用这些样本值。
这种划分并不取决于有多少 RAM 可用。由于地址空间虚拟化,每个用户进程都认为自己拥有 3 GiB 的内存。个人的用户空间系统进程彼此完全分开。无论当前正在执行的进程如何,虚拟地址空间顶端的内核空间始终相同。
...内核将虚拟地址空间分为两部分,以便能够保护个体 系统进程来自彼此。
您可以通过在书中搜索“用户进程”或“系统进程”来阅读更多示例。
用户进程和系统进程都是进程,而不是内核进程?
它们的定义是什么?它们的所有者(普通用户还是root?)、启动它们的用户还是其他什么东西有所不同?
为什么本书明确写“系统进程”或“用户进程”,而不是仅仅写“进程”来涵盖这两种“进程”,例如上面引用的?我想它所说的“用户进程”也适用于“系统进程”,它所说的“系统进程”也适用于“用户进程”。
在Bovet的Understanding Linux Kernel中,有一些概念“内核控制路径“ 和 ”内核线程”。
内核控制路径表示内核为处理系统调用、异常或中断而执行的指令序列。
...传统的 Unix 系统将一些关键任务委托给间歇性运行的进程,包括刷新磁盘缓存、交换未使用的页面、维护网络连接等。事实上,以严格的线性方式执行这些任务效率不高。它们的功能和目的用户进程如果它们安排在后台,可以获得更好的响应。因为一些 系统进程仅在内核模式下运行,现代操作系统将其功能委托给内核线程,它们不会受到不必要的用户模式上下文的阻碍。在 Linux 中,内核线程与常规进程有以下不同之处:
• 内核线程仅在内核模式下运行,而常规进程则在内核模式和用户模式下交替运行。
• 由于内核线程仅在内核模式下运行,因此它们仅使用大于 PAGE_OFFSET 的线性地址。另一方面,常规进程在用户模式或内核模式下使用全部 4 GB 线性地址。
您可以通过搜索来阅读更多内容谷歌图书。
Maurer的书中和Bovet的书中的“系统过程”是同一个概念吗?
两本书中提到的“系统进程”是否可以运行在用户空间、内核空间或两者中?
“系统进程”与内核控制路径和内核线程不同吗?
答案1
问:用户进程和内核进程都是进程,而不是内核?
我不确定是否有一个正确的答案,但我会尝试一下。
引用《操作系统设计与实现》(A. Tanenbaum),第 3 版,第 2.1 章说:
2.1.流程简介
所有现代计算机都可以同时做几件事。在运行用户程序时,计算机还可以从磁盘读取数据并将文本输出到屏幕或打印机。在多道程序设计系统中,CPU 还会从一个程序切换到另一个程序,每个程序运行数十或数百毫秒。虽然严格来说,在任何一个时刻,CPU只运行一个程序,但在1秒的时间内,它可能同时运行多个程序,从而给用户一种并行的错觉。有时人们在这种情况下谈论伪并行,以将其与多处理器系统的真正硬件并行(具有两个或更多 CPU 共享相同的物理内存)进行对比。人们很难跟踪多个并行的活动。因此,操作系统设计者多年来已经发展了一种概念模型(顺序进程),使并行性更容易处理。该模型、它的用途以及它的一些后果构成了本章的主题。
2.1.1.过程模型
在此模型中,计算机上的所有可运行软件(有时包括操作系统)被组织成许多顺序进程,或简称为进程。进程只是一个正在执行的程序,包括程序计数器、寄存器和变量的当前值。
(强调我的)
虽然我还没有时间读完这本书,但根据这个解释,“进程”是在处理器上执行的一个工作单元,并拥有所有必要的资源(图像、状态、寄存器、计数器......)。
回答已编辑的问题
内核始终在内核模式下运行并且仅使用内核空间。
这取决于内核的类型。单片内核在单个地址空间(内核空间)中运行其内容,而微内核可以在用户空间中运行其内核进程。
两本书中提到的“系统进程”是否可以运行在用户空间、内核空间或两者中?
如上所述,系统进程可以在两种模式下运行,具体取决于内核的类型。
用户进程和系统进程都是进程,而不是内核进程?
是的,用户进程和系统进程都是进程 - 因此命名;-) 不过,我不明白逗号后面的部分。
“系统进程”与内核控制路径和内核线程不同吗?
是的。进程(用户或系统=内核)是不同的。
内核控制路径表示指令序列,内核线程(又名 LWP - 轻量级进程)是直接由内核创建和调度的线程(与由线程库创建的用户线程相反)。
结论
A过程只是一个理论结构。
A核心是操作系统的一部分,它实现了进程的概念,以允许例如。所述进程的调度。
A线是进程中可以独立调度的最小部分。
答案2
就 Linux 而言,任务(线程的内核内部概念;线程可以共享资源,如内存和打开的文件;有些只在内核内部运行)可以在用户态运行,或者(它的执行线程)可以转移到内核(以及后面)来执行系统调用。用户线程可以被临时劫持以执行中断(但这并不是真正正在运行的线程)。
进程是“系统进程”还是普通用户进程在 Unix 中是完全无关的,它们的处理方式是一样的。在 Linux 中,一些任务在内核中运行来处理杂项作业。然而,它们是内核作业,而不是“系统进程”。
一大警告:关于复杂软件产品(编译器和操作系统是特别令人震惊的例子)的教科书倾向于解释简单的算法(通常是半个世纪以来没有认真使用过的算法),因为现实世界的机器和用户需求是很多过于复杂,无法以某种可以用结构化、简单的方式描述的方式来处理。编译器的大部分内容都是临时调整(特别是在代码优化领域,转换主要是实际使用中出现的可能性的子集)。就 Linux 而言,大部分代码是设备驱动程序(在操作系统文本中顺便提及为设备相关),并且此代码中的很大一部分用于处理行为不当的设备,这些设备不符合自己的规范,或者“同一设备”的不同版本之间的行为有所不同。通常,所解释的细节只是工作中需要处理的部分。能简化为一些不错的理论,(几乎)完全排除杂乱、不规则的部分。例如,克里斯·弗雷泽 (Cris Fraser) 和大卫·汉森 (David Hanson) 在他们的书中描述了低成本航司编译器声明典型的编译器文本主要包含词法分析和解析的解释,而代码生成的解释很少。这些任务大约占其编译器(设计得很简单!)代码的 5%,并且错误率可以忽略不计。标准文本中并未涵盖编译器的复杂部分。
答案3
尝试在这里做一个简短但希望清楚的答案。仅适用于现代Linux内核。
有struct task
s,由内核内部用作最小可调度单元,它始终由内核代码使用ring0创建并开始在ring0中运行,但稍后可能会也可能不会切换到ring3,或者切换回ring0(使用平台特定的系统调用指令) ) 之后。
一个任务有很多资源或者说属性,最重要的是,内存空间,任务id(从顶级pid命名空间查看的tid),任务组id(从顶级命名空间查看的pid)。虽然在ring3中,任务显然不能struct task
直接访问它自己的,但至少我刚才提到的那些属性是由内核通过/proc
fs暴露给ring3的。但是现代的 kenerl 可能会以一种奇怪的方式暴露它,比如/proc/[pid]/status
使用单词“Pid”来引用从与其 procfs 实例关联的 pid 命名空间查看的任务 id。
一个任务可能会也可能不会与其他任务共享这些属性(从顶级 pid 命名空间查看的 tid 除外),就像它们可能共享完全相同的一个内存空间,或者具有相同的任务组 ID。
现在ring3中的用户,或者说用户空间,可以发明“线程”和“进程”的概念。但由于它们纯粹是用户空间的发明,不同的人/教科书可能会使用不同的术语。所以这里我们只讲常用的术语。
OS-Thread(线程):任务的同义词。
内核线程:永远不会切换到ring3并且始终与内核共享内存空间的任务。
OS-Process(进程):内核不跟踪进程的存在,人类只是将其定义为具有相同任务组id(从顶级pid命名空间查看的pid)的一个或多个任务。一旦所有这些线程死亡,该过程就在人类大脑中消失了。
一个重要的有趣事实是,你应该能够从上面的定义中得出结论,一个操作系统进程可能包含一个或多个操作系统线程,这些操作系统线程,或者说任务,在一个操作系统进程中,实际上受到内核关于它们可以执行的属性的限制。联合国分享。
任务一旦创建,就属于某个特定的进程,这种关系永远不会改变,直到它消亡。
属于一个进程的任务必须共享完全相同的一块内存空间。
属于一个进程的任务不能停留在不同的用户命名空间或pid命名空间中,这些必须是共享的。
答案4
问:Maurer 的书中和 Bovet 的书中的“系统过程”是同一个概念吗?
我看到毛雷尔使用系统进程作为涵盖两者的通用术语用户进程和内核线程。
据我所知,Bovet 没有使用系统进程定义比 Maurer 更具体的概念。不过,他可能使用了不太严格的语言。所以我会注意不要直接将它们等同起来。我对这句话有困难
由于某些系统进程仅在内核模式下运行,因此现代操作系统将其功能委托给内核线程,而内核线程不会受到不必要的用户模式上下文的阻碍。
谁的职能被委托给谁?是操作系统的功能,还是系统进程的功能?说因为系统进程只运行在内核模式,所以它的功能被委托给内核线程,这是没有意义的。认为操作系统将特定操作系统功能“委托”给内核线程是有道理的。然而,如果我们使用 Maurers 的定义,“因为”确实没有意义。系统进程。因此,我不考虑这句话的任何严格含义。
(缺乏“阻碍”是相当微不足道的,而且这个细节可能恰好与特定的实现相矛盾)。
一个合理的宽松的重新解释是内核不支持在内核之外执行某些“关键任务”,并且其中一些任务是由内核线程处理的。
Q. 两本书中提到的“系统进程”可以在用户空间、内核空间或两者中运行吗?
在特定时间点,系统进程可以运行在用户空间或内核空间。
当用户进程进行系统调用时,该进程将转换为在内核空间中运行。当系统调用返回时,进程将转换回在用户空间中运行。
问:“系统进程”与内核控制路径和内核线程不同吗?
根据上面的定义,内核线程是系统进程,但系统进程可能不是内核线程。
Bovet 表示spin_lock
,该宏在成功时将导致当前内核路径“获取”自旋锁(不包括其他内核路径)。 spin_lock
可以从内核线程调用,因此内核线程将被视为内核控制路径。据我所知。据我所知,这并不矛盾。但由于我找不到这个明确定义的内容,什么是内核控制路径,什么不是内核控制路径,我不会依赖这个隐式定义来应用他使用该短语的任何地方。
系统调用、异常或中断的内核控制路径不是内核线程。
除了一些驱动程序现在使用线程来处理几乎所有对中断的响应。 (线程之外的唯一部分是消除多个设备之间共享的中断线的歧义)。
将中断移至线程- LWN.net,2008
https://www.kernel.org/doc/html/v4.20/core-api/genericirq.html(搜索“话题”)