在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

程序員眼里的內存(上)

jf_78858299 ? 來源:碼農的荒島求生 ? 作者:碼農的荒島求生 ? 2023-02-24 14:07 ? 次閱讀

本節是操作系統系列教程的第三篇文章,屬于操作系統第一章即基礎篇,在真正開始操作系統相關章節前在這一部分回顧一些重要的主題,算是溫故知新吧,以下是目錄,由于本文篇幅較多因此接下來會分三次發布,目錄中黑體為本篇內容。


什么是內存

C/C++內存模型

堆區與棧區的本質

JavaPython等內存模型

Java內存模型

Jave中的堆區與棧區是如何實現的

Python內存模型

指針與引用

進程的內存模型

幻想大師-操作系統

總結


什么是內存

0和1這兩個簡單的數字能做什么?在其它學科中也許什么都做不了,但是在計算機科學中這就是全部。精彩紛呈的計算機世界正是構筑在這樣兩個簡單數字之上。

內存本身其實非常簡單,內存的作用就是用來裝數字0和數字1的,如圖所示,圖中的一個盒子就是內存的一個基本單元,裝的不是0就是裝的1。

內存由一大堆的“盒子”組成,每個盒子中要么是0要么是1,其中8個盒子被稱之為一個“字節”,每8個盒子也就是一個字節都有一個編號,這些編號就是簡單的從0開始依次累加的,這個編號就被稱之為“ 內存地址 ”。其中左邊的數字是內存地址,每一排是一個字節,圖中展示的就是一個8字節大小的內存。

而對于我們平時使用的比如2G、4G甚至8G大小的內存來說,只不過就是“盒子”多一點能裝的01多一點而已,本質上和我們在這里展示的8字節大小的內存沒有任何區別。

在后面的章節中我將用右圖來表示內存,但是你的大腦里一定要有左圖這樣一個概念。當計算機在執行我們的程序時,無論是我們的機器指令還是機器指令操作的數據,都需要存放在這些小盒子中(內存)。

以上就是從硬件角度來看內存,那么從編程語言上來看,程序員應該如何理解內存呢?

C/C++內存模型

對于C/C++程序員來說,常用的int,char等變量都被裝在盒子中,char值只需要一排盒子就能裝下(8bit),一個int值一般需要四排盒子才能裝得下。連續幾排裝有同樣類型變量的盒子就是數組(array),連續幾排裝有不同類型變量的盒子就是結構體(struct),C/C++語言中不管多么復雜的數據結構都是在此基礎上構建出來的,都需要裝在這些盒子里,沒什么大不了的。

現在你已經知道了對于C/C++程序員來說,我們使用的變量是直接放在內存中的(盒子), 每一排盒子的地址就是我們熟知的“指針” ,請記住,指針就是你使用的變量在內存中的地址,僅此而已。

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

每個函數運行時都會在棧區上占用一塊內存,這塊內存中保存的是調用函數的參數以及函數中的定義的局部變量,這些變量在函數調用完成后會被釋放。從這里可以看出棧上的變量無需程序員關心其釋放問題,當函數調用完畢后會自動釋放所占用的空間。

和棧上的變量不同的是,堆上分配的內存不會像棧一樣被自動釋放,在堆上分配的內存需要程序員手動釋放,如果程序員在堆上分配了一塊內存,但在使用完后忘記釋放,這種情況就被稱之為“內存泄漏”,所謂“內存泄漏”就是使用完畢后的內存沒有釋放掉,但是這塊內存也不能被用作其它地方從而導致堆占用的內存不斷增大,表現出來的就是如果我們去檢測程序所占用的內存,會發現程序所占用的內存不斷增大,當操作系統是不可能坐視某個進程不斷吞噬掉系統內存的,當出現系統內存資源不足時將觸發操作系統的保護機制,這在Linux中就是著名的OOM Killer,即Out Of Memory Killer,OOM Killer會根據一些策略Killer有問題的進程,這個進程通常都是占用內存最多的那個。

下面我們用一小段C代碼來實際演示一變量是如何在堆區棧區上分配的,不用擔心,這段代碼非常簡單:

include

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

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

你會發現隨著函數的調用,棧是不斷在擴大的,當f2,f1執行完畢返回main時就是如下圖所示的樣子。

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

這個過程中我們還會發現一個很有意思的現象就是最先被使用的棧幀其實是最后才被釋放的,這種先進后出的性質就被稱之為“棧”,如下圖所示。所以你會看到“棧“這個詞更多的是指順序上的先進后出,只不過函數調用時所占用的內存在使用方式上也是先進后出的,所以這塊內存就被稱之為棧區了。

在講解完棧之后,我們來看看堆,不同于像a,b,c這樣存在于棧區上的變量,棧區上的變量可以在函數執行完成后被自動釋放掉,在堆區上的分配內存除非程序員手動調用free,delete明確的告知內存使用完畢,否則這塊內存就會一直被占用而不能用作其它用途,這就是堆區。

你可能會問,什么樣的變量在需要在堆上分配呢,我們知道,函數調用完成后棧上的分配的局部變量會因為棧幀被釋放而不再可用,堆區的存在就是為了解決這個問題,堆區中申請的內存不會因為棧幀的釋放而不再可用,使得變量的生命周期不再局限于某個函數,其生命周期是靠程序員用malloc(new)以及free(delete)來控制的,這樣的變量在使用時可以跨越函數調用。

