国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

探討Linux操作系統虛擬內存和物理內存的關系

電子設計 ? 來源:TOMORROW 星辰 ? 作者:TOMORROW 星辰 ? 2020-12-10 16:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

為了高效、準確測試出該系統下,單個進程能夠申請到的最大虛存空間,所以編寫了一個Linux的測試程序。因為 64 位真的是個很可怕的數字,所以程序在申請內存空間時,先申請較大的內存塊(100G),直到沒有這么大的內存塊,然后申請上次能申請到的內存塊的一半。重復以上步驟,直到內存塊變得足夠小(小于 100Byte)。然后結束申請內存。代碼如下:

#include
#define SZ_100G (50*2147483648)  //100GB 的字節數

int main()
{
	int *p[1000000];//存放申請內存塊的指針以備釋放
	int *ptem;
	long long int block_sz,total_sz=0;
	int i,j;
	char c='c';

	printf("pid=%d\n",getpid());
	getchar();

	block_sz=SZ_100G;
	for(i=0;;i++)
	{
		printf("i=%d\n",i);
		p[i]=(int *)malloc(block_sz*sizeof(char));
		if(NULL==p[i])//當所申請的內存塊不成功時,把內存塊大小減半重新申請
		{
			block_sz=block_sz/2;
			p[i]=(int *)malloc(block_sz*sizeof(char));
		}
		total_sz=total_sz+block_sz;//累加所申請到的內存塊

		if(block_sz<100)//當內存塊小于 100 個字節時結束內存申請
			break;
	}
	getchar();

	ptem=p[0];
	for(j=0;;j++)
	{
		if(0==j%1000)
			c=getchar();
		if('e'==c)
			break;

		*(ptem+=(2*1024*1024))=c;
	}

	for(;i>=0;i--)//釋放所有內存塊
		free(p[i]);

	printf("total_sz=%ldByte\n",total_sz);
	

	return 0;
}

在終端 1 編譯運行上面代碼。
運行后,先在另一個終端(終端 2)執行:

cat /proc/6674/status

查看該進程的 status 文件如下圖圖一所示:

終端 1 終端 2

圖一

對于 status 文件,本文只會關注以下幾個參數:

VmPeak(進程所占用的虛存空間最大值)

VmRSS(進程正在占用物理內存大小)

VmSwap(進程占用交換區大小)

然后回車開始申請內存,當終端停止輸出數字時,再次在終端 2 執行:

cat /proc/6674/status

得到下圖圖二輸出:

終端 1 終端 2

圖二

對比圖一和圖二中的 VmPeak:

137438953320K – 12044K = 140737475866624 Byte

= 111 1111 1111 1111 1111 1111 0100 0001 0111 0000 0000 0000(B) Byte

是的,如果你沒有眼花,你數到上面得到的是一個 47 位!!!!二進制數。

47 位什么概念?大概是 128TB = 128*1024GB !!! (試問現在誰的個人電腦有這么大的硬盤??更不要說內存)

一個進程能夠申請到這么恐怖的內存空間?這不但超過了物理內存、超過了物理內存+交換區、還超過了硬盤大小啊。這不科學啊。

但是從 status 讀出來的數據錯不了的。

首先,虛擬內存,顧名思義,虛擬的、并不是事實上存在,在一個進程的虛存空間里,只存在進程自己和系統內核,而不存在其他進程。這是為了方便編程和提高物理內存利用率而創造出來的一種機制(在過去內存是很貴的)。虛擬內存中對應著的是邏輯地址,邏輯地址通過操作系統和硬件的配合映射到物理內存上。(這里就不在多說虛擬內存的定義。如果把段頁式內存管理機制理解后,虛擬內存也就理解了。關于段頁式內存管理介紹可參考:深入理解操作系統之——分頁式存儲管理,深入理解操作系統之——段頁式存儲器管理。)

其二,交換區,實際上就是物理內存不夠用時,虛存空間的數據就必須映射到交換區上。

那么單個進程所能申請的最大虛存空間理應不會超過物理內存和交換區的和。然而實際卻是超過那么多。

然后,網上查閱相關資料,msdn 上看到了相關解釋。

傳送門:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/virtual-address-spaces

該文章介紹到,Windows 32 系統下,虛擬內存中,用戶空間占用了低地址 2G 的空間,系統內核占用了高地址 2G 空間。總共虛存空間就是 2^32Byte。

pIYBAF_R18aAbdkcAAAjG143L2o351.png

圖三

那么 64 位系統中,就系統而言,總共的虛存空間應當是 2^64Byte?

