導航:首頁 > 物理學科 > 如何申請連續物理內存

如何申請連續物理內存

發布時間:2022-03-08 18:22:32

㈠ 怎樣得到更多的物理內存

你說的不是需要內存,而是因為主板集成顯卡需要劃分64MB內存作為顯存,顯卡集成的,玩一下3D游戲一般都會比較卡!

㈡ 用死循環不停申請內存會申請到大於物理內存的空間,為什麼(Unix環境)

我們可以先查看一下計算機的物理內存
可以看到計算機的物理內存是1.8G。
接下來我們來運行這個程序
在剛開始的時候,內核還可以簡單地利用空閑著的物理內存滿足應用程序的內存需求,但當物理內存用完之後,它就開始使用所謂的交換空間(swap space)。在UNIX的大多數版本上,交換空間指的是一塊獨立的硬碟空間。如果你熟悉微軟公司的Windows,就能看出UNIX交換空間和微軟的Windows交換文件(swap file)之間的相似之處。但與微軟Windows不同的是:在UNIX的交換空間里沒有局部堆(local heap)、全局堆(global heap)或其他可丟棄內存段等讓人操心的東西--UNIX操作系統的內核把這些管理工作都替用戶包下來了。
在物理內存和交換空間之間的挪動數據和程序代碼的工作完全由內核來負責,因此,每當用戶對內存進行讀寫的時候,數據總像是早已等在物理內存里了,而事實上它是在用戶准備訪問它之前剛剛分配或交換過來的。
用更專業一點的術語來說,UNIX實現了一個請求頁面虛擬內存系統。用戶在程序看到的所有內存都是虛擬的,即在程序使用的物理地址上並不存在真是的內存。UNIX把所有的內存分成一頁一頁的,一頁通常是4096個位元組。每當程序試圖訪問內存的時候,就會出現一次虛擬內存和物理內存的轉換,它的具體做法和所花費的時間將取決於用戶使用的硬體的具體情況。如果被訪問的內存沒有在物理內存中,就會產生一個頁面錯誤(page fault),而控制權就會上交給UNIX操作系統內核。
UNIX對被訪問內存地址進行檢查,如果這是一個允許該程序使用的合法地址,它就會確定需要向程序提供哪一個物理內存頁面。然後,如果該數據從沒被寫過,就為它新分配一個內存頁面;如果數據已經被保存到硬碟的交換空間里去了,就把包含該數據的內存頁面讀回物理內存(可能需要把一個現存頁面轉移到硬碟上去)。接著,再把虛擬內存地址映射到與之對應的物理內存之後,它再讓用戶程序繼續執行。這些操作不需要UNIX應用程序本身去操行,因為這一切都隱藏在UNIX操作系統的內核里。
最終,如果應用程序耗盡了物理內存和交換空間,或者說如果堆棧超出其最大長度,UNIX操作系統的內核就會拒絕此後的內存申請。
根據這種做法,內存的供應量明顯地是沒有極限的,那麼,這是不是意味著對malloc返回情況的檢查沒有意義了呢?絕不是。使用動態分配內存地址的C語言程序經常會出現這樣一個常見的問題,即試圖在某個已分配內存塊以外的地方寫數據。當這種情況發生的時候,程序並不會立即終止,但很有可能已經覆蓋了malloc函數庫常式內部使用的某些數據。
出現這種問題之後,常見的結果是後續的malloc調用無法繼續進行,不是因為沒有內存可供分配,而是因為內存的結構被破壞了。追蹤這類問題是相當困難的,並且在程序里發現問題越早,找到解決問題的機會就越大。

㈢ 怎麼申請連續的物理內存空間

2、linux實現虛擬內存系統用戶言所內存都虛擬說程序並直接運行物理內存運行虛擬內存由虛擬內存轉換物理內存3、linux所內存都頁單位進行劃通每頁4KB;4、虛擬內存址物理內存址進行轉換內核址確性進行檢查址合內核提供應物理內存頁;申請內存空間內核檢查空餘物理內存頁並加配物理內存空間足內核拒絕申請;5、使用malloc配內存空間虛擬址空間連續轉換物理內存空間能連續能相鄰兩位元組同物理頁

