色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

程序員眼里的內(nèi)存(上)

jf_78858299 ? 來(lái)源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2023-02-24 14:07 ? 次閱讀

本節(jié)是操作系統(tǒng)系列教程的第三篇文章,屬于操作系統(tǒng)第一章即基礎(chǔ)篇,在真正開(kāi)始操作系統(tǒng)相關(guān)章節(jié)前在這一部分回顧一些重要的主題,算是溫故知新吧,以下是目錄,由于本文篇幅較多因此接下來(lái)會(huì)分三次發(fā)布,目錄中黑體為本篇內(nèi)容。


什么是內(nèi)存

C/C++內(nèi)存模型

堆區(qū)與棧區(qū)的本質(zhì)

JavaPython等內(nèi)存模型

Java內(nèi)存模型

Jave中的堆區(qū)與棧區(qū)是如何實(shí)現(xiàn)的

Python內(nèi)存模型

指針與引用

進(jìn)程的內(nèi)存模型

幻想大師-操作系統(tǒng)

總結(jié)


什么是內(nèi)存

0和1這兩個(gè)簡(jiǎn)單的數(shù)字能做什么?在其它學(xué)科中也許什么都做不了,但是在計(jì)算機(jī)科學(xué)中這就是全部。精彩紛呈的計(jì)算機(jī)世界正是構(gòu)筑在這樣兩個(gè)簡(jiǎn)單數(shù)字之上。

內(nèi)存本身其實(shí)非常簡(jiǎn)單,內(nèi)存的作用就是用來(lái)裝數(shù)字0和數(shù)字1的,如圖所示,圖中的一個(gè)盒子就是內(nèi)存的一個(gè)基本單元,裝的不是0就是裝的1。

內(nèi)存由一大堆的“盒子”組成,每個(gè)盒子中要么是0要么是1,其中8個(gè)盒子被稱之為一個(gè)“字節(jié)”,每8個(gè)盒子也就是一個(gè)字節(jié)都有一個(gè)編號(hào),這些編號(hào)就是簡(jiǎn)單的從0開(kāi)始依次累加的,這個(gè)編號(hào)就被稱之為“ 內(nèi)存地址 ”。其中左邊的數(shù)字是內(nèi)存地址,每一排是一個(gè)字節(jié),圖中展示的就是一個(gè)8字節(jié)大小的內(nèi)存。

而對(duì)于我們平時(shí)使用的比如2G、4G甚至8G大小的內(nèi)存來(lái)說(shuō),只不過(guò)就是“盒子”多一點(diǎn)能裝的01多一點(diǎn)而已,本質(zhì)上和我們?cè)谶@里展示的8字節(jié)大小的內(nèi)存沒(méi)有任何區(qū)別。

在后面的章節(jié)中我將用右圖來(lái)表示內(nèi)存,但是你的大腦里一定要有左圖這樣一個(gè)概念。當(dāng)計(jì)算機(jī)在執(zhí)行我們的程序時(shí),無(wú)論是我們的機(jī)器指令還是機(jī)器指令操作的數(shù)據(jù),都需要存放在這些小盒子中(內(nèi)存)。

以上就是從硬件角度來(lái)看內(nèi)存,那么從編程語(yǔ)言上來(lái)看,程序員應(yīng)該如何理解內(nèi)存呢?

C/C++內(nèi)存模型

對(duì)于C/C++程序員來(lái)說(shuō),常用的int,char等變量都被裝在盒子中,char值只需要一排盒子就能裝下(8bit),一個(gè)int值一般需要四排盒子才能裝得下。連續(xù)幾排裝有同樣類型變量的盒子就是數(shù)組(array),連續(xù)幾排裝有不同類型變量的盒子就是結(jié)構(gòu)體(struct),C/C++語(yǔ)言中不管多么復(fù)雜的數(shù)據(jù)結(jié)構(gòu)都是在此基礎(chǔ)上構(gòu)建出來(lái)的,都需要裝在這些盒子里,沒(méi)什么大不了的。

