这篇博客主要用于描述计算机体系结构以及操作系统相关的知识。
并发BUG
并发
bug杀人事件:
该电路具有两个模式:
- 高能模式:
需要带上滤镜。- 低能模式:
选择高能量的模式的时候, 镜片开始就位(机械部件就位需要
8s),在镜片就位前,切换成低能模式时, 可能发生:
- mirror未到位, 射出
X-Ray射线。 此时会发生问题。
- 死锁(dead lock)
出现线程互相等待的时候, 就是
死锁。
同一个线程对lock进行两次acquire就会发生死锁。$\rightarrow$ AA型死锁。

死锁的避免, 其实只有破除第四条, 1-3条是对定义的解释, 比较难破除, 避免循环等待。
- 数据竞争(Data Race)
同时发生两个或两个以上对同一个内存的操作,并且其中至少一个是写的话, 就会发生
数据竞争。不同的发生顺序,会导致不同的运行结果。
- 原子性和重排
sendmail的unix漏洞, 因为sendmail具有很高的权限吗,他具有sudo权限,但是在执行之前会检查,是不是软连接的一个程序, 但是
这里考虑到原子性的问题, 如果我创建的软连接足够快, 那么在他检查软连接的时候发生了并发的问题,就有可能执行我这个软连接。
这种类型的攻击通常被称为时间窗口竞态条件攻击或TOCTOU(Time-of-Check to Time-of-Use)攻击。在这种攻击中,攻击者试图在检查(Time-of-Check)和使用(Time-of-Use)之间更改系统的状态。
- Lock Ordering
为了避免死锁,当一个进程需要多个锁时,应该总是按照预定的顺序获取它们。这样,所有的进程都会按照同样的顺序尝试获取锁,从而避免了循环等待条件。
- Bug 的本质和防御性编程
写代码的时候,都假设你的代码是错的, 添加多的测试用例, 检查任何你可能觉得是错的地方。
- Lockdep
规定: 为每一个所确定唯一的
allocation site,同一个allocation site的锁存在一个全局唯一的上锁顺序。 $\rightarrow$ 解决死锁的问题。
- 解决数据竞争的问题
记录每个内存时的写和读, 跨线程的编译是lock和unlock, 最后会得到一个有向图, 从一个节点到另一个节点,存不存在一个路径,
用于判断是否存在datarace。 是现实Lampor’s Vector Clock.
1
- 保护栈空间:判断栈是否溢出。
在内存的top和bottom都占用一部分, 然后判断是否使用溢出?

代码编写指南
- break the big block code into the small code
系统调用和Unix Shell
graph TD
A[状态1: CPU Rest]
B[状态2: Firmware or BIOS Execution]
C[状态3: Load OS]
D[状态4: OS Initialization]
E[状态5: fork - 完整复制状态机]
A --> B
B --> C
C --> D
D --> E
操作系统:API+对象
Shell是一门把用户指令翻译成系统调用的编程语言。

