linux进程与它的堆栈空间
生活随笔
收集整理的這篇文章主要介紹了
linux进程与它的堆栈空间
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一)概述
.堆棧是一個(gè)用戶(hù)空間的內(nèi)存區(qū)域,進(jìn)程使用堆棧作為臨時(shí)存儲(chǔ).
.堆棧中存放的是函數(shù)中的局部變量,在函數(shù)的生命周期中可以將變量壓入堆棧,編譯器需要確保堆棧指針在函數(shù)退出前恢復(fù)到初始位置,也就是說(shuō),內(nèi)存是自動(dòng)分配和釋放的.
.C/C++把存儲(chǔ)在堆棧中的局部變量當(dāng)作automatic存儲(chǔ),并使用auto關(guān)鍵字,這是局部變量的默認(rèn)存儲(chǔ)方式,所以現(xiàn)在沒(méi)有人用auto關(guān)鍵詞.
.與動(dòng)態(tài)存儲(chǔ)相對(duì)映的靜態(tài)存儲(chǔ),也就是用static定義的局部變量,它不用堆棧來(lái)存儲(chǔ),而是使用數(shù)據(jù)段來(lái)存儲(chǔ).
.堆棧的基地址位于用戶(hù)空間的最高虛擬地址附近,并從那里向下延伸.
.一個(gè)進(jìn)程開(kāi)始時(shí),堆棧的最大值就不能改變,如果占用的空間超過(guò)了堆棧大小,那么就會(huì)導(dǎo)致堆棧溢出.
二)進(jìn)程的內(nèi)存組織形式
進(jìn)程被分為三個(gè)區(qū)域:文本,數(shù)據(jù)和堆棧.
1)文本區(qū)域:
文本區(qū)域也叫做代碼段,是由程序確定的,它包括代碼(指令)和只讀數(shù)據(jù),該區(qū)域通常被標(biāo)記為只讀,任何對(duì)其寫(xiě)入的操作會(huì)導(dǎo)致段錯(cuò)誤.
2)數(shù)據(jù)區(qū)域:
數(shù)據(jù)區(qū)域也叫做數(shù)據(jù)段,它包括已初始化和未初始化的數(shù)據(jù),靜態(tài)變量存儲(chǔ)在這個(gè)區(qū)域中,它的大小可以用系統(tǒng)調(diào)用brk(2)來(lái)改變.
3)堆棧區(qū)域:
堆棧區(qū)域也叫堆棧段,它用于給局部變量動(dòng)態(tài)分配空間,同樣函數(shù)傳遞參數(shù)和函數(shù)返回值也要用到堆棧.
堆棧也可向下增長(zhǎng)(向內(nèi)存低地址)也可以向上增長(zhǎng),這依賴(lài)于具體的實(shí)現(xiàn),通常都是向下增長(zhǎng)的,而SP(堆棧指針)也是指向堆棧的最后地址.
4)內(nèi)存的分配區(qū)域:
根據(jù)前面所述,堆棧是位于最高虛擬地址附近,而數(shù)據(jù)段則位于堆棧段之后,最后是代碼段.
三)堆棧著色
當(dāng)兩個(gè)線(xiàn)程或進(jìn)程使用相同的堆棧虛擬地址時(shí),它們會(huì)爭(zhēng)奪同一個(gè)cache行,導(dǎo)致競(jìng)爭(zhēng)和降級(jí)行為.
堆棧著色的技術(shù)使每一個(gè)進(jìn)程的基址都不相同,通過(guò)隨機(jī)分配堆棧基址,多個(gè)進(jìn)程會(huì)使用不同的cache行來(lái)避免.
四)堆棧的限制
堆棧空間的最大值是由setrlimit系統(tǒng)調(diào)用確定的,也可以通過(guò)bash內(nèi)建的ulimit命令來(lái)設(shè)定和查看.
例如:
查看當(dāng)前可使用的最大堆棧(以KB為單位)
ulimit -s
8192
設(shè)定為最大的使用堆棧為15KB
ulimit -s 15
此時(shí)執(zhí)行l(wèi)s將會(huì)得到一個(gè)段錯(cuò)誤.
ls -l /etc/
total 1040
Segmentation fault
通過(guò)用strace跟蹤ls命令,將發(fā)現(xiàn)有如下的系統(tǒng)調(diào)用
getrlimit(RLIMIT_STACK, {rlim_cur=15*1024, rlim_max=15*1024}) = 0
說(shuō)明當(dāng)前可用的堆棧空間,已經(jīng)不足以運(yùn)行strace命令了.
五)常駐內(nèi)存和鎖定內(nèi)存
常駐內(nèi)存專(zhuān)指存儲(chǔ)在RAM中的內(nèi)存部分,不包括存儲(chǔ)在交換區(qū)和未存儲(chǔ)的進(jìn)程的內(nèi)存.
鎖定內(nèi)存是常駐內(nèi)存的子集,它指被進(jìn)程明確地鎖定到RAM的虛擬內(nèi)存中,不能用于交換,并一直常駐于RAM中.
.堆棧是一個(gè)用戶(hù)空間的內(nèi)存區(qū)域,進(jìn)程使用堆棧作為臨時(shí)存儲(chǔ).
.堆棧中存放的是函數(shù)中的局部變量,在函數(shù)的生命周期中可以將變量壓入堆棧,編譯器需要確保堆棧指針在函數(shù)退出前恢復(fù)到初始位置,也就是說(shuō),內(nèi)存是自動(dòng)分配和釋放的.
.C/C++把存儲(chǔ)在堆棧中的局部變量當(dāng)作automatic存儲(chǔ),并使用auto關(guān)鍵字,這是局部變量的默認(rèn)存儲(chǔ)方式,所以現(xiàn)在沒(méi)有人用auto關(guān)鍵詞.
.與動(dòng)態(tài)存儲(chǔ)相對(duì)映的靜態(tài)存儲(chǔ),也就是用static定義的局部變量,它不用堆棧來(lái)存儲(chǔ),而是使用數(shù)據(jù)段來(lái)存儲(chǔ).
.堆棧的基地址位于用戶(hù)空間的最高虛擬地址附近,并從那里向下延伸.
.一個(gè)進(jìn)程開(kāi)始時(shí),堆棧的最大值就不能改變,如果占用的空間超過(guò)了堆棧大小,那么就會(huì)導(dǎo)致堆棧溢出.
二)進(jìn)程的內(nèi)存組織形式
進(jìn)程被分為三個(gè)區(qū)域:文本,數(shù)據(jù)和堆棧.
1)文本區(qū)域:
文本區(qū)域也叫做代碼段,是由程序確定的,它包括代碼(指令)和只讀數(shù)據(jù),該區(qū)域通常被標(biāo)記為只讀,任何對(duì)其寫(xiě)入的操作會(huì)導(dǎo)致段錯(cuò)誤.
2)數(shù)據(jù)區(qū)域:
數(shù)據(jù)區(qū)域也叫做數(shù)據(jù)段,它包括已初始化和未初始化的數(shù)據(jù),靜態(tài)變量存儲(chǔ)在這個(gè)區(qū)域中,它的大小可以用系統(tǒng)調(diào)用brk(2)來(lái)改變.
3)堆棧區(qū)域:
堆棧區(qū)域也叫堆棧段,它用于給局部變量動(dòng)態(tài)分配空間,同樣函數(shù)傳遞參數(shù)和函數(shù)返回值也要用到堆棧.
堆棧也可向下增長(zhǎng)(向內(nèi)存低地址)也可以向上增長(zhǎng),這依賴(lài)于具體的實(shí)現(xiàn),通常都是向下增長(zhǎng)的,而SP(堆棧指針)也是指向堆棧的最后地址.
4)內(nèi)存的分配區(qū)域:
根據(jù)前面所述,堆棧是位于最高虛擬地址附近,而數(shù)據(jù)段則位于堆棧段之后,最后是代碼段.
三)堆棧著色
當(dāng)兩個(gè)線(xiàn)程或進(jìn)程使用相同的堆棧虛擬地址時(shí),它們會(huì)爭(zhēng)奪同一個(gè)cache行,導(dǎo)致競(jìng)爭(zhēng)和降級(jí)行為.
堆棧著色的技術(shù)使每一個(gè)進(jìn)程的基址都不相同,通過(guò)隨機(jī)分配堆棧基址,多個(gè)進(jìn)程會(huì)使用不同的cache行來(lái)避免.
四)堆棧的限制
堆棧空間的最大值是由setrlimit系統(tǒng)調(diào)用確定的,也可以通過(guò)bash內(nèi)建的ulimit命令來(lái)設(shè)定和查看.
例如:
查看當(dāng)前可使用的最大堆棧(以KB為單位)
ulimit -s
8192
設(shè)定為最大的使用堆棧為15KB
ulimit -s 15
此時(shí)執(zhí)行l(wèi)s將會(huì)得到一個(gè)段錯(cuò)誤.
ls -l /etc/
total 1040
Segmentation fault
通過(guò)用strace跟蹤ls命令,將發(fā)現(xiàn)有如下的系統(tǒng)調(diào)用
getrlimit(RLIMIT_STACK, {rlim_cur=15*1024, rlim_max=15*1024}) = 0
說(shuō)明當(dāng)前可用的堆棧空間,已經(jīng)不足以運(yùn)行strace命令了.
五)常駐內(nèi)存和鎖定內(nèi)存
常駐內(nèi)存專(zhuān)指存儲(chǔ)在RAM中的內(nèi)存部分,不包括存儲(chǔ)在交換區(qū)和未存儲(chǔ)的進(jìn)程的內(nèi)存.
鎖定內(nèi)存是常駐內(nèi)存的子集,它指被進(jìn)程明確地鎖定到RAM的虛擬內(nèi)存中,不能用于交換,并一直常駐于RAM中.
轉(zhuǎn)載于:https://blog.51cto.com/xuanjicto/725319
總結(jié)
以上是生活随笔為你收集整理的linux进程与它的堆栈空间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux VIM,引导流程解析
- 下一篇: Linux 创建指定大小空文件