内存管理:算法
1. 单一分区分配:
性能
用于单用户、单任务的操做系统,主存被分为两部分:驻留操做系统(内存低端)、用户进程(内存高端)spa
2. 多分区分配:操作系统
知足多道程序的最简单的存储管理方案,将内存划分红若干个连续区域,称为分区;每一个分区只能存储一个程序,而且程序也只能在它所驻留的分区中运行进程
分区方法分为固定分区和动态分区,分区分配算法:First-Fit、Best-Fit、Worst-Fit、Next-Fit内存
这种分配策略会同时存在外部碎片和内部碎片,可经过紧缩减小碎片it
3. 页式内存管理:
内存管理
容许进程的物理地址空间能够是不连续的效率
逻辑地址空间中划分为页(数据块),物理地址空间划分为页帧,从逻辑地址映射到物理地址空间使用页表原理
所以,每一次的数据/指令访问须要两次内存访问,可以使用快表(TLB),使访问降到一次
页表:分级页表、哈希页表、反向页表
这种分配策略会同时存在外部碎片和内部碎片
4. 段式内存管理:
容许进程的物理地址空间能够是不连续的
适应用户的角度,使用段表映射地址
因为段的长度可变(区别于页),因此就面临动态分配问题,一样使用First-Fit、Best-Fit、Worst-Fit、Next-Fit算法
这种分配策略只会存在外部碎片
5. 段页式内存管理:
先段式后页式,Linux就是这样,一个程序先被划分为若干程序段,对每一分段又分红若干个固定大小的页
虚拟存储管理:
经过换入换出页(段),使得进程的逻辑空间比实际占有的内存空间大得多,从而使得内存中能够驻留更多的进程(用户)
但总的虚拟地址空间不大于物理内存和外存交换区容量之和
1. 如何知道一个进程的某个页面在不在内存?
页表项有一个有效-无效位,1表示在内存,0表示不在内存
2. 发现某个页面不存在以后,有什么响应?
产生缺页中断,要求熟悉缺页中断以后的响应流程(页面置换过程)
3. 若是发生缺页,但此时内存中无空闲块,此时将哪一个页面换出?(页面置换算法)
这个页面置换算法要求缺页中断的次数尽量的小
1. FIFO算法(先来先出):容易致使Belady现象,即内存中分配的页帧越多,缺页中断的次数反而增长
2.Optimal算法:选择将来再也不使用的,或在离当前最远位置上出现的页面被置换,因为后面的数据实际不可知,因此这种算法不可实现,但一般用来做为做为对比,来衡量其余算法的效率
3. LRU算法(最近最少使用):选择内存中最久未使用的页面被置换,这是局部性原理的合理近似,性能接近最佳算法,但因为须要记录页面使用时间的前后顺序,时间开销太大
4. 近似LRU算法:
1. first chance 算法:利用页表项的引用位,随机选取该位为0的页面置换
2. second chance 算法(clock算法):一样利用引用位,遇“1”置“0”,并依然留在内存中,遇“0”置换
3. ehanced second chance 算法:同时利用引用位和修改位,依据二者的组合淘汰页面
5. 页面缓冲算法: 对FIFO算法的改进,经过对被置换页面的缓冲,有机会不经过访问磁盘,就找回刚被置换的页面(Windows和Linux的页面置换算法就是基于页面缓冲算法的)
4. 那么一开始在内存中给每一个进程分配多少页帧?
在为进程分配帧时,首先应该考虑的问题是:能保证进程正常运行所需的最少帧数(也成最小物理块)
内存中分配页帧采用的算法:
1. 平均分配算法
2. 按比例分配算法:根据进程的大小按比例分配
3. 优先权分配算法:优先权高的进程适当增长份额
固然,分配策略也能够分为固定分配和可变分配策略
置换策略分为全局置换和局部置换
系统抖动:进程忙于换入换出页面,从而使进程的程序没有往下执行或者执行得很慢(硬盘的指示灯一闪一闪)
解决方法:1. 挂起若干进程
2. 在CPU调度中引入工做集算法:选择工做集窗口大小,例如10000条指令,进程Pi的工做集Wssi = 最近一次工做集窗口内页面引用的总数,则页帧总需求数为All(Wssi),若是改数大于内存中页帧总数,就挂起一个进程,从而防止系统抖动。