首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >私有内网4

私有内网4

原创
作者头像
用户10863648
发布于 2023-12-28 20:23:13
发布于 2023-12-28 20:23:13
2950
举报

Linux 进程运行空间与特权等级

    在 Linux 操作系统中,进程的运行空间被划分为内核空间和用户空间,这种划分是为了保护系统的稳定性和安全性。这两个空间对应着 CPU 的特权等级,分别为 Ring 0(内核态)和 Ring 3(用户态)。本文将深入介绍这两个空间的概念、特权等级的含义以及它们之间的切换机制。

内核空间与用户空间
内核空间

    内核空间是操作系统内核运行的区域,拥有最高的特权等级。在内核空间中,操作系统可以执行任意指令,访问所有硬件和内存资源。这包括对系统硬件、设备驱动程序和核心数据结构的完全访问。内核空间通常包含了操作系统的内核代码和数据结构。

用户空间

    用户空间是供用户程序执行的区域,拥有较低的特权等级。在用户空间中,程序只能执行受限的指令,且对硬件资源的直接访问受到限制。用户空间包含了用户应用程序的代码和数据,以及一些共享库和用户环境的运行时信息。

CPU 特权等级

    CPU 特权等级用于区分不同程序对计算机系统资源的访问权限。在 x86 架构中,特权等级被分为四个环,分别是 Ring 0 到 Ring 3。Ring 0 拥有最高特权,而 Ring 3 拥有最低特权。

cke_17455.png

cke_17455.png

1. Ring 0 - 内核态

    Ring 0 是最高特权等级,对应内核空间。在 Ring 0 中,操作系统内核运行,可以执行任意指令,访问系统的全部资源。内核态下运行的代码可以执行特权指令,例如修改全局描述符表(GDT)和局部描述符表(LDT),以及执行 I/O 操作。

2. Ring 3 - 用户态

    Ring 3 是最低特权等级,对应用户空间。在 Ring 3 中,运行用户应用程序,程序只能执行非特权指令,访问受限资源。用户态下运行的代码无法直接执行一些特权指令,例如修改 GDT 和 LDT。必须通过系统调用陷入到内核中,才能访问这些特权资源。

上下文

Linux 是一个多任务操作系统,支持远远大于cpu数量的任务并行运行,但是从底层上看其实这些任务也不是同时运行,而是操作系统在非常短的时间内把CPU轮流分配给这些任务,这样在表象看起来像是多任务同时运行一样。

因为这些任务实际上是轮流使用cpu,所以在任务运行之前就得有地方记录这些任务的运行信息(需要加载什么信息,在哪里开始运行等)--CPU 寄存器和程序计数器。

    在 Linux 操作系统中,当操作系统进行进程上下文切换时,通常会保存和恢复CPU 寄存器的状态,以及程序计数器的值。这确保了在切换回进程时,它能够继续执行先前被中断的位置。这是操作系统实现多任务和多进程并发执行的基本机制之一。

CPU 寄存器:

  • 含义: CPU 寄存器是一组用于暂时存储数据的小型存储区域,直接嵌入在 CPU 中。寄存器在计算机中起到非常关键的作用,用于存储临时数据、地址、状态等信息。
  • 关联进程资源: 寄存器包括通用寄存器、特殊用途寄存器等。在进程上下文切换时,通用寄存器的值通常会被保存到进程的上下文中,以便在切换回该进程时能够恢复到之前的状态。

程序计数器(Program Counter,PC):

  • 含义: 程序计数器是一种特殊的寄存器,用于存储当前正在执行的指令的地址,即程序的下一条指令的地址。
  • 关联进程位置: 程序计数器的值指示了进程在内存中的特定位置,表示即将执行的指令的地址。在进程执行期间,计算机会不断更新程序计数器的值,使其指向下一条要执行的指令的地址。

