Exercise1 源代码阅读
锁部分:spinlock.h/spinlock.c以及相关其他文件代码
1 | // Mutual exclusion lock. |
Exercise2 带着问题阅读
- 什么是临界区? 什么是同步和互斥? 什么是竞争状态? 临界区操作时中断是否应该开启? 中断会有什么影响? XV6的锁是如何实现的,有什么操作? xchg 是什么指令,该指令有何特性?
- 临界区(Critical Section):访问临界区的那段代码,多个进程/线程必须互斥进入临界区;
- 同步(Synchronization):指多个进程/线程能够按照程序员期望的方式来协调执行顺序,为了实现这个目的,必须要借助于同步机制(如信号量,条件变量,管程等);
- 互斥(Mutual Exclusion):互斥的目的是保护临界区;
- 竞争状态:竞争是基于并发环境下的,单个进程/线程不存在竞争,在并发环境下,多个进程/线程都需要请求某资源的时候,只有竞争到该资源的进程/线程才能够执行,释放资源后,剩余进程/线程按照预定的算法策略重新竞争;
- 操作临界区必须关中断,对临界区的操作是原子性的;
- 中断影响:中断降低了并发性能,同时中断也会导致频繁的上下文切换,上下文切换会导致tlb快表失效,因此要尽可能的缩减中断处理的时间;
- 自旋锁(Spinlock):xv6中利用该数据结构实现多个进程/线程同步和互斥访问临界区。当进程/线程请求锁失败时进入循环,直至锁可用并成功拿到后返回,对于单cpu系统自旋锁浪费CPU资源,不利于并发,自旋锁的优势体现在多CPU系统下,XV6支持多CPU。主要接口有void initlock(struct spinlock lk, char name)、void initlock(struct spinlock lk, char name)、void release(struct spinlock * lk);
- xchg:xchg()函数使用GCC的内联汇编语句,该函数中通过xchg原子性交换spinlock.locked和newval,并返回spinlock.locked原来的值。当返回值为1时,说明其他线程占用了该锁,继续循环等待;当返回值为0时,说明其他地方没有占用该锁,同时locked本设置成1了,所以该锁被此处占用。
1 | // x86.h 调用方式如xchg(&lk->locked, 1) |
- 基于XV6的spinlock, 请给出实现信号量、读写锁、信号机制的设计方案(三选二,请写出相应的伪代码)?
- 信号量实现
1 | struct semaphore { |
参考文献
[1] xv6锁-博客园
[2] xv6锁-xchg
[3] xv6锁-CSDN
[4] xv6整体报告-百度文库