欢迎光临
我们一直在努力

存储分类——除了栈和堆,还有哪些?

栈和堆在内存RAM中是按照逻辑结构划分的。

逻辑划分是什么意思?

逻辑划分是人为定的:将硬件/软件资源根据不同场景(功能、用途、访问方式、管理策略、生命周期、性能要求、安全边界等)划分为多个不同的区域或层次。

11层存储分层既是物理的(不同介质速度、容量、成本不同),也是逻辑的(操作系统和硬件抽象出统一的访问接口)。

物理上硬件自动在各层存储之间逐层搬运数据,逻辑抽象为“内存地址空间”。

逻辑划分的意义?

可调整功能、用途、访问方式或管理策略,来提高计算机软硬件性能。

例如缓存按速度和容量层级划分L1、L2、L3,程序员几乎无法直接控制某行数据在L1还是L3,哪些字节被踢出,只能通过​写缓存友好的代码调整访问方式(如顺序访问数组、空间局部性),来间接影响缓存命中,以提升缓存命中率。

怎么把逻辑划分、存储分层、浏览器存储串起来?

  • 底层是物理存储介质:CPU内部的SRAM(做缓存)、DRAM(主存)、NAND Flash(SSD)、磁碟(HDD)。这是费曼存储分层的物理基础。
  • 中间是硬件/OS的逻辑抽象:
    • CPU和内存控制器将SRAM逻辑划分为L1I、L1D、L2、L3缓存。
    • 操作系统将DRAM逻辑划分为栈、堆、全局区、常量区、代码区。
    • 文件系统将块设备(磁盘)逻辑划分为分区、目录、文件。
  • 上层是应用/运行时的逻辑划分:
    • JVM将堆内存划分为新生代、老年代;将方法区划分为常量池、类元数据。
    • 浏览器将本地存储划分为Cookie、LocalStorage、IndexedDB等9种API。
    • 数据库将磁盘空间划分为数据文件、日志文件、回滚段等。
  • “内存按栈/堆划分”、“内存按生命周期管理划分”、“缓存按L1/L2/L3划分”、“浏览器存储按9种API划分”,它们都是在不同层级根据不同逻辑概念对统一的物理资源进行的划分。

    寄存器内部结构

    寄存器的分类是硬件设计中的逻辑抽象,从物理上看,这些寄存器都是 CPU 内部的高速存储单元(通常是 SRAM 或触发器阵列)。CPU 设计者根据功能、用途、访问方式等逻辑维度,让指令集、编译器、操作系统能够以统一的逻辑接口访问硬件,而不必关心每个寄存器在芯片上的具体物理位置。

    类型数量用途
    通用寄存器(GPR) 16~32 个 存任意值,参与算术、逻辑运算
    程序计数器(PC) 1 个 存放下一条要执行的指令地址
    栈指针(SP) 1 个 指向当前栈顶地址
    基址指针(BP) 1 个 指向当前栈帧基址,用于访问局部变量
    状态寄存器(FLAGS) 1 个 存储比较/运算结果标志(零标志、进位标志、溢出标志等)
    浮点寄存器 8~16 个 存储浮点数,用于浮点运算
    向量寄存器 16~32 个 用于 SIMD 指令集(如 AVX、SSE),单指令多数据并行计算
    特殊功能寄存器(SFR) 几十~几百个 嵌入式专用,直接控制硬件(GPIO、定时器、中断控制器等)

    嵌入式驱动开发人员会用特殊功能寄存器直接控制硬件,比如 GPIO、定时器、中断控制器。

    缓存内部结构

    缓存也不是一整块。按照存储层级分 L1 / L2 / L3 三层:L1 最小最快(3264KB),L3 最大最慢(864MB,多核共享)。

    L1 还分指令缓存(I-Cache)和数据缓存(D-Cache),使CPU 取指令和读数据可以并行。

    内存逻辑区域

    程序运行时,操作系统会将内存划分为以下几个主要逻辑区域:

    内存区域

    存储内容

    管理方式

    特点与注意事项

    栈 (Stack)

    函数调用时的局部变量、参数、返回地址等。

    由编译器自动分配和释放,遵循后进先出(LIFO)原则。

  • 连续的内存区域,分配/释放速度极快。

  • 大小有限(通常几MB),递归过深可能导致栈溢出。

  • 函数返回后,其栈帧自动被清理。

  • 堆 (Heap)

    动态分配的内存(如 malloc、new 创建的对象)。

    由程序员手动管理(或由垃圾回收器管理),通过指针访问。

  • 空间不连续,分配和释放更灵活但也更复杂。

  • 容量远大于栈,受系统物理内存和虚拟内存限制。

  • 管理不当易导致内存泄漏或碎片化。

  • 全局/静态存储区

    全局变量、静态变量(static)。

    在程序启动时分配,程序结束时释放。

  • 分为已初始化(.data段)和未初始化(.bss段)。

  • 生命周期贯穿整个程序运行期。

  • 常量区

    字符串常量、被 const 修饰的全局变量等。

    只读,程序加载时确定。

    试图修改会导致段错误(Segmentation Fault)。

    代码区

    存放编译后的机器指令(二进制代码)。

    只读,由操作系统加载。

    磁盘逻辑结构

    磁盘逻辑结构有6 层分类,DBA / 后端 / 嵌入式 Linux 这 3 个岗位要懂,性能问题常出在这 6 层之间。

    层划分谁在用性能影响
    物理层 盘片/磁道/扇区/柱面 DBA、备份工程师 寻道时间 5-15ms
    分区层 主分区/扩展分区/逻辑分区 OS 工程师 MBR/GPT 选错 → 容量浪费
    文件系统层 ext4/NTFS/XFS/btrfs 后端、DBA inode、块大小、日志
    挂载层 mount point、/etc/fstab OS 工程师、嵌入式 Linux noatime 优化
    虚拟化层 LVM/RAID/ZFS 基础设施、DevOps RAID 级别 → IOPS 差 10 倍
    应用层 数据库/缓存/日志 后端、DBA 隔离日志和数据盘

    文件系统内部逻辑结构

    文件系统层(如 ext4、NTFS)将物理磁盘块组织成更高层次的抽象(文件、目录、元数据),为上层应用提供统一的访问接口。有助于诊断性能问题和数据恢复。

    文件系统核心逻辑结构主要功能
    Linux ext4
    • 超级块 (Superblock):记录整个文件系统的元数据(大小、块数量、inode 数量等)。
    • 块组描述符 (Block Group Descriptor):描述每个块组的布局和状态。
    • inode 表 (inode Table):存储文件元数据(权限、所有者、大小、时间戳、数据块指针)。
    • 数据块 (Data Blocks):实际存储文件内容。
    • 日志区 (Journal):记录元数据操作,保证崩溃一致性。
    提供高性能、高可靠性的磁盘存储管理,支持大文件和大容量,通过日志保证数据一致性。
    Windows NTFS
    • 主文件表 (MFT):核心元数据表,每个文件/目录对应一个或多个 MFT 记录。
    • 位图 (Bitmap):跟踪簇(数据块)的使用情况。
    • 日志文件 (LogFile):记录事务,用于系统崩溃后的恢复。
    • 安全描述符 (Secure):存储文件和目录的安全属性(ACL)。
    • 数据流 (Data Streams):支持文件附加多个数据流(如 Alternate Data Streams)。
    支持大容量、高安全性(ACL)、文件压缩、加密和磁盘配额,通过 MFT 和日志提供高级功能。

    浏览器存储

    浏览器存储是在应用层的逻辑划分,通过浏览器引擎的逻辑抽象,为不同场景提供了不同的接口和语义。把存储介质(可能是硬盘或SSD),按照功能、生命周期、容量和访问权限等维度,在逻辑上划分为9 种存储 API:Cookie/LocalStorage/SessionStorage/IndexedDB/Cache API/Service Worker/OPFS/内存

    存储类型功能/用途生命周期容量访问方式
    Cookie 会话状态、身份标识 可设置过期时间 ~4KB 每次HTTP请求自动携带
    LocalStorage 持久化本地数据 永久(除非清除) ~5-10MB 同步API,同源页面共享
    SessionStorage 临时会话数据 标签页关闭即失效 ~5-10MB 同步API,仅当前标签页
    IndexedDB 结构化数据、离线应用 永久 较大(通常>50MB) 异步API,支持事务、索引
    Cache API 网络请求/响应缓存 受Service Worker控制 取决于浏览器/设备 异步API,用于PWA、离线
    Service Worker Cache 控制网络请求缓存策略 受Service Worker生命周期控制 通常数百MB 通过Cache API异步操作
    Web Storage API LocalStorage和SessionStorage的统称 同上 同上 同步API
    File System Access API 访问本地文件系统 用户授权期间 受磁盘空间限制 异步API,需要用户授权
    Origin Private File System (OPFS) 高性能、私有的文件系统访问 永久(同源) 通常>1GB 异步API,支持同步访问
    WebSQL (已废弃) 关系型数据库存储 永久 通常50MB+ SQL语法,异步API

    15 个岗位存储对照表

    岗位场景物理层6 层磁盘按区逻辑分
    嵌入式驱动 MMIO/中断/DMA/外设 L1 GPR + SFR 区
    编译器开发 寄存器分配/指令调度 L1-3 GPR + 向量区
    OS 内核 虚拟内存/页表/MESI L4-5 文件系统层 内核 + 用户 + 页表区
    游戏引擎 Draw Call/纹理流式 L2-3 + L6 显存区
    量化交易 FPGA 行情/纳秒延迟 L1-4 GPR + L1-I/D-Cache
    AI/ML 工程师 模型训练/KVCache L5-6 + L10 权重 + 优化器 + KVCache 区
    后端工程师 JVM GC/Redis/慢查询 L5-7 虚拟化层 堆 + 栈 + Buffer Pool
    DBA 索引/备份/表空间 L7-9 + L11 全 6 层 数据/日志/回滚区
    数据工程师 ETL/Spark/HDFS L7-10 虚拟化+应用 Shuffle + 分区
    前端工程师 JS 内存/DOM/HTTP 缓存 L5 + 浏览器 9 种 内存/同步/异步/代理区
    移动端开发 App 内存/OOM/SQLite L5 + 沙盒 9 种 文件系统层 内存/小配置/加密区
    DevOps/SRE Prometheus/容量规划 L4 + L7-10 虚拟化+应用 监控 + 日志区
    基础设施 跨层选型/容灾 L4-10 全 6 层 全栈分区
    备份工程师 全量/增量/磁带 L8-11 物理+应用 备份区
    嵌入式 Linux CMA/ION/eMMC L5 + L7-8 文件+物理 CMA + DMA + ION
    赞(0)
    未经允许不得转载:171主机测评 » 存储分类——除了栈和堆,还有哪些?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址