怎么把逆战进程的分配内存调整成512mb显存能玩gta5吗

如何查看进程发生缺页中断的次数?
&&&&&&&&&用ps -o majflt,minflt -C program命令查看。
&&&&&&&&&&majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。
&&&&&&&&& 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。
发成缺页中断后,执行了那些操作?
当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:&
1、检查要访问的虚拟地址是否合法&
2、查找/分配一个物理页&
3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)&
4、建立映射关系(虚拟地址到物理地址)&
重新执行发生缺页中断的那条指令&
如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。&
内存分配的原理
从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。
1、brk是将数据段(.data)的最高地址指针_edata往高地址推;
2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
&&&&&这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。
在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。
下面以一个例子来说明内存分配的原理:
情况一、malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系),如下图:
1、进程启动的时候,其(虚拟)内存空间的初始布局如图1所示。
&&&&& 其中,mmap内存映射文件是在堆和栈的中间(例如libc-2.2.93.so,其它数据文件等),为了简单起见,省略了内存映射文件。
&&&&&&_edata指针(glibc里面定义)指向数据段的最高地址。&
2、进程调用A=malloc(30K)以后,内存空间如图2:
&&&&&&malloc函数会调用brk系统调用,将_edata指针往高地址推30K,就完成虚拟内存分配。
&&&&& 你可能会问:只要把_edata+30K就完成内存分配了?
&&&&&&事实是这样的,_edata+30K只是完成虚拟地址的分配,A这块内存现在还是没有物理页与之对应的,等到进程第一次读写A这块内存的时候,发生缺页中断,这个时候,内核才分配A这块内存对应的物理页。也就是说,如果用malloc分配了A这块内容,然后从来不访问它,那么,A对应的物理页是不会被分配的。&
3、进程调用B=malloc(40K)以后,内存空间如图3。
情况二、malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0),如下图:
4、进程调用C=malloc(200K)以后,内存空间如图4:
&&&&&&默认情况下,malloc函数分配内存,如果请求内存大于128K(可由M_MMAP_THRESHOLD选项调节),那就不是去推_edata指针了,而是利用mmap系统调用,从堆和栈的中间分配一块虚拟内存。
&&&&& 这样子做主要是因为::
&&&&&&brk分配的内存需要等到高地址内存释放以后才能释放(例如,在B释放之前,A是不可能释放的,这就是内存碎片产生的原因,什么时候紧缩看下面),而mmap分配的内存可以单独释放。
&&&&&&当然,还有其它的好处,也有坏处,再具体下去,有兴趣的同学可以去看glibc里面malloc的代码了。&
5、进程调用D=malloc(100K)以后,内存空间如图5;
6、进程调用free(C)以后,C对应的虚拟内存和物理内存一起释放。
7、进程调用free(B)以后,如图7所示:
&&&&&&& B对应的虚拟内存和物理内存都没有释放,因为只有一个_edata指针,如果往回推,那么D这块内存怎么办呢?
当然,B这块内存,是可以重用的,如果这个时候再来一个40K的请求,那么malloc很可能就把B这块内存返回回去了。&
8、进程调用free(D)以后,如图8所示:
&&&&&&& B和D连接起来,变成一块140K的空闲内存。
9、默认情况下:
&&&&&& 当最高地址空间的空闲内存超过128K(可由M_TRIM_THRESHOLD选项调节)时,执行内存紧缩操作(trim)。在上一个步骤free的时候,发现最高地址空闲内存超过128K,于是内存紧缩,变成图9所示。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:120531次
积分:1500
积分:1500
排名:第19913名
原创:12篇
转载:113篇
评论:12条
(1)(1)(8)(1)(1)(1)(1)(1)(1)(1)(3)(2)(4)(3)(2)(1)(2)(2)(2)(3)(4)(1)(3)(6)(5)(10)(5)(1)(3)(2)(2)(1)(1)(6)(1)(3)(5)(1)(3)(1)(2)(4)(4)(3)(7)1240人阅读
linux内核设计与实现(44)
如何查看进程发生缺页中断的次数?
&&&&&&&&&用ps -o majflt,minflt -C program命令查看。
&&&&&&&&&&majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。
&&&&&&&&& 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。
发成缺页中断后,执行了那些操作?
当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:&
1、检查要访问的虚拟地址是否合法&
2、查找/分配一个物理页&
3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)&
4、建立映射关系(虚拟地址到物理地址)&
重新执行发生缺页中断的那条指令&
如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。&
内存分配的原理
从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。
1、brk是将数据段(.data)的最高地址指针_edata往高地址推;
2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
&&&&&这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。
在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。
下面以一个例子来说明内存分配的原理:
情况一、malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系),如下图:
1、进程启动的时候,其(虚拟)内存空间的初始布局如图1所示。
&&&&& 其中,mmap内存映射文件是在堆和栈的中间(例如libc-2.2.93.so,其它数据文件等),为了简单起见,省略了内存映射文件。
&&&&&&_edata指针(glibc里面定义)指向数据段的最高地址。&
2、进程调用A=malloc(30K)以后,内存空间如图2:
&&&&&&malloc函数会调用brk系统调用,将_edata指针往高地址推30K,就完成虚拟内存分配。
&&&&& 你可能会问:只要把_edata+30K就完成内存分配了?
&&&&&&事实是这样的,_edata+30K只是完成虚拟地址的分配,A这块内存现在还是没有物理页与之对应的,等到进程第一次读写A这块内存的时候,发生缺页中断,这个时候,内核才分配A这块内存对应的物理页。也就是说,如果用malloc分配了A这块内容,然后从来不访问它,那么,A对应的物理页是不会被分配的。&
3、进程调用B=malloc(40K)以后,内存空间如图3。
情况二、malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0),如下图:
4、进程调用C=malloc(200K)以后,内存空间如图4:
&&&&&&默认情况下,malloc函数分配内存,如果请求内存大于128K(可由M_MMAP_THRESHOLD选项调节),那就不是去推_edata指针了,而是利用mmap系统调用,从堆和栈的中间分配一块虚拟内存。
&&&&& 这样子做主要是因为::
&&&&&&brk分配的内存需要等到高地址内存释放以后才能释放(例如,在B释放之前,A是不可能释放的,这就是内存碎片产生的原因,什么时候紧缩看下面),而mmap分配的内存可以单独释放。
&&&&&&当然,还有其它的好处,也有坏处,再具体下去,有兴趣的同学可以去看glibc里面malloc的代码了。&
5、进程调用D=malloc(100K)以后,内存空间如图5;
6、进程调用free(C)以后,C对应的虚拟内存和物理内存一起释放。
7、进程调用free(B)以后,如图7所示:
&&&&&&& B对应的虚拟内存和物理内存都没有释放,因为只有一个_edata指针,如果往回推,那么D这块内存怎么办呢?
当然,B这块内存,是可以重用的,如果这个时候再来一个40K的请求,那么malloc很可能就把B这块内存返回回去了。&
8、进程调用free(D)以后,如图8所示:
&&&&&&& B和D连接起来,变成一块140K的空闲内存。
9、默认情况下:
&&&&&& 当最高地址空间的空闲内存超过128K(可由M_TRIM_THRESHOLD选项调节)时,执行内存紧缩操作(trim)。在上一个步骤free的时候,发现最高地址空闲内存超过128K,于是内存紧缩,变成图9所示。
在了解了内存分配原理以后来看一个现象:
  1 压力测试过程中,发现被测对象性能不够理想,具体表现为:
  进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70
  2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。
  初步分析
  majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。
  这两个数值表示一个进程自启动以来所发生的缺页中断的次数。
  当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:
  检查要访问的虚拟地址是否合法
  查找/分配一个物理页
  填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)
  建立映射关系(虚拟地址到物理地址)
  重新执行发生缺页中断的那条指令
  如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。
  此进程minflt如此之高,一秒10000多次,不得不怀疑它跟进程内核态cpu消耗大有很大关系。
  分析代码
  查看代码,发现是这么写的:一个请求来,用malloc分配2M内存,请求结束后free这块内存。看日志,发现分配内存语句耗时10us,平均一条请求处理耗时1000us 。 原因已找到!
  虽然分配内存语句的耗时在一条处理请求中耗时比重不大,但是这条语句严重影响了性能。要解释清楚原因,需要先了解一下内存分配的原理。
  说完内存分配的原理,那么被测模块在内核态cpu消耗高的原因就很清楚了:每次请求来都malloc一块2M的内存,默认情况下,malloc调用mmap分配内存,请求结束的时候,调用munmap释放内存。假设每个请求需要6个物理页,那么每个请求就会产生6个缺页中断,在2000的压力下,每秒就产生了10000多次缺页中断,这些缺页中断不需要读取磁盘解决,所以叫做缺页中断在内核态执行,因此进程的内核态cpu消耗很大。缺页中断分散在整个请求的处理过程中,所以表现为分配语句耗时(10us)相对于整条请求的处理时间(1000us)比重很小。
  解决办法
  将动态内存改为静态分配,或者启动的时候,用malloc为每个线程分配,然后保存在threaddata里面。但是,由于这个模块的特殊性,静态分配,或者启动时候分配都不可行。另外,Linux下默认栈的大小限制是10M,如果在栈上分配几M的内存,有风险。
  禁止malloc调用mmap分配内存,禁止内存紧缩。
  在进程启动时候,加入以下两行代码:
  mallopt(M_MMAP_MAX, 0); // 禁止malloc调用mmap分配内存
  mallopt(M_TRIM_THRESHOLD, -1); // 禁止内存紧缩
  效果:加入这两行代码以后,用ps命令观察,压力稳定以后,majlt和minflt都为0。进程的系统态cpu从20降到10。
  可以用命令ps -o majflt minflt -C program来查看进程的majflt, minflt的值,这两个值都是累加值,从进程启动开始累加。在对高性能要求的程序做压力测试的时候,我们可以多关注一下这两个值。
  如果一个进程使用了mmap将很大的数据文件映射到进程的虚拟地址空间,我们需要重点关注majflt的值,因为相比minflt,majflt对于性能的损害是致命的,随机读一次磁盘的耗时数量级在几个毫秒,而minflt只有在大量的时候才会对性能产生影响。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1342007次
