打印
[boot]

程序运行为什么需要内存

[复制链接]
610|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蒋博1026|  楼主 | 2019-8-22 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前段时间,一直在学习Linux网络编程,学习完之后,发现自己的C语言功底还是不足,所以从今天准备在重新学学C语言。
1、计算机程序运行过程
  计算机程序运行的过程,其实就是程序中很多函数相继运行的过程。程序是由很多函数组成的,程序的本质就是函数,函数的本质就是加工数据的动作。
2、冯诺依曼结构和哈佛结构
(1)、冯诺依曼结构:数据和代码放在一起
(2)、哈佛结构:数据和代码分开存放
(3)、什么是代码:函数
(4)、什么是数据:全局变量、局部变量
在运行操作系统的片子中,运行应用程序时:这时候所有的应用程序的代码和数据都在DRAM中,所以这种结构就是冯诺依曼结构;
在单片机中,我们把程序代码烧写到Flash(NorFlash)中,然后程序在flash中原地运行,程序中涉及到的数据(全局变量、局部变量)不能放在flash中,必须放在RAM(SRAM)中.这就是哈佛结构。
3、动态内存DRAM和静态内存SRAM
4、为什么需要内存 ?
内存是用来存储可变数据的,数据在程序中就会表现为全局变量和静态变量(在gcc中,其实常量也是存储在内存中的)(大部分单片机中,常量是存储在flash中,也就是代码段)。所以内存对我们写程序来说是非常重要的,对于程序运行也很重要
所以说内存对于程序来说,可以说是本质需求。程序越简单,需要的内存越少,程序越复杂,需要的内存越大。所以内存管理对于写程序是很重要的。比如说:数据结构(研究数据如何组织)、算法(算法是为了用更有效的方法来加工数据)
5、如何管理内存
(1)、从操作系统角度来讲:操作系统掌握了所有的硬件内存,因为内存很大,所以操作系统就把内存分成一页一页的(其实就是一块,一般是4KB),然后以页面为单位进行管理。在页面内,以更细小的方式来以字节为单位进行管理。对于使用操作系统的开发人员来说,操作系统给我们提供了一些内存管理的接口,我们只需要使用这些API就可以管理内存 。譬如C语言中使用malloc(申请内存)、free(释放内存)这些接口来管理内存。
(2)、没有操作系统时,也就是在裸机程序中,程序需要自己直接操作内存,程序员需要自己计算内存的使用和安排。
(3)、从语言角度来讲:不同的编程语言提供了不同的操作内存的接口。
  汇编语言:根本没有任何内存管理,内存管理全靠程序员自己,汇编中操作内存时直接使用内存地址(譬如0xa0052200),这样是很麻烦的。
  C语言:C语言中编译器帮我们管理直接内存地址,我们都是通过编译器提供的变量名等来访问内存的(譬如变量 a),操作系统下如果需要大块内存,可以通过API(malloc、free)来访问系统内存。裸机程序中如果需要大块内存需要自己来定义数组等来解决。
  C++语言:C++语言对内存的使用进一步封装。我们可以用new来创建对象(其实就是给对象分配内存),然后使用完之后,用delete来删除对象(释放内存)。但是如果使用之后,没有进行delete,就会造成内存不能释放,也就是内存泄漏。
  Java/C#等语言:这些语言不直接操作内存,而是通过虚拟机来操作内存。这样虚拟机作为我们程序员的代理,来帮我们处理内存的释放工作。如果我的程序申请了内存,使用完成后忘记释放,则虚拟机会帮我释放掉这些内存,但是借助虚拟机也是需要代价的。所以当我们程序对性能非常在乎的时候(譬如操作系统内核),就会用C/C++语言;当我们对开发程序的速度非常在乎的时候,就会用Java/C#等语言。


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

323

主题

1827

帖子

18

粉丝