堆栈理解

来源:互联网 发布:xbox one x 知乎 编辑:程序博客网 时间:2024/05/29 07:17

堆栈

操作系统每个线程创建一个堆栈,大小为1M,供函数调用时使用!

线程内的函数中的静态变量都是从这个默认堆栈分配。

默认1M的线程堆栈结构:


就好像一栋楼,第一次层是“栈底”,楼层编号为“0x0004 0000”;顶层(楼顶)是“栈顶”,编号为“0x0013 F000”。每一层楼呢,叫做一个“页面”。

刚开始的时候(注意这句话,意为:CPU堆栈指针寄存器内的地址为“0x0013 F000”时,也就是在顶楼时),顶楼是可以为函数参数分配内存的,但是呢倒数第二层(顶楼的下层)会被标记为“保护页面”,也就是说这是神圣之地,是处女地,你暂时不可以访问!注意,顶楼和其下层已经被分配了物理存储器的可用页面了,所谓物理存储器的也用页面可用这么理解:在windows中,是虚拟内存空间,也就是说一切都是“虚”的,说给你了4G的内存空间,你就可以假想自己真的拥有了4G内存空间,但是实际上这4G内存空间不是现成做好了,切好了,包装好了仅给你用的,别忘了内存就像公交车,大家都能上车!这就好比比尔盖茨的存款,600个亿呢!银行真的是拿出600亿美元放到柜子里,等着比尔来取吗?当然不是,银行是告诉比尔,你账户里有600亿,你要是用呢,就通过银行柜台取,很可能某一天比尔要取钱350亿现金,可怜的某个银行只有5000万现金,那怎么办呢?此银行指定是联系总行调钱,从总行转移现金过来。栈顶页与紧邻其下的页不是虚的,真真儿的有物理内存分配好了在那等着呢!!但是除了这两页外的其他页,对不起,还是虚的!随着函数调用的增多,需要更多的堆栈来用,那么操作系统在用自己的内存调度机制,不断地从顶楼--倒数第二层楼--。。。正数第二层楼,按照这个顺序连续的给你分配内存供函数参数、局部变量使用!

如果CPU堆栈指针(地址)寄存器存放顶楼地址,那么此时倒数第二楼就是被保护的,不允许进入的!就相当于做了一个间隔,上面战火纷飞,但是有了保护页面的庇佑,下面的楼层(堆栈空间)安然无恙!随着堆栈空间的向下不断分配,保护页面也在不断的下移!

原创粉丝点击