一分鐘系列:什么是虛擬內存?

一分鐘系列:什么是虛擬內存?

轉自:https://mp.weixin.qq.com/s/opMgZrXV-lfgOWrNUMKweg

注:一分鐘系列的篇幅都不長,適合吃飯蹲坑、地鐵公交上食用~

內存對于用戶來說就是一個字節數組,我們可以根據地址來訪問到某個字節或者某些字節:

在這里插入圖片描述

很久之前的內存

很久很久之前,一臺機器上只放置一個程序,操作系統僅僅作為一個函數庫存在。對于內存來說,除去操作系統的代碼和數據占用的一些空間外,其余空間全部分配給正在運行的那個程序,畫個圖就是這樣:

在這里插入圖片描述

小貼士:我們把運行著的程序稱之為進程。

同時運行多個程序的內存

后來人們覺得同時在一臺計算機上只運行一個程序太虧了,就設計了一個可以同時運行多個程序的機制。不過內存條只有一個,所以這些用戶程序只能共享同一個內存條,只能把內存的不同部分劃分給不同的用戶程序,畫個圖就像是這樣:

在這里插入圖片描述

這樣子的話也有一些問題:

  • 不同用戶程序只能使用給他們規定好的那部分內存,也就是程序員在敲代碼的時候就應該小心翼翼的計算自己使用的內存有沒有占到別人家的地兒,這樣對碼農很不友好有木有。
  • 如果哪個心眼兒壞的家伙故意去讀取別人家的程序使用的內存,這不就暴露了么,更嚴重的,這個壞家伙直接把別人家程序正在使用的內存的某些字節給更新掉,這就是天坑了~
  • 能使用的內存空間都給規定好了,太少了有木有~

虛擬內存

操作系統是個老好人,使命就是解決所有用戶感到麻煩的事情。設計操作系統的大叔覺得,如果讓用戶直接去操作內存的話,用戶也不知道其他人到底使用了內存的哪些字節,自己可以使用哪些字節,如果要做到這一點的話人們在開發程序的時候還要聚到一起開個會,把每個人該用哪塊內存都規定好,即使規定好了用戶還得小心翼翼的避免使用了不屬于自己的那部分內存。干脆,干脆就不讓用戶直接操作內存了,讓用戶在編程序的時候直接把內存想象成一個非常非常大的字節數組就好了,自己在這個字節數組上可以隨便折騰,他們把這個非常大的字節數組稱之為虛擬內存,由操作系統完成從虛擬內存的虛擬地址到真實內存的真實地址之間的映射工作。畫個圖就像這樣:

在這里插入圖片描述

這樣還有問題,用戶越來越多,即使每個用戶都使用非常少的內存空間,那加起來占用的內存空間都可能超過了真實內存的大小,更何況某些喪心病狂的程序員寫的程序里本身就使用了超過真正內存大小的空間,這可怎么辦。這難不倒設計操作系統的大叔們,他們機智的把硬盤也拉了進來。

在這里插入圖片描述

操作系統完成由虛擬內存地址到真實內存地址或者磁盤地址之間的映射工作,這樣子給用戶提供的虛擬內存的地址空間就可以非常非常大,用戶程序中那些很久都用不到的內存空間可以被操作系統給搞到磁盤上邊存儲,什么時候需要用了,又從磁盤中加載到真實內存中,重要的是這個過程全部是操作系統自動完成的,對于我們這些碼農來說,編寫程序就像是在一個炒雞大的字節數組上將某個地方的數據搬到另一個地方,或者將某個地方的數據經過CPU的某種加工之后再放到某個字節數組的某個地方,整個過程so easy,完全不用擔心有沒有讀取/覆蓋掉別人正在使用的內存空間。

小貼士:對于Windows操作系統來說,虛擬內存所需的磁盤空間從系統盤,一般是C盤分配,當你的C盤剩余空間很少時就會導致很卡~

虛擬內存結構

我們說對于敲代碼的碼農來說,虛擬內存就是一個超級大的字節數組,不過這個字節數組也是被劃分為多個部分的,并不是每個地方用戶都可以訪問,一般的虛擬內存結構長這樣:

在這里插入圖片描述

