Linux Kernel 2

news2025/4/16 9:54:25

地址空间(Address Space)


一、物理地址空间(Physical Address Space)

物理地址空间 是指 RAM 和设备内存 在系统内存总线上所呈现的地址布局。

  • 举例:在典型的 32 32 32 位 Intel 架构中,
    • RAM(主内存)通常被映射在低地址段
    • 显卡内存或其他外设地址被映射在高地址段

📌 解释

  • 所谓“物理地址”是指 CPU 实际访问主板、内存条等硬件资源的地址;
  • 它由硬件总线决定,不受程序控制。

二、虚拟地址空间(Virtual Address Space)

虚拟地址空间(有时简称为“地址空间”)是指当系统开启虚拟内存管理模块(如分页机制、保护模式)后,CPU 所看到的地址空间。

  • 这时,每个地址都是一个“虚拟地址”,必须通过页表(Page Table)映射到物理内存地址
  • 内核负责建立这种虚拟地址到物理地址的映射关系

📌 常用术语解释:

  • “分页开启”也叫做 Paging Enabled \text{Paging Enabled} Paging Enabled,即启用了 MMU;
  • 操作系统通过页表控制不同虚拟地址段的访问权限和映射目标。

三、进程地址空间 vs 内核地址空间

1. 进程空间(Process Address Space)

这是指与每个用户态进程相关联的虚拟地址空间:

  • 通常从地址 0 0 0 开始,呈现为一块连续内存区域
  • 包括代码段(text)、数据段(data)、堆(heap)和栈(stack)等;
  • 不同进程之间的地址空间互相独立,彼此不可见。

2. 内核空间(Kernel Address Space)

这是内核模式代码看到的地址空间:

  • 包含内核本身的代码和数据、驱动模块、内核栈等;
  • 有更高的访问权限;
  • 用户态程序不能直接访问这一空间。

四、用户空间与内核空间共享虚拟地址空间

在大多数操作系统中,用户空间和内核空间是共享同一个虚拟地址空间的:
在这里插入图片描述

  • 典型做法是:
    • 用户空间占据虚拟地址空间的低地址部分
    • 内核空间占据虚拟地址空间的高地址部分
  • 为了防止用户程序访问内核区域,内核会在页表中设定访问权限。

📌 示意公式:

  • 假设虚拟地址空间为 4 4 4 GB:
    • 0 x 00000000 0x00000000 0x00000000 0 x B F F F F F F F 0xBFFFFFFF 0xBFFFFFFF 为用户空间;
    • 0 x C 0000000 0xC0000000 0xC0000000 0 x F F F F F F F F 0xFFFFFFFF 0xFFFFFFFF 为内核空间(如 Linux 通常采用的布局)。

执行上下文(Execution Contexts)

操作系统内核最重要的任务之一是处理中断(Interrupt),而且必须非常高效地处理。因此,内核为此引入了一种特殊的执行上下文(execution context)


一、中断上下文(Interrupt Context)

当内核因为硬件或软件中断而执行特定代码时,我们称之为运行在中断上下文中。

  • 包括中断处理函数(Interrupt Handler)及其相关机制;

  • 所有中断上下文的代码都运行在 内核态(Kernel Mode)

  • 存在一些限制,内核开发者必须注意:

    ❌ 不能调用阻塞(blocking)函数,比如 sleep()wait_event()
    ❌ 不能直接访问用户空间内存

📌 解释:

  • 中断处理必须尽快完成,任何阻塞操作都会导致系统性能下降甚至死锁;
  • 这是非抢占性环境non-preemptible中关键的执行上下文。

二、进程上下文(Process Context)

与中断上下文相对的是进程上下文

  • 当内核为某个进程或线程服务时,就处于进程上下文中;
  • 可以运行在:
    • 用户态(执行应用代码)
    • 内核态(执行系统调用)

📌 好处:

  • 在进程上下文中可以执行阻塞操作;
  • 也可以安全访问用户空间数据。

多任务(Multitasking)

多任务处理指的是操作系统“同时”执行多个程序的能力。

  • 实际上是通过快速切换context switch在多个进程之间实现的。

1. 协作式多任务(Cooperative Multitasking)

  • 每个程序主动将 CPU 控制权交还给操作系统;
  • 如果程序不主动释放,系统就无法切换任务。

❗ 容易出现“独占 CPU”的问题。

2. 抢占式多任务(Preemptive Multitasking)

  • 内核设定时间片time slice限制每个进程的运行时间;
  • 例如一个进程最多运行 100 m s 100ms 100ms,超时后会被强制切换。

