色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美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:12 ? 次閱讀

本節(jié)是操作系統(tǒng)系列教程的第三篇文章,屬于操作系統(tǒng)第一章即基礎(chǔ)篇,在真正開始操作系統(tǒng)相關(guān)章節(jié)前在這一部分回顧一些重要的主題,以下是目錄,由于本文篇幅較多因此按上篇、中篇、下篇三次發(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é)


指針與引用

在各種編程語(yǔ)言中我們應(yīng)該經(jīng)常聽到兩個(gè)詞,那就是引用或者指針。這兩個(gè)詞都是和內(nèi)存相關(guān)的,指針和引用的作用都是“如何找到存放在內(nèi)存上的數(shù)據(jù)”。

C/C++中有“指針”這樣一個(gè)概念,而其它語(yǔ)言比如Java、Python有的只是“引用”這樣一個(gè)概念。這兩者有什么區(qū)別呢?我們打個(gè)比方你就能理解了。

“引用”就好比一個(gè)人的外號(hào)一樣,就好有個(gè)程序員叫令狐沖,但是令狐沖同學(xué)在A公司的英文名可能是“Tom”,在B公司中可能又叫“Jerry”,那么在A公司中你只需要喊一聲“Tom”就能找到令狐沖同學(xué)。

而“指針”強(qiáng)調(diào)的是位置,比如令狐沖在A公司的工位是“10排第二個(gè)”,在B公司中的工位是“8排第六個(gè)”,下班后回的位置在“中關(guān)村”。

這個(gè)例子當(dāng)中的令狐沖同學(xué)就好比程序語(yǔ)言中的對(duì)象,令狐沖的各種外號(hào)就好比對(duì)象的引用,令狐沖當(dāng)前所在的位置就好比對(duì)象的指針。

雖然通過(guò)“引用”和“指針”都能找到令狐沖同學(xué),但是尋找的方式是不一樣的。

只有C/C++這樣的編譯型語(yǔ)言才會(huì)有“指針”這樣一個(gè)概念,指的是當(dāng)前的對(duì)象放在了內(nèi)存中的哪個(gè)位置上了。在比如Java、Python等語(yǔ)言中只有“引用”這樣一個(gè)概念。

在C/C++語(yǔ)言中,我們可以通過(guò)指針直接找到一個(gè)對(duì)象,因?yàn)槟阒肋@個(gè)對(duì)象就在內(nèi)存中指針?biāo)赶虻奈恢茫贘ava、Python等語(yǔ)言中,當(dāng)你利用引用找到對(duì)象時(shí)基本上是沖著解釋器喊一句“Hey,解釋器,幫我找到令狐沖這個(gè)對(duì)象”,解釋器通過(guò)記錄查找到這個(gè)對(duì)象,注意解釋器是知道對(duì)象在內(nèi)存中的真正位置的,由于直接管理內(nèi)存是一項(xiàng)非常繁瑣容易出錯(cuò)的事情(C/C++程序員一定對(duì)此有深刻體會(huì)),因此解釋器就接手了對(duì)內(nèi)存直接管理, Java、Python等程序員是沒(méi)有必要知道對(duì)象在內(nèi)存中的真正位置的 ,沒(méi)有指針也可以開心的寫程序而且程序更加健壯,何樂(lè)不為呢,因此這些語(yǔ)言中是沒(méi)有指針這樣一個(gè)概念。

Sun的一篇論文中提到了為什么Java里沒(méi)有指針。

Most studies agree that pointers are one of the primary features that enable programmers to inject bugs into their code. Given that structures are gone, and arrays and strings are objects, the need for pointers to these constructs goes away. Thus, Java has no pointer data types. ...

You no longer have dangling pointers and trashing of memory because of incorrect pointers, because there are no pointers in Java.

大意是Java設(shè)計(jì)者認(rèn)為指針太有技巧性以至于很容易出錯(cuò),因此Java中沒(méi)有指針。其實(shí)不只是Java,流行的語(yǔ)言當(dāng)中除了C/C++之外幾乎都沒(méi)有指針。