用戶需要調用函數的時候,一般都會生成一個稱之為棧幀的結構,從而導致虛擬內存中的棧空間增長。

用戶需要單獨申請內存空間時,就會從堆空間分配,從而導致虛擬內存中的堆空間增長。

這里需要強調的一點是,我們平時所說的操作系統內核不是一個進程,而是指操作系統的代碼。

不知不覺我覺得超過了一分鐘,下次再見~


來源:微信公眾號

作者:小孩子4919

原文:虛擬內存是個啥 | 一分鐘系列

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532692.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532692.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532692.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯真題訓練 2019.3題

標題:數列求值 (本題總分:10 分)### 給定數列 1, 1, 1, 3, 5, 9, 17, …,從第 4 項開始,每項都是前 3 項的和。求 第 20190324 項的最后 4 位數字。 【答案提交】 這是一道結果填空的題,你只需…

11-Kafka

1 Kafka Kafka是一個分布式流式數據平臺,它具有三個關鍵特性 Message System: Pub-Sub消息系統Availability & Reliability:以容錯及持久化的方式存儲數據記錄流Scalable & Real time 1.1 Kafka架構體系 Kafka系統中存在5個關鍵組件 Producer…

虛擬內存精粹

虛擬內存精粹 標題:虛擬內存精粹 作者:潘建鋒 原文:HTTPS://strikefreedom.top/memory-management–virtual-memory 導言 虛擬內存是當今計算機系統中最重要的抽象概念之一,它的提出是為了更加有效地管理內存并且降低內存出錯的概…

藍橋杯真題訓練 2019.4題

標題: 數的分解(本題總分:10 分) 【問題描述】 把 2019 分解成 3 個各不相同的正整數之和,并且要求每個正整數都不包 含數字 2 和 4,一共有多少種不同的分解方法? 注意交換 3 個整數的順序被視…

深度學習自動編譯和優化技術調研

深度學習自動編譯和優化技術調研 轉自:https://moqi.com.cn/blog/deeplearning/ 作者:墨奇科技全棧開發 在墨奇科技,我們需要將一些包含深度神經網絡(DNN)的 AI 算法移植到邊緣端的設備, 這些設備往往使用 …

三元組數據處理系統

include<stdio.h> include<stdlib.h> define OK 1 define ERROR 0 define OVERFLOW -2 typedef int Status; typedef float ElemType; typedef ElemType *Triplet; // 聲明Triplet為ElemType指針類型 //三元組的初始化 Status initTriplet(Triplet &T, E…

Copy-On-Write COW機制

Copy-On-Write COW機制 轉自&#xff1a;https://zhuanlan.zhihu.com/p/48147304 作者&#xff1a;Java3y 前言 只有光頭才能變強 在讀《Redis設計與實現》關于哈希表擴容的時候&#xff0c;發現這么一段話&#xff1a; 執行BGSAVE命令或者BGREWRITEAOF命令的過程中&#xff0c…

實驗報告:抽象數據類型的表現和實現

實驗報告&#xff1a;抽象數據類型的表現和實現 實驗內容 基本要求&#xff1a; 設計實現抽象數據類型“三元組”&#xff0c;要求動態分配內存。每個三元組由任意三個實數的序列構成&#xff0c;基本操作包括&#xff1a;創建一個三元組&#xff0c;取三元組的任意一個分量&…

關于x86、x86_64/x64、amd64和arm64/aarch64

關于x86、x86_64/x64、amd64和arm64/aarch64 轉自&#xff1a;https://www.jianshu.com/p/2753c45af9bf 為什么叫x86和x86_64和AMD64? 為什么大家叫x86為32位系統&#xff1f; 為什么軟件版本會注明 for amd64版本&#xff0c;不是intel64呢&#xff1f; x86是指intel的開…

實驗報告: 線性表的基本操作及應用

實驗報告&#xff1a; 線性表的基本操作及應用 實驗內容 基本要求&#xff1a; &#xff08;1&#xff09;實現單鏈表的創建&#xff1b;&#xff08;2&#xff09;實現單鏈表的插入&#xff1b;&#xff08;3&#xff09;實現單鏈表的刪除 &#xff08;4&#xff09;實現單鏈…

TVM:源碼編譯安裝

