微信小程序本地存储与登录页面处理实例详细讲解
771
2022-09-04
【复习笔记】操作系统之内存管理
一、程序装入内存的三种方式
1. 绝对装入2. 可重定位装入3. 动态重定位从写程序到程序运行的过程
二、程序链接的三种方式三、覆盖技术四、交换技术五、连续分配管理方式
1. 单一连续分配(连续)2. 固定分区分配(连续)3. 动态分区分配(连续)
六、基本分页存储管理七、两级页表机制八、基本分段存储管理九、段页式存储管理十、虚拟存储技术
传统存储管理方式的特征、缺点虚拟存储的定义和特征虚拟存储技术的实现基本页表和请求页表缺页中断时的操作请求分页与基本分页的区别请求分页需要注意的地方
十一、页面置换算法
1. 最佳置换算法(OPT)2. 先进先出置换算法3. 最近最久未使用置换算法(Least Recently Used)4. 时钟置换算法(CLOCK)5. 改进的时钟置换算法置换算法的对比
十二、页面分配策略十三、堆栈分配
一、程序装入内存的三种方式
1. 绝对装入
2. 可重定位装入
3. 动态重定位
从写程序到程序运行的过程
二、程序链接的三种方式
三、覆盖技术
四、交换技术
五、连续分配管理方式
1. 单一连续分配(连续)
2. 固定分区分配(连续)
分区说明表
3. 动态分区分配(连续)
用于存储的数据结构
分区分配算法
首次适应算法:空闲分区按照地址递增次序链接,每次从低地址开始查找,找到第一个满足大小的空闲分区最佳适应算法:空闲分区按照容量递增次序链接,每次分配内存时顺序查找空闲分区链最坏适应算法:空闲分区按照容量递减次序链接,每次分配内存时顺序查找空闲分区链邻近适应算法:空闲分区按照地址递增次序链接,每次从上次查找结束的位置开始查找,找到第一个满足大小的空闲分区。可以跳过如首次适应算法中很多低地址部分的小空闲分区。最终剩余的空闲分区比较均匀。
分区的分配与回收: 只要回收的分区与其他空闲分区相邻,则需要合并。
六、基本分页存储管理
页、页面 : 进程被分割后的一个一个部分页框、页帧: 内存空间被分割后的一个一个部分
页表
地址转换
地址转换例题
具有快表(TLB)的基本地址变换机构快表: 是一种访问速度比内存快很多的高速缓存(TLB是cache,不是内存),用来存放最近访问的页表项的副本,可以加快地址变换速度。于此对应,内存中的页表称为慢表。
注: 快表可减少访问内存次数,同时访问快表比访问内存快引入快表后,地址变换加快
局部性原理
七、两级页表机制
单级页表存在的问题:
页表必须连续存放,因此页表很大时,需要占用很多连续的页框没必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面
八、基本分段存储管理
分段存储管理地址变换机构
分页和分段的比较
九、段页式存储管理
段页式地址变换机构
十、虚拟存储技术
传统存储管理方式的特征、缺点
虚拟存储的定义和特征
虚拟存储技术的实现
基本页表和请求页表
缺页中断时的操作
请求分页与基本分页的区别
请求分页需要注意的地方
十一、页面置换算法
1. 最佳置换算法(OPT)
2. 先进先出置换算法
注: 实际上难以实现
3. 最近最久未使用置换算法(Least Recently Used)
4. 时钟置换算法(CLOCK)
5. 改进的时钟置换算法
置换算法的对比
十二、页面分配策略
抖动现象: 刚刚换入内存的页面,马上又要换出。页面频繁的换入换出导致进程无法正常工作。主要原因: 进程频繁访问的页面数目高于可用的物理块数。
十三、堆栈分配
一个由C/C++编译的程序占用的内存分为以下几个部分:
栈区(stack): 由编译器自动分配释放,存放函数的参数值,局部变量的值等。堆区(heap):由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。文字常量区:常量字符串就是放在这里的。程序代码区:存放函数体的二进制代码。
栈 是内存中的一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出。
堆 是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。
在高级语言中,程序函数调用、函数中定义的变量都用到栈(stack)。用malloc, calloc, realloc等函数分配得到变空间是在堆(heap)上。在所有函数体外定义的是全局量。加了static修饰符后不管放在哪里都属于静态变量,存放在全局区(静态区)在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用。在函数体内定义的static表示只在该函数体内有效。函数中的"armfly"这样的字符串存放在常量区。
int a = 0; //全局初始化区, 可以被其他c文件 extern 引用static int ss = 0; //静态变量,只允许在本文件使用char *p1; //全局未初始化区void main(void){ int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "123456"; //123456\0在常量区, p3在栈上。 static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10); //在堆区申请了10个字节空间 p2 = (char *)malloc(20); //在堆区申请了20个字节空间 strcpy(p1, "123456"); /* 123456字符串(结束符号是0,总长度7)放在常量区,编译器可能会 将它与p3所指向的"123456"优化成一个地方 */}
参考:局部变量、 全局变量、 堆、 堆栈、 静态和全局
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~