㈣ 怎麼申請一塊大內存

申請大內存,用malloc或者new都是不行的,因為它們能申請的內存受到計算機物理內存的限制。
申請大內存可以採用內存映射文件。
存映射文件來申請大容量物理內存是可行的。內存映射文件用於多個進程共享數據時,創建內存映射的函數的第一個參數必須設置為INVALID_HANDLE_VALUE,表示在物理內存中創建。利用這個特點我們可以申請超過32MB的物理內存。具體能夠申請的大小由剩餘的物理內存決定。例子如下:
#define MAXLEN (64*1024*1024)
HANDLE hFile;
hFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, MAXLEN, NULL);
if(hFile == NULL)
{
//創建文件映射對象失敗
return;
}

LPVOID lpAddress;
lpAddress = MapViewOfFile(hFile, FILE_MAP_WRITE|FILE_MAP_READ, 0, 0, MAXLEN);

if(lpAddress == NULL)
{
//創建文件視圖失敗
return;
}

上述的函數如果都成功了,你就可以使用物理內存了。物理內存的首地址是lpAddress。使用完了別忘了調用函數UnmapViewOfFile(lpAddress); 和CloseHandle(hFile);

㈤ 怎麼申請連續的物理內存空間

malloc申請的空間是在執行的時候由內存池分配的連續空間,這塊空間是系統自動分配的,一般是夠用的,如果不夠用或者內存池為空的話,malloc返回的指針為空。使用malloc分配的內存空間在虛擬地址空間上是連續的,但是轉換到物理內存空間上有可能是不連續的,因為有可能相鄰的兩個位元組是在不同的物理分頁上;

㈥ 如何增加物理內存

買啊,這個是硬體,只能買.還有就是要注意的,看你的機器配置,目前32位只能支持4G內存.但是卻不能加到4G.只能加到3G左右,還有買內存的話,最好買2條一樣的,這樣比較方便實現雙通道

㈦ linux內存池能分配連續物理內存嗎

處理器通過地址訪問內存單元,程序中用到的基址加偏移地址是線性地址,需要通過MMU將虛擬地址映射成物理地址。這給分配和釋放內存帶來方便:1)物理地址不連續的空間可以映射為邏輯上連續的虛擬地址。2)進程可以獲得比實際內存大的"空間",虛擬內存使得進程在這種情況下仍可正常運行。
linux內核為驅動程序提供了一致的內存管理介面,因此不用考慮不同體系結構如何管理內存的。
在linux內核中分配內存用kmalloc和kfree。
kmalloc分配時可以被阻塞,且不對所獲得的區域清零。它分配的區域在物理內存中也是連續的。
原型:
#include<linux/slab.h>
void *kmalloc(size_t size,int flags); //參數為分配大小及分配標志
flags參數:
GFP_KERNEL:內核內存通用分配方法,表示內存分配是由運行在內核空間的進程執行的。可休眠,所以使用GFP_KERNEL分配內存的函數必須是可重入的。
GFP_ATOMIC:用於在中斷處理常式或者運行在進程上下文之外的代碼中分配內存,不可休眠。內核通常會為原子性的分配預留一些空閑頁面。
所有標志定義在 <linux/gfp.h>中。
size參數:
內核是基於頁技術分配內存,以最佳的利用系統的RAM。
linux處理內存分配的方法是:創建一系列的內存對象池,每個池的內存大小事固定的,處理分配請求時,就直接在包含足夠大的內存塊中傳遞一個整款給請求者。內核只能分配一些預定義的固定大小的位元組數組。kmalloc能處理的的最小內存塊是32或者64,不大於128KB。
內存區段:
linux內核把內存分為3個區段:可用於DMA的內存,常規內存以及高端內存。kmalloc不能分配高端內存。內存區段在mm/page_alloc.c中實現。區段的初始化在對應的arch樹下的mm/init.c中。

