真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Linux中怎么實(shí)現(xiàn)虛擬內(nèi)存

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Linux中怎么實(shí)現(xiàn)虛擬內(nèi)存,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都網(wǎng)站制作、鐵東網(wǎng)絡(luò)推廣、成都微信小程序、鐵東網(wǎng)絡(luò)營銷、鐵東企業(yè)策劃、鐵東品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供鐵東建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com

Linux虛擬內(nèi)存怎么實(shí)現(xiàn)

第一個(gè)例子:下面一段程序會(huì)打印出程序的pid(進(jìn)程號)后掛起。

#include

#include

#include

intmain(){

printf("run`pmap%d`\n",getpid());

pause();

}

將上面代碼保存成文件mem_munch.c然后運(yùn)行下面程序編譯并執(zhí)行:

$gccmem_munch.c-omem_munch

$./mem_munch

run`pmap25681`

上面進(jìn)程號是25681,可能你試驗(yàn)的結(jié)果會(huì)不太一樣。

下面我們通過pmap命令來查看一下這個(gè)小程序的內(nèi)存使用情況

$pmap25681

25681:./mem_munch

00000000004000004Kr-x--/home/user/mem_munch

00000000006000004Kr----/home/user/mem_munch

00000000006010004Krw---/home/user/mem_munch

00007fcf5af880001576Kr-x--/lib/x86_64-linux-gnu/libc-2.13.so

00007fcf5b1120002044K-----/lib/x86_64-linux-gnu/libc-2.13.so

00007fcf5b31100016Kr----/lib/x86_64-linux-gnu/libc-2.13.so

00007fcf5b3150004Krw---/lib/x86_64-linux-gnu/libc-2.13.so

00007fcf5b31600024Krw---[anon]

00007fcf5b31c000132Kr-x--/lib/x86_64-linux-gnu/ld-2.13.so

00007fcf5b51200012Krw---[anon]

00007fcf5b53900012Krw---[anon]

00007fcf5b53c0004Kr----/lib/x86_64-linux-gnu/ld-2.13.so

00007fcf5b53d0008Krw---/lib/x86_64-linux-gnu/ld-2.13.so

00007fff7efd8000132Krw---[stack]

00007fff7efff0004Kr-x--[anon]

ffffffffff6000004Kr-x--[anon]

total3984K

上面的結(jié)果是這個(gè)程序的內(nèi)存使用情況,其實(shí)更確切的說是這個(gè)程序認(rèn)為它使用內(nèi)存的情況。從上面的結(jié)果我們能看到,當(dāng)你訪問libc庫時(shí),實(shí)際上是對內(nèi)存地址00007fcf5af88000的訪問,當(dāng)你訪問ld庫時(shí),實(shí)際上是對內(nèi)存地址00007fcf5b31c000的訪問。

上面的輸出可能還比較抽象,下面我們修改一下上面的程序,我們在程序的堆和棧上各放一塊數(shù)據(jù)。

#include

#include

#include

#include

intmain(){

inton_stack,*on_heap;

//局部變量是放在棧上的,所以on_stack的地址就是棧的初始地址

on_stack=42;

printf("stackaddress:%p\n",&on_stack);

//malloc的內(nèi)存是在堆上分配的

on_heap=(int*)malloc(sizeof(int));

printf("heapaddress:%p\n",on_heap);

printf("run`pmap%d`\n",getpid());

pause();

}

編譯運(yùn)行:

$./mem_munch

stackaddress:0x7fff497670bc

heapaddress:0x1b84010

run`pmap11972`

然后再用pmap命令查看一下內(nèi)存使用:

$pmap11972

11972:./mem_munch

00000000004000004Kr-x--/home/user/mem_munch

00000000006000004Kr----/home/user/mem_munch

00000000006010004Krw---/home/user/mem_munch

0000000001b84000132Krw---[anon]

00007f3ec4d980001576Kr-x--/lib/x86_64-linux-gnu/libc-2.13.so

00007f3ec4f220002044K-----/lib/x86_64-linux-gnu/libc-2.13.so

00007f3ec512100016Kr----/lib/x86_64-linux-gnu/libc-2.13.so

00007f3ec51250004Krw---/lib/x86_64-linux-gnu/libc-2.13.so

00007f3ec512600024Krw---[anon]

00007f3ec512c000132Kr-x--/lib/x86_64-linux-gnu/ld-2.13.so

00007f3ec532200012Krw---[anon]

00007f3ec534900012Krw---[anon]

00007f3ec534c0004Kr----/lib/x86_64-linux-gnu/ld-2.13.so

00007f3ec534d0008Krw---/lib/x86_64-linux-gnu/ld-2.13.so

00007fff49747000132Krw---[stack]

00007fff497bb0004Kr-x--[anon]

ffffffffff6000004Kr-x--[anon]

total4116K

這次多出了上面紅色的一行內(nèi)容,紅色內(nèi)容就是堆的起始位置:

0000000001b84000132Krw---[anon]

在我們程序運(yùn)行的輸出里也有一行紅色的輸出,這是這個(gè)地址在程序中的內(nèi)存地址:

heapaddress:0x1b84010

這兩個(gè)地址基本上是一樣的,其中的anon是Anonymous的縮寫,表明這段內(nèi)存是沒有文件映射的。

我們再看上面綠色的兩行,與上面相對應(yīng),這兩行分別是用pmap和應(yīng)用程序看到的棧起始地址:

00007fff49747000132Krw---[stack]

stackaddress:0x7fff497670bc

上面說到的內(nèi)存使用,都只是程序認(rèn)為自己對內(nèi)存的使用,實(shí)際上程序在分配內(nèi)存是不知道系統(tǒng)內(nèi)存的狀態(tài)的。所以上面的輸出都只是從程序自己的角度看到的內(nèi)存使用狀況。比如在上面的例子中,我們看到程序的內(nèi)存地址空間是從0×0000000000400000到0xffffffffff600000的所有地址(而0xffffffffff600000到0×00007fffffffffffffff之間的地址是有特殊用處的,這里不多講)。這樣算下來,我們總共可以使用的內(nèi)存空間有1千萬TB。

但是實(shí)際上目前沒有硬件能有1千萬TB的物理內(nèi)存。為什么操作系統(tǒng)會(huì)如此設(shè)計(jì)呢?原因有很多,可以看這里,但也正因此,我們可以使用遠(yuǎn)遠(yuǎn)超出物理內(nèi)存大小的內(nèi)存空間。

內(nèi)存映射

內(nèi)存映射的原理就是讓操作系統(tǒng)將一個(gè)文件映射到一段內(nèi)存中,然后在操作這個(gè)文件內(nèi)存就可以像操作內(nèi)存一樣。比如我們創(chuàng)建一個(gè)完全內(nèi)容隨機(jī)的文件,然后將它用內(nèi)存映射的方式映射到一段內(nèi)存空間中。那么我們在這段內(nèi)存中隨便取一位就相當(dāng)于取到了一個(gè)隨機(jī)數(shù)。下面就讓我們來做這個(gè)實(shí)驗(yàn),先用下面命令生成一個(gè)內(nèi)容隨機(jī)的文件。

$ddif=/dev/urandombs=1024count=1000000of=/home/user/random

1000000+0recordsin

1000000+0recordsout

1024000000bytes(1.0GB)copied,123.293s,8.3MB/s

$ls-lhrandom

-rw-r--r--1useruser977M2011-08-2916:46random

然后我們用下面程序來將這個(gè)文件內(nèi)容映射到內(nèi)存,再從中取出隨機(jī)數(shù)

#include

#include

#include

#include

#include

intmain(){

char*random_bytes;

FILE*f;

intoffset=0;

//open"random"forreading

f=fopen("/home/user/random","r");

if(!f){

perror("couldn'topenfile");

return-1;

}

//wewanttoinspectmemorybeforemappingthefile

printf("run`pmap%d`,thenpress",getpid());

getchar();

random_bytes=mmap(0,1000000000,PROT_READ,MAP_SHARED,fileno(f),0);

if(random_bytes==MAP_FAILED){

perror("errormappingthefile");

return-1;

}

while(1){

printf("randomnumber:%d(pressfornextnumber)",*(int*)(random_bytes+offset));

getchar();

offset+=4;

}

}

然后運(yùn)行這個(gè)程序:

$./mem_munch

run`pmap12727`,thenpress

Linux虛擬內(nèi)存怎么實(shí)現(xiàn)

下面我們通過一次次的按下回車鍵來從這個(gè)文件中讀取隨機(jī)數(shù),按下幾次后我們可以再通過pmap來查看其內(nèi)存空間的情況:

$pmap12727

12727:./mem_munch

00000000004000004Kr-x--/home/user/mem_munch

00000000006000004Kr----/home/user/mem_munch

00000000006010004Krw---/home/user/mem_munch

000000000147d000132Krw---[anon]

00007fe261c6f000976564Kr--s-/home/user/random

00007fe29d61c0001576Kr-x--/lib/x86_64-linux-gnu/libc-2.13.so

00007fe29d7a60002044K-----/lib/x86_64-linux-gnu/libc-2.13.so

00007fe29d9a500016Kr----/lib/x86_64-linux-gnu/libc-2.13.so

00007fe29d9a90004Krw---/lib/x86_64-linux-gnu/libc-2.13.so

00007fe29d9aa00024Krw---[anon]

00007fe29d9b0000132Kr-x--/lib/x86_64-linux-gnu/ld-2.13.so

00007fe29dba600012Krw---[anon]

00007fe29dbcc00016Krw---[anon]

00007fe29dbd00004Kr----/lib/x86_64-linux-gnu/ld-2.13.so

00007fe29dbd10008Krw---/lib/x86_64-linux-gnu/ld-2.13.so