CPU 寄存器和程序计数器。都是 CPU 在运行任何任务前,必须的依赖环境,因此也被叫做 CPU 上下文。

一句话总结上下文:

    在每个任务运行前,cpu需要知道任务是从哪儿运行的,然后从哪儿开始的,也就是说,需要系统给它设置好 CPU寄存器和程序计数器, cpu的寄存器是,cpu内置的容量小,但是速度极快的内存,而程序计数器,则是用来存储正在执行的指令位置,或者即将执行的吓一跳指令位置。他们是cpu在运行任何任务前,都必须依赖的环境(包括寄存器状态、内存映射、打开的文件、进程优先级等),因此也被叫做CPU上下文

一句话总结上下文切换:

    就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

上下文切换

上下文切换是指操作系统在多任务环境下,从一个任务切换到另一个任务时保存和恢复这些上下文信息的过程。在 Linux 系统中,上下文和上下文切换是操作系统中关键的概念,对于系统性能和多任务处理有着重要的影响。

在多任务操作系统中,CPU 上下文切换是实现并发执行的关键机制。根据任务的不同,可以把上下文切换可以分成三种不同的上下文切换场景:进程上下文切换、线程上下文切换以及中断上下文切换。我们将从底层原理出发,详细介绍每种场景的具体实现和影响因素。

进程上下文切换
进程的上下文切换

    进程上下文切换是指从一个进程切换到另一个进程。它发生在多任务系统中,由调度器负责决定哪个进程获得 CPU 时间。上下文切换的开销包括保存当前进程的上下文、加载新进程的上下文以及刷新内存映射等。

系统调用的上下文切换

    在一开始介绍进程的运行空间与系统等级的时候,进程在从用户态到内核态的转变涉及系统调用,这里的系统调用也涉及上下文切换。系统调用是用户程序请求内核执行特权操作的方式,例如打开、读取或关闭文件。当进行文件内容查看等操作时,需要多次系统调用完成。每次系统调用都引发了 CPU 上下文的切换。

具体过程如下:

  1. 保存用户态: 在系统调用开始时,CPU 寄存器里保存着用户态的指令位置,需要先保存这些信息以便后续恢复。
  2. 进入内核态: 为了执行内核态代码,CPU 寄存器需要更新为内核态指令的新位置。
  3. 执行内核任务: 此时,CPU 进入内核态并执行相应的内核任务,完成系统调用的操作。
  4. 恢复用户态: 系统调用结束后,CPU 寄存器需要恢复原来保存的用户态,然后切换回用户空间,继续运行进程。

一次系统调用的过程实际上发生了两次 CPU 上下文切换。

虽然系统调用过程中不涉及虚拟内存等用户态资源的切换,也不会切换进程,但实际上,CPU 的上下文切换是无法避免的。因此,系统调用过程中的上下文切换通常被称为特权模式切换,而非上下文切换。

进程上下文切换与系统调用的区别

进程上下文切换与系统调用有明显区别:

  1. 上下文内容: 进程上下文切换包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态。 系统调用时,只保存和恢复了 CPU 寄存器和用户态的状态。
  2. 切换对象: 进程上下文切换是在不同进程之间进行的 系统调用过程中一直是同一个进程在运行
  3. 过程复杂度: 进程上下文切换相对于系统调用更为复杂。它需要保存当前进程的内核状态和 CPU 寄存器之前,还需要保存该进程的虚拟内存、栈等;加载下一进程的内核态后,还需要刷新进程的虚拟内存和用户栈。
进程上下文切换的开销

上下文切换的过程并非“免费”,它需要内核在 CPU 上运行来完成。根据Tsuna的实验数据,每次上下文切换都需要几十纳秒到数微秒的 CPU 时间。在进程上下文切换次数较多的情况下,容易导致 CPU 时间主要花费在资源的保存和恢复上,而非真正的进程执行。

进程调度与上下文切换的时机

