当前位置: 首页 > news >正文

网站建设使用虚拟主机的优点与缺点新闻热搜榜 今日热点

网站建设使用虚拟主机的优点与缺点,新闻热搜榜 今日热点,wordpress增加浏览量,找室内设计师上哪个网站文章目录1 进程内存分配探究1.1 代码1.2 试验过程2 线程内存分配探究2.1 代码2.2 试验过程3 总结参考资料:1. 嵌入式软件开发杂谈(3):Linux下内存与虚拟内存2. 嵌入式软件开发杂谈(1):Linux下最…

文章目录

  • 1 进程内存分配探究
    • 1.1 代码
    • 1.2 试验过程
  • 2 线程内存分配探究
    • 2.1 代码
    • 2.2 试验过程
  • 3 总结

参考资料:
1. 嵌入式软件开发杂谈(3):Linux下内存与虚拟内存
2. 嵌入式软件开发杂谈(1):Linux下最大能创建多少线程?

在链接1中,我们可以了解到系统为每一个进程分配了4GB的虚拟内存空间,其中3GB为用户空间,是每个进程独有的,1GB为内核空间,所有的进程以及内核共同享有。

在链接2中,我们了解到系统为每个线程分配独立的堆栈,不同的系统有不同的大小,在32位linux系统上默认为8MB。

在上篇文章中介绍了系统以及进程相关的内存指标,但是有个疑问,当进程运行时候,系统是如何来分配内存的,是直接分配3GB给到内存,还是按需分配,最大3GB,通过下面代码来探究一番。

PS:下面测试环境为Ubuntu 64位系统。

1 进程内存分配探究

1.1 代码

#include <stdio.h>
#include <stdlib.h>int main()
{int ch = 0;int s32Size = 1024;char* s8Ptr = NULL;int s32Cnt = 0;while ((ch = getchar()) != EOF){printf("get char,malloc %d mem\n", s32Size);s8Ptr = NULL;s8Ptr = (char*)malloc(s32Size);if (NULL == s8Ptr){printf("malloc err\n");}else{printf("malloc success, cnt:%d, addr:%p\n", ++s32Cnt, s8Ptr);}}return 0;
}

上面代码,每当我们在终端输入一个字符,程序就申请1KB的内存,并且打印申请内存的地址。

1.2 试验过程

我们知道,堆是负责动态内存的分配,因此可以通过 # cat /proc/$(pid)/maps | grep heap
来查看进程的内存分配情况。

运行程序,然后使用top查看虚拟内存的使用情况以及使用上面指令来查看堆的使用情况。
在这里插入图片描述

# cat /proc/11031/maps | grep heap
00ae2000-00b03000 rw-p 00000000 00:00 0 

从上面可以可以看到这个进程的虚拟内存使用量为4352KiB,堆的地址为00ae2000-00b03000,换算一下堆的大小为132KB。但是此时程序并没有申请内存,怎么回事?

我们第一次申请内存,打印如下:

get char,malloc 1024 mem
malloc success, cnt:1, addr:0xae2830

然后查看虚拟内存VIRT使用量,还是4352KiB,并没有增加,堆的使用地址还是00ae2000-00b03000,也没有改变。

继续申请内存:

get char,malloc 1024 mem
malloc success, cnt:2, addr:0xae2c40
get char,malloc 1024 mem
malloc success, cnt:3, addr:0xae3050

第二次和第三次申请内存,VIRT和堆的信息仍然维持原状,没有改变,继续申请:

get char,malloc 1024 mem
malloc success, cnt:128, addr:0xb02c20

直到第128次申请内存时候,VIRT的使用量为4484KiB,比4352增加了132KB,而堆的使用量为264KB,比上次增加了132KB,信息如下:
在这里插入图片描述

cat /proc/11031/maps | grep heap
00ae2000-00b24000 rw-p 00000000 00:00 0                                  [heap]

继续申请内存,直到第258次申请内存,VIRT变为4616K,比4484增加了132KB,而堆的使用量为396KB,比上次增加了132KB,信息如下:

get char,malloc 1024 mem
malloc success, cnt:258, addr:0xb23c40

在这里插入图片描述

# cat /proc/11031/maps | grep heap
00ae2000-00b45000 rw-p 00000000 00:00 0                                  [heap]

从上面的测试中,我们看到第二次申请内存的地址为0xae2c40,而第一次申请内存的地址为0xae2830,两者相减,为1040,但是我们只申请了1024个字节,为什么会多16个字节?
第一个问题:为什么系统分配的内存比实际申请的内存大16个字节?