📌 更加公平,不会因一个程序出问题而拖慢整个系统。


抢占式内核(Preemptive Kernel)

抢占式多任务(preemptive multitasking)抢占式内核(preemptive kernel)

  • 抢占式内核指的是:即便处于内核态,运行中的进程也可以被中断并切换
  • 而某些操作系统虽然支持抢占式多任务,但其内核本身却是不可抢占的

✅ 抢占式内核提高系统响应性
❌ 但增加了同步复杂度,如锁管理


可分页的内核内存(Pageable Kernel Memory)

  • 如果内核支持将某些内核空间的数据(如代码段、数据段、内核堆栈等)换出到磁盘,则称之为支持分页内核内存(pageable kernel memory)

📌 优点:节省 RAM
📌 缺点:换入换出开销,必须避免在中断上下文中访问


内核栈(Kernel Stack)

每个进程在内核态下执行时,会使用一个私有的内核栈

  • 该栈用于:

    • 保存函数调用链
    • 存储内核函数中的局部变量
  • 大小通常很小: 4 K B 4KB 4KB 12 K B 12KB 12KB(依平台架构而异)

⚠️ 避免:

  • 在栈上分配大型数据结构
  • 递归调用层级太深

可移植性(Portability)

为了让操作系统能在不同硬件平台上运行,现代内核采用以下顶层结构设计:

  1. 架构相关代码(Architecture-specific)

    • 包含平台相关的 C 和汇编代码(如中断向量表、启动流程等)
  2. 架构无关代码(Architecture-independent)

    • 包括:
      • 内核核心(Kernel Core):调度器、内存管理、IPC 等子系统
      • 设备驱动(Device Drivers)

📌 优点:

  • 实现代码复用
  • 同一套内核可以在多种硬件上运行(如 x86、ARM、RISC-V 等)

非对称多处理Asymmetric MultiProcessing(ASMP)与对称多处理Symmetric MultiProcessing(SMP)

现代操作系统内核在多核处理器环境下运行时,通常采用以下两种调度和执行架构:


一、ASMP(Asymmetric MultiProcessing,非对称多处理)

非对称多处理(ASMP) 模式中:

  • 一个处理器(核心)专门用于运行内核代码(如系统调用、驱动中断处理);
  • 其余处理器仅用于运行用户空间程序

📌 例子:

  • 核心 0:专门运行内核任务
  • 核心 1、2、3:只运行用户进程

✅ 优点:

  • 实现简单:没有并发内核执行,不需担心并发访问内存的冲突问题。

❌ 缺点:

  • 内核吞吐量不随核心数扩展
    • 所有系统调用、中断处理等都压在一个内核核心上;
    • 这对依赖频繁内核交互的程序是个性能瓶颈。

📌 适用场景:

  • 主要用于一些特定用途系统(如嵌入式或科学计算应用),这些系统内核调用较少,用户程序计算密集。

二、SMP(Symmetric MultiProcessing,对称多处理)

对称多处理(SMP) 模式中:

  • 所有核心都可以运行内核代码或用户代码
  • 任意一个核心都可以处理系统调用、中断或调度任务。

📌 更加灵活、高效,可实现多核并行加速内核功能。

❗ 实现难点:

  • 存在竞争条件(Race Conditions)
    • 当多个核心同时运行内核函数并访问相同的内存区域,可能会导致冲突或数据破坏;
    • 因此必须使用同步原语Synchronization Primitives来保护关键区域。

🛠 常用的同步机制包括:

  • 自旋锁(Spin Locks)
  • 互斥锁(Mutexes)
  • 原子操作(Atomic Operations)

📌 关键公式:
若多个处理器访问临界区:

Only one CPU can execute critical section at a time \text{Only one CPU can execute critical section at a time} Only one CPU can execute critical section at a time


CPU 可扩展性(CPU Scalability)

CPU 可扩展性是指:当系统中处理器核心数量增加时,整体性能是否也能线性或接近线性增长

📈 理想情况下, n n n 个核心应该能提供接近 n × n \times n× 单核性能。


一、尽量使用无锁算法(Lock-Free Algorithms)

无锁算法是指在多核环境下,不依赖传统加锁机制(如互斥锁)的并发控制算法。

✅ 优点:

  • 避免了线程之间的锁竞争;
  • 避免了死锁和优先级反转等问题;
  • 提高了在多核下的并发吞吐量。

