程序到进程所要经历的步骤

                程序员写完一个源文件以后,可能自己的代码分为了多个模块,保存在不同的源文件中(.c文件)。如果要运行此项目,假设现在有三个模块main.c,m1.c,m2.c:

        1)最开始要经过编译程序编译,将源代码翻译成一条条的机器指令,生成main.s,m1.s,m2.s。

        2)再经过汇编程序进行汇编,将机器指令翻译成计算机能识别的机器码(程序中的机器指令会有唯一的机器码与之对应),对于每一个模块,都会有对应的目标(object)模块(.o文件)产生。生成main.o,m1.o,m2.o。

        3)产生多个目标模块之后,还要对模块之间进行链接,此过程中,若main模块对m1和m2进行了调用,则会将m1和m2链接到main中,除此之外,还会将各模块用到的库文件也一起装入。

        4)最后将链接好的链接文件转换为可执行文件(Windows系统为.exe文件)。最后执行.exe文件会使操作系统对该文件进行作业调度,为该文件创建进程,分配资源,装入内存。最后以就绪态进程的形式等待CPU调度执行。

        对于程序的链接和装入,可以根据其对于指令中的内存地址的类别,链接可以分为静态链接、装入时动态链接和运行时动态链接三种。装入可分为静态装入、可重定位装入和动态可重定位装入三种方式。

链接:

1)静态链接:在程序运行之前,就将各个模块链接在一起,需要在链接时对指令中的所有模块内的相对地址修改为新的整体的相对地址。

2)装入时动态链接:在程序装入时,再将各个模块链接在一起,在进行装入的过程中,可以知道即将要被装入哪一片内存空间,因此可以在此时将各个模块的相对地址改为整体的相对地址。如果这个程序在大部分时候只执行main函数中的内容,而只有一小段时间运行m1模块的内容,则此时需要在装入时将m1和main的内容全部装入内存,进程内存大小从程序开始到结束固定不变(显然这样不能充分利用内存)

3)运行时动态链接:在程序运行时,如果需要哪个模块,就动态地将哪个模块链接进来。(在执行main函数的时候先装入main模块的内容,在要执行m1模块的程序时再将m1链接进内存中来)

装入:

        装入即为将指令和数据装入内存。

1)静态装入:即装入前就已知要往哪片内存地址中装入,指令中的地址即为在内存中执行时的实际地址。(程序在编译时就指明了要往内存地址为0x0123——0x2345这段内存,程序都是在这段内存中运行,显然这并不适合现在的计算机系统)

2)可重定位装入:指令中的地址为相对于程序开始的位置0的地址,在装入时就将指令中的相对地址改为内存中的实际地址。(如此做需要在程序开始运行之前就将所有需要的内容放入一段内存中,地址变换在程序开始之前一次性完成,如果该程序被剥夺CPU阻塞并挂起,在下一次运行时就必须将该段程序放回原来的内存才能正常运行,如果期间有别的程序启动占据了此段位置,则原来的程序就不能正常运行)

3)动态可重定位装入:指令中的地址为相对于程序开始的位置0的地址,在装入时仍不变,等到CPU实际运行该指令时再将地址转换为实际地址去访存。            

        现在的计算机操作系统都使用动态可重定位装入和运行时动态链接保证程序并发和效率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值