在該文章下面還有 Windows 64 位系統的虛存空間介紹,如下圖圖四所示。從圖中看到用戶虛存空間 8TB+系統空間 248TB=256TB=2^48 Byte ,這個數字似乎和上面所測得的單個進程能夠申請到的最大虛存空間的數字有點接近了。

pIYBAF_R182AHv1KAAA9UJVQds8012.png

圖四

注意看圖四,還可以發現 64 位系統中還有很大很大的虛存空間保留沒有被使用的。從這個出發繼續查閱資料,然后找到了關于目前 64 位 CPU 的相關說明。由于目前還遠遠用不到 64 位那么大的空間,所以 AMD 64 位 CPU 目前只用了 48 位的尋址。而 Intel 的 64 位 CPU 是和 AMD 交叉授權,所以 Intel 64CPU 也同樣只采用 48 位尋址。所以圖三的保留空間就得到了解釋。

再回到原先的問題,現在知道了就 64 位系統而言,虛擬內存空間是可以達到 2^48Byte 那么大的,參考 Windows 64 位系統虛存空間結構,可以猜測Linux 64 位系統下,用戶虛存空間和系統內核虛存空間分布和 Windows 是相似的,只是兩者大小比例有所差別。(因為找了很久,沒有找到Linux的官方文檔說明,只找到很舊的、32 位。所以不能提供準確的參考,如果有讀者找到,希望可以告訴作者一下補上)。

不過,到現在,還有問題沒有解決,為什么所申請的虛存空間會比物理內存與交換區的和大?

現在回到一開始沒有運行完的程序,在終端 1 回車繼續運行程序,程序接著會對所申請到的第一個 100G 內存塊每隔 2M 空間進行寫操作,每回車一次,會寫 1000 次。回車幾次后,在終端 2 再執行:

cat /proc/6674/status

得到下圖圖五:

圖五

由圖五可以看到正在使用的物理內存 VmRSS 變小了,正在使用的交換區空間 VmSwap 迅速增大。但是兩者之和是在一直增加的,這就說明,申請到的虛擬內存在未被使用之前,它只是一個數字,并沒有實際的物理內存和交換區與之相對應。當對虛存進行寫操作時,系統就會逐步分配物理內存,而物理內存的數據又會可能被系統調到交換區。現在問題逐漸明了了。

如果我不停地對虛存空間進行寫操作會怎樣,為了解決疑惑,在終端 1 不停回車,偶爾在終端 2 中查看 status 文件中的狀態,寫到一定程度后,終端 1 出現了

[1]    7893 killed     a.out

如圖六所示:

圖六

在進程結束之前查看到的 status 文件顯示 VmRSS+VmSwap 約等 1.8G,加上系統占用和其他進程占用,那么說此時物理內存和交換區已經接近極限了。再繼續運行寫的時候,操作系統為了系統的正常運行選擇把這個進程殺死了。那么所有的疑問也解決了。

