2022-OS-【2】程序状态机视角

知识都是相通的,nio,内存,离不开操作系统的调度。都能在OS这门课里找到答案。

状态机

从状态机的视角理解程序,很抽象,文字描述不能完全辅助你在大脑里想象出这个过程。最好去看老师的视频来自己充分的理解。

2022-OS-【2】程序状态机视角_第1张图片

2022-OS-【2】程序状态机视角_第2张图片

状态迁移

拿函数调用举例,来看程序在执行过程中的状态改变

2022-OS-【2】程序状态机视角_第3张图片
这里是一个用手动实现栈帧结构,然后用栈存储显式的模拟函数调用时入栈,出栈的操作。

这里讲到函数调用和栈帧的关系,那么什么是栈帧?简单叙述:
栈帧算是栈里的元素的一种叫法,而这时栈里每个元素存放的不再只是单一的一个值,例如上图的结构

type struct{
    int pc,n;
    char from ,to , via;
 }Frame;

栈帧真正的结构

2022-OS-【2】程序状态机视角_第4张图片
里面保存着:

  • 函数的返回地址和参数
  • 临时变量: 包括函数的非静态局部变量以及编译器自动生成的其他临时变量
  • 函数调用的上下文

使用gdb来debug一个递归的汉诺塔程序

2022-OS-【2】程序状态机视角_第5张图片

橘色和蓝色分别是两次调用方法时执行的时堆栈变化,注意虽然这里看似是执行了两条语句,但别忘了这个程序是递归的,其实这是嵌套执行的函数执行。

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。

2022-OS-【2】程序状态机视角_第6张图片

参考:
https://jyywiki.cn/OS/2022/sl...
http://t.csdn.cn/PWjUG

你可能感兴趣的:(操作系统)