二. 操作系统上的程序(指令可能有问题,后面再查资料)
- gcc -E file.c:c语言将宏展开。(变成易读的形式)
- !gcc %:编译;!./file.out:运行。
- 什么是程序:gdb角度:程序就是状态机。
* 状态:堆&栈;
* 初始状态:main对应的第一条语句
* 转移:任何一条语句
- c语言程序由多个栈帧(stack frame,保存参数、局部变量、pc(程序计数器)等)组成,函数调用即创建一个新的栈帧,函数调用返回即pop掉顶上栈帧。
- watch point
- 程序死循环,操作系统如何解决?
指令syscall:将程序控制权交给操作系统,修改状态机,由操作系统控制硬件资源结束程序。
程序 = 计算 + syscall(http://jyywiki.cn/OS/2022/slides/2.slides#/3/2)
- 编译器:源代码状态机➡二进制代码状态机,以状态机的视角来看,正确的编译应当是编译优化不改变状态机状态。
编译优化:保证观测一致性的前提下改写程序,提高效率。
- strace
三. 多处理器编程
- 线程是并发的基本单位,即共享内存的多个执行流(指针可以互相引用),执行流拥有独立的堆栈/寄存器。
- 线程创建:在状态机里新加入一个栈帧链表。
- clone:创建线程的系统调用
- 编译器优化可能会对多线程执行顺序造成影响(valatile可以避免编译器的优化)。
- 现代处理器也可以视为编译器(将汇编编译为μops)
- 多处理器之间及时可见性会丧失。
四. 理解并发程序的运行
- PeterSon算法:进入临界区的情况:如果只有一个人举旗,他就可以直接进入;如果两个人同时举旗,由厕所门上的标签决定谁进;手快 🈶️ (被另一个人的标签覆盖)、手慢 🈚。
posted @
2022-08-09 17:17
tao_sama
阅读(
266)
评论()
收藏
举报