说出你所知道的各类linux系统的各类同步机制(重点),什么是死锁?如何避免死锁(每个技术面试官必问)

Linux 内核的同步机制,第 1 部分

  1. 原子操作,不会被任何事务给打断,通常用于资源计数,引用计数。TCP/IP协议栈的IP碎片计数。
  2. 信号量。就像一个房间有好几把钥匙,拿到钥匙就能进去访问。设置为1的时候变为了mutex。绝大部分情况下作为互斥锁使用。
  3. 读写信号量。可以允许多个读,一个写。一旦有人在写,就大家都不能读。但是如果没人在写,就可以允许很多一起读。
  4. 自旋锁。自旋锁与互斥锁的区别在于不会导致睡眠,如果自旋锁被其他执行单元持有了,那么调用者就一直自旋在那循环地看持有者是否已经释放,而不睡眠。在持有时间短的情况下使用会比互斥锁高效。

Linux 内核的同步机制,第 2 部分

  1. 大内核锁。
  2. 读写锁,一种特殊的自旋锁。
  3. 大读者锁。高性能的读写锁。实现机制:每个CPU都有一个读者锁写者锁,读者只需要获取本地CPU的读者锁,写者锁要获取所有CPU的锁。
  4. RCU(Read-Copy-Update)读不需要获取锁,写的话是先拷贝当前的文件,然后对副本修改,最后找时机(没有其他执行单元在读)使用回调函数把修改保存回去。如果多个写,需要写进程之间本身做好同步。
  5. 顺序锁(seqlock)读者可以在写的时候读,写者也可以在读的时候写,但是写与写之间还是互斥的。利用了一个序号,写的时候要对序号加1,这样读的人可以知道读的期间有没有人写。

    什么是死锁及死锁的必要条件和解决方法【转】

死锁。就是几个进程申请资源,出现了无限循环等待的现象。

四个必要条件

  1. 资源是互斥的
  2. 不可抢占
  3. 占有且申请
  4. 循环等待

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是大号资源)

Logo

更多推荐