内核中的同步问题(二)

 

读写锁

读者和写者问题是一个常见的同步问题。尤其在操作系统和驱动中经常有这种问题。中断处理程序改写数据,用户进程读取数据就是这种情况。这种情况简单来说就是,可以同时读,但不能同时写,也不能读和写同时进行。

内核实现了读写锁来处理这种情况。

rwlock_t rwlock = RW_LOCK_UNLOCKED; Process Reader: read_lock(&rwlock); /* Critical Section */ read_unlock(&rwlock); Process Writer: write_lock(&rwlock); /* Critical Section */ write_unlock(&rwlock);

 

当然,这些函数还有对应的屏蔽中断版。如下

Process reader: read_lock_irqsave(&rwlock); /* Critical Section */ read_unlock_irqrestore(&rwlock); Process Writer: write_lock_irqsave(&rwlock); /* Critical Section */ write_unlock_irqrestore(&rwlock);

上面的读写锁使得读者进程和写者进程拥有相同的优先级,有时可能需要写者拥有更高优先级,这样每个读者都能得到最新的数据。内核对于这种情况提供了一个seqlock。

 

Process Writer: read_seqlock(&seqlock); /* Critical Section */ read_sequnlock(&seqlock); Process Writer: do{ read_seqbegin(&seqlock); /* Critical Section */ data = target; }while(read_seqretry(&seqlock, data);

由于写者进入临界区时,可能还有读者正在读取数据,所以读者在读取数据后需要验证数据是否被写者改变。

 

 

你可能感兴趣的:(内核中的同步问题(二))