📌 常用技术:

  • 原子操作(如 compare_and_swap \text{compare\_and\_swap} compare_and_swap
  • 循环 CAS(spin CAS loops)
  • 内存屏障(memory barriers)

二、热点区域使用细粒度锁(Fine-Grained Locking)

高并发访问的临界区域(high contention areas)中,使用更细粒度的锁可以提升扩展性。

对比:

锁粒度类型描述扩展性影响
粗粒度锁用一个锁保护多个资源❌ 容易产生锁竞争,影响性能
细粒度锁每个资源或资源组使用独立锁✅ 并发性更高,锁冲突减少

📌 示例:

  • 使用 per-CPU 数据结构,减少跨核心访问;
  • 将一个全局队列拆分为多个局部队列,每个队列单独加锁。

三、关注算法复杂度(Algorithm Complexity)

即使没有锁竞争,如果算法本身的复杂度太高,也会成为扩展性能的瓶颈。

建议:

  • 优化常用路径(hot path)的时间复杂度;
  • 避免在线程间频繁拷贝数据或创建临时结构;
  • 使用更适合并行的算法(例如基于数组的并行查找替代链表遍历)。

📌 记住:
O(1) ≫ O(log N) ≫ O(N) \text{O(1)} \gg \text{O(log N)} \gg \text{O(N)} O(1)O(log N)O(N)


💡 良好的 CPU 可扩展性 = 更低锁冲突 + 更短临界区 + 更高并发度 + 更优算法设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AndroidTV D贝桌面-v3.2.5-[支持文件传输]

AndroidTV D贝桌面 链接:https://pan.xunlei.com/s/VONXSBtgn8S_BsZxzjH_mHlAA1?pwdzet2# AndroidTV D贝桌面-v3.2.5[支持文件传输] 第一次使用的话,壁纸默认去掉的,不需要按遥控器上键,自己更换壁纸即可

线性方程组的解法

文章目录 线性方程组的解法认识一些基本的矩阵函数MATLAB 实现机电工程学院教学函数构造1.高斯消元法2.列主元消去法3. L U LU LU分解法 线性方程组的解法 看到以下线性方程组的一般形式:设有以下的 n n n阶线性方程组: A x b \mathbf{Ax}\mathbf{b} A…

Python赋能量子计算:算法创新与应用拓展

量子计算与Python结合的算法开发与应用研究 摘要 量子计算作为计算机科学的前沿技术,凭借其独特的计算能力在解决复杂问题方面展现出巨大潜力。Python作为一种高效、灵活的编程语言,为量子计算算法的开发提供了强大的支持。本文从研究学者的视角,系统探讨了量子计算与Pytho…

Java学习笔记(多线程):ReentrantLock 源码分析

本文是自己的学习笔记,主要参考资料如下 JavaSE文档 1、AQS 概述1.1、锁的原理1.2、任务队列1.2.1、结点的状态变化 1.3、加锁和解锁的简单流程 2、ReentrantLock2.1、加锁源码分析2.1.1、tryAcquire()的具体实现2.1.2、acquirQueued()的具体实现2.1.3、tryLock的具…

【软考系统架构设计师】系统配置与性能评价知识点

1、 常见的性能指标 主频外频*倍频 主频1/CPU时钟周期 CPI(Clock Per Instruction)平均每条指令的平均时间周期数 IPC(Instruction Per Clock)每时钟周期运行指令数 MIPS百万条指令每秒 MFLOPS百万个浮点操作每秒 字长影响运算的…

解锁Midjourney创作潜能:超详细提示词(Prompts)分类指南

AI生图自由!就来 ChatTools (https://chat.chattools.cn),畅享Midjourney免费无限绘画。同时体验GPT-4o、Claude 3.7 Sonnet、DeepSeek等强大模型。 为了帮助大家更好地驾驭Midjourney,我们精心整理并分类了大量常用且效果出众的提示词。无论…

大模型分布式推理和量化部署

一、小常识 1、计算大模型占用多少显存 对于一个7B(70亿)参数的模型,每个参数使用16位浮点数(等于 2个 Byte)表示,则模型的权重大小约为: 7010^9 parameters2 Bytes/parameter=14GB 70亿个参数每个参数占用2个字节=14GB 所以我们需要大于14GB的显存。注意14GB单纯是大…

【ROS】分布式通信架构

【ROS】分布式通信架构 前言环境要求主机设置(Master)从机设置(Slave)主机与从机通信测试本文示例启动ROS智能车激光雷达节点本地计算机配置与订阅 前言 在使用 ROS 时,我们常常会遇到某些设备计算能力不足的情况。例…

零基础HTML·笔记(持续更新…)

基础认知 HTML标签的结构 <strong>文字变粗</strong> &#xff1c;开始标签&#xff1e;内容&#xff1c;结束标签&#xff1e; 结构说明&#xff1a; 标签由<、>、1、英文单词或字母组成。并且把标签中<>包括起来的英文单词或字母称为标签名。常…

Visual Studio 2022 UI机器学习训练模块

VS你还是太超标了&#xff0c;现在机器学习都不用写代码了吗&#xff01;&#xff01; 右键项目解决方案&#xff0c;选择机器学习模型

FreeRTOS使任务处于阻塞态的API

在FreeRTOS中&#xff0c;任务进入阻塞状态通常是因为等待某个事件或资源。以下是常用的使任务进入阻塞态的API及其分类&#xff1a; 1. 任务延时 vTaskDelay(pdMS_TO_TICKS(ms)) 将任务阻塞固定时间&#xff08;相对延时&#xff0c;从调用时开始计算&#xff09;。 示例&…

独立开发者之网站的robots.txt文件如何生成和添加

robots.txt是一个存放在网站根目录下的文本文件&#xff0c;用于告诉搜索引擎爬虫哪些页面可以抓取&#xff0c;哪些页面不可以抓取。下面我将详细介绍如何生成和添加robots.txt文件。 什么是robots.txt文件&#xff1f; robots.txt是遵循"机器人排除协议"(Robots…

Leedcode刷题 | Day31_贪心算法05

一、学习任务 56. 合并区间代码随想录738. 单调递增的数字968. 监控二叉树 二、具体题目 1.56合并区间56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 给出一个区间的集合&#xff0c;请合并所有重叠的区间。 示例 1: 输入: intervals [[1,3],[2,6],[8,10],[15,1…

猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取

开发背景 家里养了三只猫咪&#xff0c;其中一只布偶猫经常出入厕所。但因为平时忙于学业&#xff0c;没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关&#xff0c;频繁如厕可能是泌尿问题&#xff0c;停留过久也可能是便秘或不适。为了更科学地了解牠的…

粘性定位(position:sticky)——微信小程序学习笔记

1. 简介 CSS 中的粘性定位&#xff08;Sticky positioning&#xff09;是一种特殊的定位方式&#xff0c;它可以使元素在滚动时保持在视窗的特定位置&#xff0c;类似于相对定位&#xff08;relative&#xff09;&#xff0c;但当页面滚动到元素的位置时&#xff0c;它会表现得…

最新版IDEA超详细图文安装教程(适用Mac系统)附安装包及补丁2025最新教程

目录 前言 一、IDEA最新版下载 二、IDEA安装 三、IDEA补丁 前言 IDEA&#xff08;IntelliJ IDEA&#xff09;是专为Java语言设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发&#xff0c;被公认为业界最优秀的Java开发工具之一。DEA全称Int…

JavaWeb-04-Web后端基础(SpringBootWeb、HTTP协议、分层解耦、IOC和DI)

目录 一、SpringBootWeb入门 1.1 概述 1.2 入门程序 1.2.1 需求 1.2.2 开发步骤 1.3 入门解析 二、HTTP协议 2.1 HTTP概述 2.1.1 介绍 2.1.2 特点 2.2 HTTP请求协议 2.2.1 介绍 2.2.2 获取请求数据 2.3 HTTP响应协议 2.3.1 格式介绍 2.3.2 响应状态码 2.3…

SQLite + Redis = Redka

Redka 是一个基于 SQLite 实现的 Redis 替代产品&#xff0c;实现了 Redis 的核心功能&#xff0c;并且完全兼容 Redis API。它可以用于轻量级缓存、嵌入式系统、快速原型开发以及需要事务 ACID 特性的键值操作等场景。 功能特性 Redka 的主要特点包括&#xff1a; 使用 SQLi…

wkhtmltopdf 实现批量对网页转为图片的好工具,快速实现大量卡片制作

欢迎来到涛涛聊AI 1、需求痛点 在学习当中经常遇到一些知识点&#xff0c;想和大家分享。但只有文本形式&#xff0c;很多人不愿意去阅读&#xff0c;也看不到重点。 如果自己去单独设计页面版式&#xff0c;又太浪费时间。那就想着有没有一种方法&#xff0c;可以把一个知识…

深入解析xDeepFM:结合压缩交互网络与深度神经网络的推荐系统新突破

今天是周日&#xff0c;我来解读一篇有趣的文章——xDeepFM。这篇文章由 Mao et al. 发表在SIGIR 2019会议。文章提出了一个新的网络模型——压缩交互网络&#xff08;CIN&#xff09;&#xff0c;用于显式地学习高阶特征交互。通过结合 CIN 和传统的深度神经网络&#xff08;D…