後備高速緩存 (lookaside cache)
內核中普通對象進行初始化所需的時間超過了對其進行分配和釋放所需的時間,因此不應該將內存釋放回一個全局的內存池,而是將內存保持為針對特定目而初始化的狀態。例如,如果內存被分配給了一個互斥鎖,那麼只需在為互斥鎖首次分配內存時執行一次互斥鎖初始化函數(mutex_init)即可。後續的內存分配不需要執行這個初始化函數,因為從上次釋放和調用析構之後,它已經處於所需的狀態中了。
linux2.6中USB和SCSI驅動程序使用了這種高速緩存,是為一些反復使用的塊增加某些特殊的內存池。後背高速緩存管理也叫slab分配器,相關函數和類型在<linux/slab.h>中申明。
slab分配器實現高速緩存具有kmem_cache_t類型。
kmem_cache_t * kmem_cache_create( const char *name, size_t size, size_t align,
unsigned long flags;
void (*constructor)(void*,kmem_cache_t *, unsigned long),
void (*destructor)(void*, kmem_cache_t *, unsigned long));
用於創建一個新的高速緩存對象。
constructor用於初始化新分配的對象,destructor用於清除對象。
一旦某個對象的高速緩存被創建以後,就可以調用kmem_cache_alloc從中分配內存對象。
void * kmem_cache_alloc(kmem_cache_t *cache,int flags);
釋放內存對象使用kmem_cache_free
void kmem_cache_free(kmem_cache_t *cache,const void *obj);
在內存空間都被釋放後,模塊被卸載前,驅動程序應當釋放他的高速緩存。
int kmem_cache_destory(kmem_cache_t *cache);
要檢查其返回狀態,如果失敗,表明莫塊中發生了內存泄露。
基於slab的高速緩存scullc
kmem_cache_t *scullc_cache;
scullc_cache=kmem_cache_creat("scullc",scullc_quantum,0,SLAB_HWCACHE_ALIGN,NULL,NULL);
if(!scullc_cache)
{
scullc_cleanup();
return -ENOMEM;
}
if(!dpte->data[s_pos])
{
dptr->data[s_pos]=kmem_cache_alloc(scullc_cache,GFP_KERNEL);
if(!dptr->data[s_pos])
goto nomem;
memset(dptr->data[s_pos],0,scullc_quantum);
}
for(i=0;i<qset;i++)
{
if(dptr->data[i])
kmem_cache_free(scullc_cache,dptr->data[i]);
}
if(scullc_cache)
kmem_cache_destory(scullc_cache);
內存池:
內核中有些地方的內存分配是不允許失敗的,為確保能分配成功,內核建立一種稱為內存池的抽象,他試圖始終保持空閑狀態,以便緊急情況使用。
mempool_t * mempool_creat(int min_nr,
mempool_alloc_t *alloc_fn, //對象分分配 mempool_alloc_slab
mempool_free_t *free_fn, //釋放 mempool_free_slab
void *pool_data);
可以用如下代碼來構造內存池
cache=kmem_cache_creat(...); //創建一個高速緩存
pool=mempool_creat(MY_POOL_MINIMUM,mempool_alloc_slab,mempool_free_slab,cache);//建立內存池對象
void *mempool_alloc(mempool_t *poll,int gfp_mask);//分配對象
void *mempool_free(void *element,mempool_t *poll);//釋放對象
void mempool_destroy(mempool_t *poll);//銷毀內存池
注意:mempool會分配一些內存塊,空閑且不會被用到,造成內存的大量浪費。所以一般情況不要用內存池。

㈧ 怎樣設置物理內存

物理物理就是不依靠軟體實現的情況,最簡單的顯然是花點錢買跟條子,不然的話只有試試調大虛擬內存了。

