色偷偷91综合久久噜噜-色偷偷成人-色偷偷尼玛图亚洲综合-色偷偷人人澡久久天天-国内精品视频一区-国内精品视频一区二区三区

Hello! 歡迎來到小浪云!


Linux系統(tǒng)編程:進(jìn)程地址空間


Linux系統(tǒng)編程:進(jìn)程地址空間一,內(nèi)存地址空間1.1,區(qū)存儲(chǔ)變量:普通局部變量、指針變量、函數(shù)參數(shù)、函數(shù)返回地址、臨時(shí)變量、寄存器變量;

函數(shù)參數(shù):函數(shù)的參數(shù)是從右到左依次入的;

Linux系統(tǒng)編程:進(jìn)程地址空間在vs2022上區(qū)并不是”向下生長(zhǎng)的”,而是正常的棧,因此推斷結(jié)果應(yīng)該是b的地址較低,a的地址比b的地址高;

Linux系統(tǒng)編程:進(jìn)程地址空間函數(shù)返回地址:函數(shù)返回地址是指函數(shù)執(zhí)行完畢后,程序需要跳轉(zhuǎn)回繼續(xù)執(zhí)行的內(nèi)存地址(即函數(shù)的地址)。當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),當(dāng)前程序的執(zhí)行流程會(huì)轉(zhuǎn)移到該函數(shù)內(nèi)部。在函數(shù)執(zhí)行完成后,程序需要知道回到哪里繼續(xù)執(zhí)行后續(xù)的代碼,這個(gè)“回去的位置”對(duì)應(yīng)的內(nèi)存地址就是函數(shù)返回地址。

1.2,區(qū)介紹

特點(diǎn)

動(dòng)態(tài)分配:程序運(yùn)行時(shí)可根據(jù)需要隨時(shí)在區(qū)申請(qǐng)和釋放內(nèi)存空間,大小可在運(yùn)行時(shí)確定,適應(yīng)不同數(shù)據(jù)結(jié)構(gòu)算法的需求;

空間較大:一般來說,區(qū)的空間比棧區(qū)的空間更大,因?yàn)樗请S機(jī)開辟的,并不像棧區(qū)地址都是連續(xù)的,所以空間更大,方便使用;

管理復(fù)雜:需要程序員手動(dòng)管理內(nèi)存分配和釋放,容易引發(fā)懸空指針和由于忘了釋放內(nèi)存造成的內(nèi)存泄漏問題;

1.3,全局區(qū)(數(shù)據(jù)段)與常量區(qū)全局區(qū)也稱為靜態(tài)存儲(chǔ)區(qū),用于存放全局變量和靜態(tài)變量;

生命周期:隨著進(jìn)程結(jié)束釋放內(nèi)存;即便是函數(shù)內(nèi)部的局部靜態(tài)變量生命周期依舊是整個(gè)進(jìn)程;

Linux系統(tǒng)編程:進(jìn)程地址空間我們可以看到即便是超出了作用域Static int a 的地址空間依舊沒有釋放;這說明靜態(tài)局部變量的生命周期不是隨作用域的,而是隨進(jìn)程的;但只能在作用域中使用(在不返回值的情況下); ——>靜態(tài)局部變量相當(dāng)于全局變量,唯一的區(qū)別就是作用域不同;

1.4,代碼段數(shù)據(jù)段是進(jìn)程中存儲(chǔ)執(zhí)行代碼的內(nèi)存區(qū)域,它包含了程序的指令和常量(“1”,”hello world”….);

二,fork的遺留問題為什么fork有兩個(gè)返回值?

這其實(shí)是在兩個(gè)進(jìn)程中看,父進(jìn)程執(zhí)行到fork時(shí)還沒來得及return,此時(shí)子進(jìn)程就已經(jīng)創(chuàng)建出來了,并且也會(huì)return一個(gè)值,所以有兩個(gè)值;那這么看就會(huì)產(chǎn)生兩個(gè)數(shù)據(jù),對(duì)吧;接下來我們驗(yàn)證一下他們的地址;

Linux系統(tǒng)編程:進(jìn)程地址空間Linux系統(tǒng)編程:進(jìn)程地址空間我們可以看到id的值是不一樣的,但地址確實(shí)一樣的,這是為什么呢?按道理說,如果地址相同那同一個(gè)地址怎么可能存兩個(gè)數(shù)據(jù)呢?況且還發(fā)生了寫時(shí)拷貝,地址怎么會(huì)相同呢?

其實(shí)這里我們看到的是虛擬內(nèi)存地址;

先來解釋一下上面的情況:

