知识都是相通的,nio,内存,离不开操作系统的调度。都能在OS这门课里找到答案。
状态机
从状态机的视角理解程序,很抽象,文字描述不能完全辅助你在大脑里想象出这个过程。最好去看老师的视频来自己充分的理解。
状态迁移
拿函数调用举例,来看程序在执行过程中的状态改变
这里是一个用手动实现栈帧结构,然后用栈存储显式的模拟函数调用时入栈,出栈的操作。
这里讲到函数调用和栈帧的关系,那么什么是栈帧?简单叙述:
栈帧算是栈里的元素的一种叫法,而这时栈里每个元素存放的不再只是单一的一个值,例如上图的结构
type struct{
int pc,n;
char from ,to , via;
}Frame;
栈帧真正的结构
里面保存着:
- 函数的返回地址和参数
- 临时变量: 包括函数的非静态局部变量以及编译器自动生成的其他临时变量
- 函数调用的上下文
使用gdb来debug一个递归的汉诺塔程序
橘色和蓝色分别是两次调用方法时执行的时堆栈变化,注意虽然这里看似是执行了两条语句,但别忘了这个程序是递归的,其实这是嵌套执行的函数执行。
frame at xxxxx: 代表当前栈帧的地址
ArgList at xxxxx:是存放临时变量的地址
called by frame at xxxx:表示上一个栈帧的地址
sp is xxxx:返回自己的地址,如上面那个栈帧结构图所写的Return Address
看到这里是不是发现有点眉目了,第二次called by的是第一次的 frame at,这不就是一个嵌套调用的过程吗
当我学到这里是对栈帧有了大致的理解,在看《深入Java虚拟机》的2.2.2那段话时对栈帧这个词就没有感到陌生了hh。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。