概念

进程 是一个执行起来的程序。进程 = 内核数据接口 + 代码和数据
– 承担分配系统资源的基本实体

线程 是执行流,执行力度比进程更要细。是进程内部的一个执行分值
– 线程是OS调度的基本单位

如果linux要支持线程,那么线程就必须要被OS管理!

Linux下线程的概念和实现

Linux下的进程,是用进程模拟实现的(复用历史代码)
线程在进程内部运行,线程在进程的地址空间内运行

核心实现逻辑
Linux内核中没有专门的线程结构体,而是通过「复用进程的task_struct结构体」来模拟实现线程:

  • 一个进程(主线程)对应一个task_struct,创建新线程时,内核会新建一个task_struct

  • 新线程的task_struct与主线程共享:地址空间、文件描述符表、信号处理方式、当前工作目录等

  • 新线程的task_struct独立拥有:栈空间、程序计数器(PC)、寄存器集合、线程ID(TID/LWP)等

关键特性

  • 线程在进程内部运行,共享进程的地址空间,因此线程间通信无需跨进程(如直接读写全局变量)

  • 进程是资源分配的最小单位,线程是CPU调度的最小单位

  • 线程的创建/销毁/切换开销远低于进程(无需分配新的地址空间)
    在这里插入图片描述

进程 VS 线程

Linux执行流,统一成为:轻量级进程(LWP)
Linux中没有真正意义上的线程,linux的线程概念,使用LWP进行模拟实现的!

在这里插入图片描述
Linux特有的LWP概念
Linux执行流,统一称为:轻量级进程(Light Weight Process,LWP)

  • Linux中没有“真正意义上的线程”,所有执行流均以LWP的形式存在

  • 每个LWP对应一个唯一的LWP ID(可通过ps -Lf 查看)

  • 内核调度时,只识别LWP ID,而非进程ID(PID) —— 即使是同一个进程内的多个线程,内核也会视为不同的LWP分别调度

例子
在这里插入图片描述
真是调度,看的是LWP

地址空间

进程地址空间的划分(Linux 32位为例)
Linux进程的虚拟地址空间被划分为多个区域,核心分区如下:

  • 内核空间(3GB~4GB):所有进程共享,存放内核代码/数据,用户态无法直接访问

  • 用户空间(0GB~3GB):每个进程独立拥有,包含:

    • 代码段(.text):存放程序编译后的机器码,只读

    • 数据段(.data/.bss):存放全局变量、静态变量

    • 堆(Heap):动态内存分配区域(malloc/mmap),向上增长

    • 栈(Stack):存放函数参数、局部变量、返回地址,向下增长

    • 环境变量/命令行参数区:存放env、argv等

资源划分
在这里插入图片描述


内存管理

Linux中,内存管理的基本单位是4KB

页式内存管理的核心
Linux中,内存管理的基本单位是4KB的页(Page) —— 内核不会直接按字节分配内存,而是以4KB为最小粒度:

  • 虚拟地址被划分为若干个4KB的虚拟页(Virtual Page)

  • 物理内存被划分为若干个4KB的物理页框(Page Frame)

  • 内核通过「页表」建立虚拟页和物理页框的映射关系

为什么用4KB作为基本单位?

  • 平衡内存浪费:若单位太小(如1B),页表项会暴增;若单位太大(如1MB),会导致内存碎片(如分配1KB也会占用1MB)

  • 硬件支持:CPU的MMU(内存管理单元)原生支持4KB页大小,转换效率最高
    在这里插入图片描述

虚拟地址和物理地址的转换

转换流程(32位Linux二级页表为例)

  1. CPU将32位虚拟地址拆分为:页目录号(10位) + 页表号(10位) + 页内偏移(12位)

  2. 内核通过CR3寄存器找到当前进程的页目录基址

  3. 用页目录号索引页目录表,找到对应的页表基址

  4. 用页表号索引该页表,找到物理页框号

  5. 物理页框号 + 页内偏移 = 最终的物理地址

  6. CPU的MMU硬件完成上述转换(无需内核参与,效率极高)

核心作用

  • 地址隔离:每个进程拥有独立的页表,虚拟地址空间互不干扰

  • 内存复用:多个进程的虚拟页可映射到同一个物理页(如共享库)

  • 按需分配:仅当进程访问某虚拟页时,才分配物理页框(缺页中断)
    在这里插入图片描述

补充

单级页表对连续内存要求搞,于是引入了多级页表,但是多级页表也是一把双刃剑,在减少连续存储要求且减少存储空间的同时降低了查询的效率。

单级页表的问题

32位系统中,单级页表需要 2^20 = 1048576 个页表项(每个项4字节),总计占用4MB内存 —— 每个进程都要占用4MB页表空间,内存浪费极大;且单级页表要求连续的物理内存存放,对内存连续性要求高。

多级页表的优势
  • 节省内存:仅为进程实际使用的虚拟页创建页表项,未使用的区域无需分配页表

  • 降低连续内存要求:页目录表和页表可分散存储在物理内存的不同位置

多级页表的代价
  • 地址转换效率降低:二级页表需要2次内存访问(页目录→页表→物理页),三级页表需要3次

  • 内核额外开销:需要维护多级页表的创建、销毁和映射关系

优化方案

CPU通过「TLB(快表)」缓存最近访问的页表项,将多级页表的转换效率提升至接近单级页表(TLB命中率通常>90%)。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