另外一點值得注意的是,f2函數中我們在堆上申請了一塊內存用來存放整數,但是f2執行完成后并沒有去釋放這塊內存,根據堆的性質我們知道這塊函數在接下來的運行過程中無法再被使用,就好像這塊內存被遺忘了一樣,這就是內存泄漏。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3041

    瀏覽量

    74177
  • 操作系統
    +關注

    關注

    37

    文章

    6859

    瀏覽量

    123502
  • C++
    C++
    +關注

    關注

    22

    文章

    2113

    瀏覽量

    73742
收藏 人收藏

    評論

    相關推薦

    數據顯示:中國程序員是世界最牛的程序員

    根據我們的數據顯示,中國和俄羅斯擁有最具才華的程序員。中國程序員在數學、功能程序設計和數據結構方面超過了世界其他國家的程序員,而俄羅斯程序員
    發表于 12-14 20:33 ?661次閱讀

    用戶和程序員之間的關系

    我曾經說過,程序員不是一般的人,是具有某種超能里的人。但問題是,程序員往往意識不到自己的這種特異功能,在他們的眼里,會認為自己很普通,跟常人一樣,所以,程序員能做到的事情,其他人——比
    的頭像 發表于 11-16 16:10 ?2102次閱讀

    “菜鳥”程序員和“大神”程序員到底有什么區別

    現在社會上有很多程序員,那您是否可想過程序員為什么會有不同的水平?你又是哪一類的程序員?“菜鳥”程序員和“大神”程序員差在哪里?
    的頭像 發表于 05-14 08:48 ?3753次閱讀

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

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

    程序員如何定義

    當了幾年的程序員了,一直都在想一個問題,什么是程序員程序員應該做好那些事情,什么樣的程序員是有素質的程序員?什么樣的
    的頭像 發表于 12-18 14:15 ?2668次閱讀

    菜鳥程序員和大神程序員的差距

    ?你又是哪一類的程序員?“菜鳥”程序員和“大神”程序員差在哪里?真是差在技術上了嗎?那不是差在技術那差在了哪里?
    的頭像 發表于 06-03 15:56 ?2553次閱讀

    什么是程序員

    當了幾年的程序員了,一直都在想一個問題,什么是程序員程序員應該做好那些事情,什么樣的程序員是有素質的程序員?什么樣的
    的頭像 發表于 06-04 16:21 ?9050次閱讀

    程序員的未來

    程序員出路在何方程序員 創業如果你是程序員,也想創業,看看我說的。
    的頭像 發表于 06-12 17:29 ?2976次閱讀

    普通程序員和高級程序員有哪些區別

    從工作的方面來說,普通程序員和高級程序員一般有下面幾個區別:
    的頭像 發表于 09-08 10:47 ?3807次閱讀

    如何定義程序員

    多年以來,黑程序員一直是一項廣大人民群眾喜聞樂見的娛樂活動,我們不僅黑程序員程序員也喜歡自黑,如此一來,大家好像都覺得黑程序員是一項天經地義的事情了,然而事實
    的頭像 發表于 10-28 17:05 ?2749次閱讀

    JAVA程序員和C程序員有什么區別

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

    優秀程序員與糟糕程序員的變現差異

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

    程序員的類型

    今天來聊個有趣的話題,你是什么類型的程序員? 在學校里或在公司里,你是不是接觸過不少其他的程序員,有沒有發現,雖然同屬程序員科, 但也有眾多的不同。 今天我就來給程序員分個類,看看你是
    的頭像 發表于 11-28 16:39 ?4724次閱讀

    每個程序員都應該知道的內存

    。不幸的是,兩者都沒有使用計算機的內存子系統或CPU的緩存的結構和成本大多數程序員都很理解。本文解釋了現代商品硬件使用的內存子系統的結構
    發表于 11-23 16:55 ?0次下載

    程序員眼里內存(下)

    在各種編程語言中我們應該經常聽到兩個詞,那就是引用或者指針。這兩個詞都是和內存相關的,指針和引用的作用都是“如何找到存放在內存的數據”。
    的頭像 發表于 02-24 14:12 ?343次閱讀
    <b class='flag-5'>程序員</b><b class='flag-5'>眼里</b>的<b class='flag-5'>內存</b>(下)
    主站蜘蛛池模板: 亚洲福利一区福利三区| 中国三级视频| 日本色www| 天堂bt在线网bt| 三级视频中文字幕| 欧美精品成人久久网站| 奇米77| 久久久久久久综合色一本| 国产毛片农村妇女aa板| 97人人艹| 开心激情五月网| 韩国床戏合集三小时hd中字| 国产资源在线播放| www射射一区| 六月婷婷在线视频| 国内a级毛片免费···| brazzersvideosex欧美最| 天天干天天干天天色| 中国美女一级黄色片| 午夜精品视频在线看| 圆胖肥女人性视频| 天天夜天天干| bt天堂网在线| 黄网站在线观看视频| 五月情视频在线观看| 免费人成网址在线观看国内| 欧美有码视频| 韩国三级久久精品| 天天射天天干天天色| 国产午夜精品久久久久免费视小说 | 午夜寂寞影院视频观看| 久久天天综合| 免费操人视频| 能直接看黄的网站| 都市禁忌猎艳风流美妇| 免费爱做网站在线看| 婷婷色婷婷| 美女网站在线观看视频18| sihu免费观看在线高清| 黄色成人免费网站| 国内自拍2021|