在 Linux 系统中,进程的调度并不仅仅发生在进程执行完终止的时候。我们来逐一梳理几个触发进程调度的场景,以加深对进程调度机制的理解。

1. 时间片耗尽
时机:

当前运行进程的时间片耗尽。

为了保证所有进程能够得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片轮流分配给各个进程。当某个进程的时间片耗尽时,系统会挂起该进程,并切换到等待 CPU 的其他进程运行。

2. 系统资源不足
时机:

进程等待某些系统资源(如内存)。

在系统资源不足的情况下(例如内存不足),进程需要等待资源满足才能继续运行。此时,该进程会被挂起,并由系统调度其他等待 CPU 的进程运行。

3. 睡眠函数
时机:

进程主动调用睡眠函数(如 sleep)。

通过睡眠函数(如 sleep)等方式,进程可以主动挂起自己,等待一定的时间后再次被调度运行。

  1. 进程进入睡眠状态,不再占用 CPU 资源。
  2. 睡眠时间结束或被唤醒后,进程重新被调度运行。
4. 优先级更高的进程
时机:

高优先级进程就绪并准备运行。

当有优先级更高的进程就绪时,为了确保高优先级进程能够及时运行,当前进程会被挂起,系统调度高优先级进程运行。

  1. 低优先级进程被挂起。
  2. 高优先级进程获得 CPU 控制权,运行相应任务。
  3. 执行完任务后,系统可能重新调度低优先级进程。
5. 硬件中断
时机:

硬件设备产生中断。

发生硬件中断时,CPU 上正在执行的进程会被中断挂起,转而执行内核中的中断服务程序。一旦中断处理完毕,原先的进程可能会被重新调度运行。

  1. 当前进程被中断挂起。
  2. 中断服务程序执行。
  3. 中断处理完成后,可能重新调度原先的进程继续执行。
线程上下文切换

    线程上下文切换与进程上下文切换类似,但开销更小。因为线程共享相同的地址空间,切换时无需刷新内存映射。线程上下文切换通常发生在同一进程内的不同线程之间。

    线程(Thread)和进程(Process)是操作系统中用于执行程序的两个基本概念,在开始分析之前,我们先了解下线程与进程:线程是调度的基本单位,而进程则是资源拥有的基本单位

  1. 任务调度:
    • 线程是操作系统进行任务调度的基本单位。内核可以调度多个线程在同一进程中并发执行,充分利用多核处理器的性能。
    • 进程是一个独立的执行环境,它包含至少一个线程。但在内核的任务调度中,调度的对象是线程,而非整个进程。
  2. 资源拥有:
    • 进程是独立的资源拥有者,拥有独立的地址空间、文件描述符等。不同进程之间的资源是相互独立的。
    • 线程共享相同进程的资源,包括虚拟内存、文件描述符等。线程间的通信相对简单,因为它们共享相同的地址空间。
    • 线程也有自己的私有数据,比如栈和寄存器等。
  3. 调度效率:
    • 由于线程共享相同的资源,线程的创建、销毁和切换开销相对较小,调度效率较高。
    • 进程的独立性导致了较大的创建、销毁和切换开销,因为这涉及到整个地址空间的切换。
  4. 错误影响范围:
    • 一个线程的错误可能影响整个进程,因为它们共享相同的资源。这需要更加谨慎的编程和调试。
    • 进程的独立性使得一个进程的错误不太可能直接影响其他进程,提高了系统的稳定性。

线程上下文切换 可以分为两种情况

  1. 前后线程属于不同的进程。因为资源不共享,所以上下文切换的过程与进程上下文切换时一样的。
  2. 如果前后两个线程属于一个进程。因为虚拟内存是共享的,所以切换的时候 虚拟内存等资源是不用动的,只需要切换不同线程自己拥有的私有数据,寄存器等不共享的数据。
中断上下文切换