TVM&#xff1a;Linux源碼編譯安裝 筆者環境&#xff1a; OS&#xff1a;Ubuntu 18.04 CMake&#xff1a;3.10.2 gcc&#xff1a;7.5.0 cuda&#xff1a;11.1 編譯安裝過程總覽 本文將簡介 tvm 的編譯安裝過程&#xff0c;包含兩個步驟&#xff1a; 通過C代碼構建共享庫設置相…

第2章線性表的基本使用及其cpp示例(第二章匯總,線性表都在這里)

2.1線性表的定義和特點 【類型定義&#xff1a; *是n個元素的有限序列 *除了第一個元素沒有直接前驅和最后一個沒有直接后驅之外&#xff0c;其余的每個元素只有一個直接前驅和直接后驅&#xff1b; &#xff08;a1,a2…an&#xff09; 【特征&#xff1a; *有窮性&#xff1…

TVM:通過Python接口(AutoTVM)來編譯和優化模型

TVM&#xff1a;通過Python接口&#xff08;AutoTVM&#xff09;來編譯和優化模型 上次我們已經介紹了如何從源碼編譯安裝 tvm&#xff0c;本文我們將介紹在本機中使用 tvm Python 接口來編譯優化模型的一個demo。 TVM 是一個深度學習編譯器框架&#xff0c;有許多不同的模塊…

TVM:在樹莓派上部署預訓練的模型

TVM&#xff1a;在樹莓派上部署預訓練的模型 之前我們已經介紹如何通過Python接口&#xff08;AutoTVM&#xff09;來編譯和優化模型。本文將介紹如何在遠程&#xff08;如本例中的樹莓派&#xff09;上部署預訓練的模型。 在設備上構建 TVM Runtime 首先我們需要再遠程設備…

2.2線性表的順序表

2.2.1線性表的順序表示和實現------順序映像 【順序存儲】在【查找時】的時間復雜度為【O(1)】&#xff0c;因為它的地址是連續的&#xff0c;只要知道首元素的地址&#xff0c;根據下標可以很快找到指定位置的元素 【插入和刪除】操作由于可能要在插入前或刪除后對元素進行移…

TVM:交叉編譯和RPC

TVM&#xff1a;交叉編譯和RPC 之前我們介紹了 TVM 的安裝、本機demo和樹莓派遠程demo。本文將介紹了在 TVM 中使用 RPC 進行交叉編譯和遠程設備執行。 通過交叉編譯和 RPC&#xff0c;我們可以在本地機器上編譯程序&#xff0c;然后在遠程設備上運行它。 當遠程設備資源有限…

2.3單鏈表的基本使用及其cpp示例

2.3線性表的鏈式表現與實現 2.3.1.1單鏈表 【特點&#xff1a; *用一組任意的存儲單元存儲線性表的數據元素 *利用指針實現用不同相鄰的存儲單元存放邏輯上相鄰的元素 *每個元素ai&#xff0c;除存儲本身信息外&#xff0c;還存儲其直接后繼的元素&#xff08;后一個元素的地址…

TVM:簡介

TVM&#xff1a;簡介概述 Apache TVM 是一個用于 CPU、GPU 和機器學習加速器的開源機器學習編譯器框架。它旨在使機器學習工程師能夠在任何硬件后端上高效地優化和運行計算。本教程的目的是通過定義和演示關鍵概念&#xff0c;引導您了解 TVM 的所有主要功能。新用戶應該能夠從…

2.3.3單鏈表的雙向鏈表

2.3.3雙向鏈表 插入、刪除 指在前驅和后驅方向都能游歷&#xff08;遍歷&#xff09;的線性鏈表 雙向鏈表的每個結點有兩個指針域 【結構】&#xff1a;prior data next 雙鏈表通常采用帶頭結點的循環鏈表形式 可理解為首位相接的數據“圈”&#xff0c;每個結點都可以向前…

nvidia-smi 命令詳解

nvidia-smi 命令詳解 簡介 nvidia-smi - NVIDIA System Management Interface program nvidia smi&#xff08;也稱為NVSMI&#xff09;為來自 Fermi 和更高體系結構系列的 nvidia Tesla、Quadro、GRID 和 GeForce 設備提供監控和管理功能。GeForce Titan系列設備支持大多數…