虛擬內存
內存在計算機中的作用很大,電腦中所有運行的程序都需要經過內存來執行,如果執行的程序很大或很多,就會導致內存消耗殆盡。為了解決這個問題,Windows中運用了虛擬內存技術,即拿出一部分硬碟空間來充當內存使用,當內存佔用完時,電腦就會自動調用硬碟來充當內存,以緩解內存的緊張。舉一個例子來說,如果電腦只有128MB物理內存的話,當讀取一個容量為200MB的文件時,就必須要用到比較大的虛擬內存,文件被內存讀取之後就會先儲存到虛擬內存,等待內存把文件全部儲存到虛擬內存之後,跟著就會把虛擬內里儲存的文件釋放到原來的安裝目錄里了。下面,就讓我們一起來看看如何對虛擬內存進行設置吧。
虛擬內存的設置
對於虛擬內存主要設置兩點,即內存大小和分頁位置,內存大小就是設置虛擬內存最小為多少和最大為多少;而分頁位置則是設置虛擬內存應使用那個分區中的硬碟空間。對於內存大小的設置,如何得到最小值和最大值呢?你可以通過下面的方法獲得:選擇「開始→程序→附件→系統工具→系統監視器」(如果系統工具中沒有,可以通過「添加/刪除程序」中的Windows安裝程序進行安裝)打開系統監視器,然後選擇「編輯→添加項目」,在「類型」項中選擇「內存管理程序」,在右側的列表選擇「交換文件大小」。這樣隨著你的操作,會顯示出交換文件值的波動情況,你可以把經常要使用到的程序打開,然後對它們進行使用,這時查看一下系統監視器中的表現值,由於用戶每次使用電腦時的情況都不盡相同,因此,最好能夠通過較長時間對交換文件進行監視來找出最符合您的交換文件的數值,這樣才能保證系統性能穩定以及保持在最佳的狀態。
找出最合適的范圍值後,在設置虛擬內存時,用滑鼠右鍵點擊「我的電腦」,選擇「屬性」,彈出系統屬性窗口,選擇「性能」標簽,點擊下面「虛擬內存」按鈕,彈出虛擬內存設置窗口,點擊「用戶自己指定虛擬內存設置」單選按鈕,「硬碟」選較大剩餘空間的分區,然後在「最小值」和「最大值」文本框中輸入合適的范圍值。如果您感覺使用系統監視器來獲得最大和最小值有些麻煩的話,這里完全可以選擇「讓Windows管理虛擬內存設置」。
調整分頁位置
Windows 9x的虛擬內存分頁位置,其實就是保存在C盤根目錄下的一個虛擬內存文件(也稱為交換文件)Win386.swp,它的存放位置可以是任何一個分區,如果系統盤C容量有限,我們可以把Win386.swp調到別的分區中,方法是在記事本中打開System.ini(C:\Windows下)文件,在[386Enh]小節中,將「PagingDrive=C:WindowsWin386.swp」,改為其他分區的路徑,如將交換文件放在D:中,則改為「PagingDrive=D:Win386.swp」,如沒有上述語句可以直接鍵入即可。
而對於使用Windows 2000和Windows XP的,可以選擇「控制面板→系統→高級→性能」中的「設置→高級→更改」,打開虛擬內存設置窗口,在驅動器[卷標]中默認選擇的是系統所在的分區,如果想更改到其他分區中,首先要把原先的分區設置為無分頁文件,然後再選擇其他分區。
或者,WinXP一般要求物理內存在256M以上。如果你喜歡玩大型3D游戲,而內存(包括顯存)又不夠大,系統會經常提示說虛擬內存不夠,系統會自動調整(虛擬內存設置為系統管理)。
如果你的硬碟空間夠大,你也可以自己設置虛擬內存,具體步驟如下:右鍵單擊「我的電腦」→屬性→高級→性能 設置→高級→虛擬內存 更改→選擇虛擬內存(頁面文件)存放的分區→自定義大小→確定最大值和最小值→設置。一般來說,虛擬內存為物理內存的1.5倍,稍大一點也可以,如果你不想虛擬內存頻繁改動,可以將最大值和最小值設置為一樣。

