导言:
在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代?
一.程序在内存中的分布
作为一个程序猿,我们应该会常常跟代码打交道,那么我们所编写的程序或代码,是怎么跑起来的,操作系统怎么调用的,怎么划分的我们可以使用一个简单的图来了解一下:
在图片中,把我们的内存一共分为了两个部分,一个是操作系统的内核区,另外一个就是用户区
对于操作系统: 操作系统(英语:Operating System,缩写:OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。
操作系统内核要负责:程序调用,驱动调用,内存管理和分配,有兴趣可以学学操作系统,我们这里主要是看看用户内存区
用户内存区主要是用户对计算机发出的指令,计算机要做出相应的操作,用户区也是我们最大化操作计算机的地方,启动一个APP,打开网站,鼠标单击,Linux中的一次 dir指令等等,都是我们人,用户在进行操作和管理
我们写的程序或代码也是运行在用户空间上的
程序在用户空间上加载出来六个部分:
- 代码段
- 只读数据段
- 初始化数据段
- 未初始化数据段
- heap堆
- stack栈
代码段:就是我们写的源生的一些语言指令,在操作系统也可以叫做临界区,他在运行是不可改变的,又是纯的
只读数据段:就是我们在程序中写的一些常量,比如c或Java中使用const修饰的变量,它们是全局唯一且不可变的,包括语言本省有一些自定义的宏都是不可变的
初始化和未初始化的数据段:都是一些申请的全局变量,有些是未初始化的,有些是初始化的,在程序运行的时候就会被调用,都是数据段范围
heap堆:这就是我们的重点了,它的作用是动态申请空间的程序存放的地方,比如Java中我们new了一个对象,对象都存放在堆中的,还有c语言中malloc函数,它们所申请的东西都是存放在堆中的
stack栈:这是程序运行时被调用最频繁的了,它的结构很适合存储不长时间存在的变量,以及断点记录,每当一个函数执行完,它就会释放此次函数所产生的空间
补充:
我们仔细去看看图片就会发现,堆空间是向上扩张的,栈空间是向下扩张的,除了这两个空间,其它的空间都是静态资源,即在编译时分配的空间在执行的时候所需的空间还是那么大
栈空间是紧贴内核区的,因为栈在程序运行时本身就需要大量的操作,即使在内存中,把数据送到cpu或内核都是要开销的,所以为了使计算机可以快起来,栈作为操作多的结构就被选择紧贴内核
堆中存储的数据结构普遍都很大,包括对象这些操作集合,它们两者都向中间靠,会不会相遇呢?其实中间的数据区空间是很大的,绝大多数情况不会
栈中存储的都是值类型,指针也是值类型