一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

探討Linux操作系統(tǒng)虛擬內(nèi)存和物理內(nèi)存的關(guān)系

電子設(shè)計(jì) ? 來(lái)源:TOMORROW 星辰 ? 作者:TOMORROW 星辰 ? 2020-12-10 16:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

為了高效、準(zhǔn)確測(cè)試出該系統(tǒng)下,單個(gè)進(jìn)程能夠申請(qǐng)到的最大虛存空間,所以編寫了一個(gè)Linux的測(cè)試程序。因?yàn)?64 位真的是個(gè)很可怕的數(shù)字,所以程序在申請(qǐng)內(nèi)存空間時(shí),先申請(qǐng)較大的內(nèi)存塊(100G),直到?jīng)]有這么大的內(nèi)存塊,然后申請(qǐng)上次能申請(qǐng)到的內(nèi)存塊的一半。重復(fù)以上步驟,直到內(nèi)存塊變得足夠?。ㄐ∮?100Byte)。然后結(jié)束申請(qǐng)內(nèi)存。代碼如下:

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

int main()
{
	int *p[1000000];//存放申請(qǐng)內(nèi)存塊的指針以備釋放
	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])//當(dāng)所申請(qǐng)的內(nèi)存塊不成功時(shí),把內(nèi)存塊大小減半重新申請(qǐng)
		{
			block_sz=block_sz/2;
			p[i]=(int *)malloc(block_sz*sizeof(char));
		}
		total_sz=total_sz+block_sz;//累加所申請(qǐng)到的內(nèi)存塊

		if(block_sz<100)//當(dāng)內(nèi)存塊小于 100 個(gè)字節(jié)時(shí)結(jié)束內(nèi)存申請(qǐng)
			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--)//釋放所有內(nèi)存塊
		free(p[i]);

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

	return 0;
}

在終端 1 編譯運(yùn)行上面代碼。
運(yùn)行后,先在另一個(gè)終端(終端 2)執(zhí)行:

cat /proc/6674/status

查看該進(jìn)程的 status 文件如下圖圖一所示:

終端 1 終端 2

圖一

對(duì)于 status 文件,本文只會(huì)關(guān)注以下幾個(gè)參數(shù):

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

VmRSS(進(jìn)程正在占用物理內(nèi)存大小)