44》虛擬內存使用技巧
對於虛擬內存如何設置的問題,微軟已經給我們提供了官方的解決辦法,對於一般情況下,我們推薦採用如下的設置方法:
(1)在Windows系統所在分區設置頁面文件,文件的大小由你對系統的設置決定。具體設置方法如下:打開"我的電腦"的"屬性"設置窗口,切換到"高級"選項卡,在"啟動和故障恢復"窗口的"寫入調試信息"欄,如果你採用的是"無",則將頁面文件大小設置為2MB左右,如果採用"核心內存存儲"和"完全內存存儲",則將頁面文件值設置得大一些,跟物理內存差不多就可以了。
小提示:對於系統分區是否設置頁面文件,這里有一個矛盾:如果設置,則系統有可能會頻繁讀取這部分頁面文件,從而加大系統盤所在磁軌的負荷,但如果不設置,當系統出現藍屏死機(特別是STOP錯誤)的時候,無法創建轉儲文件 (Memory.dmp),從而無法進行程序調試和錯誤報告了。所以折中的辦法是在系統盤設置較小的頁面文件,只要夠用就行了。
(2)單獨建立一個空白分區,在該分區設置虛擬內存,其最小值設置為物理內存的1.5倍,最大值設置為物理內存的3倍,該分區專門用來存儲頁面文件,不要再存放其它任何文件。之所以單獨劃分一個分區用來設置虛擬內存,主要是基於兩點考慮:其一,由於該分區上沒有其它文件,這樣分區不會產生磁碟碎片,這樣能保證頁面文件的數據讀寫不受磁碟碎片的干擾;其二,按照Windows對內存的管理技術,Windows會優先使用不經常訪問的分區上的
頁面文件,這樣也減少了讀取系統盤里的頁面文件的機會,減輕了系統盤的壓力。
(3)其它硬碟分區不設置任何頁面文件。當然,如果你有多個硬碟,則可以為每個硬碟都創建一個頁面文件。當信息分布在多個頁面文件上時,硬碟控制器可以同時在多個硬碟上執行讀取和寫入操作。這樣系統性能將得到提高。
小提示:
允許設置的虛擬內存最小值為2MB,最大值不能超過當前硬碟的剩餘空間值,同時也不能超過32位操作系統的內存定址范圍——4GB。

㈨ 怎樣申請一段連續的內存空間

malloc(sizeof(Type)*size)

㈩ 如何手動增加電腦物理內存

增加物理內存只能通過加內存條的方式來完成,而虛擬內存卻可以對系統作一些調整來達到這個目的,虛擬內存能在一定程度上改善物理內存偏低的狀況,但是虛擬內存不能代替物理內存..

閱讀全文

與如何申請連續物理內存相關的資料

熱點內容
word中化學式的數字怎麼打出來 瀏覽:705
乙酸乙酯化學式怎麼算 瀏覽:1372
沈陽初中的數學是什麼版本的 瀏覽:1318
華為手機家人共享如何查看地理位置 瀏覽:1010
一氧化碳還原氧化鋁化學方程式怎麼配平 瀏覽:848
數學c什麼意思是什麼意思是什麼 瀏覽:1369
中考初中地理如何補 瀏覽:1260
360瀏覽器歷史在哪裡下載迅雷下載 瀏覽:671
數學奧數卡怎麼辦 瀏覽:1350
如何回答地理是什麼 瀏覽:989
win7如何刪除電腦文件瀏覽歷史 瀏覽:1023
大學物理實驗干什麼用的到 瀏覽:1449
二年級上冊數學框框怎麼填 瀏覽:1659
西安瑞禧生物科技有限公司怎麼樣 瀏覽:832
武大的分析化學怎麼樣 瀏覽:1213
ige電化學發光偏高怎麼辦 瀏覽:1301
學而思初中英語和語文怎麼樣 瀏覽:1608
下列哪個水飛薊素化學結構 瀏覽:1388
化學理學哪些專業好 瀏覽:1452
數學中的棱的意思是什麼 瀏覽:1017