LOADING

加载过慢请开启缓存 浏览器默认开启

计算机体系结构

这篇博客主要用于描述计算机体系结构以及操作系统相关的知识。

并发BUG

并发bug杀人事件:

image-20230917142432572

image-20230917142203321

该电路具有两个模式:

  • 高能模式: 需要带上滤镜
  • 低能模式:

选择高能量的模式的时候, 镜片开始就位(机械部件就位需要8s),在镜片就位前,切换成低能模式时, 可能发生:

  • mirror未到位, 射出X-Ray射线。 此时会发生问题。
  • 死锁(dead lock)

出现线程互相等待的时候, 就是死锁

同一个线程对lock进行两次acquire就会发生死锁。$\rightarrow$ AA型死锁。

image-20230917144810847

死锁的避免, 其实只有破除第四条, 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.

image-202309171929511931

  • 保护栈空间:判断栈是否溢出。

在内存的top和bottom都占用一部分, 然后判断是否使用溢出?

image-20230917194047198

代码编写指南

  • 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是一门把用户指令翻译成系统调用的编程语言。