現(xiàn)在你已經(jīng)知道了對(duì)于C/C++程序員來(lái)說(shuō),我們使用的變量是直接放在內(nèi)存中的(盒子), 每一排盒子的地址就是我們熟知的“指針” ,請(qǐng)記住,指針就是你使用的變量在內(nèi)存中的地址,僅此而已。

C/C++程序在被執(zhí)行時(shí),需要在內(nèi)存中劃出兩段區(qū)域用于存放數(shù)據(jù),這兩個(gè)區(qū)域就是我們熟悉的堆(Heap)和棧(Stack),也稱堆區(qū)和棧區(qū),如圖所示,其中數(shù)據(jù)段和代碼段我們已經(jīng)熟悉了,在這里我們將進(jìn)一步完善C/C++程序在內(nèi)存中的樣子,如圖所示,其中堆區(qū)緊鄰數(shù)據(jù)段,在數(shù)據(jù)段之上,而棧在最上方,棧和堆之間是尚未被使用的內(nèi)存,隨著程序的運(yùn)行,當(dāng)程序申請(qǐng)內(nèi)存時(shí)棧區(qū)和堆區(qū)之間的空隙會(huì)減小,當(dāng)程序釋放內(nèi)存后空隙會(huì)擴(kuò)大,這就是C/C++程序的內(nèi)存模型。

每個(gè)函數(shù)運(yùn)行時(shí)都會(huì)在棧區(qū)上占用一塊內(nèi)存,這塊內(nèi)存中保存的是調(diào)用函數(shù)的參數(shù)以及函數(shù)中的定義的局部變量,這些變量在函數(shù)調(diào)用完成后會(huì)被釋放。從這里可以看出棧上的變量無(wú)需程序員關(guān)心其釋放問(wèn)題,當(dāng)函數(shù)調(diào)用完畢后會(huì)自動(dòng)釋放所占用的空間。

和棧上的變量不同的是,堆上分配的內(nèi)存不會(huì)像棧一樣被自動(dòng)釋放,在堆上分配的內(nèi)存需要程序員手動(dòng)釋放,如果程序員在堆上分配了一塊內(nèi)存,但在使用完后忘記釋放,這種情況就被稱之為“內(nèi)存泄漏”,所謂“內(nèi)存泄漏”就是使用完畢后的內(nèi)存沒(méi)有釋放掉,但是這塊內(nèi)存也不能被用作其它地方從而導(dǎo)致堆占用的內(nèi)存不斷增大,表現(xiàn)出來(lái)的就是如果我們?nèi)?a target="_blank">檢測(cè)程序所占用的內(nèi)存,會(huì)發(fā)現(xiàn)程序所占用的內(nèi)存不斷增大,當(dāng)操作系統(tǒng)是不可能坐視某個(gè)進(jìn)程不斷吞噬掉系統(tǒng)內(nèi)存的,當(dāng)出現(xiàn)系統(tǒng)內(nèi)存資源不足時(shí)將觸發(fā)操作系統(tǒng)的保護(hù)機(jī)制,這在Linux中就是著名的OOM Killer,即Out Of Memory Killer,OOM Killer會(huì)根據(jù)一些策略Killer有問(wèn)題的進(jìn)程,這個(gè)進(jìn)程通常都是占用內(nèi)存最多的那個(gè)。

下面我們用一小段C代碼來(lái)實(shí)際演示一變量是如何在堆區(qū)棧區(qū)上分配的,不用擔(dān)心,這段代碼非常簡(jiǎn)單:

include