中断上下文切换是由硬件中断或软件中断触发的。当中断发生时,操作系统会保存当前进程或线程的上下文,然后转入中断服务例程执行。执行完中断服务例程后,操作系统会恢复之前保存的上下文,继续执行被中断的进程或线程。

中断上下文切换与进程上下文切换有着明显的区别。中断上下文切换并不涉及到进程的用户态,因此在中断过程中打断了一个正处在用户态的进程时,不需要保存和恢复这个进程的虚拟内存、全局变量等用户态资源。相比之下,中断上下文只包括内核态中断服务程序执行所必需的状态,主要包括 CPU 寄存器、内核堆栈、硬件中断参数等。

中断上下文切换的特点:

  1. 内核态执行:
    • 中断上下文切换是在内核态下执行的,与用户态进程无关。因此,不需要保存和恢复用户态的资源。
  2. 资源限定:
    • 中断上下文主要关注于提供中断服务所需的最少资源,包括 CPU 寄存器、内核堆栈、硬件中断参数等。
    • 与进程上下文切换相比,中断上下文切换的资源范围较为有限,着重于满足中断处理的基本需求。
  3. 无需虚拟内存切换:
    • 由于中断上下文不牵涉用户态,因此无需切换虚拟内存。不同进程的虚拟内存空间在中断上下文中并不影响。
  4. 快速执行:
    • 中断上下文切换的目标是尽快响应硬件中断,因此切换过程相对迅速。
    • 这与进程上下文切换不同,后者可能涉及到更多的资源保存和恢复,因而相对较慢。

中断上下文切换的设计目标是最小化对系统性能的影响,专注于提供必要的执行环境以迅速处理硬件中断。这种机制使得操作系统能够高效地响应外部事件,保证系统的可靠性和实时性。

总结

上下文和上下文切换是操作系统中的关键概念,直接影响系统的性能和响应能力。了解上下文的概念以及上下文切换的过程有助于理解操作系统的工作原理,并能够优化程序以提高系统的性能和效率。在设计和开发多任务应用程序时,合理处理上下文切换是至关重要的。

复制

将client_name.ovpn传至手机后,在openvpn中打开文件即可链接

地址http://yt.hzjliang.xyz/s/w5YeP

