成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在 4GB 物理內存的機器上,申請 8G 內存會怎么樣?

網絡 通信技術
當應用程序讀寫了這塊虛擬內存,CPU 就會去訪問這個虛擬內存, 這時會發現這個虛擬內存沒有映射到物理內存, CPU 就會產生缺頁中斷,進程會從用戶態切換到內核態,并將缺頁中斷交給內核的 Page Fault Handler (缺頁中斷函數)處理。

大家好,我是小林。

早上看到讀者在群里討論這些面試題:

圖片

其中,第一個問題「在 4GB 物理內存的機器上,申請 8G 內存會怎么樣?」存在比較大的爭議,有人說會申請失敗,有的人說可以申請成功。

這個問題在沒有前置條件下,就說出答案就是耍流氓。因為在 32 位操作系統和 64 位操作系統場景下,答案是不同的。

另外,我們還要看申請完 8G 內存后會不會被使用,會被使用是一種情況,不會被使用又是另外一種情況了。

所以,我們要分場景討論。

應用程序通過 malloc 函數申請內存的時候,實際上申請的是虛擬內存,此時并不會分配物理內存。

當應用程序讀寫了這塊虛擬內存,CPU 就會去訪問這個虛擬內存, 這時會發現這個虛擬內存沒有映射到物理內存, CPU 就會產生缺頁中斷,進程會從用戶態切換到內核態,并將缺頁中斷交給內核的 Page Fault Handler (缺頁中斷函數)處理。

缺頁中斷處理函數會看是否有空閑的物理內存:

  • 如果有,就直接分配物理內存,并建立虛擬內存與物理內存之間的映射關系。
  • 如果沒有空閑的物理內存,那么內核就會開始進行回收內存的工作,如果回收內存工作結束后,空閑的物理內存仍然無法滿足此次物理內存的申請,那么內核就會放最后的大招了觸發 OOM (Out of Memory)機制。

32 位操作系統和 64 位操作系統的虛擬地址空間大小是不同的,在 Linux 操作系統中,虛擬地址空間的內部又被分為內核空間和用戶空間兩部分,如下所示:

圖片

通過這里可以看出:

  • 32? 位系統的內核空間占用1G?,位于最高處,剩下的3G 是用戶空間;
  • 64? 位系統的內核空間和用戶空間都是128T,分別占據整個內存空間的最高和最低處,剩下的中間部分是未定義的。

現在可以回答這個問題了:在 32 位操作系統、4GB 物理內存的機器上,申請 8GB 內存,會怎么樣?

因為 32 位操作系統,進程最多只能申請 3 GB 大小的虛擬內存空間,所以進程申請 8GB 內存,在申請虛擬內存階段就會失敗(我手上沒有 32 位操作系統測試,我估計失敗的原因是 OOM)。

在 64 位操作系統、4GB 物理內存的機器上,申請 8G 內存,會怎么樣?

64 位操作系統,進程可以使用 128 TB 大小的虛擬內存空間,所以進程申請 8GB 內存是沒問題的,因為進程申請內存是申請虛擬內存,只要不讀寫這個虛擬內存,操作系統就不會分配物理內存。

我們可以簡單做個測試,我的服務器是 64 位操作系統,但是物理內存只有 2 GB。

圖片

現在,我在機器上,申請 4 GB 內存,注意下面代碼只是單純分配了虛擬內存,并沒有使用該虛擬內存:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

int main() {
int ret;
char* addr[4];
printf("使用cat /proc/%d/maps查看內存分配\n",getpid());
size_t s = 1024 * 1024 * 1024;
int i = 0;
for(i = 0; i < 4; ++i) {
printf("alloc size = %d\n", s);
addr[i] = (char*) malloc(s);
printf("主線程調用malloc后,申請1gb大小得內存,此內存起始地址:0X%x\n", addr[i]);
}
getchar();
return 0;
}

然后運行這個代碼,可以看到,我的物理內存雖然只有 2GB,但是程序正常分配了 4GB 大小的虛擬內存:

圖片

我們可以通過下面這條命令查看進程的虛擬內存大小:

# ps aux | grep alloc_4g
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 7797 0.0 0.0 4198540 352 pts/1 S+ 16:58 0:00 ./alloc_4g

