内存交换(Memory Swap)与内存覆盖(Memory Overwrite)

内存交换(Memory Swap)与内存覆盖(Memory Overwrite)

内存交换(Swap)内存覆盖(Overwrite) 是两个不同的概念,涉及 计算机存储管理、进程调度、数据安全等方面。它们在 操作系统数据结构安全性性能优化 方面都有重要影响。


1. 内存交换(Memory Swap)

(1)什么是内存交换?

内存交换(Swapping) 是操作系统在内存不足时,把 暂时不活跃的进程RAM(物理内存) 移动到 磁盘(Swap Space 交换空间),以释放内存给其他进程使用。

(2)内存交换的原理

  • 当物理内存不足时,操作系统会选择不活跃的进程,把它们的全部内存页写入磁盘的 Swap 空间
  • 当该进程需要运行时,系统再将它的数据从 Swap 交换空间重新加载到 RAM。

(3)Linux/Windows 中的 Swap

  • Linux 使用 Swap 分区或 Swap 文件/swapfile)。
  • Windows 使用 Pagefile(页面文件)pagefile.sys)。

(4)示例:Linux 交换空间

在 Linux 上,可以使用以下命令查看 Swap 使用情况:

free -h  # 显示内存和 Swap 交换空间
swapon -s  # 查看当前启用的 Swap 分区

(5)Swap 交换的影响

优点

  • 允许在物理内存不足时运行更多程序(避免崩溃)。
  • 提供进程暂停和恢复的机制(进程调度)。

缺点

  • 速度慢:Swap 交换涉及磁盘 I/O,比 RAM 慢 几个数量级(RAM 速度约 10GB/s,磁盘 几百 MB/s)。
  • 频繁 Swap 可能导致 Thrashing(颠簸现象),CPU 过多时间在内存交换而非执行程序。

(6)如何优化 Swap

  • 增加物理内存(RAM),减少 Swap 需求。
  • 调整 swappiness(Linux)
    sudo sysctl vm.swappiness=10  # 降低 Swap 频率(默认 60)
    
  • 使用 SSD 作为 Swap(比 HDD 更快,但仍比 RAM 慢)。

2. 内存覆盖(Memory Overwrite)

(1)什么是内存覆盖?

内存覆盖(Memory Overwrite) 是指程序错误地覆盖了不属于它的数据,导致数据损坏、崩溃、或安全漏洞

(2)内存覆盖的常见原因

✅ (1) 数组越界(Buffer Overflow)
#include <iostream>
int main() {
    char arr[5] = "test";  // 数组大小 5,字符串 "test" 刚好 4+1(\0)
    arr[5] = 'X';  // ❌ 内存覆盖,超出数组范围
}

解决方法

  • 使用 std::vector<>std::string,避免手动管理内存。
  • 使用 sizeof() 确保不越界访问

✅ (2) 指针误用
#include <iostream>
int main() {
    int* p = nullptr;
    *p = 42;  // ❌ 访问 NULL 指针,导致程序崩溃
}

解决方法

  • 初始化指针int* p = new int(42);
  • 使用智能指针std::unique_ptrstd::shared_ptr)。

✅ (3) 释放后访问(Use After Free)
#include <iostream>
int main() {
    int* p = new int(10);
    delete p;  // 释放内存
    *p = 20;  // ❌ 未定义行为,访问已释放的内存
}

解决方法

  • 释放后置 nullptrdelete p; p = nullptr;
  • 使用智能指针std::unique_ptrstd::shared_ptr)。

✅ (4) 缓冲区溢出(Stack Smashing)

典型的安全漏洞(如 gets()

#include <iostream>
void unsafe() {
    char buffer[8];
    gets(buffer);  // ❌ 可能覆盖返回地址,导致代码执行劫持
}

解决方法

  • 使用 fgets(),避免写入超过缓冲区大小的数据。
  • 使用 std::string 代替 char[]

(3)内存覆盖的危害

程序崩溃:覆盖系统关键数据导致异常。
数据损坏:程序错误地写入内存,破坏重要信息。
安全漏洞:攻击者利用缓冲区溢出,执行恶意代码(如 return-to-libc 攻击)。


3. 内存交换 vs. 内存覆盖

特性内存交换(Swap)内存覆盖(Overwrite)
定义操作系统将不活跃进程的内存数据交换到磁盘程序错误地覆盖内存中的数据
目的释放 RAM,支持多任务提高程序健壮性,避免数据损坏
影响可能导致性能下降可能导致崩溃或安全漏洞
解决方案增加 RAM、优化 swappiness使用智能指针,避免越界访问

4. 关键结论

内存交换(Swap) 主要用于操作系统调度,当内存不足时将数据转移到磁盘,降低性能但保持系统稳定
内存覆盖(Overwrite) 主要发生在程序错误,会导致数据损坏、崩溃,甚至安全漏洞。
优化 Swap 可以提高系统性能,避免内存覆盖 可以增强程序的安全性和稳定性。

💡 编写安全代码时,应注意边界检查,避免访问无效指针,并尽量使用 std::vector<>std::string 以及智能指针! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值