嵌入式C语言面试相关知识——内存管理(不定期更新)

嵌入式C语言面试相关知识——内存管理(不定期更新)

  • 一、博客声明
  • 二、自问题目
    • 1、嵌入式系统的内存布局是怎么样的?
    • 2、动态内存分配在嵌入式系统中的使用有什么注意事项?
    • 3、什么是内存碎片,如何减少内存碎片?
    • 4、什么是内存池,有什么特点优势,工作原理是什么?
    • 5、如何避免内存泄漏?
    • 6、在嵌入式系统中,栈溢出的原因有哪些?如何检测和避免栈溢出?
    • 7、解释嵌入式系统中的内存对齐。为什么需要内存对齐?
    • 8、如何优化嵌入式系统中的内存使用?
    • 9、malloc和free函数的工作原理?

一、博客声明

  又是一年一度的秋招,怎么能只刷笔试题目呢,面试题目也得看,想当好厂的牛马其实也不容易呀O(∩_∩)O。注意:这篇博客大部分是来自网上的资源,通过自问或者他问,然后寻找答案,为了加深印象,总结和抄一遍。


二、自问题目

1、嵌入式系统的内存布局是怎么样的?

  嵌入式系统中的内存布局分为5个部分:*栈(Stack)、堆(Heap)、BBS段(Block Started by Symbol)、 数据段(Data Segment)、 代码段(Text Segment) 。 其描述可以看下面这幅图片。
在这里插入图片描述

  • 栈(Stack): 用于函数调用时局部变量和函数调用信息,从高地址向低地址增长。栈的大小和生命周期由编译器在编译时确定,通常在程序启动时就分配好了。

  • 堆(Heap): 用于动态内存分配,从低地址向高地址增长。在程序运行时,需要通过函数如malloc()free() 来动态分配和释放内存。

  • BSS段(Block Started by Symbol): 用于存放未初始化的全局变量和静态变量。在程序运行前会将这些变量初始化位0或者空指针。

  • 数据段(Data Segment): 存放已经初始化的全局变量和静态变量,在程序运行前就已经分配好了内存空间。

  • 代码段(Text Segment): 存放程序的机器指令,通常是只读的。通常包括程序的执行代码,如函数、循环、条件语句等。

2、动态内存分配在嵌入式系统中的使用有什么注意事项?

  动态内存分配需要注意四个问题,分别是内存碎片、内存泄漏、实时性和资源受限。

  • 内存碎片: 频繁的动态内存分配和释放可能导致内存碎片,影响系统稳定性。
  • 内存泄漏: 未释放的内存会导致内存泄漏,逐渐耗尽可用内存。
  • 实时性: 动态内存分配的时间开销可能不确定,影响系统的实时性能。
  • 资源受限: 嵌入式系统通常内存资源有限,应该尽量避免频繁的使用动态内存分配。

3、什么是内存碎片,如何减少内存碎片?

  • 内存碎片: 内存碎片分为了内部碎片和外部碎片:

    • **内部碎片: ** 分配的内存块比实际需要的内存大,未使用的部分称为内部碎片。
    • **外部碎片: ** 多个小的内存块之间存在未使用的空间,无法被利用。
  • 减少内存碎片的方法:

    • 使用固定大小的内存块: 分配固定大小的内存块,避免大小不一的内存分配。
    • 内存池: 使用内存池进行内存分配和释放,减少碎片。
    • 紧凑算法: 在适当的时候进行内存紧凑,合并小块内存。

4、什么是内存池,有什么特点优势,工作原理是什么?

  • 内存池: 是一种管理内存分配和释放的技术,其核心思想就是预先分配一定数量的内存块,然后在程序运行期间重复使用这些内存块,而不是动态地分配和释放内存。内存池常用于需要频繁进行小块内存分配和释放的场景。
  • 特点和优势:
    • 提高性能: 避免了频繁的动态内存和释放操作,减少内存碎片的产生,从而提高了内存分配和释放的效率。
    • 减少内存碎片: 由于内存池预先分配了一定数量的内存块,这些内存块的大小是固定的,或者按照需求配置,因此能有效地减少内存碎片的产生。
    • 简化管理: 内存池可以有程序员精准地控制和管理,避免了内存管理带来的不确定性和性能消耗。
    • 实时性: 在需要实时性较高的系统重,内存池可以提前分配和初始化内存块,减少了运行时不可预测的延迟。
  • 工作原理: 通常由 内存块池、分配算法和回收机制 三部分组成。
    • 内存块池: 预先分配一定数量的内存块集合,每个内存块大小固定或者按需求配置。
    • 分配算法: 用于从内存块池中分配内存块的算法,通常是一种简单的分配策略。如首次适配,最佳适配。
    • 回收机制: 用于将不再使用的内存块放回到内存池中,以便下次重复使用。

