3.1 内存的基础常识

目录

3.1 内存的基础常识

3.1.1 计算机的多级存储结构

3.1.2 程序的装入和链接


3.1.1 计算机的多级存储结构

对于计算机的存储结构而言一般可以分为三层:最高层为 CPU 寄存器,中间为主存(内存),最底层是辅存,如下图所示

内存:可以用来存储数据的装置,内存的主要作用是缓和高速CPU与低速外存之间的速度矛盾。为了可以将存储在内存上的数据加以区分,我们会为内存的存储单元编上地址,即内存地址。内存地址一般是从0开始的,每一个内存地址对应一个存储单元。如果计算机是按字节编址的那么一个存储单元就是一个字节记作1B即八个二进制位(8bit)。我们经常可以看到手机的内存是4GB等等,这里的4GB就是指个字节也就是个字节,所以这些字节就需要32位二进制数才能表示。

3.1.2 程序的装入和链接

将一个用户源程序变为可以在内存中执行的程序,一般要经过编译链接装入三个步骤,我们着重介绍的是装入以及链接。

  1. 程序的装入:

  • 绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。但是绝对装入的地址需要程序员事先提供,而且一旦程序或数据被修改后,可能要改变程序中的所有地址,十分不方便,只适用于单道程序环境。
  • 可重定位装入(静态重定位):编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。
  • 动态运行时装入(动态重定位):编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持,用它来存放程序(数据)在内存中的起始地址。程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。

  当系统对内存进行了“紧凑”而使若干程序从内存的某处移至另一处时,不需对程序做任何修改,只要用该程序在内存的新起始地址,去置换原来的起始地址即可。
2.程序的链接

链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块

  • 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开
  • 装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
  • 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接,用不到的模块就不需要进入内存。其优点是便于修改和更新,便于实现对目标模块的共享。

操作系统(三十二)内存的基础常识相关推荐

  1. 第三十二章 XML基础知识概念

    文章目录 第三十二章 XML基础知识概念 attribute CDATA区域 comment content model default namespace DOM DTD(文档类型定义) eleme ...

  2. Linux学习之CentOS(三十二)--Linux系统服务基础

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  3. Android开发笔记(三十二)文件基础操作

    File类 File类是java中的文件操作工具类,它的常用方法如下: File构造函数 : 根据文件路径构造File对象 delete : 删除文件 exists : 判断文件是否存在 getNam ...

  4. 【零基础学Java】—Java 日期时间(三十二)

    [零基础学Java]-Java 日期时间(三十二) DateFormat 是日期/时间格式化子类的抽象类,它以语言无关的方式格式化和分析日期或时间. 日期/时间格式化子类(如SimpleDateFor ...

  5. 1709 ltsb 内存占用_「正点原子STM32Mini板资料连载」第三十二章 内存管理实验

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第三十二章 内存管理实验 上一章,我 ...

  6. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  7. 【正点原子Linux连载】第三十二章 U-Boot启动流程详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  8. 深度学习入门(三十二)卷积神经网络——BN批量归一化

    深度学习入门(三十二)卷积神经网络--BN批量归一化 前言 批量归一化batch normalization 课件 批量归一化 批量归一化层 批量归一化在做什么? 总结 教材 1 训练深层网络 2 批 ...

  9. ASP 三十二条精华代码

    整理收藏: ASP 三十二条精华代码 1. οncοntextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table b ...

最新文章

  1. 2018-2019-1 20165214 《信息安全系统设计基础》第六周学习总结
  2. alu是计算机中的什么东西,ALU,什么是ALU,ALU介绍--电子百科词库--科通芯城,IC及其他电子元器件交易型电商平台100%正品保证...
  3. java el jstl_java -EL技术JSTL技术
  4. 多媒体广告的底线在哪里
  5. 傲娇Android二三事之操蛋的开发日记(第一回)
  6. stm32入门c语言下载,STM32入门C语言详解.docx
  7. RtlAdjustPrivilege 一行代码提升进程权限
  8. 分类算法—Performance指标
  9. 增删改查java代码_程序员:听说你正在为天天写增删改查代码而烦恼
  10. 反流氓软件运动为何变了味
  11. MySQL Miscellaneous Functions(ip uuid方法)
  12. Ubuntu 下实现类似Everything的功能
  13. 统计php 代码行数,PHP实现统计代码行数小工具
  14. Linux下Valgrind的使用概述 来源:Linux社区 作者:dndxhej
  15. wifidog源码分析 - 初始化阶段
  16. 关于川大667和972自命题考试的心得
  17. 石油大--2020年秋季组队训练赛第十二场----J、Greedy Termite(线段树)
  18. 使用Py2neo连接Neo4j失败解决方案/Py2neo安装
  19. 老毛桃PE修改方法(屏蔽更改主页,屏蔽加装的绿色浏览器)
  20. MySQL基础知识面试选择题40

热门文章

  1. WPF中的Bitmap与byte
  2. spring AspectJ的Execution详解
  3. Maven远程仓库:pom依赖以及jar包下载
  4. c++虚函数的作用是什么?
  5. MySQL的常见存储引擎介绍与参数设置调优
  6. C#.NET 大型企业信息化系统 - 防黑客攻击 - SSO系统加固优化经验分享
  7. 编程方法学24:管理大型数据中的良好软件工程原理
  8. MYsql:net start mysql 失败 发生系统错误5
  9. KDE应用如何在GNOME环境下运行?
  10. 【转】C++ vector的reserve和resize详解