如圖所示,這就是以上代碼運(yùn)行過(guò)程中的樣子,你會(huì)發(fā)現(xiàn),每個(gè)函數(shù)在被執(zhí)行的時(shí)候都在棧區(qū)上占有一小段,在這一小段中存放當(dāng)前函數(shù)中定義的局部變量和傳入函數(shù)的參數(shù)。每個(gè)函數(shù)所占用的這一段內(nèi)存有一個(gè)很形象的名字,叫做“棧幀(stack frame)”,原因就在于棧是隨著函數(shù)調(diào)用一幀一幀增加的,每個(gè)函數(shù)在被調(diào)用時(shí)都會(huì)在棧上分配一幀,所以就叫棧幀。這個(gè)詞請(qǐng)大家不必去深究,每個(gè)被調(diào)函數(shù)在棧區(qū)上做占用的內(nèi)存總要有個(gè)名字,棧幀只不過(guò)比較形象而已。

這段代碼中,main函數(shù)會(huì)調(diào)用函數(shù)f1,f1會(huì)調(diào)用函數(shù)f2(),其中變量a,b,c以及heap依次被放在各自函數(shù)的棧幀中,值得注意的一點(diǎn)在于, heap這個(gè)變量本身是在棧上的,但是heap所指向的內(nèi)存是分配在堆上的 ,heap本身僅僅保存的是4這個(gè)值在內(nèi)存中的 位置 ,比如這里的0x10,表示的就是4這個(gè)值放在了內(nèi)存0x10的這個(gè)位置上,heap就是C/C++語(yǔ)言中所謂的指針。

你會(huì)發(fā)現(xiàn)隨著函數(shù)的調(diào)用,棧是不斷在擴(kuò)大的,當(dāng)f2,f1執(zhí)行完畢返回main時(shí)就是如下圖所示的樣子。

從圖中我們可以看出,f2在執(zhí)行完畢后,f2所占用的內(nèi)存就被回收了,所謂“回收”就是這塊內(nèi)存又可以用作其它用途了。f1執(zhí)行完畢后所占用的內(nèi)存同樣也被回收,這樣我們就又回到了main()函數(shù)中。

這個(gè)過(guò)程中我們還會(huì)發(fā)現(xiàn)一個(gè)很有意思的現(xiàn)象就是最先被使用的棧幀其實(shí)是最后才被釋放的,這種先進(jìn)后出的性質(zhì)就被稱之為“棧”,如下圖所示。所以你會(huì)看到“棧“這個(gè)詞更多的是指順序上的先進(jìn)后出,只不過(guò)函數(shù)調(diào)用時(shí)所占用的內(nèi)存在使用方式上也是先進(jìn)后出的,所以這塊內(nèi)存就被稱之為棧區(qū)了。

在講解完棧之后,我們來(lái)看看堆,不同于像a,b,c這樣存在于棧區(qū)上的變量,棧區(qū)上的變量可以在函數(shù)執(zhí)行完成后被自動(dòng)釋放掉,在堆區(qū)上的分配內(nèi)存除非程序員手動(dòng)調(diào)用free,delete明確的告知內(nèi)存使用完畢,否則這塊內(nèi)存就會(huì)一直被占用而不能用作其它用途,這就是堆區(qū)。

你可能會(huì)問(wèn),什么樣的變量在需要在堆上分配呢,我們知道,函數(shù)調(diào)用完成后棧上的分配的局部變量會(huì)因?yàn)闂会尫哦辉倏捎茫褏^(qū)的存在就是為了解決這個(gè)問(wèn)題,堆區(qū)中申請(qǐng)的內(nèi)存不會(huì)因?yàn)闂尼尫哦辉倏捎茫沟米兞康纳芷诓辉倬窒抻谀硞€(gè)函數(shù),其生命周期是靠程序員用malloc(new)以及free(delete)來(lái)控制的,這樣的變量在使用時(shí)可以跨越函數(shù)調(diào)用。

