栈
计算机里面的栈其实有着举足轻重的作用。大学刚学c语言的时候,教的是堆栈,传达的是一种后入先出的算法思想。但其实我们知道,堆和栈是两个截然不同的东西。而这里面说到的栈,则是更融入到计算机系统里面,CPU结构的一部分。
对于栈的提出背景
对于一个函数设计里面,为了加速函数执行的速度和效率,提出使用cpu的寄存器传递参数, 但是由于寄存器数量有限,对于当函数内再想调用子函数的时候,再使用原有的cpu寄存器就会冲突了。 想利用寄存器传参,就必须在调用子函数前把寄存器当前函数的状态存储起来,然后当子函数退出的时候再恢复主函数。
所谓状态,即保存函数中的局部变量,因为对于函数而言,相互内部的局部变量是不影响的(除非在局部变量中创建一个引用类型的变量,因为该变量存储位置不再是栈中,而是在堆中)。面临的问题是,如何保存每一个函数(嵌套函数,即函数内部调用再次函数)中的局部变量呢【状态】???
栈的提出
争对上面的问题的解决方法,可以利用栈的结构体来解决寄存器传参的问题, 可以把当前寄存器中的值临时压入栈中(push),再执行函数的子函数,即子函数再次对寄存器进行传参,这样在栈中就会压栈(push),当执行完函数中的子函数时,出栈(pop),这样函数中的局部变量的使用就也利用了栈中的内存空间,最后利用栈指针的偏移来完成存取。 是函数的这些参数和变量的存储演变成记住一个栈指针的地址,每次函数被调用的时候,都配套一个栈指针地址,即使循环嵌套调用函数,只要对应函数栈指针是不同的,也不会出现冲突。利用栈,当函数不断调用的时候,不断的有参数局部变量入栈,栈里面会形成一个函数栈帧的结构,一个栈帧结构归属于一次函数的调用。栈的空间也是有限的,如果不限制的使用,就会出现典型的栈溢出的问题。
栈在操作系统中的意义
对于上面的函数切换机制,有了这样的先决条件,多任务就有了存在的基础。栈存在的意义所在!!!底层看出栈可以通过切换栈针来实现切换任务,即假如能控制找到每一个函数任务对应的栈针(栈针存储在堆栈寄存器中)即能操作cpu的调度,这就是实现多任务的本质。
补充
- 对于每一个栈空间而言,每一个栈空间都是独立的【目的,保存当前函数(任务)的状态】
- 多任务的底层本质是轮询切换机制
- 栈 是一种数据结构【先进后出】,对数据的处理,由寄存器处理一个任务转为可处理多个任务【底层是通过不断切换栈针来实现】