VmSwap(進(jìn)程占用交換區(qū)大?。?/p>

然后回車開(kāi)始申請(qǐng)內(nèi)存,當(dāng)終端停止輸出數(shù)字時(shí),再次在終端 2 執(zhí)行:

cat /proc/6674/status

得到下圖圖二輸出:

終端 1 終端 2

圖二

對(duì)比圖一和圖二中的 VmPeak:

137438953320K – 12044K = 140737475866624 Byte

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

是的,如果你沒(méi)有眼花,你數(shù)到上面得到的是一個(gè) 47 位!!!!二進(jìn)制數(shù)。

47 位什么概念?大概是 128TB = 128*1024GB !!! (試問(wèn)現(xiàn)在誰(shuí)的個(gè)人電腦有這么大的硬盤??更不要說(shuō)內(nèi)存)

一個(gè)進(jìn)程能夠申請(qǐng)到這么恐怖的內(nèi)存空間?這不但超過(guò)了物理內(nèi)存、超過(guò)了物理內(nèi)存+交換區(qū)、還超過(guò)了硬盤大小啊。這不科學(xué)啊。

但是從 status 讀出來(lái)的數(shù)據(jù)錯(cuò)不了的。

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

其二,交換區(qū),實(shí)際上就是物理內(nèi)存不夠用時(shí),虛存空間的數(shù)據(jù)就必須映射到交換區(qū)上。

那么單個(gè)進(jìn)程所能申請(qǐng)的最大虛存空間理應(yīng)不會(huì)超過(guò)物理內(nèi)存和交換區(qū)的和。然而實(shí)際卻是超過(guò)那么多。

然后,網(wǎng)上查閱相關(guān)資料,msdn 上看到了相關(guān)解釋。

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

該文章介紹到,Windows 32 系統(tǒng)下,虛擬內(nèi)存中,用戶空間占用了低地址 2G 的空間,系統(tǒng)內(nèi)核占用了高地址 2G 空間??偣蔡摯婵臻g就是 2^32Byte。

pIYBAF_R18aAbdkcAAAjG143L2o351.png

圖三

那么 64 位系統(tǒng)中,就系統(tǒng)而言,總共的虛存空間應(yīng)當(dāng)是 2^64Byte?

在該文章下面還有 Windows 64 位系統(tǒng)的虛存空間介紹,如下圖圖四所示。從圖中看到用戶虛存空間 8TB+系統(tǒng)空間 248TB=256TB=2^48 Byte ,這個(gè)數(shù)字似乎和上面所測(cè)得的單個(gè)進(jìn)程能夠申請(qǐng)到的最大虛存空間的數(shù)字有點(diǎn)接近了。

pIYBAF_R182AHv1KAAA9UJVQds8012.png

圖四

注意看圖四,還可以發(fā)現(xiàn) 64 位系統(tǒng)中還有很大很大的虛存空間保留沒(méi)有被使用的。從這個(gè)出發(fā)繼續(xù)查閱資料,然后找到了關(guān)于目前 64 位 CPU 的相關(guān)說(shuō)明。由于目前還遠(yuǎn)遠(yuǎn)用不到 64 位那么大的空間,所以 AMD 64 位 CPU 目前只用了 48 位的尋址。而 Intel 的 64 位 CPU 是和 AMD 交叉授權(quán),所以 Intel 64CPU 也同樣只采用 48 位尋址。所以圖三的保留空間就得到了解釋。

再回到原先的問(wèn)題,現(xiàn)在知道了就 64 位系統(tǒng)而言,虛擬內(nèi)存空間是可以達(dá)到 2^48Byte 那么大的,參考 Windows 64 位系統(tǒng)虛存空間結(jié)構(gòu),可以猜測(cè)Linux 64 位系統(tǒng)下,用戶虛存空間和系統(tǒng)內(nèi)核虛存空間分布和 Windows 是相似的,只是兩者大小比例有所差別。(因?yàn)檎伊撕芫?,沒(méi)有找到Linux的官方文檔說(shuō)明,只找到很舊的、32 位。所以不能提供準(zhǔn)確的參考,如果有讀者找到,希望可以告訴作者一下補(bǔ)上)。

不過(guò),到現(xiàn)在,還有問(wèn)題沒(méi)有解決,為什么所申請(qǐng)的虛存空間會(huì)比物理內(nèi)存與交換區(qū)的和大?

現(xiàn)在回到一開(kāi)始沒(méi)有運(yùn)行完的程序,在終端 1 回車?yán)^續(xù)運(yùn)行程序,程序接著會(huì)對(duì)所申請(qǐng)到的第一個(gè) 100G 內(nèi)存塊每隔 2M 空間進(jìn)行寫操作,每回車一次,會(huì)寫 1000 次?;剀噹状魏?,在終端 2 再執(zhí)行:

cat /proc/6674/status

得到下圖圖五:

圖五

由圖五可以看到正在使用的物理內(nèi)存 VmRSS 變小了,正在使用的交換區(qū)空間 VmSwap 迅速增大。但是兩者之和是在一直增加的,這就說(shuō)明,申請(qǐng)到的虛擬內(nèi)存在未被使用之前,它只是一個(gè)數(shù)字,并沒(méi)有實(shí)際的物理內(nèi)存和交換區(qū)與之相對(duì)應(yīng)。當(dāng)對(duì)虛存進(jìn)行寫操作時(shí),系統(tǒng)就會(huì)逐步分配物理內(nèi)存,而物理內(nèi)存的數(shù)據(jù)又會(huì)可能被系統(tǒng)調(diào)到交換區(qū)?,F(xiàn)在問(wèn)題逐漸明了了。

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

[1]    7893 killed     a.out

如圖六所示:

圖六