另外一點(diǎn)值得注意的是,f2函數(shù)中我們?cè)诙焉仙暾?qǐng)了一塊內(nèi)存用來(lái)存放整數(shù),但是f2執(zhí)行完成后并沒(méi)有去釋放這塊內(nèi)存,根據(jù)堆的性質(zhì)我們知道這塊函數(shù)在接下來(lái)的運(yùn)行過(guò)程中無(wú)法再被使用,就好像這塊內(nèi)存被遺忘了一樣,這就是內(nèi)存泄漏。

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

    關(guān)注

    8

    文章

    3048

    瀏覽量

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

    關(guān)注

    37

    文章

    6882

    瀏覽量

    123584
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2114

    瀏覽量

    73785
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)顯示:中國(guó)程序員是世界最牛的程序員

    根據(jù)我們的數(shù)據(jù)顯示,中國(guó)和俄羅斯擁有最具才華的程序員。中國(guó)程序員在數(shù)學(xué)、功能程序設(shè)計(jì)和數(shù)據(jù)結(jié)構(gòu)方面超過(guò)了世界其他國(guó)家的程序員,而俄羅斯程序員
    發(fā)表于 12-14 20:33 ?663次閱讀

    用戶和程序員之間的關(guān)系

    我曾經(jīng)說(shuō)過(guò),程序員不是一般的人,是具有某種超能里的人。但問(wèn)題是,程序員往往意識(shí)不到自己的這種特異功能,在他們的眼里,會(huì)認(rèn)為自己很普通,跟常人一樣,所以,程序員能做到的事情,其他人——比
    的頭像 發(fā)表于 11-16 16:10 ?2110次閱讀

    “菜鳥(niǎo)”程序員和“大神”程序員到底有什么區(qū)別

    現(xiàn)在社會(huì)上有很多程序員,那您是否可想過(guò)程序員為什么會(huì)有不同的水平?你又是哪一類的程序員?“菜鳥(niǎo)”程序員和“大神”程序員差在哪里?
    的頭像 發(fā)表于 05-14 08:48 ?3767次閱讀

    這可能就是程序員最大的悲哀

    這個(gè)繁榮的行業(yè),只要你自己不水,可以衣食無(wú)憂,努努力還能buffer加成,成為別人眼里很酷的那種人,沒(méi)多少行業(yè)如程序員起薪高,也沒(méi)多少行業(yè)如程序員漲薪快,沒(méi)多少行業(yè)如程序員這般智力密集
    的頭像 發(fā)表于 12-07 15:47 ?1250次閱讀

    程序員如何定義

    當(dāng)了幾年的程序員了,一直都在想一個(gè)問(wèn)題,什么是程序員程序員應(yīng)該做好那些事情,什么樣的程序員是有素質(zhì)的程序員?什么樣的
    的頭像 發(fā)表于 12-18 14:15 ?2687次閱讀

    菜鳥(niǎo)程序員和大神程序員的差距

    ?你又是哪一類的程序員?“菜鳥(niǎo)”程序員和“大神”程序員差在哪里?真是差在技術(shù)上了嗎?那不是差在技術(shù)那差在了哪里?
    的頭像 發(fā)表于 06-03 15:56 ?2569次閱讀

    什么是程序員

    當(dāng)了幾年的程序員了,一直都在想一個(gè)問(wèn)題,什么是程序員程序員應(yīng)該做好那些事情,什么樣的程序員是有素質(zhì)的程序員?什么樣的
    的頭像 發(fā)表于 06-04 16:21 ?9070次閱讀

    程序員的未來(lái)

    程序員出路在何方程序員 創(chuàng)業(yè)如果你是程序員,也想創(chuàng)業(yè),看看我說(shuō)的。
    的頭像 發(fā)表于 06-12 17:29 ?2982次閱讀

    普通程序員和高級(jí)程序員有哪些區(qū)別

    從工作的方面來(lái)說(shuō),普通程序員和高級(jí)程序員一般有下面幾個(gè)區(qū)別:
    的頭像 發(fā)表于 09-08 10:47 ?3814次閱讀

    如何定義程序員

    多年以來(lái),黑程序員一直是一項(xiàng)廣大人民群眾喜聞樂(lè)見(jiàn)的娛樂(lè)活動(dòng),我們不僅黑程序員程序員也喜歡自黑,如此一來(lái),大家好像都覺(jué)得黑程序員是一項(xiàng)天經(jīng)地義的事情了,然而事實(shí)
    的頭像 發(fā)表于 10-28 17:05 ?2757次閱讀

    JAVA程序員和C程序員有什么區(qū)別

    1、知道JAVA程序員和C程序員的差別嗎?食堂里,吃完飯就走的是JAVA程序員,吃完飯還要自己收拾的那就是是C程序員。至于為什么會(huì)這樣,大家都明白(因?yàn)镴AVA自帶垃圾回收機(jī)制,C需要
    的頭像 發(fā)表于 11-03 11:25 ?4337次閱讀

    優(yōu)秀程序員與糟糕程序員的變現(xiàn)差異

    軟件蠶食一切,未來(lái)屬于程序員。所以人人都想當(dāng)程序員。但是并不是每個(gè)人都能當(dāng)好程序員。在你做出決定前還是先看看自己能不能當(dāng)好程序員吧。
    的頭像 發(fā)表于 11-07 16:14 ?3094次閱讀

    程序員的類型

    今天來(lái)聊個(gè)有趣的話題,你是什么類型的程序員? 在學(xué)校里或在公司里,你是不是接觸過(guò)不少其他的程序員,有沒(méi)有發(fā)現(xiàn),雖然同屬程序員科, 但也有眾多的不同。 今天我就來(lái)給程序員分個(gè)類,看看你是
    的頭像 發(fā)表于 11-28 16:39 ?4730次閱讀

    每個(gè)程序員都應(yīng)該知道的內(nèi)存

    。不幸的是,兩者都沒(méi)有使用計(jì)算機(jī)的內(nèi)存子系統(tǒng)或CPU的緩存的結(jié)構(gòu)和成本大多數(shù)程序員都很理解。本文解釋了現(xiàn)代商品硬件使用的內(nèi)存子系統(tǒng)的結(jié)構(gòu)
    發(fā)表于 11-23 16:55 ?0次下載

    程序員眼里內(nèi)存(下)

    在各種編程語(yǔ)言中我們應(yīng)該經(jīng)常聽(tīng)到兩個(gè)詞,那就是引用或者指針。這兩個(gè)詞都是和內(nèi)存相關(guān)的,指針和引用的作用都是“如何找到存放在內(nèi)存的數(shù)據(jù)”。
    的頭像 發(fā)表于 02-24 14:12 ?350次閱讀
    <b class='flag-5'>程序員</b><b class='flag-5'>眼里</b>的<b class='flag-5'>內(nèi)存</b>(下)
    主站蜘蛛池模板: 老女老肥熟国产在线视频| 肉欲横流(NP高H)| 精品网站一区二区三区网站| 国产亚洲一区在线| 国产亚洲精品久久精品6| 好男人免费观看在线高清WWW| 精品国产乱码久久久久久上海公司 | 韩国电影real在线观看完整版| 极品色αv影院| 久久受www免费人成_看片中文| 老师小扫货水能么多叫出来| 蜜芽无码亚洲资源网站| 任你懆视频 这里只有精品| 午夜伦理一yy4480影院| 一本大道无码AV天堂欧美| 国产永久视频| 狠狠色狠狠色综合日日小说| 久久亚洲精品无码A片大香大香| 男女性杂交内射妇女BBWXZ| 日本日本熟妇中文在线视频| 午夜伦理一yy4480影院| 樱桃熟了A级毛片| rio 快播| 国产亚洲日韩另类在线观看| 精品国产在天天线在线麻豆| 男女做爽爽爽视频免费软件| 乳欲性高清在线| 亚洲免费视频网站| 99久久伊人一区二区yy5o99| 国产97视频在线观看| 火影小南被爆羞羞网站| 男生插曲女生身全过程| 吻嘴胸全身好爽床大全| 樱桃视频影院在线播放| 大胸美女被吊起来解开胸罩| 黑人特黄AA完整性大片| 欧美午夜精品久久久久久浪潮 | 国产人妻人伦精品A区| 久久青青热| 日韩精品在线看| 亚洲视频国产|