—->父進(jìn)程創(chuàng)建子進(jìn)程時(shí)確實(shí)發(fā)生了寫時(shí)拷貝,id變量的確有兩份,不過是寫時(shí)拷貝開辟的空間是物理內(nèi)存,這個(gè)時(shí)候物理內(nèi)存上存在兩個(gè)id地址,一個(gè)是父進(jìn)程的,一個(gè)是子進(jìn)程的,而我們?cè)诔绦蛑锌吹降氖翘摂M內(nèi)存地址;物理內(nèi)存無(wú)法在程序中看到;

問題一:為什么要有虛擬地址(進(jìn)程地址空間)

1.統(tǒng)一進(jìn)程視角看待內(nèi)存

現(xiàn)在我們使用OS類比一個(gè)大富翁,3個(gè)進(jìn)程類比3個(gè)他的孩子;一個(gè)大富翁(操作系統(tǒng))有10億美金,而他有四個(gè)私生子,但是四個(gè)私生子(進(jìn)程)都并不知道對(duì)方的存在(進(jìn)程獨(dú)立性),所以他們都認(rèn)為大富翁只有他唯一一個(gè)兒子,而大富翁告訴他們一旦自己去世了,就把所有的家產(chǎn)留給他,所以每個(gè)兒子也都信了,因此大富翁其實(shí)給每個(gè)私生子都畫了一個(gè)大餅(進(jìn)程地址空間)。每個(gè)人都認(rèn)為自己有十億家產(chǎn)。但實(shí)際上是這些私生子要多少才會(huì)給多少(進(jìn)程需要多少空間操作系統(tǒng)就給多少空間

如果有一張?zhí)摂M內(nèi)存,這樣每個(gè)進(jìn)程就不需要關(guān)心當(dāng)前的物理內(nèi)存會(huì)不會(huì)影響到別的進(jìn)程,我用的時(shí)候直接告訴OS,然后他幫我們分配,這樣可以更加方便有序的使進(jìn)程運(yùn)行;

2.保護(hù)內(nèi)存地址,出現(xiàn)問題直接攔截(相當(dāng)于加了一層防護(hù))

當(dāng)我們申請(qǐng)物理內(nèi)存空間時(shí),就會(huì)利用虛擬地址進(jìn)行地址審查,在這個(gè)轉(zhuǎn)化過程中,如果虛擬內(nèi)存地址出現(xiàn)問題,就會(huì)直接結(jié)束這個(gè)過程,就不會(huì)直接影響到物理內(nèi)存;

為什么我們無(wú)法修改常量字符串?

常量字符串位于常量區(qū)域,但僅僅如此不足以說明不可修改,我們都知道不可修改是一種權(quán)限,那這個(gè)權(quán)限在哪里呢?其實(shí)這個(gè)權(quán)限是在頁(yè)表中,當(dāng)通過虛擬地址訪問物理地址時(shí),會(huì)通過頁(yè)表轉(zhuǎn)化并檢查權(quán)限,如果沒有權(quán)限就會(huì)被攔截;

三,什么是進(jìn)程地址空間我們知道要管理一個(gè)對(duì)象的方法是–>先描述再組織;

Linux系統(tǒng)編程:進(jìn)程地址空間四,頁(yè)表現(xiàn)代操作系統(tǒng)不做浪費(fèi)時(shí)間和空間的事;

4.1,寫時(shí)拷貝,缺頁(yè)中斷,惰性加載首先,頁(yè)表中有什么呢?

Linux系統(tǒng)編程:進(jìn)程地址空間答:虛擬地址、物理地址、權(quán)限位、標(biāo)志位(是否將對(duì)應(yīng)的代碼和數(shù)據(jù)加載到內(nèi)存中)

權(quán)限位有什么用?

權(quán)限位上有該地址的讀和寫權(quán)限,如果該地址是只讀權(quán)限那么我們對(duì)地址進(jìn)行修改就會(huì)被OS直接攔截,非法請(qǐng)求就不會(huì)發(fā)送到物理內(nèi)存,對(duì)物理內(nèi)存起到一定程度的保護(hù)作用;

標(biāo)志位是什么?

標(biāo)志位是檢查進(jìn)程該地址需要的代碼是否加載到了內(nèi)存中;

惰性加載:就是需要多少加載多少,操作系統(tǒng)對(duì)于大文件是可以實(shí)現(xiàn)分批加載的,也就是進(jìn)程可能有時(shí)會(huì)只有PCB在內(nèi)存中;