在進(jìn)程結(jié)束之前查看到的 status 文件顯示 VmRSS+VmSwap 約等 1.8G,加上系統(tǒng)占用和其他進(jìn)程占用,那么說(shuō)此時(shí)物理內(nèi)存和交換區(qū)已經(jīng)接近極限了。再繼續(xù)運(yùn)行寫的時(shí)候,操作系統(tǒng)為了系統(tǒng)的正常運(yùn)行選擇把這個(gè)進(jìn)程殺死了。那么所有的疑問(wèn)也解決了。

系統(tǒng)所允許的申請(qǐng)的虛存空間是可以超過(guò)物理內(nèi)存與交換區(qū)的和的。但是當(dāng)進(jìn)程所占用的物理內(nèi)存加上交換區(qū)影響到了系統(tǒng)的正常運(yùn)行就會(huì)被系統(tǒng)殺死。
編輯:hfy

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

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213823
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7152

    瀏覽量

    125592
  • 物理內(nèi)存
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    8574
  • 虛擬內(nèi)存
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux系統(tǒng)中通過(guò)預(yù)留物理內(nèi)存實(shí)現(xiàn)ARM與FPGA高效通信的方法

    在嵌入式系統(tǒng)開(kāi)發(fā)中,ARM 和 FPGA 之間的通信可以使用 ARM 側(cè)的 DDR 作為通道。由于 FPGA 也可以直接訪問(wèn)到 ARM 側(cè) DDR,但 DDR 作為共享通信時(shí),就不能被操作系統(tǒng)內(nèi)存
    的頭像 發(fā)表于 04-16 13:42 ?683次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>中通過(guò)預(yù)留<b class='flag-5'>物理</b><b class='flag-5'>內(nèi)存</b>實(shí)現(xiàn)ARM與FPGA高效通信的方法

    hyper v 內(nèi)存,hyper v 內(nèi)存設(shè)置的操作步驟和方法是什么?

    造成資源浪費(fèi),影響宿主機(jī)及其他虛擬機(jī)的性能。因此,掌握Hyper-V內(nèi)存設(shè)置的操作步驟和方法,對(duì)于高效使用虛擬機(jī)十分關(guān)鍵。下面就為大家詳細(xì)介紹。 ? ?Windows
    的頭像 發(fā)表于 01-24 15:22 ?681次閱讀
    hyper v <b class='flag-5'>內(nèi)存</b>,hyper v <b class='flag-5'>內(nèi)存</b>設(shè)置的<b class='flag-5'>操作</b>步驟和方法是什么?

    虛擬內(nèi)存和云計(jì)算的關(guān)系

    虛擬內(nèi)存是一種計(jì)算機(jī)系統(tǒng)內(nèi)存管理技術(shù),它通過(guò)將物理內(nèi)存與磁盤空間結(jié)合起來(lái),使得應(yīng)用程序可以訪問(wèn)比物理
    的頭像 發(fā)表于 12-04 09:50 ?517次閱讀

    虛擬內(nèi)存溢出該怎么處理 虛擬內(nèi)存在服務(wù)器中的應(yīng)用

    在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,虛擬內(nèi)存是一種重要的資源管理技術(shù),它允許系統(tǒng)使用硬盤空間來(lái)擴(kuò)展物理內(nèi)存的容量。然而,當(dāng)
    的頭像 發(fā)表于 12-04 09:49 ?825次閱讀

    Linux下如何管理虛擬內(nèi)存 使用虛擬內(nèi)存時(shí)的常見(jiàn)問(wèn)題

    Linux系統(tǒng)中,虛擬內(nèi)存管理是操作系統(tǒng)內(nèi)核的一個(gè)重要功能,負(fù)責(zé)管理物理內(nèi)存和磁盤上的交換空間
    的頭像 發(fā)表于 12-04 09:19 ?1341次閱讀

    虛擬內(nèi)存對(duì)計(jì)算機(jī)性能的影響

    ,它允許計(jì)算機(jī)使用硬盤空間來(lái)模擬物理內(nèi)存。當(dāng)物理內(nèi)存(RAM)不足以容納當(dāng)前所有活動(dòng)的程序和數(shù)據(jù)時(shí),操作系統(tǒng)會(huì)將部分?jǐn)?shù)據(jù)從RAM移動(dòng)到硬盤上
    的頭像 發(fā)表于 12-04 09:17 ?3487次閱讀

    什么是虛擬內(nèi)存分頁(yè) Windows系統(tǒng)虛擬內(nèi)存優(yōu)化方法

    虛擬內(nèi)存分頁(yè)概述 在Windows操作系統(tǒng)中,虛擬內(nèi)存是通過(guò)分頁(yè)機(jī)制實(shí)現(xiàn)的。分頁(yè)允許系統(tǒng)內(nèi)存中的數(shù)據(jù)移動(dòng)到硬盤上,以便為當(dāng)前運(yùn)行的程序騰出
    的頭像 發(fā)表于 12-04 09:16 ?1464次閱讀

    虛擬內(nèi)存不足如何解決 虛擬內(nèi)存物理內(nèi)存的區(qū)別

    物理內(nèi)存,可以減少系統(tǒng)對(duì)虛擬內(nèi)存的依賴。 調(diào)整虛擬內(nèi)存設(shè)置 : 進(jìn)入系統(tǒng)設(shè)置,調(diào)整
    的頭像 發(fā)表于 12-04 09:14 ?1482次閱讀

    虛擬內(nèi)存的作用和原理 如何調(diào)整虛擬內(nèi)存設(shè)置

    虛擬內(nèi)存,也稱為虛擬內(nèi)存管理或頁(yè)面文件,是計(jì)算機(jī)操作系統(tǒng)中的一種內(nèi)存管理技術(shù)。它允許系統(tǒng)使用硬盤空間作為額外的RAM(隨機(jī)存取存儲(chǔ)器),以彌
    的頭像 發(fā)表于 12-04 09:13 ?2520次閱讀

    如何優(yōu)化RAM內(nèi)存使用

    :使用任務(wù)管理器查看當(dāng)前運(yùn)行的程序和服務(wù),關(guān)閉那些不需要的。 禁用啟動(dòng)程序 :減少開(kāi)機(jī)啟動(dòng)項(xiàng),只保留必要的程序。 2. 優(yōu)化操作系統(tǒng)設(shè)置 調(diào)整虛擬內(nèi)存 :合理設(shè)置虛擬內(nèi)存,避免過(guò)多占用硬盤空間。 清理磁盤 :定期進(jìn)行磁盤清理,
    的頭像 發(fā)表于 11-11 09:58 ?1449次閱讀

    linux操作系統(tǒng)安裝步驟 linux操作系統(tǒng)的特點(diǎn)及組成

    Linux操作系統(tǒng)安裝步驟 Linux操作系統(tǒng)是一種開(kāi)源的操作系統(tǒng),它以其穩(wěn)定性、安全性和靈活性而聞名。以下是安裝
    的頭像 發(fā)表于 10-21 11:24 ?1219次閱讀

    Windows管理內(nèi)存的三種主要方式

    Windows操作系統(tǒng)提供了多種方式來(lái)管理內(nèi)存,以確保系統(tǒng)資源的有效利用和性能的優(yōu)化。以下是關(guān)于Windows管理內(nèi)存的三種主要方式的詳細(xì)闡述,包括堆
    的頭像 發(fā)表于 10-12 17:09 ?2388次閱讀

    邏輯內(nèi)存物理內(nèi)存的區(qū)別

    邏輯內(nèi)存物理內(nèi)存是計(jì)算機(jī)系統(tǒng)中兩個(gè)重要的概念,它們?cè)谟?jì)算機(jī)的運(yùn)行和數(shù)據(jù)處理中起著至關(guān)重要的作用。 1. 物理
    的頭像 發(fā)表于 09-27 15:38 ?1784次閱讀

    內(nèi)存緩沖區(qū)和內(nèi)存關(guān)系

    內(nèi)存緩沖區(qū)和內(nèi)存之間的關(guān)系是計(jì)算機(jī)體系結(jié)構(gòu)中一個(gè)至關(guān)重要的方面,它們共同協(xié)作以提高數(shù)據(jù)處理的效率和系統(tǒng)的整體性能。
    的頭像 發(fā)表于 09-10 14:38 ?1232次閱讀

    操作系統(tǒng)內(nèi)存布局介紹

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