一段高级的程序语言代码要经过编译、链接、装入才能进入内存,
程序运行时创建进程
链接:将编译后的目标模块链接成一个可执行程序。有静态链接和动态链接之分。
静态链接:在程序运行前,将目标模块链接成一个完整的装入模块
需要做的两个任务:1.修改逻辑地址
2.变换外部调用符号
优缺点
优点:程序运行速度比较快
缺点:当程序文件较大时,占用的内外存空间大,存储开销大。程序开发不够灵活、方便。修改某一模块会导致对整个程序的重新链接。
动态链接:将某些目标模块的链接推迟到程序运行时(这些模块中的函数被调用执行时)才进行。
优缺点
优点:节省了内外存空间,方便了程序开发
缺点:程序运行时的速度变慢
装入:需要为进程和所需数据分配内存,装入到内存中。
绝对装入:在编译时产生物理地址的目标代码,装入时按照装入模块的物理地址将程序和数据装入到内存中
可重定位装入(静态重定位):编译时产生逻辑地址的可重定位代码,装入时对目标代码中的指令和数据地址进行修改
动态运行时装入(动态重定位):地址映射延迟到进程执行时再进行
内存空间分配:为进程分配内存空间,有连续分配和离散分配
连续分配:单一连续分配
固定分区分配
动态分区分配
单一连续分配:内存分为系统区、用户区。适用于单用户、单任务的操作系统
固定分区分配:将用户内存空间划分为若干个固定大小的区域
分区和分区之间有大小相等和不相等两种情况
数据结构:分区编号、分区大小、分区起始地址、分区状态
动态分区分配:系统初始只有一个空闲区。当进程请求空间时,由系统根据进程需要的空间大小划分出一片空闲区分配给进程。
当运行一段时间之后,由于有的进程会被释放,所以内存中会出现不连续的空闲区域。所以当进程再次请求内存时,系统从所有空闲区中找到大小合适的空闲区域进行分配。系统中的分区大小和数量都是变化的,空闲区的大小和数量也是变化的。
系统需要建立并维护记录空闲分区情况,用空闲分区和空闲分区链表示
空闲分区表
数据结构:分区编号、分区大小、分区起始地址
空闲分区链
数据结构:空闲分区大小、空闲分区起始地址、指向前一个空闲分区的指针、指向后一个空闲分区的指针
动态分区分配算法:
首次适应算法:首次适应算法要求空闲分区链以地址递增的顺序链接。 在进行内存分配时,从链首开始顺序查找,直到找到一
个能满足进程大小要求的空闲分区为止。
循环首次适应算法:也是以地址递增的顺序链接。为进程分配内存空间时,不再每次从链首开始查找合适的空闲分区,而是从上
次找到的空闲区的下一个空闲分区开始查找。
最佳适应算法:将所有空闲分区按分区大小递增的顺序形成一个空闲区链。每次找到满足分区大小最接近进程需要的内存空间大
小的
离散分配:分页存储管理
分段存储管理
段页式存储管理
分页存储管理:页表是系统为进程建立的数据结构,通过页表实现从页(逻辑地址)到页框(物理地址)的映射。
分段存储管理:进程的地址空间被划分成若干个段,系统为每个段分配一个连续的物理内存区域,各个不同的段可以离散的放在
物理内存不同的区域。
段页式存储管理:将用户进程的逻辑空间先划分为若干个段,每个段再划分为若干个页。进程以页为单位在物理内存中离散存
放,每个段中被离散存放的页具有逻辑相关性。