00007ffff29b2000132Krw---[stack]

00007ffff29de0004Kr-x--[anon]

ffffffffff6000004Kr-x--[anon]

total980684K

上面的輸出和之前的大同小異,但是多出了上面紅色的一行。這是我們上面的隨機(jī)文件映射到內(nèi)存中的內(nèi)存。我們再使用pmap-x選項(xiàng)來查看一下程序的內(nèi)存使用,會(huì)得到下面的內(nèi)容,其中RSS(residentsetsize)列表示真實(shí)占用的內(nèi)存。

pmap-x12727

12727:./mem_munch

AddressKbytesRSSDirtyModeMapping

0000000000400000040r-x--mem_munch

0000000000600000044r----mem_munch

0000000000601000044rw---mem_munch

000000000147d000044rw---[anon]

00007fe261c6f000040r--s-random

00007fe29d61c00002880r-x--libc-2.13.so

00007fe29d7a6000000-----libc-2.13.so

00007fe29d9a500001616r----libc-2.13.so

00007fe29d9a9000044rw---libc-2.13.so

00007fe29d9aa00001616rw---[anon]

00007fe29d9b000001080r-x--ld-2.13.so

00007fe29dba600001212rw---[anon]

00007fe29dbcc00001616rw---[anon]

00007fe29dbd0000044r----ld-2.13.so

00007fe29dbd1000088rw---ld-2.13.so

00007ffff29b200001212rw---[stack]

00007ffff29de000040r-x--[anon]

ffffffffff600000000r-x--[anon]

----------------------------------

totalkB980684508100

如果你的虛擬內(nèi)存占用(上面的Kbytes列)都是0,不用擔(dān)心,這是一個(gè)在Debian/Ubuntu系統(tǒng)上pmap-x命令的bug。最后一行輸出的總占用量是正確的。

現(xiàn)在你可以看一下RSS那一列,這就是實(shí)際內(nèi)存占用。在random文件上,你的程序?qū)嶋H上可以訪問在00007fe261c6f000之前的數(shù)十億字節(jié)的內(nèi)存地址,但是只要你訪問的地址超過4KB,那么操作系統(tǒng)就會(huì)去磁盤上查找內(nèi)容。也就是說實(shí)際上只有4KB的物理內(nèi)存被使用了。只有訪問這4KB的東西時(shí),才是真正的內(nèi)存操作。其它部分雖然你使用的也是內(nèi)存操作函數(shù)來訪問它,但是由于它沒有被加載到內(nèi)存中,所以在這些內(nèi)容被訪問的時(shí)候,操作系統(tǒng)會(huì)先去磁盤讀random中讀取內(nèi)容到內(nèi)存中。

如果我們把程序再修改一下,修改成下面這樣,讓程序把整個(gè)random文件都訪問一遍。

#include

#include

#include

#include

#include

intmain(){

char*random_bytes;

FILE*f;

intoffset=0;

//open"random"forreading

f=fopen("/home/user/random","r");

if(!f){

perror("couldn'topenfile");

return-1;

}

random_bytes=mmap(0,1000000000,PROT_READ,MAP_SHARED,fileno(f),0);

if(random_bytes==MAP_FAILED){

printf("errormappingthefile\n");

return-1;

}

for(offset=0;offset<1000000000;offset+=4){   inti=*(int*)(random_bytes+offset);   //toshowwe'remakingprogress   if(offset%1000000==0){   printf(".");   }   }   //attheend,waitforsignalsowecancheckmem   printf("\ndone,run`pmap-x%d`\n",getpid());   pause();   }   現(xiàn)在我們的pmap-x命令就會(huì)得到如下輸出:   $pmap-x5378   5378:./mem_munch   AddressKbytesRSSDirtyModeMapping   0000000000400000044r-x--mem_munch   0000000000600000044r----mem_munch   0000000000601000044rw---mem_munch   0000000002271000044rw---[anon]   00007fc2aa33300009765640r--s-random   00007fc2e5ce000002920r-x--libc-2.13.so   00007fc2e5e6a000000-----libc-2.13.so   00007fc2e606900001616r----libc-2.13.so   00007fc2e606d000044rw---libc-2.13.so   00007fc2e606e00001616rw---[anon]   00007fc2e607400001080r-x--ld-2.13.so   00007fc2e626a00001212rw---[anon]   00007fc2e629000001616rw---[anon]   00007fc2e6294000044r----ld-2.13.so   00007fc2e6295000088rw---ld-2.13.so   00007fff037e600001212rw---[stack]   00007fff039c9000040r-x--[anon]   ffffffffff600000000r-x--[anon]   ----------------------------------   totalkB980684977072104

上述就是小編為大家分享的Linux中怎么實(shí)現(xiàn)虛擬內(nèi)存了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


本文題目:Linux中怎么實(shí)現(xiàn)虛擬內(nèi)存
轉(zhuǎn)載源于:http://weahome.cn/article/gpgdjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部