0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么在内存中同时运行两个程序是不可能的

冬至配饺子 来源:廣廣的随笔 作者:廣廣的随笔 2022-08-17 16:33 次阅读

早期计算机都是直接访问物理内存的,这样想在内存中同时运行两个程序是不可能的,想想为什么?

下面给出三种存储模型:

pYYBAGL8pxKAFa00AACb_J-YOqk363.png

第一种和第三种均不常用了,因为用户程序一旦出现错误,可能会销毁OS,当按上述方式装载程序时,新装载的程序会覆盖掉先前装载的程序。唯一能并行的方法就是使用多线程,但是会共享信息,所以不可行。

后来提出内存键的概念来区分在内存中多道程序,此时内存中可以装载多道程序,但是一个程序可能因为jmp指令跳转到另一个程序从而发生程序崩溃。这都是因为使用了绝对地址产生的问题,一种解决办法是采用静态重定位的方法,比如一个程序装入到16000地址位,则程序中地址数都要加上16000这个常数,虽然这种方法一般来讲是可行的,但是无法辨别它是重定位的地址还是不是重定位的地址,来了一个访问地址,那这个访问地址加不加16000,而且该方法会减慢装载速度。

一种存储器的抽象:地址空间

要想多个程序同时处于内存中就需要解决两个问题:保护和重定向。我们希望每个程序都有自己独立的一套地址空间。

一个简单的方法是使用动态重定位,利用基址寄存器(存放程序开始地址)和界限寄存器(存放程序大小),当指令读或写数据字前,CPU硬件会将其发送到内存总线前与基址寄存器中的值相加,并判断相加后的指令是否越界。但是每次都要做加法运算和比较运算就会显得很慢。

交换技术的出现

将所有进程都装载入内存是不大可能的,一种策略是将空闲进程存入磁盘,将需要使用的进程整个装入内存;另一种策略是虚拟内存

poYBAGL8pyaATErjAADgDr2Ngos485.png

交换在内存中产生了多个空闲区,通过把所有内存尽可能向下移动,有可能将这些小的内存区合并为大的内存区,这称为内存压缩,但通常不进行该操作,因为非常耗时,而且OS需要准确的按其需要的大小分配内存。

但是如果数据段可以增长,例如,很多程序语言都允许从堆中动态分配内存。所以我们可以为其预留一部分空间。

pYYBAGL8pziAVLzcAAC9bFLXyWQ211.png


其中,堆栈存放私有变量和返回地址,向下增长。数据段作为堆使用供变量动态分配和释放,向上增长。

空闲内存区管理-位图方法

内存可能被划分为小到几个字,大到几千字节的分配单元,每个分配单元对应位图中的一位,0表示空闲,1表示占用。在分配一个k个分配单元的进程时,需要在位图中查找k个连续的分配单元进行分配,这是非常耗时的。

空闲内存区管理-链表

还有一个方法是维护一个记录已分配的内存段和空闲内存段的链表,设当X进程结束后同时需要合并内存。

poYBAGL8p0uAMlwAAAB4w0Mx_B0916.png

当然,这里有很多算法可以分配内存,有首次适配法,下次适配法,最佳适配法(会生成更多的小的空闲区,可以考虑最差适配法)等。

虚拟内存

为了防止某程序过大,最开始采用覆盖块的方法,即手动切割程序成一个个小块,但是怎么切割是个问题。于是这个问题干脆交给计算机去做,虚拟内存就诞生了。其基本思想是:

每个程序都有自己的基本空间,这个空间被分成多个块,每个块称作一页和页面。(注意:虚拟内存就是利用磁盘空间来扩大内存,所以称为虚拟)

放张图就明白了:

poYBAGL8p16Ab9HmAADhNW9u2gY027.png

这里,我们通过页表(基址+偏移量)来管理页面,也可以加上TLB(块表),计算机组成原理的内容吧。有时,单个页表是不够表示页面的,所以我们可以采用二级页表或多级页表,来看下面一张图:

poYBAGL8p3mAQM7EAAELkLVeSf4251.png

有页面自然也有页面置换算法,这些算法有最优页面置换算法,最近未使用置换算法,先进先出置换算法等

pYYBAGL8p3-ALdFxAADuIcJq61g825.png


在考虑如何交换时,如果考虑换出单个进程中最小生存时间的页面称为局部页面置换算法,考虑换出整个内存中最小生存时间的页面称为全局页面置换算法。通常情况下全局算法较好。另一种途径是为进程平均分配页面,剩余放入公共池里面。

我们也可以采用测试缺页中断率的方法。

同时,我们也应该选则合适的页面大小,在共享方面,一般只读的页面可以作为共享页面来减少内存消耗。

共享库

