日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从几个角度谈谈内存的管理和划分

發布時間:2023/12/19 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从几个角度谈谈内存的管理和划分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.從操作系統的角度

操作系統管理內存是作為開發者認識內存最基本的起點,對于windows 操作系統與Linux系統是通過對內存分頁或者分段劃分和管理的(Windows一個分頁是4KB),這是為了讓操作系統很快的尋址和管理。當然對于分頁的尋址和回收也有自己各種各樣的算法,每款系統都有自己的算法,這里就不多講了(你可以在其他資料上面看到關于不同系統對于內存的管理,回收的原理和算法)。對于內核級別而言,內存是按片管理,內核中也有執行的內核線程和方法棧;但是對于用戶空間級別我們討論代碼和數據區才更加有意義。一般內存加載系統之后,系統占有的部分和應用占有分配的內存空間是獨立分開的,除非應用調度系統的資源。

Linux和Windows系統對于其用戶應用(用戶空間)而言,主要有堆,棧,方法區和數據區。可參考《程序員的修養,連接加載與庫》

二.從進程的角度

進程是直接從操作系統獲取的內存空間,也是開發者角度的上內存管理劃分。

1.棧

對于程序員而言,聽到棧應該是很多的,但是是不是很是理解呢?

首先要知道棧是什么樣的數據結構 -- 順序結構,或者是存儲序列,只是先壓棧最后彈棧罷了。(堆是鏈表,不連續的)

一般在棧里面存儲的數據是基本數據類型(int char double 等)和 指針句柄類型。一個棧結構對應的就是一個方法的指令!棧是對方法的指令的存儲和指令管理。

棧一般不是程序員(開發者)控制的,它是編譯器或者系統分配的,那么如果是編譯環境控制的,我們認為能不能在編譯環境設置或者編碼設定呢?那么這要具體根據開發環境了或者說開發語言支不支持。對于 Windows一般分配的棧是2M。對于c#開發語言,我們可以在vs環境里面設置(#param comment clinker,"stack": 10000000?? 10M),但是對于c、c++語言我沒有了解過是否支持設置。

對于Android系統每一個進程是一個虛擬機-dalvik,Android系統對于2.0x版本分配給應用UI線程的棧大小是8kb,4.0x是16kb,注意這里是UI主線,包含視圖句柄和其他的數據。其他的線程可能還要分配的棧空間,這些棧空間加在一起就是虛擬機對應用分配的棧空間,或者系統對虛擬機分配的棧空間(每個應用就是跑起來的虛擬機)。

2.堆

它才是我們程序員天天打交道的東西,我們有權對其開發和回收。(尤其是面對對象編程,每一個對象幾乎都是放在堆上面 "new 出來")

堆是鏈表結構,不是連續的。

在堆上面可以存儲全局變量或者對象(對象包含自己的成員變量和方法)

當然不同的系統 對堆的限制也不一樣,對于Android系統而言貌似是限制在256M,對于Windows系統貌似只要你的內存夠大,你可以隨意的開發。

3.數據區(包含靜態變量,常量,全局變量)

靜態存儲

static聲明的變量或者方法或者常量

和系統沒有什么關系,系統不關心什么static,只是編譯器關心的,要么自己搞一個static區域或者直接在堆中保存。因為有的語言在編譯的過程中,直接將static存儲在堆,沒有所謂的static區域,只是其生命周期是伴隨整個應用。

常量

即常量的保存區域

和系統沒有什么關系,系統不關心什么常量,只是編譯器關心的,要么自己搞一個常量區域或者直接在堆中保存。因為有的語言在編譯的過程中,直接將常量存儲在堆。


還有一個概念--代碼區

4.代碼區

也許很人也聽說這個名詞,其實這個概念就不涉及什么內存的劃分,這個概念應該是操作系統的東西。

我們知道開啟一個應用,對于系統而言就是創建一個進程,(進程里面可能包含一個或者在多個線程,那就看你的應用是多線程的還是多線程的)進程是由三部分組成:sp,pcb和代碼區。pcb是程序控制模塊,sp是指令計數器,代碼區就是這個應用要執行的指令和數據,換句話說就是你具體要干的什么事。代碼區的數據和指令就是要在棧和堆里面創建的數據和執行的指令。

如果你開好幾個應用,并行執行,比如你在聽歌又在敲代碼,那么屬于不同進程的多線程,CPU在不同的時間片上切換不同的線程(時間片20ms).

注意:同一進程的多線程之間可以共享數據,但是不同進程中的線程不能共享數據


上面所說的似乎閱讀起來是從系統方面和編譯器方面對內存管理做了角度敘述,但是說回來,編譯環境對內存進行劃分還是基于系統的,所以本質上還是系統對內存進行的劃分。之所以上面這樣劃分形式的闡述是為了加強一個應用從誕生的角度(編碼)理解內存和相關數據的生命周期。

系統起一個進程,分配了內存空間,進而也會更細化的對線程數據和指令存儲進行劃分,這進一步的劃分是根據生命周期和作用域。


總結

以上是生活随笔為你收集整理的从几个角度谈谈内存的管理和划分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。