程序设计中对内存分配管理的思考,进程内存、线程内存、共享池、栈、堆

设计一个程序,要考虑如何分配和管理内存,以下是对所有内存分配和管理类型的总结。

第一、进程级的内存资源,也叫全局静态内存,其生命周期是伴随整个进程的运行期间,可以用作在进程范围内共享数据的方法。对应于C语言的全局静态变量,如 static int buf[10];

在多线程的情况下,假如每个线程并行运行时都会使用某个全局静态变量,而又不希望受到其它线程的干扰,于是就产生了第二种线程级的内存资源。

第二、线程级的内存资源,其生命周期是伴随一个线程的始末,每创建一个新的线程,这种类型的内存资源就会被创建一次,线程结束时,它也被销毁。对应于C语言的线程级全局变量,如

static __thread int buf[MAX_ERROR_LEN];

第一种和第二种内存都存在的问题是,如果它们在整个进程或者线程的生命周期中被使用的频率很低,但是却占用了大量的内存,在线程的创建和结束时需要消耗较大的分配和销毁工作量,那就不是很理想,针对内存需求量较大、使用频率又较低的情况,产生了第三种内存。

第三、共享内存池,就是在进程的范围内或者是整个操作系统的范围内先分配一定数量的全局内存块,供所有的线程共享使用,线程需要的时候申请一块来用,结束以后将它归还共享池。这跟线程使用malloc动态申请一块内存有什么区别呢?区别在于,malloc分配的是固定数量的内存,而我们需要的内存往往是不确定的,不知道需要多少内存,我们需要一个动态的内存管理器,这通常是我们自己设计的一个内存管理器,比如我在上篇文章中设计的MemChain,共享内存池中就是这样的动态内存分配管理器,能满足任意数量内存的需求,不再需要我们额外考虑内存的分配。创建和销毁一个MemChain往往要比申请一个已有的MemChain更耗时,所以我们采用共享池,而不是在线程中频繁创建和销毁MemChain.

还有最后两种,就是我们最常用的栈内存和堆内存。

第四、栈内存,栈是一种线程内函数级的内存资源,其生命周期是一个函数的一次运行的始末,它的大小受到操作系统的限制,比如Ubuntu默认的栈容量是8M,我们在函数中使用的自动变量的总和不能超过栈的容量,因此,函数中使用的自动变量都是比较少量的内存,需要大内存时就需要从堆中获取。

第五、堆内存,堆内存是不受任何限制的,系统有多少就可以用多少,直到耗尽内存为止,第三种内存就属于堆内存,只是我们设计了一个共享池的机制来预先加载一部分堆内存,并用MemChain方便的管理和使用它。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuzen

您的资助将帮助我创作更好的作品

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值