5、如何避免内存泄漏?

  • 合理分配和释放内存: 确保每次分配的内存都有相应的释放操作。
  • 使用工具: 如Valgrind、AddressSanitizer等工具检测内存泄漏。
  • 代码审查: 通过代码审查发现潜在的内存泄漏问题。
  • 设计规范: 制定并遵守内存管理的设计规范和编码标准。

6、在嵌入式系统中,栈溢出的原因有哪些?如何检测和避免栈溢出?

  • 栈溢出的原因:

    • 递归调用: 过深的递归调用会导致栈空间被耗尽。
    • 过大的局部变量: 在栈上分配过大的局部变量(如大数组)会导致栈溢出。
    • 不合理的栈大小设置: 初始化时分配的栈空间不足。
  • 检测和避免栈溢出的方法:

    • 堆栈监控: 使用工具或者手动在栈顶放置哨兵值,监控栈的使用情况。
    • 合理分配栈空间: 根据系统需求合理的设置栈的空间大小。
    • 避免使用深度递归: 使用循环替代递归,避免深度递归调用。
    • 将大变量放在堆上: 堆的空间比较大,因此可以将需要大量内存的变量放在堆上,缓解栈的压力。

7、解释嵌入式系统中的内存对齐。为什么需要内存对齐?

  • 内存对齐: 是指数据在内存中的地址按照特定的边界排列。例如,4字节对齐表示数据地址必须是4的倍数。
  • 原因:
    • 硬件要求: 某些处理器要求数据按照特定的边界对齐,否则导致异常或性能下降。
    • 性能优化: 对齐数据可以提高内存的访问效率,减少CPU访问内存的次数。
    • 异常报错: 对某些严格要求的系统架构,如果不按要求对齐,会发生异常报错乃至系统崩溃。

8、如何优化嵌入式系统中的内存使用?

  • 使用内存池: 减少动态内存分配带来的碎片和开销。
  • 代码优化: 减少不必要的全局变量和静态变量,优化局部变量的使用。
  • 数据结构优化: 选择合适的数据结构,避免浪费内存。
  • 合理分配栈和堆的空间: 根据实际需求合理分配栈和堆的大小。
  • 定期检查和清理: 使用工具定期检查内存的使用情况,及时发现和清理内存泄漏。

9、malloc和free函数的工作原理?

  • malloc: 在堆上分配指定大小的内存块,返回指向该内存块的指针。如果返回失败,返回NULL
  • free: 释放malloc分配的内存块,将其归还给内存池供以后使用。
  • 工作原理:
    • malloc: 从堆上找到一个足够大的空闲内存块,标记为已使用,并返回该内存块的指针,如果没有合适的内存块,会尝试向操作系统请求更多的内存。
    • free: 将指定的内存块标记为可用,并尝试合并相邻的空闲块以减少碎片。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

恢复出厂设置后如何从 iPhone 恢复数据

在 iPhone 恢复出厂设置后,所有数据都会被删除,并且 iPhone 将恢复到原始出厂设置,这意味着您的所有 iPhone 数据,包括照片、视频、联系人和应用程序都将消失。 幸运的是,如果您有备份可以恢复,这并不一定…

Edge浏览器油猴插件的安装与使用

油猴 (又称篡改猴或Tampermonkey) 是最流行的浏览器扩展之一。它允许用户自定义并增强网页的功能。用户脚本是小型 JavaScript 程序,可用于向网页添加新功能或修改现有功能。使用油猴,您可以轻松在任何网站上创建、管理和运行这些用户脚本。 1.插件的安…

pycharm配置conda解释器

假如我新建了一个conda虚拟环境,名为python3.8

【数据结构与算法】快速排序霍尔版

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​

鸿蒙NEXT不再支持安卓这条路真的走的通吗?

前言 看到高赞又是一片嘲讽,“apk换种打包方式”等等轻松拿几百赞,我也是无语。 国内多家互联网大厂都已经启动HarmonyOS Next应用开发,预计明年正式上线,如今业内很多人都已经知道了。 网络上相关报道也有很多,新浪…

06.C2W1.Auto-correct

往期文章请点这里 目录 OverviewAutocorrectWhat is autocorrect?How it works Building the modelMinimum edit distanceMinimum edit distance algorithmMinimum edit distance Part 2Minimum edit distance Part 3 往期文章请点 这里 Overview 本周学习目标:…

Vue 使用 @click 绑定点击事件

https://andi.cn/page/621505.html

oracle数据库默认表空间详解

文章目录 oracle数据库默认表空间列表 oracle数据库默认表空间列表 系统表空间(System Tablespace) 系统表空间包含了系统级别的元数据,如数据字典、系统表和存储过程等。例如SYSTEM表空间用于保存数据库的数据字典、PL/SQL程序的源代码和解释…

通信协议_Modbus协议简介

概念介绍 Modbus协议:一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De f…

04.C1W3.Vector Space Models

往期文章请点这里 目录 Vector Space ModelsWord by Word and Word by DocWord by Document DesignWord by Document DesignVector Space Euclidean DistanceEuclidean distance for n-dimensional vectors Euclidean distance in PythonCosine Similarity: IntuitionCosine S…

验证回文串-string题目

用双指针&#xff0c;left right从两头往中间对比&#xff0c;不是字母的都略过&#xff0c;比的时候化成小写字母 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool isPalindrome(string s) {if(s.size() < 1)return true;int left …

vue-org-tree搜索到对应项高亮展开

效果图&#xff1a; 代码&#xff1a; <template><div class"AllTree"><el-form :inline"true" :model"formInline" class"demo-form-inline"><el-form-item><el-input v-model"formInline.user&quo…

Git详细安装和使用教程

文章目录 准备工作-gitee注册认识及安装GitGit配置用户信息本地初始化Git仓库记录每次更新到仓库查看及切换历史版本Git忽略文件和查看文件状态Git分支-查看及切换Git分支-创建分支Git分支-合并及删除分支Git分支-命令补充Git分支-冲突需求: 准备工作-gitee注册 传送门: gite…

zabbix 与 grafana 对接

一.安装 grafana 1.初始化操作 初始化操作 systemctl disable --now firewalld setenforce 0 vim /etc/selinux/config SELINUXdisabled 2.上传数据包并安装 cd /opt grafana-enterprise-9.4.7-1.x86_64.rpm #上传软件包 yum localinstall -y grafana-enterprise-9.4.7-1…

Django QuerySet对象,exclude()方法

模型参考上一章内容&#xff1a; Django QuerySet对象&#xff0c;filter()方法-CSDN博客 exclude()方法&#xff0c;用于排除符合条件的数据。 1&#xff0c;添加视图函数 Test/app11/views.py from django.shortcuts import render from .models import Postdef index(re…

身边的故事(十四):阿文的故事:再买房

短短的一年多时间里&#xff0c;阿文仿佛从人生低谷完全走出来了。各种眼花缭乱的操作和处理事情方式让人觉得不可思议&#xff0c;是不是一个人大手大脚花钱惯了&#xff0c;让他重新回到艰苦朴素的日子是不是比死都难受呢&#xff1f;又或者像我这种靠勤勤恳恳的打工人是无法…

SpringMVC常见的注解

一、Spring MVC Spring Web MVC是基于ServletAPI构建的原始web 框架&#xff0c;一开始就包含在Spring 框架中&#xff0c;通常被称为“Spring MVC”。 1.MVC 是什么&#xff1f; MVC(Model、View、Controller&#xff09;是软件工程中的一种软件架构设计模型。它把软件系统分…

基于深度学习LightWeight的人体姿态之行为识别系统源码

一. LightWeight概述 light weight openpose是openpose的简化版本&#xff0c;使用了openpose的大体流程。 Light weight openpose和openpose的区别是&#xff1a; a 前者使用的是Mobilenet V1&#xff08;到conv5_5&#xff09;&#xff0c;后者使用的是Vgg19&#xff08;前10…

Flink SQL kafka连接器

版本说明 Flink和kafka的版本号有一定的匹配关系&#xff0c;操作成功的版本&#xff1a; Flink1.17.1kafka_2.12-3.3.1 添加kafka连接器依赖 将flink-sql-connector-kafka-1.17.1.jar上传到flink的lib目录下 下载flink-sql-connector-kafka连接器jar包 https://mvnreposi…

python实现接口自动化

代码实现自动化相关理论 代码编写脚本和工具实现脚本区别是啥? 代码&#xff1a; 优点&#xff1a;代码灵活方便缺点&#xff1a;学习成本高 工具&#xff1a; 优点&#xff1a;易上手缺点&#xff1a;灵活度低&#xff0c;有局限性。 总结&#xff1a; 功能脚本&#xff1a;工…