Linux 内核的同步机制,第 1 部分
原子操作,不会被任何事务给打断,通常用于资源计数,引用计数。TCP/IP协议栈的IP碎片计数。信号量。就像一个房间有好几把钥匙,拿到钥匙就能进去访问。设置为1的时候变为了mutex。绝大部分情况下作为互斥锁使用。读写信号量。可以允许多个读,一个写。一旦有人在写,就大家都不能读。但是如果没人在写,就可以允许很多一起读。自旋锁。自旋锁与互斥锁的区别在于不会导致睡眠,如果自旋锁被其他执行单元持有了,那么调用者就一直自旋在那循环地看持有者是否已经释放,而不睡眠。在持有时间短的情况下使用会比互斥锁高效。Linux 内核的同步机制,第 2 部分
大内核锁。读写锁,一种特殊的自旋锁。大读者锁。高性能的读写锁。实现机制:每个CPU都有一个读者锁写者锁,读者只需要获取本地CPU的读者锁,写者锁要获取所有CPU的锁。RCU(Read-Copy-Update)读不需要获取锁,写的话是先拷贝当前的文件,然后对副本修改,最后找时机(没有其他执行单元在读)使用回调函数把修改保存回去。如果多个写,需要写进程之间本身做好同步。顺序锁(seqlock)读者可以在写的时候读,写者也可以在读的时候写,但是写与写之间还是互斥的。利用了一个序号,写的时候要对序号加1,这样读的人可以知道读的期间有没有人写。
什么是死锁及死锁的必要条件和解决方法【转】
死锁。就是几个进程申请资源,出现了无限循环等待的现象。
四个必要条件
资源是互斥的不可抢占占有且申请循环等待A、B进程都需要打印机和CDROM。现在A占有了打印机,B占有了CDROM。 1. 打印机和CDROM都是互斥的,打印机一个时间只能让一个进程使用,CDROM也是。 2. A进程不能要求B进程放弃它拥有的CDROM,B进程也不能要求A放弃它所拥有的打印机。 3. A占有了打印机还去申请CDROM,B占有了CDROM还去申请打印机。 4. A等待B,B也在等待A。
解决方案也从这四个条件来着手。 1. 资源的互斥是客观的,要改变的话不现实。 2. 申请资源不可满足的时候释放已经申请到的资源。 3. 只有在全部资源都可以得到的情况下才一次性分配。 4. 资源有序分配。给所有资源编号,进程对资源的请求必须是严格递增的序列,只有在占有了小号资源的情况下才能申请了大号资源。(假设打印机是小号资源,CDROM是大号资源)
