- 程序的装入和链接
- 程序的链接
- 源程序经过编译会产生一系列装入模块,链接程序将这组目标模块以及他们所需要的库函数装配成一个完整的装入模块。
- 静态链接方式
- 装入时动态链接
- 运行时动态链接
- 源程序经过编译会产生一系列装入模块,链接程序将这组目标模块以及他们所需要的库函数装配成一个完整的装入模块。
- 程序的装入
- 绝对装入方式
- 可重定位的装入方式:根据内存的具体情况将装入模块装入到内存的适当位置。把装入时对目标程序中指令和数据地址的修改过程称为重定位。地址变换通常是在进程装入时一次完成的。
- 动态运行时的装入方式:装入程序把装入模块准入内存后,不立即把逻辑地址转换为物理地址,而是把这个过程推迟到程序真正执行时再进行。
- 程序的链接
- 连续分配
- 单一连续分配
- 在用户区内存中仅装有一道用户程序,整个用户区的内存由该程序占用。
- 固定分区分配
- 将内存划分为多个固定大小的区域,每个分区装入一个程序,独立的运行。(如果有四个分区,允许四个程序并发执行,当有一个作业结束后,可以从后备队列中在选取一个作业执行。)
- 划分分区方法:
- 分区大小相等:容易造成浪费
- 分区大小不等:这样的比较适合方便。
- 内存分配方式:
- 将分区按照大小排序,并且建立一张分区表(包含分区大小和状态)。当要分配的时候通过索引找到合适的分区将其分配出去,并且修改分区的状态。
- 动态分区分配
- 数据结构:
- 空闲分区表和空闲分区链:一个是表,一个是链接的形式。
- 分配算法
- FF(首次适应法):空闲分区链按照地址递增的次序链接。从头开始找,直到找到一块合适的,再按照作业的大小,划分一块给作业,其余的留在分区链中
优缺点:尽量使用中低地址的空间,保留了高地址的到空闲分区;但是低地址划分太多次,留下太多的碎片 - NF(循环首次适应):应该从上一次查找的位置继续进行下一次查找,其余的和FF一样。
- BF(最佳适应法):所有分区按照容量的大小进行排序,方便查找和划分。
- WF(最坏适应):和最佳相反。
- FF(首次适应法):空闲分区链按照地址递增的次序链接。从头开始找,直到找到一块合适的,再按照作业的大小,划分一块给作业,其余的留在分区链中
- 分区分配操作
- 分配:请求分配u.size,空闲分区m.size,当m.size-u.size<=size(分区可以分割的最小值),当满足条件时候开始划分,剩下的留下,当剩下的太少时,不分割直接分配。
- 分配:请求分配u.size,空闲分区m.size,当m.size-u.size<=size(分区可以分割的最小值),当满足条件时候开始划分,剩下的留下,当剩下的太少时,不分割直接分配。
- 数据结构:
- 动态课重定位分区分配
- 碎片:由于连续分配是将程序装入一个分区中的,在划分分区的时候会产生剩余的部分小分区,各个小分区不是连续的,就无法被利用造成浪费。形成了碎片。
- 利用动态重定位方式可以解决这个问题。
- 单一连续分配
- 对换
- 定义:把内存中暂时不用的进程或者不能运行的程序的数据和进程换出到外存上,腾出足够的空间,再把外存上已经具备条件的进程或者程序换到内存中
- 对换类型:整体对换和页面对换。
- 对换空间管理:
- 文件区管理:用来存放各类文件,一般不用来访问,而是用来存储。
- 对换区管理:对换空间用连续分配的方式,很少考虑碎片的问题,只为提高换入换出的速度。
- 数据结构和连续分配中的数据结构类似。
- 进程的换入和换出
- 进程的换出:
选择被换出的进程:首先选择阻塞状态或者睡眠状态的进程,其次选择优先级低的进程。
进程的换出:进程换出时,只能换出非共享的数据段和程序。
- 进程的换出:
- 分页存储管理方式
- 连续分配方式会形成很多碎片,虽然可以用紧凑的方法拼接成大的可用的空间,但是利用率不高。之后就形成了可以将程序装入到许多不连续的内存中,这就是离散分配。
- 离散分配的类型:
- 分页存储管理方式:
- 分页:将用户程序的地址空间分为若干个固定大小的页,把内存空间也分为若干个物理块,大小和页面大小相同。可以把用户的任意页面放入内存中的物理块中去。
- 分页存储管理方法:
- 页面和物理块:将进程的地址空间分为若干个页面,将内存空间分为若干个物理块,每次都将进程的若干个页面装入到不相邻的物理块中去;其中由于物理块未被装满容易差生碎片,叫页内碎片。
- 页号和页内地址计算:
- 页表:实现页号到物理块号的地址隐射。
- 地址变换机构:见博客http://www.cnblogs.com/Kobe10/p/5673520.html
- 分页存储管理方式:
-
-
- 分段存储管理:为了方便程序员编程和使用。信息共享。
- 段页式存储管理:
- 分段存储管理:为了方便程序员编程和使用。信息共享。
-