一、程序的装入和链接
一个用户的源代码变为一个可执行的程序需要经过三步
首先,由编译程序将源代码编译成若干个目标模块;其次,由链接程序将这些目标模块以及库函数链接成一个完整的装入模块;最后,由装入程序将装入模块装入内存。
程序的链接
- 静态链接,即程序装入之前,已将各目标模块及它们所需的函数库连接成一个完整的装配模块;
- 装入时动态链接,即程序装入时,将各目标模块及它们所需的函数库连接成一个完整的装配模块,即边装入变链接;
- 运行时动态链接,即主程序装入后,在运行之时,需要哪个模块再进行对该模块的链接;
程序的装入分绝对装入方式和可重定位装入方式两种
绝对装入是指在装入内存之前已经知道程序的首地址了,装入时只要从该首地址不断向后扩展就行;而可重定位装入是指在装入内存之前根本不知道程序会从哪里开始装入,知道的只有每条语句相对于首地址的位移量,首地址是在装入时确定的,确定之后再根据相对于首地址的位移量得出每条语句的地址。
二、储存器的连续分配方式
1、单一连续分配
把内存分为系统区和用户区两部分,系统区仅提供给OS使用,用户区提供给用户使用,即分配时将整个用户区分配给用户使用;这种方式只用于单用户、单任务的操作系统。
2、固定分区分配
把内存的用户空间划分为若干个固定大小的分区,并为之建立一张分区使用表,当一用户程序要装入时,由内存分配程序检索该表,从中找出一个能满足要求的、尚未分配的分区,将其分配之。
3、动态分区分配
根据进程的是以需要,动态的为之分配内存空间,大小刚适,因而不会浪费存储空间。分区分配中的数据结构包括空闲分区表(利用一张表记录着每个空闲分区的分区序号、分区始址、分区大小)和空闲分区链(使用指针将各个空闲分区连成一条链表)两种。
分区分配算法包括:
1. 首次适应算法(从头开始检测出第一个大小合适的分区分配之)
2. 循环首次适应算法(从上一次分配位置开始检测出第一个大小合适的分区分配之)
3. 最佳适应算法(空闲分区链表为从小到大排序,从头检测出不小于申请分区大小的分区,割下申请分区大小分配之,剩余的插回链表中,容易产生碎片)
4、可重定位分区分配
由于动态分配会造成许多不能使用的小的空闲区,称为“零头”或“碎片”,这时,可以将多个分散在内存中的作业的地址重定位,将它们“拼接”或“紧凑”起来,这样,那些“零头”或“碎片”也就会连接成更大的连续存储空间以便分配之。可重定位分区分配与动态分区分配基本相同,仅仅是前者增加了紧凑功能。
5、对换与覆盖
对换技术:把内存中暂时不能运行的进程或暂时不用的程序和数据,调出到外存上,以便腾出更多的内存空间;
覆盖技术:一个程序被分为若干功能上相对独立的程序段,让那些不会同时执行的程序段共享一块内存。
三、离散型分配:分页管理方式
页面与页表:将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面;系统又为每个进程建立一张页面映射表,简称页表。
地址结构:页号+块号
地址变换机构:
基本的:通过逻辑地址的页号与页表寄存器的页表始地址相加,得出该页号在页表中的页表项地址,从该页表项得出与该页号相对应的物理块号首地址,然后让物理块号首地址与逻辑地址的页内地址相加即可得出物理地址。
在一分页存储管理系统中,逻辑地址长度为16位,页面大小为4096B,现有一逻辑地址为2F6AH,且第0、1、2页依次存放在物理块5、10、11中,问相应的物理地址为多少?
4096B=2^12B
16位寻址一共2^16B
分页存储.共分的页:2^16/2^12=2^4=16 共分16页.
第0页的地址范围 0 - FFFH
第1页的地址范围 1000H - 1FFFH
第2页得地址范围 2000H - 2FFFH
.
第11页 B000H - BFFFH
第15页 F000H - FFFFH
2F6AH=10 1111 0110 1010 在2页的范围对应物理块11
所以物理地址为:
2F6AH - 2000H + B000H = F6AH + B000H= BF6AH
有快表的:在基本的地址变换机构中增加了“联想寄存器”或“快表”,将部分页表放在快表中,在查找(在快表中的查找不需要与页表始址相加了,是直接一个一个对比查找的)后如果发现快表中没有该页号对应的页表项,再从内存中的页表查找,记得执行过后要将此页表项加入快表中哦。
四、离散型:分段管理方式
段与段表:将一个作业按照逻辑关系分成若干个段,称为段;系统又为每个进程建立一张段映射表,简称段表。
地址变换机构:通过逻辑地址的段号与段表寄存器的段表始地址相加,得出该段号在段表中的段表项,从而得出该段号相对应内存的基址,根据内存的基址与通过逻辑地址的段内地址可得出物理地址。
逻辑地址(0,137),(1,4000),(2,3600),(5,230)中的0,1,2,5表示段号,137,4000,3600,230表示位移量.段号0中的内存地址50K表示0号段的起始地址,10K表示这个段的长度.对于逻辑地址(0,137),先找到段号0处,物理地址=起始地址+位移量,即物理地址=50K+137=50X1024+137=51337.(说明1K=1024)
对于(1,4000),由于位移量4000>3X1024,所以越界,产生中断信号
对于(2,3600),找到段号2处,物理地址=70K+3600=70X1024+3600=75280
对于(5,230),逻辑地址的段号5>段表长度4,发生越界,产生中断信号.
五、分页与分段的主要区别
(1)页是信息的物理单位,而段则是信息的逻辑单位;
(2)页的大小固定且有系统决定,而段的长度不定,用户编写的程序不同而不同;
(3)分页的作业地址是一维的,而分段的作业地址空间则是二维的,程序员在标识一个地址时,既得给出段名,又得给出段内地址。
六、页面置换算法
缺页中断次数为 初始化的次数+更换次数
在进程运行过程中,若其所要访问的页面不在内存而需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。但应将哪 个页面调出,须根据一定的算法来确定。通常,把选择换出页面的算法称为页面置换算法
1-最佳置换算法
其所选择的被淘汰页面,将是以后永不使用的或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。
2-先进先出算法FCFO
其所选择的被淘汰页面,是在内存中驻留最久的
3-最近最久未使用LRU
其所选择的被淘汰页面,是最近未被使用的
4-clock
当某页被访问,则该页的访问位置1;
所淘汰页为:遍历链表,取第一个访问为0的卖将其置换出去;
访问位为1的置为0;
类似LRU
七、虚拟内存
虚拟内存的基本思想是程序、数据、堆栈的总大小可以超过物理存储器的大小
操作系统把当前使用部分保留在内存中,而其他未使用部分放置在磁盘上