缺頁(yè)中斷:當(dāng)所需的代碼和數(shù)據(jù)還沒有被加載進(jìn)內(nèi)存的時(shí)候,這時(shí)候就會(huì)發(fā)生缺頁(yè)中斷,中斷的意思就是暫時(shí)暫停此進(jìn)程,等待代碼和數(shù)據(jù)加載進(jìn)來后就會(huì)繼續(xù)執(zhí)行進(jìn)程;

那么為什么不一次性將代碼數(shù)據(jù)加載到內(nèi)存中呢?

從空間的角度思考,一個(gè)大文件加載是需要占用很大的空間的,而且進(jìn)程一開始也不會(huì)馬上用到一整塊代碼,所以這個(gè)時(shí)候有一些代碼數(shù)據(jù)是空閑的,也就占用了額外的內(nèi)存空間;

從時(shí)間的角度考慮,加載一個(gè)大文件十分耗費(fèi)時(shí)間;一次性加載效率不高;

因此出現(xiàn)了缺頁(yè)中斷,其用意就是對(duì)代碼和數(shù)據(jù)進(jìn)行局部性加載,合理使用內(nèi)存從而提高效率;

寫時(shí)拷貝:數(shù)據(jù)段(全局區(qū))的數(shù)據(jù)本來是可寫的,但權(quán)限確實(shí)只讀的,這么做的目的就是為了維持寫時(shí)拷貝;當(dāng)進(jìn)程雙方中的一方對(duì)數(shù)據(jù)進(jìn)行修改,就會(huì)觸發(fā)寫時(shí)拷貝機(jī)制,重新開辟一塊空間,存儲(chǔ)新的數(shù)據(jù),并且修改頁(yè)表映射;

4.2進(jìn)程地址是如何被切換的Linux系統(tǒng)編程:進(jìn)程地址空間進(jìn)程PCB結(jié)構(gòu)體里有對(duì)應(yīng)的進(jìn)程地址空間指針,所以進(jìn)程切換就意味著進(jìn)程空間地址空間被切換,而頁(yè)表會(huì)被存儲(chǔ)在CPU的cr3寄存器中,這其實(shí)屬于進(jìn)程的上下文信息,在進(jìn)程切換的時(shí)候會(huì)被進(jìn)程帶走,后面再恢復(fù)過來!

4.3進(jìn)程創(chuàng)建的具體分析過程進(jìn)程被創(chuàng)建的時(shí)候,優(yōu)先被創(chuàng)建和加載的是PCB數(shù)據(jù)結(jié)構(gòu)和對(duì)應(yīng)的地址空間,代碼和數(shù)據(jù)等到需要的會(huì)后在加載進(jìn)來;

4.4重新理解進(jìn)程具有獨(dú)立性1.在PCB數(shù)據(jù)結(jié)構(gòu)上,每一個(gè)進(jìn)程都有自己唯一的PCB;

2.虛擬地址可以相同,但通過頁(yè)表映射的物理地址是不同的;各自有各自的區(qū)域,對(duì)于父子進(jìn)程在寫時(shí)拷貝的機(jī)制下,也是擁有自己獨(dú)一份的物理地址;

五,命令行參數(shù)和環(huán)境變量在棧的上面Linux系統(tǒng)編程:進(jìn)程地址空間Linux系統(tǒng)編程:進(jìn)程地址空間

相關(guān)閱讀

主站蜘蛛池模板: 久久久2019精品 | 天天碰天天 | 欧美精品在线一区 | 中国毛片免费观看 | 成年女人免费视频拍拍拍 | 亚洲一级黄色片 | 老司机久久影院 | 国产精品毛片无码 | 我想看一级毛片免费的 | 四虎国产精品永免费 | 综合欧美一区二区三区 | 日韩伦理在线 | 黄色成人一级片 | 亚洲一区免费在线观看 | 婷婷国产天堂久久综合五月 | 高清三级特黄60分钟在线播放 | 制服丝袜在线看 | 老司机av | 一级毛片一级毛片一级级毛片 | 天天操天天操 | 亚洲成年人免费网站 | 国产精品久久女同磨豆腐 | 亚洲三级视频 | 亚洲免费二区 | 精品成人毛片一区二区视 | 日本三级香港三级人妇99视 | 亚洲男人的天堂在线视频 | 日本天堂网址 | 黄色一级片免费看 | 六月婷婷综合 | 无遮挡很爽很污很黄很色的网站 | 黄色a视频| 国产ts视频| 一级毛片视频 | 国产jizzjizz免费看jizz | 天天干夜夜艹 | 色婷婷亚洲综合 | 国产成人综合精品 | 2020av在线播放 | 日韩高清色www蜜桃tv | 91成人午夜性a一级毛片 |