首页 > 系统相关 >内存、程序运行

内存、程序运行

时间:2022-12-03 22:25:33浏览次数:38  
标签:程序运行 装入 程序 地址 内存 模块 链接

一、内存

  • 内存是用于存放数据的硬件。程序执行前需要先放入内存中才能被处理

  • 在多道程序环境下,系统中会有多个程序并发执行,会有多个程序的数据需要提示放入内存,如何区分程序中的数据在内存的位置?

    • 给内存的存储单位编地址。

    • 内存地址从0开始。每个地址对应一个存储单元。

    • 如果计算机按字节编码,则每个存储单位大小就是1字节,即8个二进制位。

    • 如果字长为16的计算机按字编码,那么每个存储单位为16个二进制位。

  • 如一台手机有\(4GB\)内存,该内存可以存放\(4*2^{30}\)个字节,按字节编码就会有\(2^{32}\)个存储单元。地址长度为32位。


二、程序运行原理


2.1、程序的运行

  • 编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言)
  • 链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
  • 装入(装载):由装入程序将装入模块装入内存运行

image-20221203211956476

2.2、装入的三种方式


2.2.1、绝对装入(物理地址)

  • 绝对装入
    • 在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址(物理地址)的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。
    • 只适合单道程序环境
    • 程序中使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。通常情况下都是编译或汇编时再转换为绝对地址
  • 例如
    • 事先已知用户程序(进程)驻留在从R处开始的位置,则编译程序所产生的目标模块(即装入模块),便可从R处开始向上扩展。
    • 绝对装入程序便可按照装入模块中的地址,将程序和数据装入内存。
    • 装入模块被装入内存后,由于程序中的相对地址(即逻辑地址)与实际内存地址完全相同,故不需对程序和数据的地址进行修改。

2.2.2、静态重定向(装入时转换)

  • 静态重定向
    • 又称可重定位装入。
    • 编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址
    • 可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行重定位,将逻辑地址变换为物理地址
    • 地址变换是在装入时一次完成的作业运行期间作业不能移动【实际指令地址变化】
    • 在一个作业装入内存时,必须分配其要求的全部内存空间
  • 如下图
    • 装入前:指令\(LOAD\) \(12500\)的物理地址是【起始地址0+1000】
    • 装入后:指令\(LOAD\) \(12500\)的物理地址是【起始地址10000+1000】

image-20221203213725210

2.2.3、动态重定向(运行时转换)

  • 动态重定位
    • 又称动态运行时装入。
    • 编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后并不会立即把逻辑地址转换为物理地址而是把地址转换推迟到程序真正要执行时才进行转换因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
    • 可以将程序分配到不连续的存储区中,作业运行期间允许移动。在程序运行前只需要装入部分代码就可以运行,在运行期间,根据需要动态申请内存。

2.3、三种链接方式


2.3.1、静态链接

  • 在程序运行之前
  • 先将各个目标模块及它们所需的库函数链接成一个完整的可执行文件(装入模块),之后不再拆开

2.3.2、装入时动态链接

  • 各个目标模块装入内存时,边装入边链接

2.2.2、运行时动态链接

  • 在程序执行中需要该目标模块时才对它链接
  • 便于修改和更新,实现目标模块的共享

标签:程序运行,装入,程序,地址,内存,模块,链接
From: https://www.cnblogs.com/shyfvm/p/16948898.html

相关文章

  • Java 内存分析
    Java内存堆存放new的对象和数组可以被所有的线程共享,不会存放别的对象引用栈存放基本变量类型(会包含这个基本类型的具体数值)引用对象的变量(会存放这个引......
  • Android 内存缓存框架 LruCache 的实现原理,手写试试?
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。前言大家好,我是小彭。在之前的文章里,我们聊到了LRU缓存淘汰算法,并且分析Java标准库中支......
  • 看完这篇,还不懂JAVA内存模型(JMM)算我输
    欢迎关注专栏【JAVA并发】更多技术干活尽在个人公众号——JAVA旭阳前言开篇一个例子,我看看都有谁会?如果不会的,或者不知道原理的,还是老老实实看完这篇文章吧。@Slf4j(......
  • Java 字符串输出到文件中,不会因为数据过大导致堆内存崩了
    输出数据的两种方式:​​1.使用追加的方式输出数据。​​​​2.定量输出数据,每次读取1k。​​1.使用追加的方式输出数据。StringdateStr=System.currentTimeMillis()+"";......
  • 记一次 .NET 某电子厂OA系统 非托管内存泄露分析
    一:背景1.讲故事这周有个朋友找到我,说他的程序出现了内存缓慢增长,没有回头的趋势,让我帮忙看下到底怎么回事,据朋友说这个问题已经困扰他快一周了,还是没能找到最终的问题,看......
  • Linux运维获取内存、cpu、磁盘IO信息
    一、脚本今天主要分享一个shell脚本,用来获取linux系统CPU、内存、磁盘IO等信息。#!/bin/bash#获取要监控的本地服务器IP地址IP=`ifconfig|grepinet|grep-vE'in......
  • 内存马基础知识
    javaweb三大组件javaweb:Servlet,Filter,Listener三大组件的各自功能:Servlet:用我的话来讲它就像是一个处理器,它会接受http请求然后把他封装成HttpServletRequest和Htt......
  • Linux如何查看当前占用CPU或内存最多的K个进程
    内存可以使用以下命令查使用内存最多的K个进程方法1:ps-aux|sort-k4nr|head-K如果是10个进程,K=10,如果是最高的三个,K=3说明:ps-aux中(a指代a......
  • 收藏:linux中查看内存泄露的工具
    来自极客时间的讲座中,提到linux中查看内存泄露的工具:memleak.1.使用方式memleak-a-p$(pidofapp)# -a表示显示每个内存分配请求的大小以及地址#-p指定案例应用的P......
  • 类的内存结构(一)
    类的内存结构包含什么?静态成员变量和静态成员函数是不会计算在类的内存结构中的,因为静态static决定了它们早在编译期就确定了静态变量区中的地址,因此通常来说类的内存结......