標籤: 公衆號文章程序員
內存對於用戶來講就是一個字節數組,咱們能夠根據地址來訪問到某個字節或者某些字節10⁴
:編程
好久好久以前,一臺機器上只放置一個程序,操做系統僅僅做爲一個函數庫存在。對於內存來講,除去操做系統的代碼和數據佔用的一些空間外,其他空間所有分配給正在運行的那個程序,畫個圖就是這樣:數組
小貼士: 咱們把運行着的程序稱之爲進程。 函數
後來人們以爲同時在一臺計算機上只運行一個程序太虧了,就設計了一個能夠同時運行多個程序的機制。不過內存條只有一個,因此這些用戶程序只能共享同一個內存條,只能把內存的不一樣部分劃分給不一樣的用戶程序,畫個圖就像是這樣:操作系統
這樣子的話也有一些問題:設計
不一樣用戶程序只能使用給他們規定好的那部份內存,也就是程序員在敲代碼的時候就應該當心翼翼的計算本身使用的內存有沒有佔到別人家的地兒,這樣對碼農很不友好有木有。code
若是哪一個心眼兒壞的傢伙故意去讀取別人家的程序使用的內存,這不就暴露了麼,更嚴重的,這個壞傢伙直接把別人家程序正在使用的內存的某些字節給更新掉,這就是天坑了~cdn
能使用的內存空間都給規定好了,太少了有木有~blog
操做系統是個老好人,使命就是解決全部用戶感到麻煩的事情。設計操做系統的大叔以爲,若是讓用戶直接去操做內存的話,用戶也不知道其餘人到底使用了內存的哪些字節,本身可使用哪些字節,若是要作到這一點的話人們在開發程序的時候還要聚到一塊兒開個會,把每一個人該用哪塊內存都規定好,即便規定好了用戶還得當心翼翼的避免使用了不屬於本身的那部份內存。乾脆,乾脆就不讓用戶直接操做內存了,讓用戶在編程序的時候直接把內存想象成一個很是很是大的字節數組就行了,,本身在這個字節數組上能夠隨便折騰,他們把這個很是大的字節數組稱之爲虛擬內存
,由操做系統完成從虛擬內存的虛擬地址到真實內存的真實地址之間的映射工做。畫個圖就像這樣:進程
這樣還有問題,用戶愈來愈多,即便每一個用戶都使用很是少的內存空間,那加起來佔用的內存空間均可能超過了真實內存的大小,更況且某些喪心病狂的程序員寫的程序裏自己就使用了超過真正內存大小的空間,這可怎麼辦。這難不倒設計操做系統的大叔們,他們機智的把硬盤也拉了進來。
操做系統完成由虛擬內存地址到真實內存地址或者磁盤地址之間的映射工做,這樣子給用戶提供的虛擬內存的地址空間就能夠很是很是大,用戶程序中那些好久都用不到的內存空間能夠被操做系統給搞到磁盤上邊存儲,何時須要用了,又從磁盤中加載到真實內存中,重要的是這個過程所有是操做系統自動完成的,對於咱們這些碼農來講,編寫程序就像是在一個炒雞大的字節數組上將某個地方的數據搬到另外一個地方,或者將某個地方的數據通過CPU的某種加工以後再放到某個字節數組的某個地方,整個過程so easy,徹底不用擔憂有沒有讀取/覆蓋掉別人正在使用的內存空間。
小貼士: 對於Windows操做系統來講,虛擬內存所需的磁盤空間從系統盤,通常是C盤分配,當你的C盤剩餘空間不多時就會致使很卡~
咱們說對於敲代碼的碼農來講,虛擬內存
就是一個超級大的字節數組,不過這個字節數組也是被劃分爲多個部分的,並非每一個地方用戶均可以訪問,通常的虛擬內存結構長這樣:
用戶須要調用函數的時候,通常都會生成一個稱之爲棧幀
的結構,從而致使虛擬內存中的棧空間
增加。
用戶須要單獨申請內存空間時,就會從堆空間分配,從而致使虛擬內存中的堆空間
增加。
這裏須要強調的一點是,咱們平時所說的操做系統內核
不是一個進程,而是指操做系統的代碼。
不知不覺我以爲超過了一分鐘,下次再見~
小貼士: 作個預報,關於虛擬內存的實現,也就是操做系統怎麼把虛擬內存的地址映射到真是內存地址以及磁盤地址的,這個就須要炒雞長的篇幅啦,哈哈,敬請期待《計算機是怎樣運行的》。
寫文章挺累的,有時候你以爲閱讀挺流暢的,那實際上是背後無數次修改的結果。若是你以爲不錯請幫忙轉發一下,萬分感謝~ 這裏是個人公衆號「咱們都是小青蛙」,裏邊有更多技術乾貨,時不時扯一下犢子,歡迎關注: