操作系统导论读书笔记—虚拟化内存

本文深入探讨了操作系统中的内存管理,特别是虚拟化内存和分页机制。介绍了物理存储器的层次结构,强调了分段和分页在解决内存问题上的角色,如内部碎片、外部碎片和地址转换。讨论了内存分配策略,包括分段带来的问题、空闲空间管理方法如分割与合并、地址转换的硬件实现以及TLB缓存。此外,还涉及了页交换策略,如最优替换、FIFO和LRU等,以及脏页处理和其他内存策略。
摘要由CSDN通过智能技术生成

1. 物理存储组成

在这里插入图片描述
物理存储器容量由小到大依次为寄存器、缓存、主存、本地磁盘、远程存储服务器,其存取速度由快变慢,单位字节的价格由高变低。

2. 分段

操作系统提供了一个物理内存的抽象,这个抽象就叫地址空间,是运行程序所能看到的系统中的内存。进程的地址空间包含了运行程序的所有内存状态。比如:程序的代码、栈保存当前函数的调用信息,分配空间给局部变量,传递参数和函数返回值。最后,堆用于管理动态分配的、用户管理的内存(malloc或new申请的)。还有静态初始化的变量。操作系统在专门硬件的帮助下,通过每一个虚拟内存的索引,将其转换为物理地址,从而进行访问。虚拟内存空间

2.1 内存类型及API

2.1.1 栈内存

在运行一个C程序时,会分配两种内存。第一种称为栈内存,它的申请和释放操作是编译器来隐式管理的,所以有时也称为自动内存。当函数退出时,编译器会释放该内存。函数不能返回指向栈内存的指针。

2.1.2 堆内存

这种主要针对长期内存要求,所有申请和释放操作都由程序员完成。

	void *malloc(int num); //返回指向新内存的指针

在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。

	void free(void *address); 

该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。

2.1.3 TXT区域(代码段)

储存是存放二进制可执行代码的位置

2.1.4 Data区域

存放静态常量,从高地址开始向下增长

2.1.5 BSS区域

存放未初始化的静态变量

2.2 内存常见错误

忘记分配内存

char *src="hello";
char *dst;
strcpy(dst,src);//segfault

运行这段代码,可能会导致段错误。

没有分配足够的内存

char *src="hello";
char *dst=char*malloc(strlen(src));//too small
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值