xv6中专门讲锁的篇幅并不多,锁的代码也在一两行左右,但是锁的使用却是无处不在的,而且要理解好也并不那么容易
对锁的需求来自于interleaving(交错执行),这可能是多处理器环境下,也可能是单处理器环境下在不同进程/线程间切换cpu
为什么单处理器下需要锁?很多你以为的操作并不是原子的,比如a+=1,首先是取出a的值,然后加1,然后赋值给a
如果在赋值之前,因为抢占式调度,cpu选择的另一个进程修改了a的值,那么重新调度回去,完成对a的赋值之后,之前的修改就会丢失
当他们需要访问共享的数据结构时,就出现了问题,如:
- 一个进程在读一个数据时,可能另一个进程正在修改它,那么这个进程读到的数据就可能是不正确的
- 多个进程同时更新一个数据,那么可能只有最后完成的更新保留了下来,之前的更新都丢失了
例如:
这样一个数据结构,list指向第一个节点(invariant),push新建一个节点,并将其插入到最前面,然后让list重新指向他
考虑下面情况: