内存为什么还有管理?

本文作者:度白嵌入式

任何程序运行起来都需要分配内存空间存放该进程的资源信息的,C程序也不例外。C程序中的变量、常量、函数、代码等等的信息所存放的区域都有所不同,不同的区域又有不同的特性。C语言学习者、尤其是在学习嵌入式的朋友,这些知识点一定要吃透!

被欺骗的C进程

每一个C语言的程序被执行起来的时候系统为了更方便开发人员操作,会给每一个进程分配一个虚拟的内存空间,它实际上是从处理内存映射出来的。虚拟内存的起始地址结束地址都是固定的,因此虚拟内存的布局都是一样。比如有三个进程 P1 P2 P3 ,他们虽然得到的物理内存是完全不一样,但是从进程的角度来看他们三个得到的内存确实一模一样的。

22410dbf8b4a75140467d1fd32f4a7d4.png

假设你正在使用的计算机实际物理内存只有 1GB 大小,而当前系统运行了三个进程,Linux 会将 PM 中的某些内存映射为三个大小均为 4GB 的虚拟内存 ,让每个进程都以为自己独自拥有了完整的内存空间,这样极大地方 便了应用层程序的数据和代码的组织。

虚拟内存布局:

虚拟内存布局分为内核空间、栈、堆、数据段、代码段和一个不允许访问的空间(相当于一堵墙)。

d0ba9d89f669b81ab17b6c46210d5fa7.png

一个用户进程可以访问的内存区域介于 0x0804 8000 到0xc0000000 之间,这个“广袤”的区域又被分成了几个部分,分别用来存放进程的代码和数据。

下面让我们更进一步地研究虚拟内存中每一个空间所存放的是什么类型的数据。

栈内存

栈内存是用于存放环境变量、命令行参数和局部变量的。栈内存空间十分有限,默认情况下栈的大小为 8M ,在嵌入式开发的时候我们应该尽可能减少使用栈空间。栈空间的增长,从上(高地址) 往下 (低地址)每当有一个函数被调用的时候,栈就会从上往下分配一个段,这一段空间就是一个栈帧,该内存空间用来存放该函数的局部变量。

0c4bc0a40d1be5c910a44bb18a136d75.png

当一个函数退出(调用结束)的时候,栈空间会从下往上释放一个栈帧,将所有的内存归还给系统。

注意:

栈空间中的内存存放的数据值是未知的, 因此每一个局部变量在使用之前最好做好初始化

栈内存的空间我们无法手动实现申请与释放,都是由系统自动完成,我们无法干预。

堆空间

堆空间是相对自由的空间,这是一个非常重要的区域,因为在此区域定义的内存的 生命周期我们是可以控制的:从 malloc( )/calloc( )/realloc( )开始,到 free( )结束,其分配和释放完全由我们开发者自定义,这就给了我们最大的自由和灵活性,让程序在运行的过 程当中,以最大的效益使用内存。

c5e3e96d4095abe5379c297f056eebd5.png

注意:

  • 相对于栈空间来说,堆的内存空间相对大很多

  • 堆空间的增长方式,从下(低地址)往上(高地址)

  • 堆空间中的内存都属于匿名空间, 因此需要借助指针来访问

  • 有开发者自行申请和释放的,如果没有释放那么这个空间将一直存在,直到程序结束。

数据段

数据段中存放着全局变量、静态变量、和常量这些数据,生命周期与程序一致。程序不止,数据不断(段)。

34c3c390127f3d212f6e9d342f4a43b1.png

代码段

代码段中又分成了两个空间:

.text段:存放用户的代码(mian func ...)

init段:当程序运行之初的一些初始化的工作(由编译器根据系统来对应添加的)

7412a22b9cedf3b8986d0e32be9378f8.png

内存管理是嵌入式学习的重点知识,也是判断一个人是否入门的重要标志。内存管理学得好,对C语言的理解又会更加深刻一些。


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

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

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

相关文章

ajax html fileupload,fileUpload.html

文件上传测试说明: 最大上传量:100M,单个文件最大长度:100Menctype"multipart/form-data" method"post">Element.hide(progressBar);Event.observe(fileUploadForm,submit,startProgress,false);Event.observe(cancelUploadButton,click,ca…

HDOJ1106 排序

题目&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1106 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b; } int main(){ char s[1001]; int len,i,sum,cnt; …

TCP实现可靠传输

1. TCP 和 UDP的区别&#xff1a; TCP面向连接&#xff1b;UDP无连接TCP保证数据的可靠传输&#xff0c;数据传送无差错&#xff0c;不丢失&#xff0c;无重复&#xff0c;按序到达&#xff1b;UDP不保证可靠交付TCP连接一对一&#xff1b;UDP支持更广泛UDP实时性好&#xff0c…

旧手机别扔,手把手教你DIY一台Linux服务器

作者&#xff1a;Hannah Lee编译&#xff1a;弯月 欧阳姝黎来源&#xff1a;CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;本文将向你展示如何使用 UrBackup 和 Linux Deploy在一台 Android 旧手机上搭建一台备份服务器。旧手机的污染问题众所周知&#xff0c;我有一台旧…

学计算机买电脑显卡1605ti够吗,GTX1650和GTX1050Ti哪个好?GTX1050ti和GTX1650性能差距对比评测...

GTX1650显卡在2019年4月22日进行发售&#xff0c;不少用户认为GTX1650是智商检测卡&#xff0c;真的是吗&#xff1f;从命名上来看&#xff0c;GTX1650应该是GTX1050的升级产品&#xff0c;不过根据英伟达的说法&#xff0c;GTX1650相比GTX1050提升幅度达到了70%&#xff0c;但…

Cacti Plugin Architecture安装

1.下载Cacti PluginArchitecture ,http://mirror.cactiusers.org/downloads/plugins/cacti-plugin-0.8.7g-PA-v2.8.tar.gz2.解压Cacti Plugin Architecture 3.安装cd cacti-plugin-archcp cacti-plugin-0.8.7b-PA-v2.1.diff /var/www/cactipatch -p1 -N < cacti-plugin-0.8.…

P1547 Out of Hay

传送门 练习 只是一个最小生成树的水题&#xff0c;拿来练练模板 AC代码&#xff1a; #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define maxn 10001 struct hh {int x,y,z; }t[maxn]; int …

研发转FAE,要想清楚

说个事情吧因为今天有个同学跟我说&#xff0c;自己想转去做FAE。他最近刚面试了一个FAE的岗位&#xff0c;那边感觉挺缺人了&#xff0c;感觉那边领导也比较喜欢自己&#xff0c;想让他快点去那边。然后我就跟他聊了下首先&#xff0c;过去做FAE的岗位就是一个大头兵&#xff…

Gamma的传说

Gamma校正对于图形和图像来说是个常提的概念&#xff0c;但对于gamma的缘由和使用方法&#xff0c;却存在着很多传说。本文将尽可能解析gamma校正来源&#xff0c;破解各种迷思。Gamma校正从何而来 有一种常见的说法&#xff0c;gamma来源于眼睛对光感受。我也曾经错误地采用了…

计算机网络在实践中的应用,计算机网络技术及在实践中的应用

摘 要隨着社会的快速发展&#xff0c;计算机网络技术也得到迅猛发展&#xff0c;计算机网络技术已经广泛应用于人们的生活和工作中。如今&#xff0c;计算机网络技术已经趋向成熟&#xff0c;应用范围也在不断扩大。计算机网络技术实际上是以下几种技术的结合&#xff1a;一是计…

进程中的一个线程死了所引发的后果

我们知道&#xff0c;同一个进程中的多个线程共享进程资源&#xff0c;包括主内存、文件句柄、锁资源等。那么当一个线程死了&#xff08;非正常退出、死循环等&#xff09;就会导致线程该占有的资源永远无法释放&#xff0c;从而影响其他线程的正常工作&#xff0c;看下面一个…

心急吃不了热豆腐

良好的焊接是保证电路稳定持久工作的前提。下面给出了常见到的焊接缺陷。看看你遇到过多少种&#xff1f;▲ 图1 焊接中的常见问题▲ 图2 锡珠▲ 图3 扰动的焊接&#xff1a;在焊接点冷却过程中焊锡移动&#xff0c;造成焊接表面起雾、结晶、粗糙▲ 图4 立碑▲ 图5 冷结&…

ICON资源

http://openiconlibrary.sourceforge.net/downloads.html http://commons.wikimedia.org/wiki/Crystal_Clear&#xff08;强烈推荐&#xff09; http://www.everaldo.com/crystal/ http://www.iconspedia.com/&#xff08;很多国外nb的设计师&#xff0c;强烈推荐) http://www.…

会议升降计算机主机,升降式无纸化多媒体会议系统

升降式无纸化多媒体会议系统&#xff0c;我们将全面贯彻执行现代化企业管理理念以及“一站式****”的服务理念&#xff0c;内强素质外树形象&#xff0c;随时为全球广大客户提供更超值的产品与服务&#xff0c;更好更快得促进企业的稳健快速发展。精品主题&#xff0c;实战科普…

给电子类大学生一点求职建议

‍读大学的时候应该想清楚以后要干嘛&#xff0c;不然很可能要面对毕业即失业的窘境。每年近千万毕业生涌向社会&#xff0c;这个数字多少会给你点压力吧。因为我是专业对口的&#xff0c;所以我就从对口的角度&#xff0c;说下我们电子信息类专业学的啥以及怎么学。有很多人在…

Silverlight三维柱状图3D饼图的Silverlight图表组件案例

Silverlight三维柱状图3D饼图的Silverlight图表组件案例 开发环境&#xff1a;Visual Studio 2010 Silverlight 4 SQL2005 Silverlight开发的3D图表组件与及应用的项目截图&#xff1a; 本Silverlight开发的图表控件程序架构简洁清淅&#xff0c;是做二次开发的良好项目框架和核…

oppo专用计算机,OPPO手机助手

OPPO手机助手是OPPO官方最安全的手机助手&#xff0c;将OPPO手机和电脑连接后&#xff0c;可通过“OPPO手机助手”在电脑上管理手机中的应用程序、短信、通讯录(含通话记录)和图片等&#xff0c;还能在电脑上备份手机中的资料。OPPO手机助手是oppo手机的贴心管家。华军软件园提…

EDG牛逼

不管EDG有多牛&#xff0c;明天的早餐可以加个馒头&#xff01;EDG&#x1f42e;&#x1f37a;

[LeetCode][Python][C#]刷题记录 26. 删除排序数组中的重复项

这道题我真的纠结好久&#xff0c;因为没注意那个原地的题目要求&#xff0c;所以很奇怪怎么我电脑运行成功&#xff0c;但是LeetCode上运行就是不对。气哭。 感谢群友lino的帮助。他试了set方法不行&#xff0c;直接喂给我的答案了。。。 题目&#xff1a;26. 删除排序数组中的…

IE9给我带来的惊喜和不解(For Silverlight不解)

今天兴致冲冲的装上了IE9&#xff0c;发现IE9装好后不能打开我的Silverlight。提示我需要安装Silverlight插件 如图 后面深蓝色群里得朋友说他们没有这个问题&#xff0c;但是在64位的情况下会有这个问题&#xff0c;我查看了 我的Silverlight是好的&#xff0c;并且重新安装ru…