地址http://yt.hzjliang.xyz/s/UnCbV

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
写给Java程序员看的,CPU 上下文切换、用户态、内核态、进程与线程上下文切换(转)
JDK源码中很多Native方法,特别是多线程、NIO部分,很多功能需要操作系统功能支持,作为Java程序员,如果要理解和掌握多线程和NIO等原理,就需要对操作系统的原理有所了解。
会说话的丶猫
2020/08/06
2.2K0
写给Java程序员看的,CPU 上下文切换、用户态、内核态、进程与线程上下文切换(转)
Linux性能优化篇-了解CPU上下文切换
所以我们会比较好了解CPU密集型,需要大量计算资源,会非常消耗cpu,I/O密集型需要等待I/O,会有大量的不可中断进程,
早起的鸟儿有虫吃
2019/08/22
5.1K0
Linux性能优化篇-了解CPU上下文切换
性能之cpu篇
对于性能来说,cpu的调度逻辑是影响性能的主要来源,本文主要来介绍下cpu跟性能相关的调度逻辑和排障工具。
灰子学技术
2022/04/27
7740
性能之cpu篇
​Linux CPU 性能优化指南
本文作者:allenxguo,腾讯 QQ 音乐后台开发工程师 本文主要帮助理解 CPU 相关的性能指标,常见的 CPU 性能问题以及解决方案梳理。 系统平均负载 简介 系统平均负载:是处于可运行或不可中断状态的平均进程数。 可运行进程:使用 CPU 或等待使用 CPU 的进程 不可中断状态进程:正在等待某些 IO 访问,一般是和硬件交互,不可被打断(不可被打断的原因是为了保护系统数据一致,防止数据读取错误) 查看系统平均负载 首先top命令查看进程运行状态,如下: PID USER
腾讯技术工程官方号
2020/08/11
9K0
深入理解 Linux CPU 上下文切换
我们都知道 Linux 是一个多任务操作系统,它支持的任务同时运行的数量远远大于 CPU 的数量。 当然,这些任务实际上并不是同时运行的(Single CPU),而是因为系统在短时间内将 CPU 轮流分配给任务,造成了多个任务同时运行的假象。 CPU 上下文(CPU Context) 在每个任务运行之前,CPU 需要知道在哪里加载和启动任务。这意味着系统需要提前帮助设置 CPU 寄存器和程序计数器。 CPU 寄存器是内置于 CPU 中的小型但速度极快的内存。程序计数器用于存储 CPU 正在执行的或下一条要
范蠡
2022/05/25
6650
深入理解 Linux CPU 上下文切换
Linux 性能调优之CPU上下文切换
99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完事情,战胜焦虑,战胜那些心里空荡荡的时刻,而不是选择逃避。不要站在原地想象困难,行动永远是改变现状的最佳方式
山河已无恙
2024/09/12
1K0
Linux 性能调优之CPU上下文切换
探讨Linux CPU的上下文切换
我们都知道 Linux 是一个多任务操作系统,它支持的任务同时运行的数量远远大于 CPU 的数量。当然,这些任务实际上并不是同时运行的(Single CPU),而是因为系统在短时间内将 CPU 轮流分配给任务,造成了多个任务同时运行的假象。 CPU 上下文(CPU Context) 在每个任务运行之前,CPU 需要知道在哪里加载和启动任务。这意味着系统需要提前帮助设置 CPU 寄存器和程序计数器。 CPU 寄存器是内置于 CPU 中的小型但速度极快的内存。程序计数器用于存储 CPU 正在执行的或下一条要执行
范蠡
2022/04/28
1.5K0
探讨Linux CPU的上下文切换
Linux调度系统全景指南(上篇)
| 导语 本文主要是讲Linux的调度系统, 由于全部内容太多,分三部分来讲,调度可以说是操作系统的灵魂,为了让CPU资源利用最大化,Linux设计了一套非常精细的调度系统,对大多数场景都进行了很多优化,系统扩展性强,我们可以根据业务模型和业务场景的特点,有针对性的去进行性能优化,在保证客户网络带宽前提下,隔离客户互相之间的干扰影响,提高CPU利用率,降低单位运算成本,提高市场竞争力。欢迎大家相互交流学习!
刘盼
2021/03/10
1.7K0
Linux调度系统全景指南(上篇)
总说上下文切换耗性能,那他到底耗了多少性能?
   众所周知,操作系统是一个分时复用系统,通过将CPU时间分为好几份。系统在很短的时间内,将 CPU 轮流分配给它们,从而实现多任务同时运行的错觉。    伴随着的还有一个词是上下文切换,无论在工作中还是面试中,我们总会听到要减少线程、进程的上下文切换,因为上下文切换的代价比较高,会影响性能。     今天我们就来详细说说上下文切换到底在切换什么,以及如何可视化的观察上下文切换的代价,它是怎么影响程序性能的。
