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

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

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

3天內不再提示

程序員眼里的內存(下)

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

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


什么是內存

C/C++內存模型

堆區與棧區的本質

JavaPython等內存模型

Java內存模型

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

Python內存模型

指針與引用

**進程的內存模型

**

**幻想大師-操作系統

**

總結


指針與引用

在各種編程語言中我們應該經常聽到兩個詞,那就是引用或者指針。這兩個詞都是和內存相關的,指針和引用的作用都是“如何找到存放在內存上的數據”。

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

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

而“指針”強調的是位置,比如令狐沖在A公司的工位是“10排第二個”,在B公司中的工位是“8排第六個”,下班后回的位置在“中關村”。

這個例子當中的令狐沖同學就好比程序語言中的對象,令狐沖的各種外號就好比對象的引用,令狐沖當前所在的位置就好比對象的指針。

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

只有C/C++這樣的編譯型語言才會有“指針”這樣一個概念,指的是當前的對象放在了內存中的哪個位置上了。在比如Java、Python等語言中只有“引用”這樣一個概念。

在C/C++語言中,我們可以通過指針直接找到一個對象,因為你知道這個對象就在內存中指針所指向的位置,但在Java、Python等語言中,當你利用引用找到對象時基本上是沖著解釋器喊一句“Hey,解釋器,幫我找到令狐沖這個對象”,解釋器通過記錄查找到這個對象,注意解釋器是知道對象在內存中的真正位置的,由于直接管理內存是一項非常繁瑣容易出錯的事情(C/C++程序員一定對此有深刻體會),因此解釋器就接手了對內存直接管理, Java、Python等程序員是沒有必要知道對象在內存中的真正位置的 ,沒有指針也可以開心的寫程序而且程序更加健壯,何樂不為呢,因此這些語言中是沒有指針這樣一個概念。

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

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設計者認為指針太有技巧性以至于很容易出錯,因此Java中沒有指針。其實不只是Java,流行的語言當中除了C/C++之外幾乎都沒有指針。

在這一節中,你只需要理解以下兩點就可以啦。

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

我們已經在前面幾個小節中研究了C/C++以及Java、Python程序的內存模型,接下來讓我們回到操作系統。

我們已經知道了,不管什么語言,最后操作系統看到的都是C程序,C程序在內存運行起來就是進程。而在前面的小節當中我們已經知道進程在內存中的樣子,但那里的描述其實是不完整的,也是不準確的。接下里我們就來看一下,操作系統中的進程在內存中到底是什么樣子的,如下圖所示(注意這幅圖描述的是32位操作系統下進程在內存中是什么樣子的),我們需要注意以下幾點:

  1. 在上圖中多出了一塊內存,注意,這塊內存就是操作系統在運行的時候所占用的內存。
  2. 每個進程獨占一個連續的4G大小的內存,從內存地址0開始,一直到0xffffffff,其中最上方的1G留給了操作系統使用,下方的3G是留給進程自己使用的,其中程序員可以操作的區域就是圖中的堆區和棧區。
  3. 你會發現代碼段下方也有一點空隙沒有使用,其實這是有特殊目的的,具體用途會在后面的章節中講解。

現在你已經知道了進程在內存中的樣子,你一定會有疑問吧,

為什么每個進程認為自己占用的是4G內存呢? 如果我的PC上只有2G內存,進程還是認為自己擁有4G內存嗎

操作系統上不是可以同時運行很多進程嗎,內存是有限的,假如只有2G, 每個進程都認為自己擁有4G內存,這不會有問題嗎

我們首先來回答第一個問題:是的,每個進程都認為計算機上的真實內存就是4G,而且是進程自己獨占的,即使真正的物理內存只有256MB。

第二個問題:很顯然,不管你現在看這篇文章用的電腦,iPad安卓手機還是iPhone,這些計算設備中的進程都是這么認為的,你能看到這篇文章說明進程認為自己擁有4G內存是不會出現問題的。

在這里需要再次強調的是:

每個進程都認為真實的內存就是4G,其中1G被操作系統使用,剩余部分被進程使用,也就是可以被程序員使用。 注意這是不受真實物理內存限制的 ,也就是說,即使真實的物理只有256MB,進程同樣認為在內存是4G,其中1G是操作系統的,剩余3G是進程自己獨占的,程序員依然可以按照內存大小是3G來寫程序。所以在大小256MB的真實物理內存上,程序員依然可以一次性申請超過256MB的內存而且可以申請成功,后續內存的使用也不受影響。

