一段高级的程序语言代码要经过编译、链接、装入才能进入内存,

程序运行时创建进程

 

链接:将编译后的目标模块链接成一个可执行程序。有静态链接和动态链接之分。

 

静态链接:在程序运行前,将目标模块链接成一个完整的装入模块

需要做的两个任务:1.修改逻辑地址

                                2.变换外部调用符号

优缺点

            优点:程序运行速度比较快

            缺点:当程序文件较大时,占用的内外存空间大,存储开销大。程序开发不够灵活、方便。修改某一模块会导致对整个程序的重新链接。

 

动态链接:将某些目标模块的链接推迟到程序运行时(这些模块中的函数被调用执行时)才进行。

优缺点

            优点:节省了内外存空间,方便了程序开发

            缺点:程序运行时的速度变慢

 

 

装入:需要为进程和所需数据分配内存,装入到内存中。

绝对装入:在编译时产生物理地址的目标代码,装入时按照装入模块的物理地址将程序和数据装入到内存中

可重定位装入(静态重定位):编译时产生逻辑地址的可重定位代码,装入时对目标代码中的指令和数据地址进行修改

动态运行时装入(动态重定位):地址映射延迟到进程执行时再进行

 

内存空间分配:为进程分配内存空间,有连续分配和离散分配

连续分配:单一连续分配

                  固定分区分配

                  动态分区分配

 

单一连续分配:内存分为系统区、用户区。适用于单用户、单任务的操作系统

固定分区分配:将用户内存空间划分为若干个固定大小的区域

                        分区和分区之间有大小相等和不相等两种情况

                        数据结构:分区编号、分区大小、分区起始地址、分区状态

动态分区分配:系统初始只有一个空闲区。当进程请求空间时,由系统根据进程需要的空间大小划分出一片空闲区分配给进程。

                       
 当运行一段时间之后,由于有的进程会被释放,所以内存中会出现不连续的空闲区域。所以当进程再次请求内存时,系统从所有空闲区中找到大小合适的空闲区域进行分配。系统中的分区大小和数量都是变化的,空闲区的大小和数量也是变化的。

 

系统需要建立并维护记录空闲分区情况,用空闲分区和空闲分区链表示

空闲分区表

数据结构:分区编号、分区大小、分区起始地址

空闲分区链

数据结构:空闲分区大小、空闲分区起始地址、指向前一个空闲分区的指针、指向后一个空闲分区的指针

 

动态分区分配算法:

首次适应算法:首次适应算法要求空闲分区链以地址递增的顺序链接。 在进行内存分配时,从链首开始顺序查找,直到找到一                     
       个能满足进程大小要求的空闲分区为止。

循环首次适应算法:也是以地址递增的顺序链接。为进程分配内存空间时,不再每次从链首开始查找合适的空闲分区,而是从上                     
            次找到的空闲区的下一个空闲分区开始查找。

最佳适应算法:将所有空闲分区按分区大小递增的顺序形成一个空闲区链。每次找到满足分区大小最接近进程需要的内存空间大                     
     小的

 

离散分配:分页存储管理

                  分段存储管理

                  段页式存储管理

分页存储管理:页表是系统为进程建立的数据结构,通过页表实现从页(逻辑地址)到页框(物理地址)的映射。

分段存储管理:进程的地址空间被划分成若干个段,系统为每个段分配一个连续的物理内存区域,各个不同的段可以离散的放在                     
     物理内存不同的区域。

段页式存储管理:将用户进程的逻辑空间先划分为若干个段,每个段再划分为若干个页。进程以页为单位在物理内存中离散存                       
           放,每个段中被离散存放的页具有逻辑相关性。

 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信