在静态链接.o程序时,会造成很大的内存消耗,因为要链接不同库文件,这些库文件直接装载至内存。但是共享库(又称动态链接库,DLL),只会装载一小段能够在运行时绑定被调用函数的存根例程,即用什么函数,才装入对应的页面而不是整个文件装入。当然,如果其它程序装载了该共享库,则本程序就不需要装载它了。

另外,如果DLL文件更新了,其并不需要重新编译执行,用户只需要下载更新的DLL文件下次启动时即可使用。

来看两个进程使用共享库,需要用相对地址:

poYBAGL8p5GACzSVAAC0-QfXJ4g282.png

共享库实际上是内存映射文件的一个特例。

如何进行缺页中断处理?

poYBAGL8p6WAKvAcAACreB1Bisw267.png



审核编辑:刘清


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5025

    浏览量

    117707
  • 存储器
    +关注

    关注

    38

    文章

    7141

    浏览量

    161971
  • 中断处理
    +关注

    关注

    0

    文章

    92

    浏览量

    10889
收藏 人收藏

    评论

    相关推荐

    ——求 单片机如何让两个程序同时运行 求 高手解决———

    本帖最后由 eehome 于 2013-1-5 09:53 编辑 求 单片机如何让两个程序同时运行我用一单片机的P1和P3口控制16
    发表于 12-12 22:20

    51单片机的两个定时器可以同时运行吗?

    在操作,发现两个定时器一起运行就出问题,请问是不是两个定时器可以同时运行吗?要用一就要关掉另
    发表于 07-14 10:36

    怎么让while循环里的两个程序同时运行

    怎么让while循环里的两个程序同时运行?为什么总是有先后?
    发表于 07-26 22:41

    ucosii如何实现两个任务同时运行而非按优先级调度

    ucosii是按优先级调度任务的两个任务比如一任务播放声音优先级高一任务显示图片 优先级低那么由于优先级调度任务的机制会造成播放声音时候,图片显示会卡主 那么播放声音就相当于中断一样了图片会等声音播放完毕才会变化 如何能做到
    发表于 07-23 17:03

    Labview可以同时运行两个不同的任务吗?

    Labview可以同时运行两个不同的任务吗,比如说一任务发送数据(DA),另一任务接收数据(AD)?
    发表于 03-27 18:45

    两个TASK同时运行

    当开启两个TASK的时候,其中一调用Task_sleep(bios_wait_forever)函数,另一task会不会也进入休眠状态。求TI员工解答。
    发表于 06-21 00:03

    如何同时运行两个niDaq模块

    因为我只是制作了一非常简单的程序并且线程不会同时执行。你可以打开这个例子。你会看到我在说什么。如果我错了请告诉我,因为这没有任何意义,因为我无法找到有关如何同时运行
    发表于 03-18 06:44

    51单片机驱动4电机同时运行比一两个运行的转速低

    我用的是51单片机,驱动4电机,4三极管的c都连的是板子上的vcc,b连的4io口,pwm输出,但4电机同时运行的转速,明显比一
    发表于 03-04 23:59

    请问F28377S的内核和CLA可以同时运行吗?

    比如我有两个没有时序关系的程序1和程序2,可不可在内核和CLA同时运行
    发表于 05-29 08:11

    如何用labview控制两个程序同时运行同时结束?

    我现在有两个程序,想用labview控制他们同时运行同时结束,有什么好方法吗?
    发表于 07-30 14:38

    多vi同时运行

    目前只知道通过打开vi引用-调用节点的方式跳转vi,可是这种方法无法实现两个vi同时运行,一旦跳转过去再跳转回来另一vi就停止运行了。因为我需要实现多个vi
    发表于 11-20 16:39

    Harmony可以同时运行两个本地用户吗?

    鸿蒙本地都可以运行两个应用程序同时运行两个吗?
    发表于 04-15 11:36

    如何用IMXRT1176同时运行两个PAL摄像机?

    我需要同时运行前置和后置摄像头才能获得实时视频。我正在使用 IMXRT1176。我能够通过 MIPI-CSI 或并行 8 位 CSI 外围设备从 PAL 摄像机获取实时视频。 现在,我手头有两个
    发表于 03-30 07:12

    在IMXRT1176-EVK上同时运行两个USB端口可行吗?

    我们的要求是同时运行两个 USB 端口。 Q1:是否可以同时运行两个 USB 端口? 笔记: 我为那个结构拿了另一对象。 usb_c
    发表于 05-09 06:55

    什么是区块链不可能三角为什么不可突破

    CAP定理证明了:当网络存在分区时,提供可靠的原子一致性数据是不可能的,但是想要实现一致性、可用性、分区容错性,三个属性中的两个是可行的。在异步通信系统中,当没有锁提供时,如果出现消息丢失,即使允许过时的数据返回,提供一致性数据也是不可
    发表于 02-26 11:03 2915次阅读
    什么是区块链<b class='flag-5'>不可能</b>三角为什么<b class='flag-5'>不可</b>突破