[程序员的自我修养_1] 内存分配 | 分段分页 | 系统接口

目录

第一章 温故而知新

一. 提升速度的方式

对称多处理器

多核处理器

站得高 看得远

1. 基础分配策略的问题

2. 动态内存分配策略

(1) 动态分区分配

(2) 分页机制

(3) 分段机制

3. 虚拟内存扩展

4. 针对场景(128MB)

关键代码逻辑(伪代码)

总结

二. 系统软件

1. 接口

应用程序编程接口API

系统调用接口System call Interface

硬件规格Hardware Specification

2. 操作系统

功能

操作系统

内存(内存角度)


第一章 温故而知新

研究背景:X86指令集的32位PC

三个关键部件:CPU、内存、I/O设备芯片

xmimd:

一. 提升速度的方式

早期设计

硬件结构

对称多处理器
  • 名称:SMP(Symmetrical Multi-Processing)
  • 多个对等架构的CPU
  • 用于大型数据库、网络服务器等

多核处理器
  • 名称:Multi-core Processor
  • 多个处理器核心包在一起,多个CPU但共享内存
  • 用于个人PC


站得高 看得远

软件结构

不要让 cpu 打盹

设备驱动

读取设计

内存不够怎么办

我们来看一下这种错误策略

关于隔离

  • 虚拟地址
  • 物理地址

分段

  • 解决了 1 3 两个问题

分页和页表

我们再来思考一下,对作者提到的 a b c 进程进行内存分配


1. 基础分配策略的问题

你提到的直接分配方式属于 固定分区分配,但会引发以下问题:

  • 内存碎片例如程序C(20MB)无法插入到B(100MB)之后的剩余18MB(128-110=18MB),导致外部碎片。
  • 利用率低:若程序A结束运行,其占用的10MB可能无法被后续其他程序有效利用。

2. 动态内存分配策略

操作系统通过动态分配策略管理空闲内存块,常见方法:

(1) 动态分区分配
  • 首次适应 (First Fit):从内存低地址开始找第一个足够大的空闲块。
    • 示例:A(10MB)→B(100MB)→C(20MB)。若B结束后释放100MB,新进程D(50MB)可复用B的空闲区。
  • 最佳适应 (Best Fit):选择最小的足够空闲块。
    • 问题:可能产生大量小碎片。
  • 最坏适应 (Worst Fit):选择最大的空闲块。
    • 目标:减少后续碎片化。
(2) 分页机制
  • 将物理内存划分为固定大小的页(如4KB),进程内存按页分配。
    • 解决碎片:允许非连续分配,避免外部碎片。
    • 示例:128MB内存分为32,768页。A需2,560页(10MB),B需25,600页,C需5,120页。
    • 页表管理:每个进程维护页表,记录逻辑页→物理页框的映射。
(3) 分段机制
  • 按程序逻辑划分(代码段、数据段、堆栈段),每段独立分配。
    • 优点:支持动态扩展(如堆栈),保护权限分离。
    • 缺点:仍可能产生外部碎片。

3. 虚拟内存扩展

通过磁盘交换扩展可用内存:

  • 页面置换算法:当物理内存不足时,将部分页面换出到磁盘。
    • 示例:若A、B、C同时运行需130MB(10+100+20),系统可将B的部分页面换出,优先保留活跃进程。
  • 写时复制 (Copy-on-Write):多个进程共享相同内存页,直到修改时才复制。

4. 针对场景(128MB)

假设需要同时运行A(10MB)、B(100MB)、C(20MB):

  1. 动态分区+首次适应
    • 分配A(0-10MB) → B(10-110MB) → C(110-130MB,但超出物理内存,需置换或拒绝)。
  1. 分页+虚拟内存
    • B的100MB可能部分在物理内存,部分在磁盘,但程序无感知。
  1. 优化策略
    • 合并B和C的分配区间(若B结束后运行C)。

关键代码逻辑(伪代码)

struct MemoryBlock {
    int start;
    int size;
    bool free;
};

std::list<MemoryBlock> freeList;

// 首次适应分配算法
MemoryBlock* allocate(int size) {
    for (auto& block : freeList) {
        if (block.free && block.size >= size) {
            // 分割块并返回分配结果
            ...
            return &block;
        }
    }
    return nullptr; // 分配失败
}

总结

现代操作系统通常结合分页和虚拟内存实现高效内存分配,核心目标:

  • ✅ 减少碎片(分页解决外部碎片,动态分配解决内部碎片)
  • ✅ 提高利用率(置换算法、共享内存)
  • ✅ 隔离保护(MMU硬件支持)

总结:

二. 系统软件

1. 接口

应用程序编程接口API
  • 是应用程序提供的,给应用程序/开发工具使用
  • 包括:
    • Linux下POSIX-API(Glibc库提供)
    • Windows下:Windows API32(即Win32)
系统调用接口System call Interface
  • 是操作系统提供的,给应用程序使用

形式是软件中断

  • 软件中断:不会直接中断CPU,只有当前正在运行的代码(或进程)才会产生软中断
  • 中断是一种内部中断,需要在当前运行的程序去做一些事情(通常为I/O)的请求
  • 扩展硬件中断:处理中断的驱动需要运行在CPU上的
  • 当中断产生的时候,CPU会暂时停止当前运行的程序转而执行中断请求
硬件规格Hardware Specification
  • 是硬件厂商提供的,给操作系统(内核层)使用
  • 阅读硬件编程接口,编写驱动程序操作硬件
  • 注:硬件厂商参考硬件规格+操作系统布线的接口,开发这些硬件在操作系统上的驱动程序

2. 操作系统

功能
  • 提供抽象接口
  • 管理硬件资源
操作系统
  • 发展历程(CPU角度):分时系统、多任务系统
  • 硬件被抽象成一系列概念,内部细节由驱动功能完成
  • 设备驱动(I/O角度):一个文件读写的例子
内存(内存角度)

问题:如何将计算机有限的物理内存分配给各个程序使用

直接分配物理地址,缺点:

    1. 地址空间不隔离
    2. 内存使用效率低
    3. 程序运行地址不确定

解决:使用虚拟地址

1. 分段的方法:程序需要的内存空间大小的虚拟空间映射到某个地址空间空闲,能解决问题 1 3

2. 分页的方法:

  • 把内存人为分为固定大小的页,比分段更加细粒度,同时可以进行缓存锁定
  • 页的大小,硬件决定,页表是4KB
    • 进程按页分割:虚拟页,物理页,磁盘页
    • CPU中的MMU组件执行访存时:CPU发出虚拟地址,经MMU转化为物理地址

下一篇文章,我们将对 众人拾柴火焰高--线程,进行讲解~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值