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

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

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

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

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

static __thread int buf[MAX_ERROR_LEN];

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/35518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#1.0-11.0所有历史版本主要特性总结

文章目录 前言名词解释主要版本一览表各版本主要特性一句话总结 C# 1.0 (Visual Studio 2002, .Net Framework 1.0)C# 2.0 (Visual Studio 2005, .Net Framework 2.0)C# 3.0 (Visual Studio 2008, .Net Framework 3.0)C# 4.0 (Visual Studio 2010, .Net Framework 4)C# 5.0 (V…

Bigram 分词学习

Bigram 分词:概念、应用与中文实践 Bigram 分词是一种基础而有效的文本处理技术,特别是在自然语言处理中有着广泛的应用。本文将详细解释 Bigram 分词的概念、它在各个领域的应用,以及在中文处理中的独特优势和实践。 什么是 Bigram 分词&a…

DataWhale - 吃瓜教程学习笔记(三)

学习视频:第3章-对数几率回归_哔哩哔哩_bilibili 西瓜书对应章节: 3.3 对数几率回归 sigmoid函数 极大似然估计建模 信息论 以概率论、随机过程为基本研究工具,研究广义通信系统的整个过程 - 信息熵 (信息期望) 度…

Windows bat 提取多个目录下的文件,到一个目录

批处理命令 echo off setlocalrem 设置源目录和目标目录 set "sourceDirE:\motrix" set "targetDirE:\新建文件夹"rem 创建目标目录,如果不存在 if not exist "%targetDir%" mkdir "%targetDir%"rem 循环遍历源目录中的所…

TCP:TCP连接的建立与终止

TCP连接的建立与终止 建立连接第一次握手第二次握手第三次握手 终止连接第一次挥手第二次挥手第三次挥手第四次挥手 T C P是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本文将详细讨论一个T C P连接是如何建立的以及通信…

2024年能源电力行业CRM研究报告

中国能源电力行业属于大制造业的重要组成部分,在国民经济中的地位举足轻重。据统计,近十年来能源电力行业的整体投资呈现出增长趋势,尤其是“十四五”期间增长显著,2022年全国主要电力企业共完成投资12470亿元,同比增长…

STM32中挂在APB1(低速)和APB2(高速)上的外设

在STM32中, 连接在APB1(低速外设)上的设备有: 电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4 。 连接在APB2(高速外设)上的设备有: GPIO_A-E、USART1、ADC1、ADC2、ADC3、TIM1、TIM…

【乐吾乐2D可视化组态编辑器】连线

1 连线的绘制 1.1 钢笔绘制连线 1.1.1 曲线、线段、直线、脑图曲线 开始:单击左键 暂停:单击右键 或 enter 结束:esc 乐吾乐2D可视化组态编辑器demo:https://2d.le5le.com/ 1.1.2 横线 按下快捷键shift,点击鼠标左键绘制…

101.6k星的后台巨擘:一站式SaaS多租户、商城、CRM、ERP解决方案

RuoYi-Vue Pro,一个丰富优化重构的后台管理系统,为企业提供了一个强大、灵活、易用的解-决方案。 特点 丰富的功能支持:包括RBAC动态权限、数据权限、SaaS多租户、工作流、三方登录、支付、短信等。 现代化的技术栈:基于Spring Boot、MyBatis Plus、Vue & Element,支持…

在UE中创建命名管道之创建UE蓝图类

需求 在实际工作遇到了需要 UE 开发进程间通信相关的需求。 经过思考后选择使用命名管道来实现 。 名词概念 首先什么是进程间通信: 进程间通信( Inter-Process Communication,IPC)是指在操作系统中,不同进程之间进行数据交换…

负载均衡的部署方式有什么?

负载均衡时建立在现有的网络结构之上,将工作内容进行平衡、分摊到多个操作单位上进行运行,能够提高网络的可用性和灵活性,加强了网络数据的处理能力。那负载均衡技术都有着哪些部署方式呢? 负载均衡有着三种部署方式,分…

大厂面试官问我:Redis内存淘汰,LRU维护整个队列吗?【后端八股文四:Redis内存淘汰策略八股文合集】

往期内容: 大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】-CSDN博客 大厂面试官问我:布隆过滤…

精选:15款顶尖Python知识图谱(关系网络)绘制工具,数据分析的强力助手

知识图谱(关系网络)可以用简单的形状和线条显示复杂的系统,帮助我们理解数据之间的联系。我们今天将介绍15个很好用的免费工具,可以帮助我们绘制网络图。 NetworkX NetworkX是一个用于处理网络的Python工具。许多人在Python中处…

模型选择、过拟合与欠拟合

一、训练误差与泛华误差 1、在训练时,我们关心的是泛化误差,也就是对新数据的预测 2、训练误差:模型在训练数据上的误差;泛化误差:模型在新数据上的误差 二、验证数据集与测试数据集 1、验证数据集:用于…

Percona Toolkit 神器全攻略(配置类)

Percona Toolkit 神器全攻略(配置类) Percona Toolkit 神器全攻略系列共八篇,前文回顾: 前文回顾Percona Toolkit 神器全攻略Percona Toolkit 神器全攻略(实用类) 全文约定:$为命令提示符、gr…

Spring Boot集成jsoup实现html解析

1.什么是jsoup jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据,可操作 HTML 元素、属性、文本。 JSo…

函数内部结构分层浅析(从MVC分层架构联想)

函数内部结构分层浅析(从MVC分层架构联想) 分层架构:一种将软件代码按不同功能进行划分的架构模式。 优点包括: 可维护性:各层职责明确,易于单独修改维护。 可扩展性:方便添加或修改某一层,不…

优化Java应用的日志记录方法

优化Java应用的日志记录方法 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 在开发和维护Java应用程序时,良好的日志记录是确保应用稳定性和…

优化Java中网络通信的性能策略

优化Java中网络通信的性能策略 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代软件开发中,优化网络通信的性能是确保应用程序高效运行的关键…

Rocketmq在单节点情况下新增从节点

Rocketmq在单节点情况下新增从节点 在docker-compose部署rocketmq单节点的基础上,新增一个从节点 一,修改docker-compose配置文件 原docker-compose文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:server-4.5.2container_name: rm…