本章知识点主要来自朱有鹏老师视频课,部分本身添加总结java
从硬件角度:内存其实是电脑的一个配件(通常叫内存条)。根据不一样的硬件实现原理还能够把内存分红SRAM和DRAM(DRAM又有好多代,譬如最先的SDRAM,后来的DDR一、DDR2·····、LPDDR)程序员
从逻辑角度:内存是这样一种东西,它能够随机访问(随机访问的意思是只要给一个地址,就能够访问这个内存地址)、而且能够读写(逻辑上固然也能够限制其为只读或者只写);内存在编程中自然是用来存放变量的(就是由于有了内存,因此C语言才能定义变量,C语言中的一个变量实际就对应内存中的一个单元)。算法
计算机为何须要编程?编程已经编了不少年,已经写了不少程序,为何还须要另外写程序?计算机有这个新的程序到底为了什么?编程
程序的目的是为了去运行,程序运行是为了获得必定的结果。数组
计算机就是用来计算的,全部的计算机程序其实都是在作计算。计算就是在计算数据。数据结构
因此计算机程序中很重要的部分就是数据。函数
计算机程序 = 代码 + 数据 计算机程序运行完获得一个结果,就是说代码 + 数据 (通过运行后) = 结果性能
从宏观上来理解,代码就是动做,就是加工数据的动做;数据就是数字,就是被代码所加工的东西。spa
那么能够得出结论:程序运行的目的不外乎2个:结果、过程操作系统
用函数来类比:
int add(int a, int b) { return a + b; } // 这个函数的执行就是为了获得结果 void add(int a, int b) { int c; c = a + b; printf("c = %d.\n", c); } // 这个函数的执行重在过程(重在过程当中的printf),返回值不须要 int add(int a, int b) { int c; c = a + b; printf("c = %d.\n", c); return c; } // 这个函数又重结果又重过程 |
计算机程序的运行过程,其实就是程序中不少个函数相继运行的过程。程序是由不少个函数组成的,程序的本质就是函数,函数的本质是加工数据的动做。
什么是代码?:函数
什么是数据?:全局变量、局部变量
内存是用来存储可变数据的,数据在程序中表现为全局变量、局部变量等(在gcc中,其实常量也是存储在内存中的,对于大部分单片机中,常量是存储在flash中的,也就是在代码段),对咱们写程序来讲很是重要,对程序运行更是本质相关。
因此内存对程序来讲几乎是本质需求。越简单的程序须要越少的内存,而越庞大越复杂的程序须要更多的内存。内存管理是咱们写程序时很重要的话题。咱们之前学过的了解过的不少编程的关键其实都是为了内存,譬如说数据结构(数据结构是研究数据如何组织的,数据是放在内存中的)和算法(算法是为了用更优秀更有效的方法来加工数据,既然跟数据有关就离不开内存)。
对于计算机来讲,内存容量越大则性能越大,因此你们都但愿本身的电脑内存更大。咱们写程序时如何管理内存就成了很大的问题。若是管理不善,可能会形成程序运行消耗过多的内存,这样早晚内存都被你这个程序吃光了,当没有内存可用时程序就会崩溃。因此内存对程序来讲是一种资源,因此管理内存对程序来讲是一个重要技术和话题。
先从操做系统角度讲:
操做系统掌握全部的硬件内存,由于内存很大,因此操做系统把内存分红1个1个的页面(其实就是一块,通常是4KB),而后以页面为单位来管理。页面内用更细小的方式来以字节为单位管理。操做系统内存管理的原理很是麻烦、很是复杂、很是不人性化。那么对咱们这些使用操做系统的人来讲,其实不须要了解这些细节。操做系统给咱们提供了内存管理的一些接口,咱们只须要用API便可管理内存。
譬如在C语言中使用 malloc free 这些接口来管理内存。
当没有操做系统时:
在没有操做系统(其实就是裸机程序)中,程序须要直接操做内存,编程者须要本身计算内存的使用和安排。若是编程者不当心把内存用错了,错误结果须要本身承担。
再从语言角度来说:
不一样的语言提供了不一样的操做内存的接口。