教育房产时事环球科技商业
投稿投诉
商业财经
热点动态
科技数码
软件应用
国际环球
晨报科学
新闻时事
信息智能
汽车房产
办公手机
教育体育
生活生物

什么是内存(什么时候为进程分配内存)

  如何查看进程发生缺页中断的次数?
  用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。
  需要C/C   Linux服务器架构师学习资料后台私信"资料"(资料包括C/C  ,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享
  情况二、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多次缺页中断,这些缺页中断不需要读取磁盘解决,所以叫做minflt;缺页中断在内核态执行,因此进程的内核态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只有在大量的时候才会对性能产生影响。

济源属于哪个市(济源划归洛阳)近日,又有网友讨论济源的城市属性,宣称,河南省拥有17个地级市,并且直接把济源市排除在外。那么济源到底属于县级市还是地级市呢?今天我们就一起来讨论下。济源市的位置济源市,位于河南省济源是哪里的(济源属于郑州管辖吗)在河南省内的各大县级市中,济源市是最特别的一个。与其他县级市相比,济源市在行政区划上不隶属于省内任何一座地级市,而是由河南省直辖。在行政区划分类上,济源虽然是县级市,但在许多事务上绩效考核工作总结(个人绩效考核总结)绩效考核工作总结(个人绩效考核总结)绩效考核工作紧紧围绕分公司提出的将单纯绩效考核转变为绩效管理,突出绩效经营和绩效改进的目标,在中心党政班子的直接领导下,结合中心生产任务经营管理绩效考核指标(什么是绩效考核?)绩效考核指标(什么是绩效考核?)什么是绩效绩效就是一切我们想要的东西,也可以理解为绩效就是结果,但如果某些因素对于其他因素而言,对结果有明显直接的影响时,绩效的意义就可以与这些因素教师思想工作总结(教师年度思想工作总结200字)本学期在学校领导的正确领导下,我不仅圆满地完成了本学期的教学任务,还在业务水平上有了很大的提高立足现在,放眼未来,为使今后的工作取得更大的进步,现对本学期教学工作作出总结,希望能发特岗教师个人总结(特岗教师年度个人总结200字)篇一教师年度工作总结报告通用一年来,我爱岗敬业,认真研修课程标准,严格遵守中小学教师职业道德规范的要求,完成学校交给的工作,服从领导的安排,以培养学生的创新精神和实践能力为重点,认教师个人工作小结(教师个人工作总结精简)教师工作总结1为了更好地做好今后的工作,总结经验吸取教训,我就本年度的工作小结如下一思想工作方面本人一直在各方面严格要求自己,努力地提高自己,以便使自己更快地适应社会发展的形势。通晋升报告(岗位晋升申请书)晋升报告(岗位晋升申请书)扬子晚报网5月8日讯(记者李冲)明天就是母亲节了,职场妈妈是什么样的工作生活状态?智联招聘今天发布的一份2021年职场妈妈生存状况调查报告显示,职场妈妈的认知是什么意思(认知是人与人之间最大的差距)做正确的事,比正确地做事重要100倍。作者洞见pumpkin看到一个有意思的故事。说在很久以前,有一堆人为了一块金子抢得头破血流。一个人悄悄捡起他们身边的一块钻石,扬长而去。抢金子什么是认知(怎样提高孩子的认知能力)大概是从大家逐渐摆脱穷困之后,付诸于教育事业上的注意就愈加深厚。这种发展到现在,俨然已经成为了凌驾于其他事物之上的唯一。但也正是随着对教育事业投来目光的人越来越多,一些原本已经被人ppm是什么意思(ppm是什么岗位)项目组合管理(PPM)是指项目经理和项目管理组织(PMO)用来分析承担项目的潜在回报的过程。通过组织和整合有关提议和当前项目的每条数据,项目组合经理为希望投资新项目的公司提供预测和
进入中国(外资如何进入中国)进入中国(外资如何进入中国)中国是最先发现新冠疫情的国家,由于中国对于疫情的高度重视,对于疫情的控制取得了很好的效果,在其他国家还在为疫情而苦恼时,中国首当其中恢复了正常的生活秩序麻疹多久退(热退疹出后会是麻疹)小宇今年9岁,最近一周持续发高热,还有点咳嗽。起初,妈妈以为孩子感冒了,便给他吃了一些感冒药,但一直不见退热。几天后,小宇身上开始出现了一些淡红色的小疹子,开始是头面部,后来身上和打坐要多久(打坐一年面貌变化图)有人来问,从初学打坐至有成,得多久?一般来说,打坐有成,进步再快,也得费上两三年。假如说双盘盘不上,那时间还得再久一些。从散盘练习至单盘,再练习至能双盘,大概需要一年左右。双盘练至指南录后序教案(指南录后序课件)指南录后序教案(指南录后序课件)公元1276年,宋恭帝德祐二年,距南宋灭亡还有三年。这年,元兵兵临城下,这让南宋君臣六神无主,手足无措。此刻,文天祥是孤独的,因为其他人莫知计所出,微软平板电脑怎么样(微软苏菲平板电脑怎么样)微软平板电脑怎么样(微软苏菲平板电脑怎么样)SurfaceLaptop4作为微软家的亲儿子,表现出了卓越的工业设计水准和软硬件优化特色,为Windows阵营的轻薄本做出了较好的表率中国科普网站(中国科普知识网)中国科普网站(中国科普知识网)纵观世界互联网,大量不合标准的科学内容会让读者头晕目眩。太多的网站充斥着复制和抄袭的新闻稿,或者完全懒惰炒作或误导性的报道。真实科学网站(RealCl苗方清颜怎么样(苗方产品含有激素吗)对于女孩子们来说,能够让自己变得漂亮,花再多的钱也无所谓,但是下面这个女子就不一样了,小董从去年11月开始到现在,一直在一家美容机构祛痘,结果半年多的时间了,脸上的痘痘反而越长越多清颜堂祛痘效果怎么样(有没有在清颜堂工作过的)近日,广东电视台今日一线报道,来广州实习的女学生小吴,在白云区嘉禾望岗的一家痘博士门店体验了15元的祛痘服务后,没想到却背上了近万元的网贷。小吴根据一则15元体验祛痘的网络广告到店土家族歌曲(土家族歌曲大全)土家族歌曲(土家族歌曲大全)张家界土家翠翠王芳原创歌曲我用歌声谢谢你音乐MV全网发布202105212150红网0000红网时刻张家界5月21日讯(通讯员覃龙)5月20日,张家界青拜厄学多久(拜厄弹完相当于几级)首先要了解什么是指法指法指的是遇到一首新曲子,哪个音用哪个手指弹,这就是指法。而一般的古典钢琴教材基本都会标注指法,只要演奏者能够认识五线谱就行,不用去思考哪个音用哪个手指弹,跟着雷贝吃多久(雷贝拉唑40mg每天最多吃多久)众所周知,市场上药店里都会出售各种各样的胃药,有抗酸药抑酸药胃粘膜保护药以及促胃肠动力药等等。或者在大多数患者眼中,胃药是五花八门,以至让人眼花缭乱,不知如何抉择!然而,揭开这些胃