锁的来由和使用

上一篇 / 下一篇  2012-08-01 10:41:34 / 个人分类:Linux

51Testing软件测试网Ik k^"^ `(y4R

  对于开发系统级别软件的朋友来说,无论你是主动的还是被动的,锁的应用都是少不了的。很多人用锁,可是却未必知道锁的前世今生,什么时候用锁,什么时候不用锁?该用什么样的锁?今天我们就来对这个问题说道说道。51Testing软件测试网4Tj6y$fG ^a&r

51Testing软件测试网lGE1r Xe*V+B ^;bw

  (1)为什么用锁?51Testing软件测试网 {[!W` F7N%{!_"@ ky

51Testing软件测试网~7g+l7H/}

  之所以会用锁,其根本目的在于对公共资源的保护。比如说,我们希望对某些数据的操作是连贯的、具体的。否则,如果这些脏数据如果被再次引用的 话,肯定会引发不可预计的故障。虽然从代码上看,我们的操作可能只是一条语句,但是它所对应的汇编操作很有可能是由几条命令合在一起完成的,所以中间发生 任何的切换、中断都会出现问题。那么,有哪些变动会导致这种情况发生呢?其实也不复杂,主要就三种,51Testing软件测试网jIZAD x

51Testing软件测试网sF!f m,dht

  a)中断

{/qp$CM i;|,Vl0 51Testing软件测试网%Ybd/B"M

  b)抢占

KiFJXA3I R{$S0 51Testing软件测试网 o^1HGG1b9h

  c)smp51Testing软件测试网 Ta5\R j ]8H

+W8me xQ*`Ic,X$G0  (2)哪些场景需要互斥处理?51Testing软件测试网-g%O4L.W+R%_5]

51Testing软件测试网6E?;m&e#z'd

  上面说了三种情形,其实就是代码有可能被打扰的三种情况。首先,中断的发生是随机的,如果中断中使用了和内核段同样的数据,那么肯定会惹麻烦 的。同样,抢占也是一个很重要的问题。所谓的抢占,其实就是说线程在中断返回、资源释放、抢占点有可能被系统切换出运行队列。有些时候,线程的数据可能需 要与另外一个线程进行分享,如果我们此时不想和别人分享,那么关闭抢占就可以了,系统也不会进行线程调度处理了。最后一种是多cpu情形,本质上和多线程 有关,不同的cpu运行不同的线程,所以对于数据的访问必须是互斥的,我们必须利用硬件提供的汇编语句来对代码进行互斥处理,自旋锁就是用的最多的一种方 法。51Testing软件测试网X5wf}v2Zh(w3_

s)T?&\;wzm0  (3)有哪些锁的使用方法?

&_z8])} n*\0 51Testing软件测试网Rk/QS~'N]Hb#o

  为了提高数据的访问效率,人们设计了各种各样的锁。所有这些设计的目的只有一个,就是在保持数据正确性的条件下尽可能将锁造成的影响降到最小。 这从linux内核发展的轨迹可以清晰地看出来,越是高级的锁,越是具有特定的应用场景,越需要小心处理。就我个人了解,当前使用较多的锁主要有下面几 种:

d#TQ IH"Zt0 51Testing软件测试网,E ~t:A%[YxoX

  a)关中断51Testing软件测试网Z*@yCSDvK[HR

51Testing软件测试网B5b-b!LOxF~\d

  b)禁止抢占51Testing软件测试网{9oXh&yIN

hU!W2rN6q"FX7\J0  c)自旋锁

d2l0fq&BU!t5r0

/^/Jbhf)r:K8T0  d)原子操作

3Ap;w8NtR7l0

;I*BXO'y HJ0  e)读写锁51Testing软件测试网D7kr)X8E@W*i W

em:Cb!]Q5MQ0  f)互斥量

,F-j}s0Su4V0 51Testing软件测试网6Ig9j.q2] v0_

  g)信号量

(p"R-} f*`%oc0

,H$a]Me AN V9U y0  h)事件51Testing软件测试网b#]b%v0K#pU

q2W+n^8K/@"qW;T0  (4)使用锁需要注意些什么?51Testing软件测试网r(K%bb$S

51Testing软件测试网7B'l4c!KbU

  在所有代码里面,关于多线程的编写其实是很难的,主要是因为多线程考虑的情况多,另外一方面就是代码调试的难度很大,所以在模块设计的时候一定 要慎重。在平时编写的时候,多用成熟代码,这样才会在软件质量上有所保障。不过,在锁的使用中,还是有一些规则是要注意的,比如,51Testing软件测试网8^)PNN7];t.I}

51Testing软件测试网1kat,Pt!jS

  a)中断的代码是不能使用带有schedule函数的锁

Ile|)[ ~0 51Testing软件测试网!P%Q!z:J A m2L0U IE

  b)抢占只能防止本cpu上线程之间的互斥51Testing软件测试网H3sq^t*R][

.N}]0l:`q*s!]0  c)使用自旋锁的代码段不能太长,否则影响系统性能51Testing软件测试网 e;uL4F/F"\ AQ

NsqtA+w0  d)互斥量只能被本线程释放,在嵌入式实时系统中可能会遇到优先级反转的问题51Testing软件测试网,V ]/A0@wx(T

1J.qo&k oo/{0  e)使用信号量最合适的地方就是pv操作

L5r4?g | p'q8t|!~.^0 51Testing软件测试网.vBx:{u%a@

  f)原子锁计数比较合适

j'] IK _%e6p"T0

4b@"{ph%e0  g)事件功能和网络编程中的select很像,可以响应多个情形,但是无法保证这些事件有序51Testing软件测试网gk+I,R1JH

cXU!M0E"NZ8\0  h)锁成对使用、有序使用,做到这些可解决一大部分的死锁问题51Testing软件测试网$xgvK/j

51Testing软件测试网@t$v X7VI_0o-XuE

  i)没事别写多线程,就是写也先把单线程的代码完善好了再进行考虑和移植

xj`mL$k0 51Testing软件测试网(spf0~(X {l

  j)在锁中使用指针需要十分小心

.L5}4Do*|Kga0

TAG:

 

评分:0

我来说两句

Open Toolbar