㈠ 怎样得到更多的物理内存
你说的不是需要内存,而是因为主板集成显卡需要划分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)
㈩ 如何手动增加电脑物理内存
增加物理内存只能通过加内存条的方式来完成,而虚拟内存却可以对系统作一些调整来达到这个目的,虚拟内存能在一定程度上改善物理内存偏低的状况,但是虚拟内存不能代替物理内存..