有以下几种方法可以实现linux kernel中多线程间的同步
1.禁用抢占模式,在一个线程进入关键区域前,禁止抢占模式,在出关键区域后,再启用该模式。只对单处理器系统。
2.禁用中断,在一个线程进入关键区域前,禁用所有设备的中断信号。在出关键区域后,再启用设备的中断信号。只对单处理器。
3.信号(Semaphores),对单处理器和多处理器均有效。对每个资源维护一个信号,每一信号有3部分组成
1.一个整数值(初始值1)
2.一个等待队列
3.两个原子操作 down( )和up( )
对于每一个要访问某个资源的进程来说,执行down操作(减),如果整数值小于0,则把进程放入信号的等待队列。如果>=0,则该线程获得该资源的访问权限。如果执行up操作(加)后整数值>=0,则从等待队列中取出一个或多个线程来访问在资源。
4.自旋锁(Spin locks)只对多处理器有效。
由于信号需要维护一个等待队列,所以对于访问关键区域时间较少的情况下,效率较低。而自旋锁可以有效的解决该问题。
要访问关键区域前,必须获得该关键区域的唯一锁,如果没有获得唯一锁,在一直周期性的检查唯一锁是否已被释放,直到获得唯一锁。
如果在单处理器的情况下,一旦发现没有获得唯一锁,则会陷入周期性的检查中。而由于cpu一直被占用,则没有机会去执行释放的操作。
如果有大量的同步操作,则有可能会发生死锁。而对于没有顺序的申请资源,保证其不发生死锁是比较困难的。所以,linux系统规定申请资源要按照预定的顺序来操作。