成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

操作系統是如何一步步發明虛擬內存的?

系統 其他OS
面對內存不足的問題,你開始思考,既然內存一次性裝不下大型程序,那么為什么不把這個大型程序拆開了、用到哪些就裝哪些呢?

那時引以為傲的System/360大型機雖然配備了豪華的256KB物理內存(價格相當于今天的數百萬美元),但在引入多進程后內存相關的問題開始出現,因為多個進程可以同時運行在內存中。

你面臨的核心問題是:如何保證多進程能夠高效共享有限的物理內存?

最初的嘗試:固定分區

你的第一個嘗試是最直觀的方法,將物理內存劃分為幾個固定大小的區域,每個區域分配給一個程序:

圖片圖片

這就是所謂的固定分區(Fixed Partitioning),這個想法很簡單,你很快實現了這個機制:

// 固定分區內存管理的簡單實現
struct memory_partition {
    void* start_address;      // 分區起始地址
    size_t size;             // 分區大小
    bool is_occupied;        // 是否被占用
    int process_id;          // 占用進程ID
};

這個簡單的分區系統確實解決了一些問題。它允許多個程序同時駐留在內存中,并提供了基本的內存隔離。然而,它很快就暴露出了嚴重的缺陷。

問題出在內存利用率上:一個只需要10KB內存的小程序占用了整個64KB的分區,而一個需要70KB的程序卻無法運行,因為沒有任何一個分區足夠大,盡管系統中空閑內存超過了70KB!

圖片

你意識到,固定分區雖然簡單,但極其浪費內存資源。

它無法適應程序大小的變化,也無法解決運行大型程序的問題。

這個方案本質就是吃大鍋飯,不管你可執行程序本身有多大都給你固定內存,打破大鍋飯的最佳方法就是按勞分配。

動態分區:按需分配

既然是按勞分配那就不能預先劃分內存,而是根據程序的實際需求動態分配內存塊,用多少給多少:

// 動態分區內存管理
struct memory_block {
    void* start_address;      // 內存塊起始地址
    size_t size;             // 內存塊大小
    bool is_free;            // 是否空閑
    struct memory_block* next; // 鏈表中的下一個塊
};

struct memory_block* free_list; // 空閑內存塊鏈表

這就是你在數據結構課上學到的鏈表。

動態分區確實提高了內存利用率,程序可以獲得剛好滿足其需求的內存量,這種內存分配方法開始流行起來。

然而,隨著系統運行時間的增長,大量用戶開始反饋物理內存很快耗盡導致程序崩潰,一通debug后你發現了問題:內存碎片。

只需要幾周的運行,系統中就會出現了大量的小內存塊,它們分散在各處,雖然總和足夠大,但沒有一個連續的塊能滿足新程序的需求。

更糟糕的是,即使使用動態分區,仍然無法運行那些需要超過物理內存總量的程序

因為在20世紀60-80年代,雖然計算機物理內存有限(如KB級別),但程序規模卻在逐漸增大(如大型科學計算、數據庫系統),這是一個根本性的限制,你需要一種全新的思路...

覆蓋技術:程序員的自我管理

面對內存不足的問題,你開始思考,既然內存一次性裝不下大型程序,那么為什么不把這個大型程序拆開了、用到哪些就裝哪些呢

看上去好像能解決問題,你進一步思考,程序其實可以被劃分為多個獨立的功能模塊,一些核心的模塊可能需要始終駐留在內存(如主控制邏輯、核心函數),而非核心的功能模塊可以按需動態加載到共享內存區域,覆蓋前一個模塊。

假設可執行程序A劃分為一個核心模塊和4個功能模塊,那么當需要運行模塊1時就把模塊1加載到共享內存區域,當需要運行模塊2時就把模塊2加載到共享內存中覆蓋掉原來的模塊1:

圖片圖片

這樣就能實現在有限的物理內存中運行超大程序的目的,這就是早期操作系統中的"覆蓋技術"(Overlay)。

這種方法要求程序員手動將程序分割成多個模塊,并在運行時根據需要將不同模塊加載到同一塊內存區域。

// 程序員使用覆蓋技術的偽代碼
void main() {
    // 主模塊始終在內存中
    
    // 需要模塊A時
    load_module("module_A", OVERLAY_REGION);
    execute_module_A();
    
    // 需要模塊B時,覆蓋同一內存區域
    load_module("module_B", OVERLAY_REGION);
    execute_module_B();
    
    // 再次需要模塊A時
    load_module("module_A", OVERLAY_REGION);
    execute_module_A_again();
}

覆蓋技術確實突破了物理內存限制,可以在有限的物理內存上運行大型程序,是一種非常聰明的方法。

但它有嚴重的缺點:

  1. 程序員必須手動管理內存,這極其復雜且容易出錯
  2. 程序必須預先知道哪些模塊可以共享內存區域
  3. 頻繁的模塊加載會導致性能下降

這讓你開始認識到:內存管理太重要了,絕不能完全依賴程序員自己手動管理

因此你需要一個系統級的解決方案,能夠自動管理內存,對程序員透明,同時允許程序使用超過物理內存的地址空間,這就是后來的虛擬內存技術。

責任編輯:武曉燕 來源: 碼農的荒島求生
相關推薦

2025-04-03 01:45:00

2025-03-28 09:39:15

CPU指令信號

2024-09-30 09:56:59

2024-11-11 10:28:33

操作系統Unix系統

2024-09-12 10:04:06

內存程序系統

2025-04-09 08:45:00

操作系統進程線程

2018-07-13 15:36:52

2015-07-27 16:06:16

VMware Thin虛擬化

2024-08-30 08:30:29

CPU操作系統寄存器

2017-01-19 21:08:33

iOS路由構建

2024-06-27 08:30:36

內存擴容堆區

2017-12-25 11:50:57

LinuxArch Linux

2024-08-06 09:29:54

程序機器指令字符串

2019-03-05 14:09:27

Docker存儲容器

2019-07-09 15:23:22

Docker存儲驅動

2018-12-24 10:04:06

Docker存儲驅動

2019-04-01 10:15:02

2010-03-04 16:28:17

Android核心代碼

2016-11-02 18:54:01

javascript

2017-01-06 15:13:25

LinuxVim源代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久久免费看 | 精品福利视频一区二区三区 | 日韩精品成人 | 成人a在线观看 | 一本一道久久a久久精品综合蜜臀 | 久久久久久九九九九九九 | 国产精品久久久久久久久久不蜜臀 | 男人视频网站 | 国产午夜精品福利 | 欧美成人手机视频 | 人人爽日日躁夜夜躁尤物 | 狠狠操狠狠搞 | 黄色毛片一级 | 国产成人精品午夜 | 国产剧情一区 | 欧美一级视频免费看 | 丁香五月网久久综合 | 国精日本亚洲欧州国产中文久久 | 九九精品在线 | 欧美精品一区在线发布 | 久久久国产一区 | 国产精品视频一区二区三区四蜜臂 | 中文字幕欧美一区 | 精一区二区 | 狠狠躁夜夜躁人人爽天天高潮 | 成人不卡| 91av视频在线免费观看 | 伊人色综合久久天天五月婷 | 久久99精品久久 | 亚洲三区视频 | 二区三区av | 国户精品久久久久久久久久久不卡 | 999热视频| 欧美成人一区二区 | 另类专区成人 | 日韩羞羞 | 欧美日韩在线一区二区三区 | 久久久精品高清 | 一区二区在线不卡 | 日日天天 | 免费在线观看91 |