系統所允許的申請的虛存空間是可以超過物理內存與交換區的和的。但是當進程所占用的物理內存加上交換區影響到了系統的正常運行就會被系統殺死。
編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11767

    瀏覽量

    219100
  • 操作系統
    +關注

    關注

    37

    文章

    7402

    瀏覽量

    129351
  • 物理內存
    +關注

    關注

    0

    文章

    11

    瀏覽量

    8653
  • 虛擬內存
    +關注

    關注

    0

    文章

    79

    瀏覽量

    8462
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MangoTree Halo Ultra「全新PXI」,標配自動糾錯內存#

    內存
    芒果樹數字
    發布于 :2026年03月06日 15:59:34

    Linux內核伙伴系統內存申請函數詳解:從原理到實戰

    Linux 內核中,內存管理是整個系統穩定運行的基石,而伙伴系統(Buddy System) 作為內核物理
    的頭像 發表于 02-10 16:58 ?3638次閱讀
    <b class='flag-5'>Linux</b>內核伙伴<b class='flag-5'>系統</b><b class='flag-5'>內存</b>申請函數詳解:從原理到實戰

    Linux內核大塊內存申請:從場景到落地全解析

    網卡、硬盤等外設的 DMA 控制器,要求內存物理地址連續(無法識別虛擬地址映射),且需一次性分配大尺寸緩沖區(如 1GB 網絡幀緩存)。
    的頭像 發表于 02-09 16:41 ?684次閱讀
    <b class='flag-5'>Linux</b>內核大塊<b class='flag-5'>內存</b>申請:從場景到落地全解析

    Linux下擴充Swap交換空間:解決內存不足的實用指南,這些影響要注意!

    大家在使用 Linux 系統(比如常用的 Ubuntu)時,是不是偶爾會遇到 “內存不足” 的彈窗?比如運行大型編譯任務、多開虛擬機、做數據分析,或者把
    的頭像 發表于 02-09 16:33 ?228次閱讀
    <b class='flag-5'>Linux</b>下擴充Swap交換空間:解決<b class='flag-5'>內存</b>不足的實用指南,這些影響要注意!

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配

    ,目前4KB是廣泛使用的頁大小。在Linux操作系統中,每個進程甚至內核本身都被分配了地址空間,這是處理器的虛擬地址空間的一部分,內核和進程都不處理物理地址,
    發表于 01-16 20:05

    操作系統的發展及分類

    ,就形成了多道批處理操作系統。該系統把用戶提交的作業成批地送入計算機內存,然后由作業調度程序自動地選擇作業運行。   優點是資源利用率高,多道程序共享計算機資源,從而使各種資源得到充分利用;
    發表于 01-15 08:00

    rk基于linux/android內存管理

    一、內存分布 ? U-Boot 由前級 Loader 加載到 CONFIG_SYS_TEXT_BASE 地址,初始化時會探明當前系統的總內存容 量, 32 位平臺上認為最大 4GB 可用(但是不影響
    的頭像 發表于 12-15 10:42 ?217次閱讀
    rk基于<b class='flag-5'>linux</b>/android<b class='flag-5'>內存</b>管理

    Linux Swap交換空間詳解:Android編譯內存不足?這樣擴充立竿見影

    ? ? 在 ?Linux? 系統使用過程中,你是否遇到過? “ 內存不足 ”? 的報錯?比如編譯? Android? 源碼時,明明按教程操作,卻因
    的頭像 發表于 12-06 08:10 ?4277次閱讀

    FLASH中的代碼是如何得到運行的呢

    指令的地址。正常情況下自動加“4”,遇到分支跳轉的時候,由跳轉指令設置值。那么指針是什么?指針是一個變量的地址,在含有操作系統(比如Linux、Windows)即硬件層面含有內存管理單元(MMU)的情況下,指針是
    發表于 12-04 08:06

    為什么單片機中很少使用malloc,而PC程序頻繁使用呢?

    使用 malloc。 PC:在PC上,操作系統提供了強大的內存管理機制,如虛擬內存、分頁管理、垃圾回收等,能夠有效地處理動態內存分配。操作系統還會對
    發表于 11-20 06:55

    單片機的操作系統

    Linux網絡協議棧和文件系統(如JFFS2),但實時性較弱,需外擴存儲器。 ? ? VxWorks ?:高效實時操作系統,廣泛應用于通信、軍事等領域,支持自定義硬件模塊。 ? 其他選擇 ? Keil
    發表于 11-14 06:18

    Jtti Linux操作系統最常見的10大優勢

    Linux操作系統的十大優勢 Linux操作系統作為一種開源、自由的系統,已經廣泛應用于個人計算機、服務器、嵌入式設備等多個領域。它的多樣化
    的頭像 發表于 11-06 15:32 ?317次閱讀

    Perforce QAC 2025.2版本更新:虛擬內存優化、100%覆蓋CERT C規則、CI構建性能提升等

    【產品更新】Perforce QAC更新至2025.2版本,安裝路徑和許可證都有變化!重點:虛擬內存占用降低、100%覆蓋CERT C規則,C23支持增強、CI構建性能提升等。建議盡快評估升級。
    的頭像 發表于 09-09 14:40 ?689次閱讀
    Perforce QAC 2025.2版本更新:<b class='flag-5'>虛擬內存</b>優化、100%覆蓋CERT C規則、CI構建性能提升等

    golang內存分配

    內存碎片. 線程擁有一定的 cache, 可用于無鎖分配. 同時 Go 對于 GC 后回收的內存頁, 并不是馬上歸還給操作系統, 而是會延遲歸還, 用于滿足未來的內存需求. ?? ?
    的頭像 發表于 03-31 15:00 ?521次閱讀
    golang<b class='flag-5'>內存</b>分配

    快速搞懂C語言程序內存分區!

    在程序運行過程中,操作系統會根據程序的需要,將內存劃分為多個功能不同的區段,以便更高效地管理內存資源和確保程序的穩定運行。不同的內存區段負責存儲不同類型的數據和代碼,涵蓋了從程序指令、
    的頭像 發表于 03-14 17:37 ?1596次閱讀
    快速搞懂C語言程序<b class='flag-5'>內存</b>分區!