【Linux】Linux 地址空间 + 页表映射的概念解析

【Linux】Linux 地址空间 + 页表映射的概念解析
前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君**耐其心性,忘却杂尘,道有所长!!!!
在这里插入图片描述

IF’Maxue个人主页
 🔥 个人专栏:
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》

⛺️生活是默默的坚持,毅力是永久的享受。不破不立!

文章目录

Linux线程解析

一、进程与线程的核心区别

  • 进程 = 内核数据结构(如PCB) + 代码和数据(执行流)
  • 线程:进程内部的“执行分支”,是更轻量的执行流

内核视角的资源与调度:

  • 进程:系统资源分配的基本单位(占内存、文件描述符等)
  • 线程:CPU调度的基本单位(被CPU直接调度执行)

二、地址空间:线程共享的“窗口”

进程访问资源的核心是“地址空间”——它像一个“窗口”,通过这个窗口能看到进程拥有的所有资源(代码、数据、堆、栈等)。

创建进程时,系统会为它单独申请一套地址空间(窗口),包含所有资源;
而创建线程时,线程会共享进程的地址空间(同一个窗口):

image.png


(单进程的地址空间:一个窗口对应一个执行流)

image.png


(多线程共享地址空间:一个窗口对应多个执行流)

image.png


(多线程共享地址空间的结构:多个task_struct共用一套资源)

三、线程的本质:多执行流并行

  1. 资源分配的本质:划分虚拟地址
    地址空间里的虚拟地址,本质是“资源的代表”。比如代码区、数据区、堆区的虚拟地址范围,就是进程/线程能访问的资源范围。
  2. 多线程如何并行?
    多个线程(task_struct)共享同一地址空间,但可以分配不同的虚拟地址范围(比如执行不同函数),从而实现“同一进程内的并行执行”:
image.png


(多线程在同一地址空间内执行不同函数,实现并行)

  1. 函数与代码区的划分
    函数本质是“一段连续的虚拟地址”,线程执行不同函数,就是在代码区中选择不同的虚拟地址范围执行。
  2. 进程与线程的关系
    单进程可以看作“只有一个线程的特殊情况”:


(单线程进程是多线程进程的特例)

四、Linux为什么用进程模拟线程?

Linux的线程并非单独设计,而是通过“轻量级进程(LWP)”模拟实现——复用了进程的内核管理代码(如task_struct、调度逻辑)。

原因很简单:

  • 复用现有进程管理代码,无需重新设计线程管理模块,降低开发成本;
  • 保持内核的简洁与健壮性。
image.png


(Linux复用进程内核代码管理线程,成本更低)

五、其他平台的线程实现

不同操作系统的线程实现不同:

  • Windows:单独设计“线程控制块(TCB)”管理线程,内核中需单独维护线程的调度信息,实现更复杂;
  • 核心思想一致:线程是调度单位,共享进程资源,但具体实现细节因系统而异。

六、Linux线程的调度与称呼

  • 操作系统视角:线程和进程都是“执行流”,调度算法无需区分;
  • 硬件视角:Linux内核中无独立“TCB”,用户态线程通过“轻量级进程(LWP)”与内核交互,每个用户态线程对应一个LWP;
  • 内核用task_struct统一描述进程和LWP,每个线程有自己的入口函数,被CPU当作独立执行流调度:
image.png


(每个线程的task_struct对应独立执行流,共享进程资源)

七、资源划分:共享与独占

  • 进程:强调“独占”(独立地址空间、资源),仅通过通信机制共享部分数据;
  • 线程:强调“共享”(同一地址空间、代码、数据、文件描述符等),独占资源包括线程栈、寄存器状态、程序计数器(PC)、线程私有数据(TLS)。

形象说:进程像“独立的公司”,线程像“公司内的团队”——团队共享公司资源,各自执行不同任务,共同完成公司目标。

八、物理内存管理:4KB页框

硬件与系统对内存的管理,都以“4KB”为基本单位:

  • 磁盘文件、物理内存均按4KB块存储/管理,这个块称为“页框”或“页帧”;
  • 内核用struct page描述每个4KB页框:
image.png


struct page结构体:描述4KB页框的属性)

页框的地址计算

  • 早期内核中,struct page会被组织成数组(如struct page mem[1048576]),该大小对应4GB物理内存(1048576×4KB=4GB),数组下标即页框索引;
  • 页框起始物理地址 = 数组下标 × 4KB;
  • 具体物理地址 = 页框起始地址 + 页内偏移(0~4095):
image.png


(物理地址由页框起始地址和页内偏移组成)

申请物理内存的本质

就是修改struct page数组的状态(标记某页框为“已分配”),建立“进程/线程”与“页框”的对应关系。

九、虚拟地址与页表映射

程序访问的是“虚拟地址”,需通过“页表”转换为物理地址。

32位虚拟地址的划分(经典两级页表)

32位x86架构的经典两级页表中,虚拟地址被分为3部分:

  • 前10位:页目录索引;
  • 中10位:页表索引;
  • 后12位:页内偏移(4KB=2¹²,12位可覆盖0~4095的偏移范围)。

页表映射过程

  1. 用前10位查“页目录”,找到对应“页表”的物理地址;
  2. 用中10位查“页表”,找到目标“物理页框”的起始地址;
  3. 用后12位(页内偏移)定位到具体字节:
image.png


