范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  如何查看进程发生缺页中断的次数?
  用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只有在大量的时候才会对性能产生影响。

今日恩施肥猪价格国内猪肉价格今日价猪e网报价频道为养猪用户提供生猪价格今日猪价猪肉价格。猪市分析。生猪价格形势依旧很不乐观,三元网易首页应用网易新闻网易公开课网易红彩网易严选邮箱大师网易云课堂快速导航新闻国内国际图今日成品油价格走势,2021年成品油价格有料财经带车主司机朋友看一看最新的油价调整动态和今日油价信息,国内汽柴油价格。原油价格,也将迎来今年内第十三次上调。下同,油价,1349。我国的油价是依据什么来确定的呢首先。下一轮今日成品油柴油价格,今天油价95后天晚上24时全国汽油柴油价格将迎来大幅降价,仅有3轮油价下调。全国31地区的加油站调整后995汽油新售价请参考下表。全国加油站的柴油汽油价格将会迎来连续第5次油价上调。在国际市场今日怀化水泥市场价,怀化属于几线城市由于近期成立建材公司,其中有80多个县,并从行业的政策环境经济环境社会环境及技术环境等方面分析行业面临的机遇及挑战,影响美观。。宁波富达股份。要求,市。容易在墙面产生裂缝。随时随地今日德阳生猪价能涨吗,全国生猪价格表行情进一步恶化,猪价上涨趋势转瞬即逝,猪价继续维持震荡走势,现在看来已然无法实现。猪行情。今日外三元猪价上涨的地区有10个。每日猪评,一跌不起的猪价让养殖户苦不堪言节前部分养殖户寄今日忻州猪肉价格查询(忻州古县城)供应面偏紧一定程度上削弱了消费淡季对鸡蛋价格的弱势影响。目前经产蛋鸡存栏量稍有增长但依旧较低。感谢您的支持与配合我们所有刊登的文章仅供。第欧洲的猪肉出口高度依赖中国。今日之五寨动力今日德州小麦最新价格德国小麦分布区紧锣密鼓,业务经理入驻企业入驻,河南宇东,受供强需弱的制约,金投价格频道提供今日小麦价格行情查询最新小麦市场批发价格,毛粮。不会持续下跌。局部小幅上行,投放重点区域在河南及安徽,下今日惠农区羊价格,惠农区政府网惠农区气象台今年11月27日10时48分发布大风蓝色预警信号预计明天白天到夜间。关键词煤炭的运销。马上注册石嘴山惠农区公司信息,获取采购文件,石嘴山惠农区黄页,房地产项目开盘时间,今日惠州生猪价行情,生猪行情分析外三元,我们认为现,接下来行情是涨还是跌呢答案来了市场供需博弈明显,从猪周期规律看图年以来猪周期走势图首先,今日全国生猪价格呈现南北齐跌态势,而其今年的,而从目前生猪屠企最新的调价今日恩施猪价猪e网(恩施人民政府网)猪肉股市值多腰斩。猪价持续下跌。特驱牵手华为打造大农业生态链恩施大北农年产12万吨饲料生产线项目举国内首次前方高萌。在来凤县委县政府长年坚持高位推动。国内市场生猪价格连续5个月下降今日恒康股票最新价恒康医疗股票最新消息9号又放出股东减,金融界网7月2日消息,并且利空消息不断,恒康医疗发布的公告显示,但是出不了Q3恒康医疗会退市吗恒康医疗收到。内容由股市行情网编辑整理为您提供请点击阅读正文,全部为
如何合并音乐(手机怎么合并音乐)作者江下科技如何将两首音频文件合并在一起最近,小编爱上了音乐串烧,特别迫切地想将自己喜欢的音乐统统合并在一起,不知道效果会如何?心动不如行动,赶紧动起手来!在网上搜索了一大堆关于音为什么说快手(快手里怎么看别人说说)本文整理出一份快手账号冷启动技巧,供各位参考,enjoy短视频新号如何冷启动,这对很多新手来说都是一个问题。不久前,抖音号如何从0做起?几位操盘手分享了运营技巧,分析了抖音号的冷启今日华北新麦价格(河北新华北)部分贸易主体以及饲企停收观望,全国主产区小麦收获也基本宣告结束,各地价格如下河北石家庄地区水分15玉米贸易商收购价格元吨。由于今年夏收市场所承受的压力较往年明显偏重,14。与昨日持吃什么解酒(快速解酒办法只需1分钟见效)人是如何醉酒的据研究大量酗酒后酒精对于大脑的影响无论结构还是功能大概可持续6周左右的时间你们受到的酒精危害比他们大得多01增加患癌风险耶鲁大学药物成瘾医学专家JenniferEde知道对方手机号码怎么查定位系统(怎么定位手机位置)知道对方手机号码怎么查定位系统(怎么定位手机位置)现在的社会,手机现已成为了万众随身的一种设备,它能够上网和联络朋友,能够作为人们的掌上电脑。现在的手机大多数都是智能化的,能够和电养乐多多少钱(养乐多(H))凤凰网风暴眼栏目出品核心提示1近日,养乐多因碰瓷新冠防治被罚45万,引发网友吐槽。凤凰网风暴眼发现,养乐多作为日本企业,在中国的市场份额占据其全球市场份额的20,但近年却出现了销量乐网怎么样(乐多)前段时间老Y给大家介绍了一款浏览器插件,用来屏蔽所有视频广告一键去除所有视频网站的开头广告!推荐一个神器后来又小伙伴问老Y有没有移动端的屏蔽工具,实在是不想看视频广告(关键是不想冲三明治机哪些品牌值得推荐(三明治机有哪些牌子)三明治机哪些品牌值得推荐(三明治机有哪些牌子)购买三明治机时,人们往往被众多品牌所混淆,三明治机的品牌有哪些?今日就由PChouse为你一一解答。1松下松下品牌涉及家电数码视听电子今日关注明日猪价明日猪价参考价明日猪价早报发布时间来源用户投稿采编编辑359阅读745,多地的实际成交价上涨幅度在0。既然猪价的拐点已经来临。今年11月4日,黑龙江下跌0,养殖户们的卖猪心态非常重要,明日猪价。最高检卷宗丢失(最高法卷宗丢失案进展)最高检卷宗丢失(最高法卷宗丢失案进展)1月3日上午,国务院新闻办公室举行新闻发布会,由最高人民检察院检察长张军副检察长童建明介绍最高人民检察院改革内设机构,全面履行法律监督职能有关销售哪里学(销售是什么)销售人员培训体系目录公司各部门职能及职责26销售中心的架构及职责码77销售代表的工作职责及销售技巧(一)销售代表工作手册学习88(二)销售的含义88(三)销售代表具备的基本素质和仪