1.计算机的组成(五大部分)
如下图所示,计算机由 输入设备、储存器、控制器、运算器、输出设备组成。
- 输入设备:就是把外界一些信号输入到计算机中,比如摄像头、键盘输入等,本质就是把其他信号转成电信号(计算机只能处理电信号,图片属于光学信号)。
- 输出设备:就是把CPU处理过的电信号转化成其他信号进行输入,比如屏幕等。
- 存储器:存储一些数据【比如c语言中的一些变量,数组等】和指令【比如c语言当中的一些 + - * 等】。
- 中央处理器CPU:由控制器和处理器组成,CPU的任务就是对指令进行运算。
运算器:进行各种各样的运算,一系列的运算电路 控制器:控制整个cpu的运算过程,保证cpu内部有序执行
- 计算机原理:写好的指令存在存储器,CPU去存储器拿一条数据进行运算,执行完后存到存储器中继续拿下一条,同一时间点只能运算一条指令。(cpu能够进行各种各样的运算,运算顺序由存储器决定,因为CPU只能算各种各样的指令,指令储存在存储器中,)
- 在电脑中存储器分为外存和内存,外存就像硬盘之类,内存就像内存条之类;
内存:读写速度比较快,cpu读写很快,但是内存里面的东西一断电就丢失外存:内存里面的东西断电不会丢失,外存读写速度慢,是按块读取,所以cpu一般不能直接读取外存,程序是读字节,如果要读取数据需要速度很快并且断电不丢失容量空间大,一般通过多级存储结构,程序安装在外存,当外存中的程序需要运行的时候加载到内存中,然后cpu从内存中拿取数据进行运算
2.CPU工作原理
首先要了解
- 什么是指令?对于cpu来说是识别和运算的基本单位,运算器能够算+那么+就是指令,运算器能算-那么-就是指令,运算器不能算%那么%就不是指令。
- 什么是程序?程序是指令的有序集合,先执行什么后执行什么。
一条指令的执行分为三个阶段
- 取指,cpu将pc中的地址发给内存,内存将其地址中对应的指令返回到cpu中的指令寄存器IR中。
- 译码:译码器将IR中的指令进行识别,将指令(机器码)解析成对应的远算。
- 执行:控制器控制运算器中对应的运算单元进行运算,运算结果写入到寄存器中。
每执行一条指令pc的值会自动增加指向下一条指令
- cpu执行内存里边的某一条指令是由控制器决定,控制器里面有一个寄存器叫做PC,PC里面会存储一个指针地址,PC里面存的是什么地址,cpu就会拿内存里面的对应的地址,如图pc中现在有0x08,pc把地址0x08发给内存——内存接受到地址0x08——内存地址0x08对应的指令是*——把指令发给cpu,拿回来的存在cpu中的IR中,指令译码器对拿回来的指令进行翻译,指令译码器把翻译好的指令给运算器里面的*运算电路进行运算
- 当运算完一条后,存储到存储器当中,下一条如何运算?指令计数器PC中有一个PC自增器,PC自增器将上一条指令进行修改。在原来基础上进项加4指向下一条指令,重复以上顺序。
3.现在我们理解了CPU的工作原理,再来看看什么是堆,什么是栈?
如下图所示,栈和堆都存储在RAM当中,
-
栈:栈存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。满足:“先进后出”的原则存取,也就是位于栈内的元素,必须等到其上面(对应的地址为较低的地址)的数据或函数执行完成后,弹出后才可以进行下面的元素的操作。【先进后出,后进先出,方向:栈像堆移动,堆像栈移动,栈里面存放局部变量内容(函数实参)函数的调用call(调用函数时寄存器信息)】数据结构中的栈则是一种相当简单的结构。就像是只有一个口的深深的文件桶,先进去的文件会被压在下面(push),而且我们每次只能取到最上面的文件(pop),体现了其先进后出(FILO)的特性。虽然栈操作简单,但也有如单调栈等在栈内保持一定数据特性的变种。
-
堆:堆是程序中一块预留的内存空间,可由程序自由使用,堆被程序申请使用的内存在被主动释放前一直有效。一般由程序员分配释放, 若程序员不释放,对于堆来讲,释放工作由程序员手动管理,不及时回收容易产生内存泄露。 程序结束时可能由操作系统回收。【内存空间大于栈,存放变量名等】这就好像地位不同的人在排队,排在最前面的一定是地位最高的人,所以堆是[优先队列]
-
栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。
-
栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一,不同堆分配的内存无法互相操作。
-
栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloc函数完成。栈的动态分配无需释放 (是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放 回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。
那么栈和堆有什么关系呢?
假设有一个对象
let obj=new people()
obj(e=>{
e.name = '张三'
e.age = 18
})
那么
let obj=new people()就存放在堆中
e.name = '张三'e.age = 18就存放在栈中,堆指向栈
体会:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
记不住可以通过这为老哥的方法试试——什么是堆?什么是栈?他们之间有什么区别和联系? - 骚气小蛇蛇的回答 - 知乎 www.zhihu.com/question/19…
- > > 以上仅仅是我个人理解,如有不当,还请联系我删除或者修改