在這一節(jié)中,你只需要理解以下兩點(diǎn)就可以啦。

  • 指針:直接在內(nèi)存中找到變量所在位置。所以指針是實(shí)實(shí)在在的內(nèi)存地址。
  • 引用:告訴解釋器你想使用的變量,然后解釋器再去內(nèi)存中找到變量的位置。所以引用只是解釋器的一個(gè) 承諾 ,只要這個(gè)變量存在,解釋器就承諾能找到這個(gè)變量,程序員就可以使用這個(gè)變量,至于這個(gè)變量在內(nèi)存中的什么地方是不需要程序員關(guān)心的。
進(jìn)程的內(nèi)存模型

我們已經(jīng)在前面幾個(gè)小節(jié)中研究了C/C++以及Java、Python程序的內(nèi)存模型,接下來(lái)讓我們回到操作系統(tǒng)。

我們已經(jīng)知道了,不管什么語(yǔ)言,最后操作系統(tǒng)看到的都是C程序,C程序在內(nèi)存運(yùn)行起來(lái)就是進(jìn)程。而在前面的小節(jié)當(dāng)中我們已經(jīng)知道進(jìn)程在內(nèi)存中的樣子,但那里的描述其實(shí)是不完整的,也是不準(zhǔn)確的。接下里我們就來(lái)看一下,操作系統(tǒng)中的進(jìn)程在內(nèi)存中到底是什么樣子的,如下圖所示(注意這幅圖描述的是32位操作系統(tǒng)下進(jìn)程在內(nèi)存中是什么樣子的),我們需要注意以下幾點(diǎn):

  1. 在上圖中多出了一塊內(nèi)存,注意,這塊內(nèi)存就是操作系統(tǒng)在運(yùn)行的時(shí)候所占用的內(nèi)存。
  2. 每個(gè)進(jìn)程獨(dú)占一個(gè)連續(xù)的4G大小的內(nèi)存,從內(nèi)存地址0開始,一直到0xffffffff,其中最上方的1G留給了操作系統(tǒng)使用,下方的3G是留給進(jìn)程自己使用的,其中程序員可以操作的區(qū)域就是圖中的堆區(qū)和棧區(qū)。
  3. 你會(huì)發(fā)現(xiàn)代碼段下方也有一點(diǎn)空隙沒(méi)有使用,其實(shí)這是有特殊目的的,具體用途會(huì)在后面的章節(jié)中講解。

現(xiàn)在你已經(jīng)知道了進(jìn)程在內(nèi)存中的樣子,你一定會(huì)有疑問(wèn)吧,

為什么每個(gè)進(jìn)程認(rèn)為自己占用的是4G內(nèi)存呢? 如果我的PC上只有2G內(nèi)存,進(jìn)程還是認(rèn)為自己擁有4G內(nèi)存嗎

操作系統(tǒng)上不是可以同時(shí)運(yùn)行很多進(jìn)程嗎,內(nèi)存是有限的,假如只有2G, 每個(gè)進(jìn)程都認(rèn)為自己擁有4G內(nèi)存,這不會(huì)有問(wèn)題嗎

我們首先來(lái)回答第一個(gè)問(wèn)題:是的,每個(gè)進(jìn)程都認(rèn)為計(jì)算機(jī)上的真實(shí)內(nèi)存就是4G,而且是進(jìn)程自己獨(dú)占的,即使真正的物理內(nèi)存只有256MB。

第二個(gè)問(wèn)題:很顯然,不管你現(xiàn)在看這篇文章用的電腦,iPad安卓手機(jī)還是iPhone,這些計(jì)算設(shè)備中的進(jìn)程都是這么認(rèn)為的,你能看到這篇文章說(shuō)明進(jìn)程認(rèn)為自己擁有4G內(nèi)存是不會(huì)出現(xiàn)問(wèn)題的。

在這里需要再次強(qiáng)調(diào)的是:

