Lec10 Multiprocessors and locking (Frans)

锁的acquire和release之间的代码,通常被称为 critical section(临界区)。

如果两个进程访问了一个共享的数据结构,并且其中一个进程会更新共享的数据结构,那么就需要对于这个共享的数据结构加锁。

矛盾的是,有时候这个规则太过严格,而有时候这个规则又太过宽松了。除了共享的数据,在一些其他场合也需要锁,例如对于printf,如果我们将一个字符串传递给它,XV6会尝试原子性的将整个字符串输出,而不是与其他进程的printf交织输出。尽管这里没有共享的数据结构,但在这里锁仍然很有用处,因为我们想要printf的输出也是序列化的。

spinlock

锁的特性就是只有一个进程可以获取锁,在任何时间点都不能有超过一个锁的持有者。实现锁的主要难点在于锁的acquire接口,在acquire里面有一个死循环,循环中判断锁对象的locked字段是否为0,如果为0那表明当前锁没有持有者,当前对于acquire的调用可以获取锁。之后我们通过设置锁对象的locked字段为1来获取锁。最后返回。

最后更新于