本节讲述自多道操作系统以来操作系统的核心概念——进程及其扩展线程
什么是进程
进程定义
- 一个正在执行中的程序。
- 一个正在计算机上执行的程序实例。
- 能分配给处理器并由处理器执行的实体。
- 一个具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集。
构成进程的基本元素
-
进程控制块(PCB,只存在于操作系统内核)
-
程序代码(进程的静态状态)
-
数据集(与代码相关联)
进程控制块
操作系统表征进程的数据结构。
- 标识符:与进程相关的唯一标识符,用来区分其他进程。
- 状态:若进程正在执行,则进程处于运行态。
- 优先级:相对于其他进程的优先顺序。
- 程序计数器:程序中即将执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,以及与其他进程共享内存块的指针。
- 上下文数据:进程执行时处理器的寄存器中的数据。
- I/O状态信息:包括显式I/O请求、分配给进程的I/O设备和被进程使用的文件列表等。
- 记账信息:包括处理器时间总和、使用的时钟数总和、时间限制、记账号等。
PCB是进程存在的唯一标识,所谓创建进程,实则是创建描述进程的PCB,然后把PCB这样的数据结构连接到统一的进程队列中交由CPU进行调度;撤销进程实则就是在释放PCB。关于进程控制块的内容参见进程控制块的结构和
进程的状态
两状态进程模型
进程看起来只有运行和不在运行两种状态,这是进程最简单的状态
两状态进程的状态转换
进程的队列调度
进程的创建和终止
进程创建
创建进程的步骤:
- 分配进程标识符
- 分配空间
- 初始化进程控制块
- 设置正确的连接
- 创建或扩充其它数据结构
新进程的来源
来源 | 描述 |
---|---|
新批处理作业 | 批处理控制流提供给操作系统 当操作系统准备接收新工作时接收下一个作业控制指令 |
交互登录 | 终端用户登录在系统 |
由操作系统创建 | 操作系统创建以下两类进程: 1. 所有进程的父进程(初始化进程) 2.为提供服务所需,创建一个进程,代表用户程序执行一个功能使得用户无需等待 |
由现有进程派生 | 为模块化和开发并行性之需要,用户程序可指示创建多个进程 |
进程的派生
当一个进程派生另一个进程,前者称父进程,被派生的称子进程,
进程终止
任何一个计算机系统都必须让进程在恰当的时候可以终止。进程可以被创建它的进程终止,或当父进程终止时而终止。
导致进程终止的原因有:正常完成、超过时限、无可用内存、越界、算术错误、时间超出、I/O失败、无效指令、特权指令、数据误用、父进程终止、父进程请求等等。
进程的五状态模型
五种状态的定义
- 运行态:该进程正在执行;
- 假定只有一个处理器,因此一次最多只有一个进程处于这一状态
- 也就是说,100个在内存中的进程,最多只有一个在运行态(可以有0个)
- 就绪态:进程做好了准备,只要有机会就开始执行;
- 100个在内存中的进程有最多有99个在就绪态
- 阻塞/等待态:进程在某些事件发生前不能执行,如 I/O 操作完成;
- 新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中。
通常是进程控制块已经创建但还没有加载到内存中的新进程; - 退出态:操作系统从可执行进程组中释放出的进程,或者是因为它自身停止了,或者是因为某种原因被取消
新建态的意义:
- 操作系统可能基于性能或内存局限性的原因,限制系统中的进程数量。
- 当进程处于新建态时,操作系统所需要的关于该进程的信息保存在内存的进程表中,但进程自身还未进入内存,就是即将执行的程序代码不在内存中,也没有为与这个程序相关的数据分配空间。
- 当进程处于新建态时,程序保留在外存中,通常是磁盘。
进程之间的转换
-
空—>新建:参见[进程创建](# 进程创建)
-
新建 —> 就绪:操作系统准备好再接纳一个进程时,把一个进程从新建态转换到就绪态;
-
就绪 —> 运行:需要选择一个新进程运行时,操作系统会选择一个处于就绪态的进程,这是调度器或分派器的工作;
-
运行 —> 退出:如果当前正在运行的进程表示自己已经完成或取消,则它将被操作系统终止;
-
运行 —> 就绪:正在执行的进程到达了“允许不中断执行”的最大时间段、优先级高的线程进入就绪状态等;
-
运行 —> 阻塞(主动行为由进程请求):如果进程请求它必须等待的某些事件,则进入阻塞状态;常见的需要等的事件包括:IO事件、请求一个文件或者虚拟内存中的共享区域、进程间通信,etc.
-
阻塞 —> 就绪(被动行为由内核操作):当所等待的事件发生时,处于阻塞态的进程转换到就绪态;
-
就绪 —> 退出:父进程可以在任何时刻终止一个子进程。如果一个父进程终止,与该父进程的所有子进程都将被终止
需要注意以下几点
- 由运行态到阻塞态是一种进程自身做出的主动行为;而由阻塞态到就绪态不是进程自己可以控制的,是一种被动行为
- 不能由阻塞态直接转为运行态,也不能由就绪态直接转为阻塞态
阻塞队列
单阻塞队列
给出了可能实现的排队规则,有两个队列:就绪队列和阻塞队列
- 进入系统的每个进程被放置在就绪队列中,当操作系统选择另一个进程运行时,就将从就绪队列中选择
- 对于没有优先级的方案,这可以是一个简单的先进先出队列
- 正在运行的进程被移除处理器时,它根据情况或者被终止,或者被放置在就绪或阻塞队列
- 当一个事件发生时,所有位于阻塞队列中等待这个事件的进程都被转换到就绪队列中
显然,一个操作系统不可能只有一种需要阻塞的事件,如果只有一个阻塞队列,当一个事件发生时,操作系统必须扫描整个阻塞队列,搜索那些等待该事件的进程,显然这是低效的。
多阻塞队列
按照优先级方案分派进程,维护多个就绪队列(每个优先级一个队列)将会带来很多便利。操作系统可以很容易地确定哪个就绪进程具有最高的优先级且等待时间最长。
进程的挂起状态
计算机中由于 I/O 活动(或其它类似事件)比计算速度慢很多,因此在单道程序系统中的处理器在大多数时候是空闲的。在这种情况下,内存保存有多个进程,当一个进程正在等待时,处理器可以转移到另一个进程,但是处理器比 I/O 要快的多,以至于内存中所有的进程都在等待 I/O 的情况很常见。因此,即使是多道程序设计,大多数时候处理器仍然可能处于空闲状态。
解决方案一是扩大内存,二是交换。
进程的交换
交换是把内存中某个进程的一部分或者全部移到磁盘中。内存中没有处于就绪状态的进程时,操作系统就把被阻塞的进程换出到磁盘中的“挂起队列”,这是暂时保存从内存中被“驱逐”出的进程队列,或者说是被挂起的进程队列。
“交换”是一个 I/O 操作,因而也可能使问题更加恶化。但是由于磁盘 I/O 一般是系统中最快的 I/O(相对于磁带或者打印机 I/O),所以交换通常会提高性能。
挂起状态
被交换的进程状态为挂起状态。
我们可以认为所有已经挂起的进程在挂起时都处于阻塞态。显然,这时把被阻塞的进程取回内存是没有意义,因为它仍然没有准备好执行。
但是,考虑到挂起状态的每个进程最初是阻塞在一个特定的事件上,当这个事件发生时,进程就不再阻塞了,可以继续执行。这种状态可以认为是进程在就绪状态下被挂起。
因此,我们需要重新考虑设计方式。这里有两个独立的概念:进程是否在等待一个事件 以及 进程是否已经换出内存,即 阻塞与否 和 挂起与否 。
故在加入挂起后,就绪态和阻塞态分为了四种状态:
1、就绪态:进程在内存中并可以执行;
2、阻塞态:进程在内存中并等待一个事件;
3、阻塞 / 挂起态:进程在外存中并等待一个事件;
4、就绪 / 挂起态:进程在外存中,但是只要被载入内存就可以执行。
挂起进程具有以下特点:
- 不能立即执行,但是也没有被杀死
- 该进程可能在(也可能不在)等待一个事件。
- 若进程正在等待一个事件,阻塞条件不依赖于挂起条件,阻塞事件发生不会使进程立即被执行;
- 为阻止进程执行,可以通过代理把这个进程置于挂起状态,代理可以是进程自己,也可以是父进程或操作系统;
- 除非代理显式地命令系统进行状态转换,否则进程无法从这个状态中转移。
包括挂起状态的进程模型
有挂起状态后,就新增了数个操作:
-
阻塞 —> 阻塞/挂起:如果没有就绪进程,则至少一个阻塞进程被换出,为另一个没有阻塞的进程让出空间;
-
阻塞/挂起 —> 就绪/挂起:如果等待的事件发生了,则处于阻塞/挂起状态的进程可以转换到就绪/挂起状态;
-
就绪/挂起 —> 就绪:如果内存中没有就绪状态进程,操作系统需要调入一个进程继续执行;
-
就绪 —> 挂起/就绪:
- 通常,操作系统更倾向于挂起阻塞态进程而不是就绪态进程,因为就绪态进程可以立即执行,而阻塞态进程占用了内存空间但不能执行。
- 但是如果释放内存以得到足够空间的唯一方法是挂起一个就绪进程,那么这种转换也是必需的;
- 这往往是操作系统节约资源的手段
-
新建 —> 就绪/挂起以及新建 —> 就绪:当创建一个新进程,该进程或者加入到就绪队列或者加入到就绪/挂起队列中(看是否需要挂起);
-
阻塞/挂起 —> 阻塞:
- 一个进程终止,释放了一些内存空间。
- 阻塞/挂起队列中有一个进程比就绪/挂起队列中的任何进程的优先级都要高,并且操作系统有理由相信阻塞进程的事件很快就会发生,这时,把阻塞进程而不是就绪进程调入内存是合理的;
-
运行 —> 就绪/挂起:
- 通常当分配给一个运行进程的时间期满时,它将转换到就绪态。
- 但是,如果由于位于阻塞/挂起队列的具有较高优先级的进程变得不再被阻塞,操作系统抢占这个进程,也可以直接把这个运行进程转换到就绪/挂起队形中,并释放一些内存空间;
- 这往往是操作系统节约资源的手段
进程挂起的原因
事件 | 描述 |
---|---|
交换 | 操作系统释放足够的内存空间以调入并执行处于就绪状态的进程 |
其他操作系统原因 | 操作系统挂起后台进程、工具进程或被怀疑导致问题的进程 |
交互式用户请求 | 用户主动要求挂起一个程序的执行 目的是为了调试或与一个资源的使用进行连接 |
定时 | 记账或监视进程等可能周期性运行 在等待下一个时间间隔时被挂起 |
父进程的请求 | 父进程希望挂起子代进程的执行以: - 检查或修改挂起的进程 - 协调不同后代进程之间的行为 |
进程的描述
操作系统控制计算机系统内部的事件,它为处理器执行进程而进行调度和分派,给进程分配资源,并响应用户程序的基本服务请求。因此,我们可以把操作系统视为管理系统资源的实体。
那么,操作系统为了控制进程和管理资源需要哪些信息呢?
操作系统控制的信息结构
操作系统维护的信息可分为四类:
- 内存表:跟踪内存和外存。
- I/O表:管理计算机系统中的I/O设备和通道。
- 文件表:提供关于文件的相关信息。
- 进程表:管理进程。
内存、I/O和文件是代表进程而被管理的。
进程控制结构
操作系统在管理和控制进程时,首先必须知道进程的位置,然后它必须知道在管理时所必须的进程属性(如进程ID、进程状态)。
进程位置
进程的物理表示:进程最少必须包括一个或一组被执行的程序,与这些程序相关联的是局部变量、全局变量和任何已定义常量的数据单元。
因此,一个进程至少包括足够的内存空间,以保存该进程的程序和数据;此外,程序的执行通常涉及用于跟踪过程调用和过程参数传递的栈。最后,与每个进程相关联的还有操作系统用于控制进程的许多属性,通常,属性的集合称作:进程控制块。程序、数据、栈和属性的集合称做:进程映像。
进程控制块的结构
另外还会分配用户标识符用以表示控制进程的用户。
以Linux为例,其进程控制块包括以下主要部分:
- 进程id。
- 系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。
- 进程的状态,有就绪、运行、挂起、停止等状态。
- 进程切换时需要保存和恢复的一些CPU寄存器。
- 描述虚拟地址空间的信息。
- 描述控制终端的信息。
- 当前工作目录(Current Working Directory)。
- getcwd --pwd
- umask掩码。
- 文件描述符表,包含很多指向file结构体的指针。
- 和信号相关的信息。
- 用户id和组id。
- 会话(Session)和进程组。
- 进程可以使用的资源上限(Resource Limit)。
- ulimit -a
进程在虚拟内存的结构
进程控制块的作用
当进程互相之间进行通信时,进程标识符可用于通知操作系统某一特定通信的目标;当允许进程创建其他进程时,标识符可用于指示每个进程的父亲进程和后代进程。
进程控制块是操作系统中最重要的数据结构。每个进程控制块包含操作系统所需要的关于进程的所有信息。操作系统中的很多例程都需要访问进程控制块中的信息,直接访问这些表并不难,每个进程都有一个唯一的 ID 号,可用做进程控制块指针表的索引。
困难的是保护进程控制块。例程中的错误可能会破坏进程控制块,进程控制块的结构或语义变化可能影响到操作系统模块。因此需要一个处理程序例程保护进程控制块且成为读写这些块的唯一仲裁程序。
进程的控制
执行模式
非特权态常称为用户态,这是因为用户程序通常在该模式下运行。特权态可称为系统态或内核态。
使用两种模式的原因是很显然的,它可以保护操作系统和重要的操作系统表(如进程控制块)不受用户程序的干涉。在内核态下,软件具有对处理器及所有指令、寄存器和内存的控制能力,这一级的控制对用户程序不是必需的,并且为了安全起见也不是用户程序可访问的。
程序状态字中有一位表示执行模式,这一位应某些事件的要求而改变。
在典型情况下,当用户 调用一个操作系统服务 或 中断触发系统例程的执行 时,执行模式被设置成内核态;当从系统服务返回到用户进程时,执行模式被设置为用户态。
进程创建的步骤
-
分配进程标识符——此时,在主进程表中增加一个新表项,表中的每个新表项对应着一个进程。
-
分配空间——这包括进程映像中的所有元素;
-
初始化进程控制块——处理器状态信息部分大多数项目初始化为0、默认最低优先级、初始化为就绪或就绪/挂起;
设置正确的连接——如果操作系统把每个调度队列都保存成链表,则新进程必须放置在就绪或就绪/挂起链表中;
进程控制块的几种连接结构:- 线性表(已被淘汰)
- 链表(插入和删除的时间复杂度只有O(1),且易于组织为队列结构)
- 索引表
-
创建或扩充其它数据结构
- 例如:操作系统可能为每个进程保存着一个记账文件,可用于编制账单和进行性能评估。
进程的切换
进程切换的功能:在某一时刻,一个正在运行的进程被中断,操作系统指定另一个进程为运行态,并把控制权交给这个进程。
何时切换进程
- 中断
- 当前正在运行的进程无关的某种类型的外部事件相关(如完成一次 IO 操作)。
- 控制首先转移给中断处理器,它做一些基本的辅助工作,然后转移到与已经发生的特定类型的中断相关的操作系统例程
- 时钟中断
- I/O中断
- 内存失效
- 陷阱
- 与当前正在运行的进程所产生的错误或异常条件相关
- 操作系统确定错误或异常条件是否是致命的:
- 如果是,当前正在运行的进程被转换到退出态,并发生进程切换;
- 如果不是,操作系统的动作取决于错误种类和操作系统的设计(试图恢复或通知用户),操作系统可能会进行一次进程切换或者继续执行当前正在运行的进程。
- 系统调用
模式切换
当中断发生时,处理器需要做如下工作:
- 把程序计数器置成中断处理程序的开始地址;
- 暂时中断正在执行的用户进程,把进程从用户态切换到内核态,去执行操作系统例行程序以获得服务。
被中断的进程上下文保存在被中断程序的进程控制块。保存的进程上下文环境包括:
- 所有中断处理可能改变的信息;
- 恢复被中断程序时所需要的信息。
进程切换
一般中断只是短暂地切换到内核态调度,但有的时候需要将进程直接切换为就绪或阻塞态。
完整的进程切换步骤如下:
-
保存处理器上下文环境,包括程序计数器和其他寄存器;
-
更新当前处于运行态进程的进程控制块,包括将进程的状态改变到另一状态(就绪态、阻塞态、就绪/挂起态或退出态)。还必须更新其他相关领域,包括离开运行态的原因和记账信息;
-
将进程的进程控制块移动到相应队列(就绪、在事件 i 处阻塞、就绪/挂起);
-
选择另一个进程执行;
-
更新所选择进程的进程控制块,包括将进程的状态变为运行态;
-
更新内存管理的数据结构;
-
恢复处理器在被选择的进程最近一次切换出运行状态时的上下文环境,这可以通过载入程序计数器和其他寄存器以前的值来实现。
模式切换和进程切换的区别和联系
模式切换可以不改变正处于运行态的进程状态,保存和恢复上下文环境开销小;
进程切换涉及进程状态的变化,开销较大。
注意:中断不一定导致进程切换
- 一个例子:I/O中断后,系统决定仍由先前进程继续执行(比如因为该进程优先级更高)
操作系统内核是怎么控制的
无进程内核
在用户进程内执行某些例程
操作系统只保留进程切换等函数,例程作为分离的函数执行
典型进程控制结构——UNIX内核的进程控制
进程调度
进程创建
UNIX中,父进程通过系统调用fork()创建子进程,之后可能进行下面三种操作之一:
- 在父进程中继续执行。控制返回用户态下父进程进行fork调用处。
- 处理器控制权交给子进程。子进程开始执行代码,执行点与父进程相同。
- 控制转交给另一个进程。父进程和子进程都置于就绪态。
从fork中返回时,测试返回参数:
- 若值为0,则是子进程,可以转移到相应的用户程序中继续执行;
- 若值不为0(子进程的PID),则是父进程,继续执行主程序。
线程
进程的特点
进程包含两个特点:
- 资源所有权:
- 一个进程包括一个存放进程映像的虚拟地址空间。
- 进程映像是程序、数据、栈和进程控制块中定义的属性集合。
- 一个进程总是拥有对资源的控制或所有权,这些资源包括:内存、I/O 通道、I/O 设备和文件。
- 操作系统执行保护功能,以防止进程之间发生不必要的与资源相关的冲突;
- 调度/执行:进程是一个可被操作系统调度和分派的单位。
- 一个进程沿着通过一个或多个程序的一条执行路径(轨迹)执行。其执行过程可能与其他进程的执行过程交替执行。因此,一个进程具有一个执行状态(运行、就绪等)和一个分配的优先级
进程的两个特点是独立的,操作系统可以独立地对其进行处理。为了区分以上两点:
- 分派(调度运行)的单位通常称为线程或轻量级进程
- 拥有资源所有权的单位通常称为进程或任务。
多线程
多线程:是指操作系统在单个进程内支持多个并发执行路径的能力。
线程和进程的一般关系
- 每个进程里面只有一个线程的模型中(没有明确的线程概念):进程的表示包括它的进程控制块和用户地址空间,以及在进程执行中管理调用/返回行为的用户栈和内核栈。当进程正在运行时,处理器寄存器将被该进程控制;当进程不运行时,这些处理器寄存器中的内容将被保存
- 传统UNIX和Linux,一般将线程称作轻量级进程
- 当两个进程共享相同虚存时,可被当做是一个进程中的线程;没有为线程单独定义数据结构。
- 传统UNIX和Linux,一般将线程称作轻量级进程
- 单进程多线程:少见(毕竟大型操作系统不会单进程)
- Java运行时环境是单进程多线程的一个例子。
- 多进程多线程:进程仍然只有一个与之关联的进程控制块和用户地址空间。但是每个线程都有一个独立的栈,还有独立的线程控制块(用于包含寄存器值、优先级和其他与线程相关的状态信息)。
在多线程环境中,进程被定义成资源分配的单位和一个被保护的单位,与进程相关联的有:
- 存放进程映像的虚拟地址空间;
- 受保护的对处理器,其他进程,文件和 IO 资源的访问。
每个线程有:
- 线程执行状态(运行、就绪等);
- 在未运行时保存的线程上下文;从某种意义上看,线程可以被看做进程内的一个被独立地操作的程序计数器;
- 一个执行栈;
- 用于每个线程局部变量的静态存储空间;
- 与进程内的其他线程共享的对进程的内存和资源的访问。
线程的优点
- 在一个已有进程中创建一个新线程比创建一个全新进程所需的时间少很多。
- 终止一个线程比终止一个进程花费的时间少。
- 同一进程内线程间切换比进程间切换花费的时间少。
- 线程提高了不同的执行程序间通信的效率。
线程功能特性
和进程一样,线程具有执行状态,且可以相互之间进行同步。
进程状态
和进程一样,线程的关键状态有运行态、就绪态和阻塞态。
一般来说,挂起态对线程没有什么意义,这是由于此类状态是一个进程级的概念。特别地,如果一个进程被换出,由于它的所有线程都共享该进程的地址空间,因此它们都必须被换出。
有 4 种线程状态改变相关的基本操作:
-
派生:在典型情况下,当派生一个新进程时,同时也为该进程派生一个线程。随后,进程中的线程可以在同一个进程中派生另一个线程,并为新线程提供指令指针和参数;新线程拥有自己的寄存器上下文和栈空间,且被放置在就绪队列中;
-
阻塞:当线程需要等待一个事件时,它将被阻塞(保存它的用户寄存器、程序计数器和栈指针),此时处理器转而执行另一个处于同一个进程中或不同进程中的就绪线程;
-
解除阻塞:当阻塞一个线程的事件发生时,该线程被转移到就绪队列中;
-
结束:当一个线程完成时,其寄存器上下文和栈都被释放。
如果一个程序在单处理器上运行,那么必须顺序的产生请求并且顺序的处理结果,但是对两个应答的等待时并发的。在单处理器中,多道程序设计使得在多个进程中的多个线程可以交替执行。
线程同步
一个进程中的所有线程共享同一个地址空间和注入打开的文件之类的其他资源。一个线程对资源的任何修改都会影响同一个进程中其他线程的环境。因此,需要同步各种线程活动,以便它们互不干涉且不破坏数据结构。
线程的分类
用户级线程
有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。
优点:
- 线程切换不需要内核态特权;
- 调度可以是应用程序相关的;
- 用户级线程可以在任何操作系统中运行,不需要对底层内核进行修改以支持用户级线程。
缺点:
- 当执行一个系统调用时,会阻塞进程中所有线程;
- 无法利用多处理技术。
内核级线程
有关线程管理的工作由内核完成,应用程序只有一个到内核线程设施的应用程序编程接口。
优点:
- 内核可同时把同一进程中的多个线程调度到多个处理器中;
- 若进程中的一个线程被阻塞,内核可以调度同一进程中的另一个线程;
- 内核例程本身也可以使用多线程。
缺点:
- 在把控制从一个线程传送到同一个进程内的另一个线程时,需要内核的状态切换。
混合方法
线程创建、调度和同步在应用程序中进行,一个应用程序中的多个用户级线程被映射到一些内核级线程上。
结合纯粹用户级线程方法和内核级线程方法的优点,并克服它们的缺点。
多核和线程
使用多核系统支持多线程应用程序会带来一些性能和应用程序设计上的问题。
多核架构带来的潜在性能提升取决于一个应用程序有效使用可用并行资源的能力。
常见的多核应用:
- 多进程应用
- 多线程应用
- 以Java为代表的虚拟机多线程程序
- 多实例程序
常见操作系统的进程和线程管理
Linux
Linux中的线程
Linux中没有给线程单独定义数据结构,所以Linux中的线程和进程没有区别
Linux提供一种不区分进程和线程的解决方案:
- 用户级线程映射到内核级进程上。
- 组成一个用户级进程的多个用户级线程则映射到共享同一个组ID的多个Linux内核级进程上。
因此,这些进程可以共享文件和内存等资源,使得同一个组中的进程调度切换时不需要切换上下文
当Linux内核执行从一个进程到另一个进程的切换时,会检查当前进程的页目录地址是否与将被调度的进程的相同。若相同,则它们共享同一个地址空间,所以此时的上下午切换仅是从代码的一处跳转到另一处
Linux的可以共享同一内存空间,但不能共享同一个用户栈。所以每个线程有自己单独的栈空间
Linux的命名空间
命名空间可以使一个进程(或共享同一命名空间下的多个进程)拥有与其他相关命名空间下的其他进程不同的系统视图。
当前Linux有6种命名空间:mnt,pid,net,ipc,uts,user
- Mount命名空间
为进程提供文件系统层级结构的特定视图,因次两个不同mount命名空间的进程会看到不同的文件系统层次结构 - UTS命名空间
UNIX timesharing,UNIX 分时,通过UTS命名空间,初始化和配置参数能够根据同一系统上的不同进程而变化 - IPC命名空间
隔离某些进程间通信资源,如信号量 - PID命名空间
隔离进程ID空间 - 网络命名空间
隔离与网络相关的系统资源 - 用户命名空间
为自身的UID集建立一个容器