公众号 云舒编程
2024/03/13
5930
总说上下文切换耗性能,那他到底耗了多少性能?
打开线程 | 进程 | 协程的大门
不知从几何起,可能是大三那年的操作系统考试,也可能是刚经历完的秋招,这些概念总是迷迷糊糊,可能自己回答的和其他人的答复也差不多,并没有什么亮点,通常都会以:「我们换个题」的方式结束,有时候也挺尴尬的。我们不妨看看这样几个题应该怎么去回答
帅地
2021/03/25
8480
打开线程 | 进程 | 协程的大门
通过vmstat学习CPU和进程性能监控
vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、虚拟内存使用、磁盘的IO、中断、上下文切换、CPU使用等情况。在操作系统性能分析中,能100%理解vmstat输出的含义并灵活应用,是性能分析必备的基本能力。
刘盼
2020/04/01
1.4K0
关于linux中的CPU上下文切换
目录 1.什么是CPU上下文切换 2.CPU上下文切换的类型 3.如何查看系统中的上下文切换 4.案例 5.总结 ---- 读过倪朋飞的《Linux性能优化实战》经常说的 CPU 上下文切换是什么意思
冬天里的懒猫
2021/08/05
1.3K0
从入门到转型之Linux性能优化实践学习指南
本系列是从入门到转型之Linux性能优化实践学习指南,是博主学习Linux性能优化之路的精华版本,我将分享大量性能优化的思路和方法,并进行相应工具使用介绍和总结。
全栈工程师修炼指南
2022/09/29
6490
从入门到转型之Linux性能优化实践学习指南
理解上下文切换带来的性能影响
  在多任务操作系统中,为了提高CPU的利用率,可以让当前系统运行远多于CPU核数的线程。但是由于同时运行的线程数是由CPU核数来决定的,所以为了支持更多的线程运行,CPU会把自己的时间片轮流分给其他线程,这个过程就是上下文切换。   导致上下文切换的原因有很多,比如通过wait()、sleep()等方法阻塞当前线程,这时CPU不会一直等待,而是重新分配去执行其他线程。当后续CPU重新切换到当前线程时,CPU需要沿着上次执行的指令位置继续运行。因此,每次在CPU切换之前,需要把CPU寄存器和程序计数器保存起来,这些信息会存储到系统内核中,CPU再次调度回来时会从系统内核中加载并继续执行。简而言之,上下文切换,就是CPU把自己的时间片分配给不同的任务执行的过程。
向着百万年薪努力的小赵
2022/12/02
1.4K0
理解上下文切换带来的性能影响
【Linux】:进程信号(详谈信号捕捉 & OS 运行)
还记得我们之前说过的吗,处理信号时并不一定立即去处理,有可能此时我们在做一个优先级很高的事情, 此时信号处理就会等到一个合适的时候去处理。
IsLand1314
2024/11/19
2680
【Linux】:进程信号(详谈信号捕捉 & OS 运行)
怒啃 24 小时,终于搞懂上下文切换!
对于服务器系统来说,上下文切换也是影响系统性能的一个重要因素。深入理解上下文切换的原理,有利于我们做好性能优化工作。今天我将带大家了解下上下文切换的几种情形,以及其背后发生切换的具体信息,接着介绍一些监测上下文切换指标的工具,最后总结一些上下文切换异常可能得场景。
陈树义
2022/09/28
2K0
怒啃 24 小时,终于搞懂上下文切换!
Linux 性能优化的全景指南,可能都在这里了,建议收藏~
性能问题的本质就是系统资源已经到达瓶颈,但请求的处理还不够快,无法支撑更多的请求。性能分析实际上就是找出应用或系统的瓶颈,设法去避免或缓解它们。
用户6543014
2022/03/04
2.8K0
Linux 性能优化的全景指南,可能都在这里了,建议收藏~
操做系统-线程与进程
进程切换的实质是回收当前运行进程对 CPU 的控制权,并将 CPU 控制权转交给新调度的就绪进程.
一滴水的眼泪
2020/09/24
7410
基础总结 (操作系统篇)
注: 此系列内容来自网络,未能查到原作者。感觉不错,在此分享。不排除有错误,可留言指正。
fliter
2023/06/18
4690
基础总结 (操作系统篇)
cpu上下文
进程是并发环境下,一个具有独立功能的程序在某个数据集上的一次执行活动,它是操作系统进行资源分配和保护的基本单位,也是执行的单位。
没有故事的陈师傅
2021/08/13
8710
相关推荐
写给Java程序员看的,CPU 上下文切换、用户态、内核态、进程与线程上下文切换(转)
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档