其中,VSZ 就代表進程使用的虛擬內存大小,RSS 代表進程使用的物理內存大小。可以看到,VSZ 大小為 4198540,也就是 4GB 的虛擬內存。

然后,我們改一下代碼,在申請完虛擬內存后,通過 memset 函數使用這個虛擬內存,看看會發生什么。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

int main() {
int ret;
char* addr[4];
printf("使用cat /proc/%d/maps查看內存分配\n",getpid());
size_t s = 1024 * 1024 * 1024;
int i = 0;
for(i = 0; i < 4; ++i) {
printf("alloc size = %d\n", s);
addr[i] = (char*) malloc(s);
printf("主線程調用malloc后,申請1gb大小得內存,此內存起始地址:0X%x\n", addr[i]);
//訪問虛擬內存
memset(addr[i], 0, s);
}
getchar();
return 0;
}

運行結果:

圖片

可以看到,在申請了 2GB 虛擬內存后,然后馬上使用了這塊虛擬內存,由于這臺機器的物理內存只有 2 GB,所以發生了 OOM。

至此, 驗證完成了。簡單總結下:

  • 在 32 位操作系統,因為進程最大只能申請 3 GB 大小的虛擬內存,所以直接申請 8G 內存,會申請失敗。
  • 在 64位 位操作系統,因為進程最大只能申請 128 TB 大小的虛擬內存,即使物理內存只有 4GB,申請 8G 內存也是沒問題,因為申請的內存是虛擬內存,等這塊虛擬內存被訪問了,因為物理空間不夠,就會發生 OOM。
責任編輯:武曉燕 來源: 小林coding
相關推薦

2023-08-28 07:51:24

8G內存Swap

2017-11-01 14:45:33

內存管理方案

2012-11-07 15:42:58

Windows 8內存

2018-07-30 11:03:08

4GB內存8GB

2011-10-08 17:00:12

2011-05-06 16:47:06

筆記本Alienware M

2011-05-04 09:12:43

筆記本Alienware M

2017-10-27 14:32:53

內存存儲暴漲

2023-03-07 21:41:23

JVM內存服務器

2012-05-07 11:39:46

ThinkPad筆記本

2011-04-27 15:50:00

一體臺式機聯想IdeaCentr

2011-10-27 15:12:25

筆記本評測

2021-07-05 15:20:47

微軟Windows 11Windows

2013-12-26 10:34:22

虛擬化環境存儲主機

2024-01-26 15:12:59

TCP參數窗口

2012-03-26 16:21:30

戴爾筆記本

2023-03-13 15:42:00

模型芯片

2023-06-30 08:23:36

Spring!SolonJavalin

2011-10-28 15:45:44

戴爾筆記本

2009-03-04 12:32:43

LinuxVMWare虛擬PC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久久久久久爱 | 颜色网站在线观看 | 91久久久久久久久 | 久久久久国产精品一区 | 国产一区二区视频免费在线观看 | 久久久久国产一区二区三区 | 中文字幕在线视频一区二区三区 | 99热国产在线播放 | 日韩精品一区二区三区中文在线 | 日韩欧美国产成人一区二区 | 亚洲三级av| 99热.com | 国产精品视频一区二区三区 | 日韩精品视频在线 | 欧美国产亚洲一区二区 | 日韩久久综合 | 一区二区国产精品 | 亚洲免费精品一区 | 久草在线在线精品观看 | 久草热播 | 狠狠操狠狠色 | 久久婷婷国产麻豆91 | 亚洲电影一区二区三区 | 看黄在线 | 国内精品视频一区二区三区 | 岛国av一区二区 | 国产成人在线免费 | 蜜臀久久99精品久久久久野外 | 久草精品视频 | 久久久久国产一区二区三区 | 欧美视频精品 | 中文字幕亚洲一区二区三区 | av官网在线 | 9999精品视频 | 欧美黑人国产人伦爽爽爽 | 国内精品久久久久久 | 91视视频在线观看入口直接观看 | 国产日产欧产精品精品推荐蛮挑 | 久久影院一区 | 国产精品亚洲精品 | 一区二区久久 |