chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

		if(block_sz<100)//當內(nèi)存塊小于 100 個字節(jié)時結(jié)束內(nèi)存申請
			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 編譯運行上面代碼。
運行后,先在另一個終端(終端 2)執(zhí)行:

cat /proc/6674/status

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

終端 1 終端 2

圖一

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

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

VmRSS(進程正在占用物理內(nèi)存大?。?/p>

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

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

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

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

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

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

但是從 status 讀出來的數(shù)據(jù)錯不了的。

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

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

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

然后,網(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 空間。總共虛存空間就是 2^32Byte。

pIYBAF_R18aAbdkcAAAjG143L2o351.png

圖三

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

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

pIYBAF_R182AHv1KAAA9UJVQds8012.png

圖四

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

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

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

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

cat /proc/6674/status

得到下圖圖五:

圖五

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

如果我不停地對虛存空間進行寫操作會怎樣,為了解決疑惑,在終端 1 不?;剀嚕紶栐诮K端 2 中查看 status 文件中的狀態(tài),寫到一定程度后,終端 1 出現(xiàn)了

[1]    7893 killed     a.out

如圖六所示:

圖六

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

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

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

    關(guān)注

    88

    文章

    11760

    瀏覽量

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

    關(guān)注

    37

    文章

    7402

    瀏覽量

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

    關(guān)注

    0

    文章

    11

    瀏覽量

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

    關(guān)注

    0

    文章

    79

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    MangoTree Halo Ultra「全新PXI」,標配自動糾錯內(nèi)存#

    內(nèi)存
    芒果樹數(shù)字
    發(fā)布于 :2026年03月06日 15:59:34

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請函數(shù)詳解:從原理到實戰(zhàn)

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

    Linux內(nèi)核大塊內(nèi)存申請:從場景到落地全解析

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

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

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

    【「Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀深入理解Linux內(nèi)核內(nèi)存分配

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

    操作系統(tǒng)的發(fā)展及分類

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

    rk基于linux/android內(nèi)存管理

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

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

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

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

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

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

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

    單片機的操作系統(tǒng)

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

    Jtti Linux操作系統(tǒng)最常見的10大優(yōu)勢

    Linux操作系統(tǒng)的十大優(yōu)勢 Linux操作系統(tǒng)作為一種開源、自由的系統(tǒng),已經(jīng)廣泛應(yīng)用于個人計算機、服務(wù)器、嵌入式設(shè)備等多個領(lǐng)域。它的多樣化
    的頭像 發(fā)表于 11-06 15:32 ?307次閱讀

    Perforce QAC 2025.2版本更新:虛擬內(nèi)存優(yōu)化、100%覆蓋CERT C規(guī)則、CI構(gòu)建性能提升等

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

    golang內(nèi)存分配

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

    快速搞懂C語言程序內(nèi)存分區(qū)!

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