操作系统----内存管理
一个字符就是一个字节,也就是8位。
每一个进程有PCB,程序段和数据段,程序的代码会被翻译成指令,CPU会根据指令的要求去找相应的物理地址,然后进行计算。
编译生成的是逻辑地址。
相对地址---->逻辑地址,绝对地址---->物理地址
编译:先编译成若干个目标模块,然后链接,形成完整的装入模块,然后由装入程序装入内存。
链接:静态链接(先连接好),装入时动态链接(装入的时候动态依次链接),运行时动态链接(当程序执行过程中需要目标模块的时候才进行链接,便于修改和更新,实现对模块的共享)。
装入方式:
绝对装入:
只适用于单道程序,只有一道程序,所以可以确定程序装入位置。编译的时候产生最后的装入位置。
:一次性装入内存,当内存空闲地址不够的时候不能装入内存中。当装入之后就不能进行修改,也不能再申请空间。初始地址为80,同意进行+100操作,这样进行静态重定位。
:(分页存储和分段存储那里细讲)就是采用重定位寄存器,将地址转化推迟到真正执行的时候才进行物理地址的转化。动态重定位可以允许程序在内存中的移动。
动态重定位:重定位寄存器:存放装入模块的起始地址,后面将程序转化存放地址改变寄存器中的起始值,
-------------------------------------------------------《内存的空间分配》-------------------------------------------------
内存空间的分配与回收
虚拟性,操作系统提供某种技术从逻辑上进行对内存空间的扩充。
操作系统提供地址转化功能,负责程序的逻辑地址与物理地址的转化。
操作系统提供内存保护,互不干扰:
1.设计上下限寄存器,存放进程的上下限,用来查看是否越界
2.采用重定位寄存器(基址寄存器),和界地址寄存器(限长寄存器)。界地址存放进程的最大逻辑地址、重定向寄存器存放起始地址,看看80+重定向起始地址是不是超过了界地址寄存器。
覆盖技术:解决程序大小超过内存总和。
分区表中:如果用完了,空闲的格子要合并。
分配:
外部碎片:太小了,谁也用不上。
动态重定位,然后修改PCB起始地址。
首次适应算法:按照地址递增,第一个适合的放进去。
最佳适应算法:空闲分区依次递增,每次顺序查找空闲分区链,找到第一个满足的空闲分区。留下大块的内存。产生超级多的外部碎片。
最坏适应算法(最大适应算法):按照容量依次递减,找大的用,留下来的小的就概率低。空闲分区链。第一个满足不了,后面的肯定满足不了。大进程没有内存用
临近适应算法:首次适应算法中会出现前面的很小,增加查找开销。临近适应算法就是从上一次找到的地方往后找第一个适应的地方。弄一个循环链表。一个环来查找适合的内存。算法开销小,不需要重新对链表进行排列。导致改地址有概率会被划分掉,形成大程序没有内存运行的情况。
连续分配的缺点:
--------------------------------------------------------《分页存储管理》----------------------------------------------
将内存分成一个一个的小分区,然后把进程分成一个一个的小部分放进去。
前面+后面的
页号+页内偏移量
由于把每一个进程分开了,所以需要一个页表来存放各个块号的地址,有页号和块号来决定在内存中的地址。
内存块号*内存块大小=块内地址
页表放在内存中,访问内存的时候需要访问两次内存。
这个公式是干嘛用的。。。。。。
这个公式:就是算一个页表的大小。看下面。
---------------------------------------《块表》---------------------------------------------------------
访问页表的时候需要两次访问内存。 加快访问用到快表。联想寄存器TLB。内存中的页表叫做慢表。
先检查块表,然后检查慢表。
单级页表:
将页表进行分页,然后用一个内存地址存放各个小列表。
asdfasdf
无快表:n级页表查询你n+1次内存,依次访问页面。