(页目录→页表→物理页框:虚拟地址到物理地址的转换)

附:简单线程创建示例(修正编译说明)

用C语言的pthread库创建线程(体现线程共享地址空间),编译时需链接pthread库(加-lpthread参数):

#include<stdio.h>#include<pthread.h>// 共享变量(线程共享同一地址空间,可直接访问)int shared =0;// 线程1执行函数void*thread1(void*arg){ shared++;printf("线程1:shared = %d\n", shared);returnNULL;}// 线程2执行函数void*thread2(void*arg){ shared++;printf("线程2:shared = %d\n", shared);returnNULL;}intmain(){pthread_t tid1, tid2;// 创建线程pthread_create(&tid1,NULL, thread1,NULL);pthread_create(&tid2,NULL, thread2,NULL);// 等待线程结束(避免主线程提前退出)pthread_join(tid1,NULL);pthread_join(tid2,NULL);// 主线程也能访问sharedprintf("主线程:shared = %d\n", shared);return0;}

编译命令:gcc -o thread_demo thread_demo.c -lpthread
输出(共享变量被两个线程修改,顺序可能因调度略有差异):

线程1:shared = 1 线程2:shared = 2 主线程:shared = 2 

Read more

Kylin/Linux 服务器健康一键巡检工具

Kylin/Linux 服务器健康一键巡检工具

这份脚本是面向 Kylin V10SP2/CentOS/Ubuntu 等主流 Linux 发行版的全维度服务器健康巡检工具,一站式检测网卡 / 网络连通性 / DNS 解析 / 系统资源 / 安全基线 / 时间同步 / 硬件健康 / 系统更新 / 进程负载 / 系统日志 / 内核参数等 11 大类核心状态,并自动保存巡检日志、输出可视化汇总报告;巡检结果如下: ╔════════════════════════════════════════════════════════════╗ ║ 🚀 Kylin/Linux 服务器健康一键巡检工具 v3.0.0 ║ ╚════════════════════════════════════════════════════════════╝ 📅 巡检时间 :2026-02-25 23:05:26 🖥️ 主机名称 :192.168.1.10 📦 系统版本 : Kylin Linux Advanced Server V11 (Swan25) 🐧 内核版本 :6.

By Ne0inhk
Windowns系统WSL2 Ubuntu 方式部署Openclaw

Windowns系统WSL2 Ubuntu 方式部署Openclaw

这是官方推荐的 Windows 部署方式,提供最完整的 Linux 环境支持。 好消息!近期找到个更简单部署方法,通过镜像还原方式,适合想快速部署或零基础的! 【Openclaw安装别再花冤枉钱了!零基础镜像还原法,一次成功-哔哩哔哩】 https://b23.tv/iH4usWS 准备:启用适用于Linux的Windows子系统和虚拟化平台,重启电脑。 1. 启用 WSL2 以管理员 身份打开 PowerShell,执行: # 启用 WSL 功能 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart # 设置 WSL 2 为默认版本,

By Ne0inhk
探秘 C++ list:在复杂数据管理的编程世界里,它宛如灵动的魔法链条,高效实现元素频繁增删,有序维系数据秩序,无论是海量动态数据缓存、游戏角色属性集处理,还是复杂任务调度编排

探秘 C++ list:在复杂数据管理的编程世界里,它宛如灵动的魔法链条,高效实现元素频繁增删,有序维系数据秩序,无论是海量动态数据缓存、游戏角色属性集处理,还是复杂任务调度编排

🌟个人主页:落叶  🌟当前专栏:C++专栏 目录 list的介绍及使用 list的介绍 list的使用  list的构造  构造的list中包含n个值为val的 元素  构造空的list 拷贝构造函数  用[first, last)区间中的元素构造 list list iterator的使用  【begin+end】 【rbegin+ rend】反向迭代器  list capacity 【empty】检测list是否为空 【size 】返回list中有效节点的个数  list element access 【front】返回list的第一个节点中值的引用 【back 】返回list的最后一个节点中值的引用   list modifiers 【push_front】在list首元素前插入值为val的元素 【pop_front】删除list中第一个元素 【push_back】在list尾部插入值为val的元素

By Ne0inhk
【Linux】网络基础(一)

【Linux】网络基础(一)

文章目录 * 网络发展 * 认识协议 * 🚩网络协议 * 🚩协议分层 * OSI七层协议 * 🚩TCP/IP五层(四层)协议 * 🚩网络传输基本流程 * 🚩数据包的封装和解包 * MAC地址 网络发展 起初计算机是用在军事上的 独立模式: 计算机之间相互独立 网络互联:多台计算机连接在一起实现网络互联 局域网LAN:计算机数量越来越多了,通过交换机和路由器连接在一起 广域网WAN:将远隔千里之外的的计算机连接在一起 所谓局域网广域网是相对概念,我们家庭路由器就可以看作局域网,把家家户户连接的社区就是广域网。社区看作局域网,把社区连接的就是广域网,中国网络看作局域网,连接世界就是广域网 认识协议 协议是一种约定 计算机之间通过光信号电信号交流,通过频率强弱来代表0和1,要想传递不同信息,就要约定好数据格式,比如000代表什么信息 要想多台计算机之间相互通信,就要约定共同的标准,这就是网络协议 🚩网络协议 🚩协议分层 打电话的例子,语言层汉语有协议,通信设备层也有协议 英语之间交流

By Ne0inhk