vscode怎么运行jsp程序_程序怎么在系统中运行,详细解读程序在系统中的装入和链接...

我们平时运用计算机,主要就是使用用户程序,而用户程序要在系统中运行,必须将它装入内存,然后转换成一个可执行的程序。步骤如下:编译,由编译程序对用户源程序进行编译,形成若干个目标模块。链接,有链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的装入模块。装入,由装入程序将装入模块装入内存。

程序的链接,源程序经过编译后,可得到一组目标模块。而链接程序的功能就是将这组目标模块以及它们所需要的库函数装备成一个完整的装入模块。而连接方式又可分为三种。

f07d0d025a6e19a317a7a8ad52cb93cf.png

静态链接方式,在程序运行前先将目标模块以及它们所需的库函数链接成一个完整的装配模块,不过需要解决两个重要问题:对相对地址进行修改,在编译程序所产生的所以目标模块中,使用的都是相对地址,起始地址都为0,每个模块中的地址都是相对于起始地址计算的。所以就需要对后面模块的地址加上它自身的长度,在后面的模块依次累加。变换外部调用符号,将每个模块中所用的外部调用符号也都变换为相对地址。我们通常将这种事先链接而不拆开的链接方式称为静态链接方式。

2f2cbcdd768d9088ccbcc026d9299ac6.png

装入时动态链接方式,将用户源程序编译后所得到的一组目标模块装入内存时,采用边装入边链接方式。即在装入一个目标模块时,若发生外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存。这种方式具有两点优势:

便于修改和更新,对于静态链接装配在一起的装入模块,如果需要修改或更新其中的某个目标模块,要求重新打开装入模块。而动态链接时的各个目标模块时彼此分开的,所以更新或修改是件非常容易的事。

便于实现对目标模块的共享,在采用静态链接方式时,每个应用模块都必须含有其目标模块的拷贝,而动态链接方式可以将一个目标模块链接到几个应用模块上。

运行时动态链接方式,就是在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块,并将之装入内存,将其链接到被调用者模块上。未使用到的目标模块都不会被调入内存和被链接到装入模块上,不仅能加快程序的装入过程,而且可以节省大量的内存空间。

2a108459a5b6aa56d5bed7939a85dc5f.png

而链接完成后的模块,我们就需要将他装入内存了。程序装入到内存,也有如下三种方式:

绝对装入方式,用户程序经编译后,将产生绝对地址的目标代码,绝对装入程序便可按照装入模块中的地址,将程序和数据装入内存。由于程序中的相对地址与实际内存地址完全相同,故不需要进行数据和地址的修改。

可重定位装入方式,由于现代计算机大多数是在多程序环境下运行的,编译程序不可能预知经编译后所得到的目标模块应放在内存何处,因此编译形成的若干目标模块中,它们的起始地址都是从0开始的,其他地址都是相对于起始地址计算的。而这种方法,它可以根据内存的具体情况将装入模块装入到内存的适当位置。这种在装入时对目标程序中指令和数据地址的修改过程称为重定位,而地址编会通常在进程装入时一次完成,以后不再改变,故被称为静态重定位。

bfe4927816fe3f6eb6a6cceade36e549.png

动态运行时的装入方式,动态运行时的装入程序在把装入模块装入内存后,并不立即把装入模块中的逻辑地址转换为物理地址,而是把这种地址转换推迟到程序真正要执行时才进行。

用户程序转换成可以执行的程序的过程大概如此,下一篇文章就会介绍关于程序在内存中的分配空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值