色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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
    +關注

    關注

    87

    文章

    11336

    瀏覽量

    210095
  • 操作系統
    +關注

    關注

    37

    文章

    6874

    瀏覽量

    123574
  • 物理內存
    +關注

    關注

    0

    文章

    11

    瀏覽量

    8472
  • 虛擬內存
    +關注

    關注

    0

    文章

    77

    瀏覽量

    8072
收藏 人收藏

    評論

    相關推薦

    虛擬內存和云計算的關系

    虛擬內存是一種計算機系統內存管理技術,它通過將物理內存與磁盤空間結合起來,使得應用程序可以訪問比物理
    的頭像 發表于 12-04 09:50 ?158次閱讀

    虛擬內存溢出該怎么處理 虛擬內存在服務器中的應用

    在現代計算機系統中,虛擬內存是一種重要的資源管理技術,它允許系統使用硬盤空間來擴展物理內存的容量。然而,當
    的頭像 發表于 12-04 09:49 ?231次閱讀

    Linux下如何管理虛擬內存 使用虛擬內存時的常見問題

    Linux系統中,虛擬內存管理是操作系統內核的一個重要功能,負責管理物理內存和磁盤上的交換空間
    的頭像 發表于 12-04 09:19 ?587次閱讀

    虛擬內存對計算機性能的影響

    ,它允許計算機使用硬盤空間來模擬物理內存。當物理內存(RAM)不足以容納當前所有活動的程序和數據時,操作系統會將部分數據從RAM移動到硬盤上
    的頭像 發表于 12-04 09:17 ?1039次閱讀

    什么是虛擬內存分頁 Windows系統虛擬內存優化方法

    虛擬內存分頁概述 在Windows操作系統中,虛擬內存是通過分頁機制實現的。分頁允許系統內存中的數據移動到硬盤上,以便為當前運行的程序騰出
    的頭像 發表于 12-04 09:16 ?519次閱讀

    虛擬內存不足如何解決 虛擬內存物理內存的區別

    物理內存,可以減少系統虛擬內存的依賴。 調整虛擬內存設置 : 進入系統設置,調整
    的頭像 發表于 12-04 09:14 ?527次閱讀

    虛擬內存的作用和原理 如何調整虛擬內存設置

    虛擬內存,也稱為虛擬內存管理或頁面文件,是計算機操作系統中的一種內存管理技術。它允許系統使用硬盤空間作為額外的RAM(隨機存取存儲器),以彌
    的頭像 發表于 12-04 09:13 ?688次閱讀

    如何優化RAM內存使用

    :使用任務管理器查看當前運行的程序和服務,關閉那些不需要的。 禁用啟動程序 :減少開機啟動項,只保留必要的程序。 2. 優化操作系統設置 調整虛擬內存 :合理設置虛擬內存,避免過多占用硬盤空間。 清理磁盤 :定期進行磁盤清理,
    的頭像 發表于 11-11 09:58 ?497次閱讀

    Windows管理內存的三種主要方式

    Windows操作系統提供了多種方式來管理內存,以確保系統資源的有效利用和性能的優化。以下是關于Windows管理內存的三種主要方式的詳細闡述,包括堆
    的頭像 發表于 10-12 17:09 ?1204次閱讀

    邏輯內存物理內存的區別

    邏輯內存物理內存是計算機系統中兩個重要的概念,它們在計算機的運行和數據處理中起著至關重要的作用。 1. 物理
    的頭像 發表于 09-27 15:38 ?864次閱讀

    內存緩沖區和內存關系

    內存緩沖區和內存之間的關系是計算機體系結構中一個至關重要的方面,它們共同協作以提高數據處理的效率和系統的整體性能。
    的頭像 發表于 09-10 14:38 ?693次閱讀

    操作系統內存布局介紹

    32位操作系統內存布局很經典,很多書籍都是以32位系統為例子去講解的。32位的系統可訪問的地址空間為4GB,用戶空間為1GB ~ 3GB,內核空間為3GB ~ 4GB。
    的頭像 發表于 08-07 15:47 ?421次閱讀
    <b class='flag-5'>操作系統</b>的<b class='flag-5'>內存</b>布局介紹

    物理內存模型的演變

    內存管理概述中,主要是以Linux v2.6.11為例進行分析的,但是計算技術在不斷發展,新的存儲架構、新的指令集架構、新的SoC架構等都對物理內存模型的抽象提出了更高要求。為此,必須
    的頭像 發表于 02-25 10:35 ?505次閱讀

    Linux內核內存管理之內核非連續物理內存分配

    的主要優點是避免了外部碎片,而缺點是需要修改內核頁表。顯然,非連續內存區域的大小必須是4096的倍數。Linux使用非連續物理內存區的場景有幾種:(1)為swap區分配數據結構;(2)
    的頭像 發表于 02-23 09:44 ?1054次閱讀
    <b class='flag-5'>Linux</b>內核<b class='flag-5'>內存</b>管理之內核非連續<b class='flag-5'>物理</b><b class='flag-5'>內存</b>分配

    拆解mmap內存映射的本質!

    mmap 內存映射里所謂的內存其實指的是虛擬內存,在調用 mmap 進行匿名映射的時候(比如進行堆內存的分配),是將進程虛擬內存空間中的某一
    的頭像 發表于 01-24 14:30 ?1877次閱讀
    拆解mmap<b class='flag-5'>內存</b>映射的本質!
    主站蜘蛛池模板: 免费国产久久拍久久爱| 受喷汁红肿抽搐磨NP双性| 久久无码av三级| 巨黄的肉辣文np| 蜜桃久久久亚洲精品成人| 女人夜夜春| 肉蒲团从国内封禁到日本成经典 | FREE另类老女人| 吃奶啃奶玩乳漫画| 国产探花在线精品一区二区| 黑人猛挺进小莹的体内视频| 久久久国产精品免费A片蜜芽广 | 超污视频带污疼免费视频| 国产成人8x视频一区二区| 激情办公室| 女bbbbxxx孕妇| 偷窥 亚洲 色 国产 日韩| 亚洲区偷拍自拍29P| 24小时日本高清免费看| 动漫美女喷水| 精品久久久99大香线蕉| 哪里能看毛片| 无限好资源免费观看| 在线播放一区| 岛国片免费看| 久久成人亚洲| 日本无码色哟哟婷婷最新网站 | 精品久久久无码21P发布| 免费A级毛片无码鲁大师| 日韩在线 无码 精品| 亚洲日本va中文字幕久久| 97久久超碰中文字幕| 国产成人久久精品激情| 久久高清一本无码| 日本人吃奶玩奶虐乳| 亚洲精品另类有吗中文字幕 | 色AV色婷婷96人妻久久久| 亚洲欧美自拍清纯中文字幕| 99精品国产高清自在线看超| 国产免费毛片在线观看| 美女胸网站|