积分:23576
积分:23576
排名:第201名
原创:859篇
转载:218篇
评论:259条
阅读:4302
文章:23篇
阅读:38509
文章:31篇
阅读:45247
文章:14篇
阅读:16804
(1)(7)(8)(6)(1)(2)(140)(49)(3)(33)(38)(48)(32)(53)(33)(10)(17)(11)(73)(67)(21)(36)(65)(64)(126)(66)(45)(17)草!!怎么卡呀!!逆战内存也忒大了吧_逆战视频_爱拍原创求各位大神帮忙看看这配置玩逆战老是自动关机的原因,游戏
12:48:38  来源:网络转载
话题:求各位大神帮忙看看这配置玩逆战老是自动关机的原因,游戏推荐回答:配置没有问题,只玩逆战才自动关机的话,应该是游戏程序问题,重装游戏或者重装系统。别追问,只为赚积分话题:电脑最近变卡了推荐回答:电脑太慢,太卡,很可能是电脑垃圾过多,运行内存不足,还可能是电脑硬件温度过高,机箱灰尘过多(造成台式机硬件温度高等原因),或者硬件配置过低,甚至是中毒了的情况! 一. 开启的程序过多,占用大量资源: 点击加速球加速,关闭占资源过多的程序(例如:不看视频,但是有视频进程等情况): 电脑垃圾文件过多的处理:用360安全卫士清理:打开360安全卫士电脑清理 一键清理、清理垃圾、清理软件、清理插件、清理痕迹。这样可以清理掉大量的垃圾。 二.运行内存不足1.如果是运行内存不足的话,虚拟内存设置大一些: (1)Win7系统:步骤:鼠标右击桌面的我的电脑属性高级系统设置高级找到性能参考回答:是不是最近下了什么东西 也许后台有什么东西在悄悄运行 占了内存的话就会很卡的 你看看任务管理器什么东西占的内存太高吧话题:这种配置不算低吧推荐回答:显卡90度了。。。再不自动关机你就跟你的显卡说拜拜了,还好有自动保护功能 先别玩了,看看你显卡散热器是不是松了,或者是风扇坏了?话题:玩英雄联盟,逆战有时候会自动关机,求大神解答推荐回答:以前有没有这种自动关机的情况呢?是玩到一半关机,还是一进入游戏就关机啊!,如果是前者并且有前科的话,可能是电源的功率低了,我以前也碰到过玩一下子关机的情况,不知道和你的是不是吻合参考回答:可能主板有问题,还是要去店里看看话题:为什么我玩大型游戏我什么会自动关机问题详情:是笔记本的电脑推荐回答:关机,电脑自然启动保护!所以容易电脑受损:逆战所需电脑的最低配置要比穿越火线的最低配置要高哦解答。参考回答:逆战比CF大1个多GB,内存占用的也比较多。话题:电脑玩游戏时自动关机是什么原因,求大神解答!问题详情:刚开机就自动关机,大概等10分钟左右才能再次打开进入游戏大约推荐回答:脑过热了吧。下个鲁大师测下电脑温度。准备做降温处理(清理灰尘加硅胶),过热保护症状参考回答:玩游戏般说游戏软件本身应该没问题玩种游戏关机或者玩型游戏关机能跟机器配置关独立显卡集显卡内存显卡跟些游戏带起没办运行玩话题:我的电脑玩逆战经常死机求高手解答问题详情:耳机里传出嚓嚓声,玩逆战一旦卡死就黑屏我的电脑是XP系统推荐回答:他们是占内在的,这是最直接的办法,你电脑可能自动运行的程序太多了。你的电脑基本上是没问题的。还有一点,如果以一直没有出问题的话,机器承受不了的标志,如果我自己的话,只是卡死,程序一般是不占内存的。电脑都有个自动保护功能一旦温度高过 一定的温度就会黑屏并自动关机,最大的可能就是出在散热不畅上,建议你清个灰,那是运行功率过高,另外把内存条拔下来把接口处的铜片用橡皮擦擦一擦,你电脑用了多久,不是硬件问题呃,你不知道哪些占内存哪些不占内存的话,把里面不用的程序删掉,但是自动运行的程序除外,把电脑捣鼓一下应该就不会有问题了,然后把他们设置成开机不运行就地了,我能找出哪些是运参考回答:由于你没有发配置,重装游戏都能解决电脑配置发上来,所以我只能建议你降低效果开最低效果,分辨率调为800*600,更新驱动,一话题:我玩逆战电脑就100%自动关机推荐回答:请问你的电脑配置,原因很多(配置低,配置不兼容,显卡,声卡,等等这些你应该知道吧)还有就是系统有问题话题:十年前买的主机,玩得起逆战吗?问题详情:玩了逆战进入机甲模式以后就会自动关机,怎么回事?各位大神帮推荐回答:逆战的游戏要求一般,但是楼主的主机明显跟不上硬件需求,建议楼主直接换一台主机,或者自己配置一套显卡、驱动、内存参考回答:10年前!!!把里面的硬件 都换了吧}

我要回帖

更多关于 512mb 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信