0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么在內(nèi)存中同時(shí)運(yùn)行兩個(gè)程序是不可能的

冬至配餃子 ? 來源:廣廣的隨筆 ? 作者:廣廣的隨筆 ? 2022-08-17 16:33 ? 次閱讀

早期計(jì)算機(jī)都是直接訪問物理內(nèi)存的,這樣想在內(nèi)存中同時(shí)運(yùn)行兩個(gè)程序是不可能的,想想為什么?

下面給出三種存儲模型:

pYYBAGL8pxKAFa00AACb_J-YOqk363.png

第一種和第三種均不常用了,因?yàn)橛脩舫绦蛞坏┏霈F(xiàn)錯(cuò)誤,可能會銷毀OS,當(dāng)按上述方式裝載程序時(shí),新裝載的程序會覆蓋掉先前裝載的程序。唯一能并行的方法就是使用多線程,但是會共享信息,所以不可行。

后來提出內(nèi)存鍵的概念來區(qū)分在內(nèi)存中多道程序,此時(shí)內(nèi)存中可以裝載多道程序,但是一個(gè)程序可能因?yàn)閖mp指令跳轉(zhuǎn)到另一個(gè)程序從而發(fā)生程序崩潰。這都是因?yàn)槭褂昧私^對地址產(chǎn)生的問題,一種解決辦法是采用靜態(tài)重定位的方法,比如一個(gè)程序裝入到16000地址位,則程序中地址數(shù)都要加上16000這個(gè)常數(shù),雖然這種方法一般來講是可行的,但是無法辨別它是重定位的地址還是不是重定位的地址,來了一個(gè)訪問地址,那這個(gè)訪問地址加不加16000,而且該方法會減慢裝載速度。

一種存儲器的抽象:地址空間

要想多個(gè)程序同時(shí)處于內(nèi)存中就需要解決兩個(gè)問題:保護(hù)和重定向。我們希望每個(gè)程序都有自己獨(dú)立的一套地址空間。

一個(gè)簡單的方法是使用動態(tài)重定位,利用基址寄存器(存放程序開始地址)和界限寄存器(存放程序大?。?,當(dāng)指令讀或?qū)憯?shù)據(jù)字前,CPU硬件會將其發(fā)送到內(nèi)存總線前與基址寄存器中的值相加,并判斷相加后的指令是否越界。但是每次都要做加法運(yùn)算和比較運(yùn)算就會顯得很慢。

交換技術(shù)的出現(xiàn)

將所有進(jìn)程都裝載入內(nèi)存是不大可能的,一種策略是將空閑進(jìn)程存入磁盤,將需要使用的進(jìn)程整個(gè)裝入內(nèi)存;另一種策略是虛擬內(nèi)存

poYBAGL8pyaATErjAADgDr2Ngos485.png

交換在內(nèi)存中產(chǎn)生了多個(gè)空閑區(qū),通過把所有內(nèi)存盡可能向下移動,有可能將這些小的內(nèi)存區(qū)合并為大的內(nèi)存區(qū),這稱為內(nèi)存壓縮,但通常不進(jìn)行該操作,因?yàn)榉浅:臅r(shí),而且OS需要準(zhǔn)確的按其需要的大小分配內(nèi)存。

但是如果數(shù)據(jù)段可以增長,例如,很多程序語言都允許從堆中動態(tài)分配內(nèi)存。所以我們可以為其預(yù)留一部分空間。

pYYBAGL8pziAVLzcAAC9bFLXyWQ211.png


其中,堆棧存放私有變量和返回地址,向下增長。數(shù)據(jù)段作為堆使用供變量動態(tài)分配和釋放,向上增長。

空閑內(nèi)存區(qū)管理-位圖方法

內(nèi)存可能被劃分為小到幾個(gè)字,大到幾千字節(jié)的分配單元,每個(gè)分配單元對應(yīng)位圖中的一位,0表示空閑,1表示占用。在分配一個(gè)k個(gè)分配單元的進(jìn)程時(shí),需要在位圖中查找k個(gè)連續(xù)的分配單元進(jìn)行分配,這是非常耗時(shí)的。

空閑內(nèi)存區(qū)管理-鏈表

還有一個(gè)方法是維護(hù)一個(gè)記錄已分配的內(nèi)存段和空閑內(nèi)存段的鏈表,設(shè)當(dāng)X進(jìn)程結(jié)束后同時(shí)需要合并內(nèi)存。

poYBAGL8p0uAMlwAAAB4w0Mx_B0916.png

當(dāng)然,這里有很多算法可以分配內(nèi)存,有首次適配法,下次適配法,最佳適配法(會生成更多的小的空閑區(qū),可以考慮最差適配法)等。

虛擬內(nèi)存

為了防止某程序過大,最開始采用覆蓋塊的方法,即手動切割程序成一個(gè)個(gè)小塊,但是怎么切割是個(gè)問題。于是這個(gè)問題干脆交給計(jì)算機(jī)去做,虛擬內(nèi)存就誕生了。其基本思想是:

每個(gè)程序都有自己的基本空間,這個(gè)空間被分成多個(gè)塊,每個(gè)塊稱作一頁和頁面。(注意:虛擬內(nèi)存就是利用磁盤空間來擴(kuò)大內(nèi)存,所以稱為虛擬)

放張圖就明白了:

poYBAGL8p16Ab9HmAADhNW9u2gY027.png

這里,我們通過頁表(基址+偏移量)來管理頁面,也可以加上TLB(塊表),計(jì)算機(jī)組成原理的內(nèi)容吧。有時(shí),單個(gè)頁表是不夠表示頁面的,所以我們可以采用二級頁表或多級頁表,來看下面一張圖:

poYBAGL8p3mAQM7EAAELkLVeSf4251.png

有頁面自然也有頁面置換算法,這些算法有最優(yōu)頁面置換算法,最近未使用置換算法,先進(jìn)先出置換算法等

pYYBAGL8p3-ALdFxAADuIcJq61g825.png


在考慮如何交換時(shí),如果考慮換出單個(gè)進(jìn)程中最小生存時(shí)間的頁面稱為局部頁面置換算法,考慮換出整個(gè)內(nèi)存中最小生存時(shí)間的頁面稱為全局頁面置換算法。通常情況下全局算法較好。另一種途徑是為進(jìn)程平均分配頁面,剩余放入公共池里面。

我們也可以采用測試缺頁中斷率的方法。

同時(shí),我們也應(yīng)該選則合適的頁面大小,在共享方面,一般只讀的頁面可以作為共享頁面來減少內(nèi)存消耗。

共享庫

在靜態(tài)鏈接.o程序時(shí),會造成很大的內(nèi)存消耗,因?yàn)橐溄硬煌瑤煳募?,這些庫文件直接裝載至內(nèi)存。但是共享庫(又稱動態(tài)鏈接庫,DLL),只會裝載一小段能夠在運(yùn)行時(shí)綁定被調(diào)用函數(shù)的存根例程,即用什么函數(shù),才裝入對應(yīng)的頁面而不是整個(gè)文件裝入。當(dāng)然,如果其它程序裝載了該共享庫,則本程序就不需要裝載它了。

另外,如果DLL文件更新了,其并不需要重新編譯執(zhí)行,用戶只需要下載更新的DLL文件下次啟動時(shí)即可使用。

來看兩個(gè)進(jìn)程使用共享庫,需要用相對地址:

poYBAGL8p5GACzSVAAC0-QfXJ4g282.png

共享庫實(shí)際上是內(nèi)存映射文件的一個(gè)特例。

如何進(jìn)行缺頁中斷處理?

poYBAGL8p6WAKvAcAACreB1Bisw267.png



