A. win10系統,怎麼增加分配給某個程序的物理內存
系統是動態分配內存的,小軟體不佔內存,所以1G足夠運行。
B. 操作系統執行可執行程序時,內存分配是怎樣的
在操作系統中,一個進程就是處於執行期的程序(當然包括系統資源),實際上正在執行的程序代碼的活標本。那麼進程的邏輯地址空間是如何劃分的呢?
圖1做了簡單的說明(Linux系統下的):
圖一
左邊的是UNIX/LINUX系統的執行文件,右邊是對應進程邏輯地址空間的劃分情況。
一般認為在c中分為這幾個存儲區: 1. 棧 --有編譯器自動分配釋放 2. 堆 -- 一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收 3. 全局區(靜態區) -- 全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域,未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。程序結束釋放。 4. 另外還有一個專門放常量的地方。程序結束釋放。 在函數體中定義的變數通常是在棧上,用malloc, calloc, realloc等分配內存的函數分配得到的就是在堆上。在所有函數體外定義的是全局量,加了static修飾符後不管在哪裡都存放在全局區(靜態區),在所有函數體外定義的static變數表示在該文件中有效,不能extern到別的文件用,在函數體內定義的static表示只在該函數體內有效。另外,函數中的"adgfdf"這樣的字元串存放在常量區。比如:代碼:
int a = 0; //全局初始化區
char *p1; //全局未初始化區
main(){
int b; //棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; //123456 在常量區,p3在棧上。
static int c = 0; //全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得來得10和20位元組的區域就在堆區。
strcpy(p1, "123456");//123456 放在常量區,編譯器可能會將它與p3所指向 的"123456"優化成一塊。
}
還有就是函數調用時會在棧上有一系列的保留現場及傳遞參數的操作。 棧的空間大小有限定,vc的預設是2M。棧不夠用的情況一般是程序中分配了大量數組和遞歸函數層次太深。有一點必須知道,當一個函數調用完返回後它會釋放該函數中所有的棧空間。棧是由編譯器自動管理的,不用你操心。 堆是動態分配內存的,並且你可以分配使用很大的內存。但是用不好會產生內存泄漏。並且頻繁地malloc和free會產生內存碎片(有點類似磁碟碎片),因為c分配動態內存時是尋找匹配的內存的。而用棧則不會產生碎片。 在棧上存取數據比通過指針在堆上存取數據快些。 一般大家說的堆棧和棧是一樣的,就是棧(stack),而說堆時才是堆heap. 棧是先入後出的,一般是由高地址向低地址生長。
堆(heap)和堆棧(stack)的區別
2.1申請方式stack:由系統自動分配。 例如,聲明在函數中一個局部變數 int b; 系統自動在棧中為b開辟空間heap:需要程序員自己申請,並指明大小,在c中malloc函數
如p1 = (char *)malloc(10);
在C++中用new運算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在棧中的。
2.2 申請後系統的響應棧:只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。
2.3
2.4申請效率的比較:棧由系統自動分配,速度較快。但程序員是無法控制的。堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。
2.5堆和棧中的存儲內容棧: 在函數調用時,第一個進棧的是主函數中後的下一條指令(函數調用語句的下一條可執行語句)的地址,然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然後是函數中的局部變數。注意靜態變數是不入棧的。當本次函數調用結束後,局部變數先出棧,然後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容有程序員安排。
2.6存取效率的比較
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
但是,在以後的存取中,在棧上的數組比指針所指向的字元串(例如堆)快。
比如:#include <...>
void main(){
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
對應的匯編代碼
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一種在讀取時直接就把字元串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到edx中,在根據edx讀取字元,顯然慢了。
2.7小結:堆和棧的區別可以用如下的比喻來看出:使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。堆和棧的區別主要分:操作系統方面的堆和棧,如上面說的那些,不多說了。還有就是數據結構方面的堆和棧,這些都是不同的概念。這里的堆實際上指的就是(滿足堆性質的)優先隊列的一種數據結構,第1個元素有最高的優先權;棧實際上就是滿足先進後出的性質的數學或數據結構。雖然堆棧,堆棧的說法是連起來叫,但是他們還是有很大區別的,連著叫只是由於歷史的原因。
申請大小的限制棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。一、預備知識—程序的內存分配一個由c/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。2、堆區(heap)— 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。3、全局區(靜態區)(static)—全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程序結束後有系統釋放4、文字常量區 —常量字元串就是放在這里的。 程序結束後由系統釋放5、程序代碼區(text)—存放函數體的二進制代碼。
C. 雙系統運行內存如何分配
不需要人為分配,系統本身就會管理。
系統自動管理即可,因為雙系統不能同時運行,所以運行其中一個系統時,另一個系統是不佔用內存的(沒有運行),它只佔用硬碟空間而已。
雙系統在安裝的時候,兩個系統是分別裝在不同的分區內,後安裝的系統不會覆蓋前一個系統。而且每個單獨的系統都有自己的分區格式,不會造成沖突。安裝了雙系統後,在啟動的時候,有一個多重啟動的選擇菜單,可以選擇進入哪個操作系統。當前狀態下,只有一個系統是在運行的,不能隨意的切換。如果想要進入另外一個,就要重新啟動,重新選擇。
D. 編譯時分配內存和運行時分配內存
編譯其實只是一個掃描過程,進行詞法語法檢查,代碼優化而已,編譯程序越好,程序運行的時候越高效。
我想你說的「編譯時分配內存」是指「編譯時賦初值」,它只是形成一個文本,檢查無錯誤,並沒有分配內存空間。
當你運行時,系統才把程序導入內存。一個進程(即運行中的程序)在主要包括以下五個分區:
棧、堆、bss、data、code
代碼(編譯後的二進制代碼)放在code區,代碼中生成的各種變數、常量按不同類型分別存放在其它四個區。系統依照代碼順序執行,然後依照代碼方案改變或調用數據,這就是一個程序的運行過程。
E. 物理內存與虛擬內存的分配情況
虛擬內存是將物理硬碟的一部分充當內存使用,當運行程序較大時,在物理內存不夠用的情況調用虛擬內存。虛擬內存一般設置為物理內存的1.5倍左右就可以的。為防止虛擬內存過低的情況發生,建議將虛擬內存位置設置在非系統盤的其他分區。
F. 虛擬內存和物理內存怎麼分配啊
顯卡的問題一般。
虛擬內存一般設定為物理內存的1.5到2倍。
你可以搜索下怎麼分配顯存
開機時按F2健進入BIOS設置.用鍵盤方向鍵選擇Advanced選項.
再選擇依次選擇Chipest Configuration-->NorthBridge Configuration-->Share Memory.
這里應該有幾個選擇的,其中AUTO表示讓系統自動分配顯存,應該還有32/64/128M的選擇. 選中你想要的.然後按ESC鍵退出,
選擇Save changes and Exit鍵保存並退出~~~
建議你抄下選項的英文再重啟操作~~~
````````````
如果你用的是AWARD的BIOS的話, 可以按一下的步驟:
開機時按著 Delete鍵進入BIOS。
選擇: Advance Chipest Features
在 Frame Buffer Size 里用鍵盤上的「PageUP/PageDown 」 鍵來調節的。
接F10鍵保存,重啟就可以了
我們知道,許多應用程序(包括操作系統在內)都要求顯卡的內存容量達到最低要求值時才能正常運行(甚至才能完全運行),因此,集成顯卡的晶元組都使用了一些智能技術,在需要的時候用共享內存的方法來增加顯存的容量,達到能運行應用程序的目的。主流的AMD、NVIDIA、Intel集成顯示晶元,在分配顯存方面有各自的解決方案,下面就來看看在不同情況下它們分別共享了多少系統內存。
一、HyperMemory
HyperMemory是ATI提出的「允許圖形卡和CPU共享系統內存,同時將可能出現的性能沖突降到最低的一項技術」,HyperMemory技術的主要特點在於允許核心通過System Bus Interface利用PCI Express匯流排龐大的帶寬直接訪問系統內存,在需要時將數據置於系統內存中進行操作,並通過新添加的Memory Controller對本地顯存和系統內存的訪問與操作進行協調管理,使核心能更加合理、充分地利用本地顯存和系統內存的資源,達到最終擴展總顯存容量的目的。
以下為映泰TA690G AM2主板搭配512MB、1GB、2GB內存,在採用HyperMemory技術後,能分配的容量。
BIOS設置「UMA Frame Buffer Size」為「Auto」時,物理內存總容量為2GB時候的測試圖:
註:上表列出了BIOS設置的各種情況下,通過HyperMemory技術顯存所分配的系統內存的值。當然,這只是最大限制值,實際使用仍然是按需獲取的。
二、DVMT 動態顯存技術
那麼基於Intel 845G/865G/915G/945G/965G晶元組的集成顯卡又能共享多少系統內存呢?答案是:視情況而定。
顯存容量大小取決於系統以及動態分配共享顯存技術(DVMT) 設置的預分配內存。DVMT用於動態分配系統內存作為顯存,以確保最有效地利用可用資源來獲得最佳2D/3D 圖形性能。所分配的顯卡內存容量取決於操作系統要求的內存量,當不再需要內存時,將它返還操作系統供其它應用程序或系統功能使用。DVMT根據系統需求分配內存。BIOS 選項(DVMT/FIXED Memory),用於調整可用於 DVMT 的內存容量。
動態分配的內存最高可達圖形驅動程序設置的最大值,裡面有提供64MB、128MB、256MB設置。DVMT 分配顯存的最大限製取決於具體Intel晶元組和所安裝的顯卡驅動程序的版本。所以,運行應用程序時,通過各晶元組廠家的動態分配顯存的方式,顯存容量方面可以得到充足的保障,有效地提高了集成顯卡的2D/3D圖形性能。
三、TurboCache
TurboCache 技術利用額外的 PCI Express 圖形匯流排帶寬達到了超出傳統顯卡內存解決方案的更高圖形性能,提供了你所期望的NVIDIA圖形硬體的性能和功能。通過允許圖形處理單元 (GPU) 共享專用顯卡內存和動態可用系統內存的容量和帶寬,TurboCache 提升了性能,提供了更大的圖形總內存。
TurboCache 架構的主要功能特點:
1.專利硬體和軟體技術,直接渲染到系統內存;
2.TurboCache Manager(TCM)可以動態分配內存以獲得最大的系統性能;
3.智能軟體演算法可以最大化應用程序性能;
4.雙向 PCI Express帶寬配合 TurboCache 架構,提升了圖形性能。
以下為七彩虹 C.N7050PV分別搭配512MB、1GB、2GB內存,在採用TurboCache技術後能分配到的顯存容量:
在使用2GB內存時,默認物理分配64MB,不過採用TurboCache技術後最大可以獲得256MB顯存容量而在游戲過程中檢測到的可使用顯存容量為256MB。
G. 物理內存與虛擬內存該怎樣分配
虛擬內存設置在系統分區以外的分區,有助於系統運行。
我的電腦-屬性-高級-性能-設置-高級-虛擬內存-更改
點C:/
選
無分頁文件
點
設置
選擇一個剩餘空間大的其他分區
點
自定義大小
輸入
初始大小
和最大值
點
設置
確定
重啟計算機。
再說虛擬內存應該設置到多少,才能讓系統發揮好效果。
一般初始大小設置到物理內存的1到
1.5倍
,最大值設置到物理內存的2.5到3倍。
打個比方如果物理內存是1G,那初始大小設置1024MB或者1500MB,
最大值設置2500MB或者3000M
2G以上物理內存的電腦,不用設置虛擬內存。虛擬內存最大值為5000MB,不要超出范圍。
H. 操作系統執行可執行程序時,內存分配是怎樣的
如果是集顯,執行程序時需要調動集顯,有一部分的物理內存會被分配給集顯來使用,如果是獨顯,那就沒問題了,獨顯自己帶有內存,不需要共享(部分顯卡除外,有些性能強勁的顯卡可以分享內存,增加性能),這時候的內存就是你系統所能識別的內存。
從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變數,static變數。
從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。
(8)怎麼分配程序物理運行內存擴展閱讀:
C++的內存分配:
根據C++的語法規范,定義數組時數組長度必須用常量而不能用變數表示,此時可以使用動態內存分配解決這一問題。
動態內存分配是指在程序運行時為程序中的變數分配內存空間,它完全由應用程序自己進行內存的分配和回收。
程序運行時,特別要注意的是內存的分配。有以下六個地方都可以保存數據。
I. 如何分配物理內存
物理內存是你電腦本身的內存大小比如256,512或者更大1G,物理內存大小就取決於你的內存條大小,這是硬體是沒辦法設置的。
合理設置虛擬內存
1、內存的設定主要根據你的內存大小和電腦的用途來設定。所謂虛擬內存就是在你的物理內存不夠用時把一部分硬碟空間所為內存來使用,不過由於硬碟傳輸的速度要比內存傳輸速度慢的多,所以使用虛擬內存比物理內存效率要慢。個人實際需要的值應該自己多次調整為好。
設的太大會差生大量的碎片,嚴重影響系統速度,設的太小就不夠用,於是系統就會提示你虛擬內存太小。
2、一般情況下,可讓Windows來自動分配管理虛擬內存,它能根據實際內存的使用情況,動態調整虛擬內存的大小。
3、定義虛擬內存,一般默認的虛擬內存大小是取一個范圍值,最好給它一個固定值,這樣就不容易產生磁碟碎片,具體數值根據你的物理內存大小來定,256MB一般設為512MB
,玩游戲可設大一些,設為768MB。
4、擬內存最好不要與系統設在同一分區內,內存是隨著使用而動態地變化,C盤就容易產生磁碟碎片,影響系統運行速度,所以,最好將虛擬內存設置在其它分區中磁碟剩餘空間較大而又不常用而又靠前的盤中,如D、E,這樣可以避免系統在此分區內進行頻繁的讀寫操作而影響系統速度。虛擬內存在一台電腦中,只能是一個,可放在磁碟的任何一個分區中。
J. 電腦內存如何分配(系統優化)
1、內存的大小是無法手動分配的,你所說的內存應該是在硬碟上劃出的虛擬緩存。
2、虛擬緩存的大小是可以手動劃分的,每個分區的上限一般是4095K(如果你的硬碟剩餘空間足夠的話)。
3、虛擬緩存並不是越大越好,是根據你的物理內存的大小來決定的。正常情況(內存小於256M)下是物理內存的1.5倍,當你的內存超過256M後,應當適當減少虛擬緩存的大小。應為內存的讀寫速度要遠遠超過硬碟的讀寫速度,當內存足夠大的時候,減小虛擬緩存是有益於提高系統運行速度的。當然,如上所說,都是針對普通用戶的,當你經常從事圖像處理,影音編輯和運行大型游戲時,往往再大的物理內存都顯得力不從心,這時就需要分配大一些的虛擬緩存,最好不要分配在C:盤上。
4、虛擬緩存的分配方法如下:滑鼠右鍵點擊我的電腦,選<屬性>→<高級>,點擊<性能>里的<設置>→<高級>,點擊<虛擬內存>里的<更改>,這時 你就可以更改你的虛擬緩存了。建議將虛擬緩存設置在你不經常使用的分區上。