zoukankan      html  css  js  c++  java
  • 程序运行为什么需要内存

    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#等语言。

  • 相关阅读:
    13/6/21 Hella Intern Interview
    【ToReadList】六种姿势拿下连续子序列最大和问题,附伪代码(以HDU 1003 1231为例)(转载)
    【算法】[leetcode] permutations的讨论(转载)
    【算法】leetcode之 Palindrome Partitioning I&II(转载)
    【C++】从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
    【C++】STL :栈
    【算法】逆波兰表达式
    【C++】STL,vector容器操作
    【LINUX】降级安装低版本GCC,G++
    【NS2】在linux下安装低版本GGC
  • 原文地址:https://www.cnblogs.com/jiangtongxue/p/11344526.html
Copyright © 2011-2022 走看看