審核編輯:劉清


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5253

    瀏覽量

    119212
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7366

    瀏覽量

    163101
  • 中斷處理
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    10935
收藏 人收藏

    評論

    相關(guān)推薦

    請問STM32下的LWIP同時(shí)使用TCP作為服務(wù)器支持熱插拔,SNTP進(jìn)行網(wǎng)絡(luò)對時(shí),同時(shí)運(yùn)行就會內(nèi)存溢出,獨(dú)立運(yùn)行沒問題

    我使用到了Freertos,通過線程運(yùn)行TCP,但SNTP只是調(diào)用一下,SNTP是UDP協(xié)議,所以我想問下這兩個(gè)同時(shí)運(yùn)行程序崩潰,內(nèi)存溢出有沒有什么解決辦法呢??
    發(fā)表于 05-15 11:16

    ——求 單片機(jī)如何讓兩個(gè)程序同時(shí)運(yùn)行 求 高手解決———

    本帖最后由 eehome 于 2013-1-5 09:53 編輯 求 單片機(jī)如何讓兩個(gè)程序同時(shí)運(yùn)行我用一個(gè)單片機(jī)的P1和P3口控制16個(gè)
    發(fā)表于 12-12 22:20

    51單片機(jī)的兩個(gè)定時(shí)器可以同時(shí)運(yùn)行嗎?

    在操作,發(fā)現(xiàn)兩個(gè)定時(shí)器一起運(yùn)行就出問題,請問是不是兩個(gè)定時(shí)器可以同時(shí)運(yùn)行嗎?要用一個(gè)就要關(guān)掉另
    發(fā)表于 07-14 10:36

    怎么讓while循環(huán)里的兩個(gè)程序同時(shí)運(yùn)行?

    怎么讓while循環(huán)里的兩個(gè)程序同時(shí)運(yùn)行?為什么總是有先后?
    發(fā)表于 07-26 22:41

    ucosii如何實(shí)現(xiàn)兩個(gè)任務(wù)同時(shí)運(yùn)行而非按優(yōu)先級調(diào)度

    ucosii是按優(yōu)先級調(diào)度任務(wù)的兩個(gè)任務(wù)比如一個(gè)任務(wù)播放聲音優(yōu)先級高一個(gè)任務(wù)顯示圖片 優(yōu)先級低那么由于優(yōu)先級調(diào)度任務(wù)的機(jī)制會造成播放聲音時(shí)候,圖片顯示會卡主 那么播放聲音就相當(dāng)于中斷一樣了圖片會等聲音播放完畢才會變化 如何能做到
    發(fā)表于 07-23 17:03

    Labview可以同時(shí)運(yùn)行兩個(gè)不同的任務(wù)嗎?

    Labview可以同時(shí)運(yùn)行兩個(gè)不同的任務(wù)嗎,比如說一個(gè)任務(wù)發(fā)送數(shù)據(jù)(DA),另一個(gè)任務(wù)接收數(shù)據(jù)(AD)?
    發(fā)表于 03-27 18:45

    如何同時(shí)運(yùn)行兩個(gè)niDaq模塊

    因?yàn)槲抑皇侵谱髁艘?b class='flag-5'>個(gè)非常簡單的程序并且線程不會同時(shí)執(zhí)行。你可以打開這個(gè)例子。你會看到我在說什么。如果我錯(cuò)了請告訴我,因?yàn)檫@沒有任何意義,因?yàn)槲覠o法找到有關(guān)如何同時(shí)運(yùn)行
    發(fā)表于 03-18 06:44

    51單片機(jī)驅(qū)動4個(gè)電機(jī)同時(shí)運(yùn)行比一個(gè)兩個(gè)運(yùn)行的轉(zhuǎn)速低

    我用的是51單片機(jī),驅(qū)動4個(gè)電機(jī),4個(gè)三極管的c都連的是板子上的vcc,b連的4個(gè)io口,pwm輸出,但4個(gè)電機(jī)同時(shí)運(yùn)行的轉(zhuǎn)速,明顯比一
    發(fā)表于 03-04 23:59

    請問F28377S的內(nèi)核和CLA可以同時(shí)運(yùn)行嗎?

    比如我有兩個(gè)沒有時(shí)序關(guān)系的程序1和程序2,可不可在內(nèi)核和CLA同時(shí)運(yùn)行
    發(fā)表于 05-29 08:11

    如何用labview控制兩個(gè)程序同時(shí)運(yùn)行同時(shí)結(jié)束?

    我現(xiàn)在有兩個(gè)程序,想用labview控制他們同時(shí)運(yùn)行同時(shí)結(jié)束,有什么好方法嗎?
    發(fā)表于 07-30 14:38

    Harmony可以同時(shí)運(yùn)行兩個(gè)本地用戶嗎?

    鴻蒙本地都可以運(yùn)行兩個(gè)應(yīng)用程序同時(shí)運(yùn)行兩個(gè)嗎?
    發(fā)表于 04-15 11:36

    如何用IMXRT1176同時(shí)運(yùn)行兩個(gè)PAL攝像機(jī)?

    我需要同時(shí)運(yùn)行前置和后置攝像頭才能獲得實(shí)時(shí)視頻。我正在使用 IMXRT1176。我能夠通過 MIPI-CSI 或并行 8 位 CSI 外圍設(shè)備從 PAL 攝像機(jī)獲取實(shí)時(shí)視頻。 現(xiàn)在,我手頭有兩個(gè)
    發(fā)表于 03-30 07:12

    在IMXRT1176-EVK上同時(shí)運(yùn)行兩個(gè)USB端口可行嗎?

    我們的要求是同時(shí)運(yùn)行兩個(gè) USB 端口。 Q1:是否可以同時(shí)運(yùn)行兩個(gè) USB 端口? 筆記: 我為那個(gè)結(jié)構(gòu)拿了另一個(gè)對象。 usb_c
    發(fā)表于 05-09 06:55

    什么是區(qū)塊鏈不可能三角為什么不可突破

    CAP定理證明了:當(dāng)網(wǎng)絡(luò)存在分區(qū)時(shí),提供可靠的原子一致性數(shù)據(jù)是不可能的,但是想要實(shí)現(xiàn)一致性、可用性、分區(qū)容錯(cuò)性,三個(gè)屬性兩個(gè)是可行的。在異步通信系統(tǒng)
    發(fā)表于 02-26 11:03 ?3137次閱讀
    什么是區(qū)塊鏈<b class='flag-5'>不可能</b>三角為什么<b class='flag-5'>不可</b>突破

    單片機(jī)的程序在內(nèi)存和FLASH應(yīng)該如何進(jìn)行空間分配

    一句話:基于速度問題,電腦使用硬盤存儲程序,運(yùn)行時(shí),在內(nèi)存中分配空間給變量,加載程序內(nèi)存,
    發(fā)表于 09-18 17:20 ?3次下載
    單片機(jī)的<b class='flag-5'>程序</b><b class='flag-5'>在內(nèi)存</b>和FLASH<b class='flag-5'>中</b>應(yīng)該如何進(jìn)行空間分配