就像我第一次知道這種魔法時一樣,你肯定也會驚呼這怎么可能呢? 我們怎么能在256MB大小的內存上申請超過256MB的內存呢 ?但事實就是如此,你可以在物理內存大小為256MB的內存上面申請超過256MB的內存,而且無論物理內存大小,每個進程都認為自己擁有4G內存,而且是獨占內存。

這真的是太神奇了,這就是本課程的主角-操作系統帶來的神奇魔法。

幻象大師——操作系統

這種魔法確實是真實的,這個魔法就來自我們的幻象大師- 操作系統 ,其實進程看到的內存是操作系統制造的幻覺。操作系統讓每個進程都認為內存就只有兩部分,一部分是操作系統的一部分是自己的,這種魔法就稱之為虛擬內存。后面的章節中會重點介紹操作系統是如何實現這種魔法的。

在虛擬內存上程序員分配內存不受真實物理內存大小的限制

但這僅僅是進程自己這么認為,這是操作系統給進程制造的幻覺,所以被稱之為虛擬內存。虛擬內存是操作系統中極為重要的概念,和進程一樣,對虛擬內存的深刻理解也是編程高手的標志之一。我會在后續文章中來為大家透徹講解操作系統是如何做到的。

總結

哈哈,這真是比較長的一節,希望你能堅持學到這里,沒辦法,內存真的是非常重要的, 要想學好操作系統,對內存的透徹理解是必不可少的

在這一節中我們認識到了其實內存僅僅就是一堆裝0或1的小盒子組成,是沒有什么神秘的。我們也了解了C/C++、Java、Python程序的內存模型,也知道了操作系統中的進程在內存中是什么樣子的。同時操作系統中被被稱為虛擬內存的神奇魔法也著實讓人驚嘆,想學習這么魔法請繼續關注操作系統系列文章。

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

    關注

    8

    文章

    3041

    瀏覽量

    74177
  • 編程語言
    +關注

    關注

    10

    文章

    1949

    瀏覽量

    34850
  • python
    +關注

    關注

    56

    文章

    4801

    瀏覽量

    84865
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    程序員如何定義

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

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

    剛剛走出就業的程序員,技術是剛剛起步的基點。那下面我們就聊一聊有關技術的東西。首先請您先想想這幾個問題。現在社會上有很多程序員,CSDN就是我們程序員的家,那您是否可想過程序員為什么會
    的頭像 發表于 06-03 15:56 ?2553次閱讀

    什么是程序員

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

    程序員的未來

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

    為什么要成為高級程序員

    程序員到高級程序員的職業生涯要經歷以下幾個階段:初級程序員、中級程序員、最后是高級程序員
    的頭像 發表于 07-11 16:51 ?2456次閱讀

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

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

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

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

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

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

    優秀程序員的標準有哪些

    每個程序員都想知道自己是不是一個優秀的程序員,那么,就參考一下面這10 條,看看自己是否達到了一個優秀程序員的標準。
    的頭像 發表于 11-15 16:15 ?3285次閱讀

    程序員最大的失敗是什么

    程序員最大的失敗就是認為自己是好的程序員
    的頭像 發表于 11-18 16:26 ?3240次閱讀

    程序員的類型

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

    程序員為什么經常加班

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

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

    隨著CPU內核變得更快和更多,大多數程序的限制因素是現在,也將是一段時間,內存訪問。硬件設計師已經想出了更復雜的內存處理和加速技術(如CPU緩存),但是如果沒有程序員的幫助,這些功能就
    發表于 11-23 16:55 ?0次下載
    主站蜘蛛池模板: www.激情网.com| 日日爱网址| 韩国免费人成在线观看网站| 国产美女视频爽爽爽| 成人丁香婷婷| 欧美在线一级视频| 日韩毛片在线影视| 欧美一级欧美一级高清| 九九re| 一品毛片| 色综合天天综合网国产国产人 | 8000av在线| 天天插日日干| 久操视频在线免费观看| 天天搞夜夜爽| 美女和美女| 性猛交毛片| 狠狠色噜噜狠狠狠狠999米奇| 亚洲国产欧美视频| 在线五月婷婷| 性欧美暴力猛交69hd| 日本一区二区三区四区在线观看| 五月婷婷激情五月| 一区二区三区四区精品| 婷婷激情综合五月天| 欧美一级黄色录相| 国产在线精品美女观看| 亚洲黄色录像| 黄色福利站| 高清一级片| 国产成人影视| 影音先锋午夜资源网站| 伊人草| 免费的国语一级淫片| 美女视频黄色的免费| 爱爱免费网址| 夜夜操操操| 国产自产视频在线观看香蕉| 亚洲欧美视频一区二区| 亚洲精品自拍区在线观看| 免费恐怖片|