每個(gè)進(jìn)程都認(rèn)為真實(shí)的內(nèi)存就是4G,其中1G被操作系統(tǒng)使用,剩余部分被進(jìn)程使用,也就是可以被程序員使用。 注意這是不受真實(shí)物理內(nèi)存限制的 ,也就是說(shuō),即使真實(shí)的物理只有256MB,進(jìn)程同樣認(rèn)為在內(nèi)存是4G,其中1G是操作系統(tǒng)的,剩余3G是進(jìn)程自己獨(dú)占的,程序員依然可以按照內(nèi)存大小是3G來(lái)寫程序。所以在大小256MB的真實(shí)物理內(nèi)存上,程序員依然可以一次性申請(qǐng)超過(guò)256MB的內(nèi)存而且可以申請(qǐng)成功,后續(xù)內(nèi)存的使用也不受影響。

就像我第一次知道這種魔法時(shí)一樣,你肯定也會(huì)驚呼這怎么可能呢? 我們?cè)趺茨茉?56MB大小的內(nèi)存上申請(qǐng)超過(guò)256MB的內(nèi)存呢 ?但事實(shí)就是如此,你可以在物理內(nèi)存大小為256MB的內(nèi)存上面申請(qǐng)超過(guò)256MB的內(nèi)存,而且無(wú)論物理內(nèi)存大小,每個(gè)進(jìn)程都認(rèn)為自己擁有4G內(nèi)存,而且是獨(dú)占內(nèi)存。

這真的是太神奇了,這就是本課程的主角-操作系統(tǒng)帶來(lái)的神奇魔法。

幻象大師——操作系統(tǒng)

這種魔法確實(shí)是真實(shí)的,這個(gè)魔法就來(lái)自我們的幻象大師- 操作系統(tǒng) ,其實(shí)進(jìn)程看到的內(nèi)存是操作系統(tǒng)制造的幻覺(jué)。操作系統(tǒng)讓每個(gè)進(jìn)程都認(rèn)為內(nèi)存就只有兩部分,一部分是操作系統(tǒng)的一部分是自己的,這種魔法就稱之為虛擬內(nèi)存。后面的章節(jié)中會(huì)重點(diǎn)介紹操作系統(tǒng)是如何實(shí)現(xiàn)這種魔法的。

在虛擬內(nèi)存上程序員分配內(nèi)存不受真實(shí)物理內(nèi)存大小的限制

但這僅僅是進(jìn)程自己這么認(rèn)為,這是操作系統(tǒng)給進(jìn)程制造的幻覺(jué),所以被稱之為虛擬內(nèi)存。虛擬內(nèi)存是操作系統(tǒng)中極為重要的概念,和進(jìn)程一樣,對(duì)虛擬內(nèi)存的深刻理解也是編程高手的標(biāo)志之一。我會(huì)在后續(xù)文章中來(lái)為大家透徹講解操作系統(tǒng)是如何做到的。

總結(jié)

哈哈,這真是比較長(zhǎng)的一節(jié),希望你能堅(jiān)持學(xué)到這里,沒(méi)辦法,內(nèi)存真的是非常重要的, 要想學(xué)好操作系統(tǒng),對(duì)內(nèi)存的透徹理解是必不可少的

在這一節(jié)中我們認(rèn)識(shí)到了其實(shí)內(nèi)存僅僅就是一堆裝0或1的小盒子組成,是沒(méi)有什么神秘的。我們也了解了C/C++、Java、Python程序的內(nèi)存模型,也知道了操作系統(tǒng)中的進(jìn)程在內(nèi)存中是什么樣子的。同時(shí)操作系統(tǒng)中被被稱為虛擬內(nèi)存的神奇魔法也著實(shí)讓人驚嘆,想學(xué)習(xí)這么魔法請(qǐng)繼續(xù)關(guān)注操作系統(tǒng)系列文章。