然后,我们可以看到,当程序运行时候,系统已经先为程序分配了132KB的内存,在随后我们申请内存时候,一直使用的是系统预先申请的132KB内存,直到我们申请的内存超过132KB,然后系统再次申请132KB,而不是我们需要多少就申请多少?
第二个问题:为什么系统会给进程申请132KB的内存,而不是我们真正需要的内存?

2 线程内存分配探究

2.1 代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/prctl.h>void *fun(void *arg)
{printf("----->thread_test\n");prctl(PR_SET_NAME, "thread_test");int ch = 0;int s32Size = 1024;char* s8Ptr = NULL;int s32Cnt = 0;while ((ch = getchar()) != EOF){printf("get char,malloc %d mem\n", s32Size);s8Ptr = NULL;s8Ptr = (char*)malloc(s32Size);if (NULL == s8Ptr){printf("malloc err\n");}else{printf("malloc success, cnt:%d, addr:%p\n", ++s32Cnt, s8Ptr);}}
}int main()
{int s32Ret = 0;pthread_t thread;if (getchar() != EOF){s32Ret = pthread_create(&thread, NULL, fun, NULL);		printf("pthread_create, ret:%d\n", s32Ret);}while(1) sleep(10);return 0;
}

上面代码,当我们第一次输入一个字符,则创建线程,随后再次输入字符则是分配内存

2.2 试验过程

运行程序,查看VIRT为6520KB,如下:
在这里插入图片描述

maps信息如下:
在这里插入图片描述

然后我们创建线程,查看VIRT和maps信息如下:
在这里插入图片描述
在这里插入图片描述

可以看到,VIRT由6520增加到14716,即增加了8MB,这个8MB是系统为每个线程创建时分配的。
然后开始第一次分配内存,VIRT和maps信息如下:
在这里插入图片描述
在这里插入图片描述

可以看到,当我们第一次申请内存的时候,VIRT由14716增加到80252,即系统为线程申请了64MB内存,而不是给进程分配的132KB内存。
第三个问题:为什么系统会给线程申请64MB的内存,而不是我们真正需要的内存?

开始第二次申请内存,VIRT和maps数据均没有变化,和进程中的分配机制一样,先从已经分配的内存中使用,当超过已经分配的内存时,才会重新分配新的内存。

get char,malloc 1024 mem
malloc success, cnt:1, addr:0x7f9bac0008c0get char,malloc 1024 mem
malloc success, cnt:2, addr:0x7f9bac000cd0

上面是程序的打印信息,可以看到我们申请了1024字节的内存,但是系统还是分配了1040个字节的内存,即多分配了16字节的内存,和问题1一致。

3 总结

通过上面的测试,我们得出了三个问题:

  • 第一个问题:64位系统,为什么系统分配的内存比实际申请的内存大16个字节?
  • 第二个问题:64位系统,为什么系统会给进程申请132KB的内存,而不是我们真正需要的内存?
  • 第三个问题:64位系统,为什么系统会给线程申请64MB的内存,而不是我们真正需要的内存?

后面章节将解决这几个问题。

http://www.ds6.com.cn/news/44079.html

相关文章:

  • 广东省做农业网站公司seo工程师
  • 个人养老保险怎么买最划算海外seo网站推广
  • 本地南昌网站建设公司seo服务商排名
  • 如何用域名做网站访问郑州靠谱seo电话
  • 手机网站样式代码百度怎么推广
  • 找人做购物网站中国新闻社
  • 网站建设咋做江门网站建设
  • 著名网站建设公司大侠seo外链自动群发工具
  • 大学生兼职网站建设策划书佛山百度推广电话
  • 做哪个网站招出国打工的多宁波网站seo哪家好
  • 给公司建网站 深圳汕头网站推广排名
  • flask做视频网站百度收录提交入口
  • 亳州做网站软文推广营销服务平台
  • wordpress文章图片保存到本地网站优化团队
  • htm网站模板电商营销策略
  • 江夏区做网站seo首页排名优化
  • 网站设计 做鼠标效果免费的seo网站下载
  • 最新房屋装修效果图大全seo入门教学
  • netcore做网站佛山seo代理计费
  • 重庆营销型网站建设价格西安seo网站排名
  • 建设学校网站的作用seo排名技术教程
  • 微信网站建设知识广告推广赚钱
  • 短网址生成管理平台海口网站关键词优化
  • 南宁网页设计招聘优化营商环境 提升服务效能
  • 荆门网站建设服务汽车网站建设
  • app网站开发工具下载微博热搜榜排名今日
  • 大连seo网站管理免费seo视频教学
  • 网络营销百度百科百度seo高级优化
  • 钢材网站建设域名比价网
  • 中国建设银行网站官网网址品牌推广的方式有哪些