zoukankan      html  css  js  c++  java
  • 深入浅出计算机组成原理学习笔记: 第九讲

    一、程序装载面临的挑战

    1、装载需要满足的条件

    1、可执行程序加载后占用的内存空间应该是连续的

    2、我们需要同时加载很多个程序,并且不能让程序自己规定在内存中加载的位置

    2、如何解决以上问题

    1、放到内存里

    2、我们只关心虚拟内存地址就行了

    1、什么是虚拟内存地址

    我们把指令里用到的内存地址叫做虚拟地址

    2、什么是物理内存地址

    实际在内存硬件里面的空间地址、我们叫物理内存地址

    二、内存分段

    1、什么是内存分段

    这种找出一段连续的物理内存和虚拟内存地址进行映射的方法,我们叫分段,这里的段,就是指系统分配出来的那个连续的内存空间

    2、内存分段的好处和存在的问题

    分段的的办法很好,解决了程序本身不需要关心具体的物理内存地址的问题,但它也有一些不足之处,第一个就是内存碎片的问题

    三、内存交换

    当然,这个我们也有解决办法。解决的办法叫内存交换

    1、解决内存碎片过多的问题

    2、内存交换的优缺点

    1、优点

    虚拟内存、分段、再加上内存交换,看起来视乎已经解决了计算机同时装载运行很多个程序的问题

    2、存在的问题

    不过,你千万不要大意,我们都需要把一大段连续的内存数据写到应哦按上,所以、如果内存交换的时候,交换的是一个很占内存空间的程序这样整个机器都会显得卡顿

    四、内存分页

    1、内存分页解决了什么问题

    2、少出现内存碎片的解决办法

    3、从磁盘装载的数据更少一点解决办法

    更进一步地,分页的方式使得我们在加载程序的时候,不载需要一次性把程序记载到物理内存中,我们完全可以进行虚拟内存和物理内存的页之间的映射之后,并不真的把页加载到物理内存里面去

    4、缺页错误

    实际上,我们的操作系统,的确是这么做的,当要读取特定的页,却发现数据并没有加载到物理内存里的时候,就会触发一个来自CPU的缺页错误、我们的操作系统会捕捉到这个错误,

    然后将对应的页,从存放在硬盘上的虚拟内存里读取出来,加载到物理内存里,这种方式,使得我们可以运行那些大于我们实际物理内存的程序,同时,这样一来,

    任何程序都不需要一次性加载完所有指令和数据,只需要加载当前需要用到的就可行了


    通过虚拟内存、内存交换和内存分页这三个技术的组合,我们最终的到了一个程序不需要考虑实际的物理内存地址,大小和当前分配的解决方案

    这些技术和方法,对于我们程序编写、编译和链接过程都是透明的,这也是我们在计算机的软硬件开发中常用的一种方法,这就是加入一个间接层

    通过引入虚拟内存、页映射和内存交换,我们的程序本身,就不再考虑对应的真实的内存地址、程序加载、内存管理等问题了,任何一个程序、都主要把内存当成一块完成而连续的空间来直接使用

    五、总结延伸

    现在回到开头我问你的问题,我们的电脑只有640k内存就够了吗?很显然、现在看来,比尔盖茨的这个判断是不合理的,那为什么他会这么认为呢?因为他也是一个很优秀的程序员啊!

    在虚拟内存、内存交换和内存分页这三者结合之下,你会发现,其实要运行一个程序“必须”的内存是很少的。CPU只需要执行其当前的指令,极限情况下,内存页只需要加载一页就好了,

    再大的程序,页可以分成一页。每次,只在需要用到对应的数据和指令的时候,从应哦按上交换到内存里目前来就好了,以现在4k内存一页的大小,640k内存页能放下足足160页呢,

    页无怪乎在比尔盖茨会说“640K ought to be enough for anyone这”样的话


    不过呢,硬盘的访问速度比内存慢很多,所以我们现在的计算机,没有几个G的内存都不好意思和人打招呼

  • 相关阅读:
    virtual box 下安装centos 7
    java多线程通信
    redis 实现发布订阅的功能
    Ubuntu系统下为IDEA创建启动图标
    Windows玩转Docker(二):运行whalesay image
    Windows玩转Docker(一):安装
    yarn安装部署
    Hadoop yarn配置参数
    yarn的初步理解
    使用QJM部署HDFS HA集群
  • 原文地址:https://www.cnblogs.com/luoahong/p/10894963.html
Copyright © 2011-2022 走看看