聲明:本文內(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

    文章

    3052

    瀏覽量

    74247
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1950

    瀏覽量

    34922
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4807

    瀏覽量

    84976
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

    程序員如何定義

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

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

    剛剛走出就業(yè)的程序員,技術(shù)是剛剛起步的基點(diǎn)。那下面我們就聊一聊有關(guān)技術(shù)的東西。首先請(qǐng)您先想想這幾個(gè)問(wèn)題。現(xiàn)在社會(huì)上有很多程序員,CSDN就是我們程序員的家,那您是否可想過(guò)程序員為什么會(huì)
    的頭像 發(fā)表于 06-03 15:56 ?2574次閱讀

    什么是程序員

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

    程序員的未來(lái)

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

    為什么要成為高級(jí)程序員

    程序員到高級(jí)程序員的職業(yè)生涯要經(jīng)歷以下幾個(gè)階段:初級(jí)程序員、中級(jí)程序員、最后是高級(jí)程序員
    的頭像 發(fā)表于 07-11 16:51 ?2469次閱讀

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

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

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

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

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

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

    優(yōu)秀程序員的標(biāo)準(zhǔn)有哪些

    每個(gè)程序員都想知道自己是不是一個(gè)優(yōu)秀的程序員,那么,就參考一下面這10 條,看看自己是否達(dá)到了一個(gè)優(yōu)秀程序員的標(biāo)準(zhǔn)。
    的頭像 發(fā)表于 11-15 16:15 ?3318次閱讀

    程序員最大的失敗是什么

    程序員最大的失敗就是認(rèn)為自己是好的程序員
    的頭像 發(fā)表于 11-18 16:26 ?3260次閱讀

    程序員的類型

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

    程序員為什么經(jīng)常加班

    有人說(shuō),程序員就是把咖啡變成代碼的機(jī)器。我想說(shuō),程序員就是滿天星辰敲著代碼、喝咖啡的單身狗。
    的頭像 發(fā)表于 01-14 14:53 ?6090次閱讀

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

    隨著CPU內(nèi)核變得更快和更多,大多數(shù)程序的限制因素是現(xiàn)在,也將是一段時(shí)間,內(nèi)存訪問(wèn)。硬件設(shè)計(jì)師已經(jīng)想出了更復(fù)雜的內(nèi)存處理和加速技術(shù)(如CPU緩存),但是如果沒(méi)有程序員的幫助,這些功能就
    發(fā)表于 11-23 16:55 ?0次下載
    主站蜘蛛池模板: 久久婷婷五月综合色丁香 | 岛国大片在线播放免费 | 久久只有这里有精品4 | 日本无修肉动漫在线观看 | 奇米网一区二区三区在线观看 | 狠狠婷婷综合久久久久久 | 国产福利视频第一导航 | 一天不停的插BB十几次 | 色多多旧版污污破解版 | 日韩午夜中文字幕电影 | 中国大陆一级毛片免费 | 日本美女抠逼 | 超级最爽的乱淫片免费 | 护士12p | 旧里番ovaの催○セイ活指导 | 中文字幕专区高清在线观看 | 久久精品视频免费 | YELLOW日本动漫高清免费 | 国产精品一区二区制服丝袜 | 中文字幕视频在线免费观看 | 亚洲男人天堂网 | 国产亚洲精品久久精品69 | 成人影院久久久久久影院 | 日本工口生肉全彩大全 | 被同桌摸出水来了好爽的视频 | 伊人久久综在合线亚洲 | 免费观看成人毛片 | 飘雪在线观看免费完整版 | 国产午夜亚洲精品理论片八戒 | 国产亚洲精品久久久久久国模美 | 一边吃奶一边啪啪真舒服 | 国产AV精品无码免费看 | 涩涩涩涩爱网站 | 在线免费公开视频 | 久久黄色小视频 | 国模精品一区二区三区视频 | 高干紧射H后入 | 久久久免费观成人影院 | 中文字幕爆乳JULIA女教师 | 大岛优香久久中文字幕 | 欧美亚洲国产免费高清视频 |