[ CnUnix ] in KIDS 글 쓴 이(By): dokeby () 날 짜 (Date): 1994년04월21일(목) 14시21분11초 KST 제 목(Title): Re: 452 locking multiprocessor thread 를 지원하는 시스템에서는 thread 들을 synchronize 하기 위한 여러 종류의 library 들이 제공됩니다 . 해당 시스템의 thread 관련 library 들을 찾아 보세요 . 그 중에서 spin-lock 에 관련된 library 는 대개 해당 시스템이 하드웨어적으로 제공하는 TAS 나 CAS 종류의 instruction 을 이용하여 coding 되어 있습니다. 따라서 spin lock 기능에 해당하는 library function 을 이용하면 됩니다. 만약에 thread 를 제공하지 않는 시스템이라면 대개 user level 에서의 process synchronization 을 위한 library 들이 제공되지 않으므로, 순전히 critical section 을 보호하기 위한 목적이라면 다음과 같은 function 을 이용해 보세요 . 다음 code 는 Motorola 의 68K processor 를 사용하는 기계에서 동작하는 code 이므로 해당 기계에서 사용하는 processor 에 맞는 assembly code 로 수정하면 됩니다 . lockinit: global lockinit mov.l (4,%sp),%a0 mov.b &0,(%a0) rts lock: global lock mov.l (4,%sp),%a0 loop: tas.b (%a0) bne.b spin rts spin: tst.b (%a0) # cache snoop 을 가정 beq.b loop jmp spin unlock: global unlock mov.l (4,%sp),%a0 mov.b &0,(%a0) rts 사용법: int lockval; /* process 간의 synchronization 이 목적이라면 * address space 가 같아야 하므로 shared memory * 를 allocation 받아 그 영역에 잡아야 한다. * address space 를 공유하는 thread 를 이용하는 * 프로그램이라면 normal data 영역에 잡아도 됨. */ lockinit(&lockval); /* 초기에 한번만 call 한다 */ . . . lock(&lockval); < critical section > unlock(&lockval); * user level 에서의 spin-lock 방식은 single processor system 에서는 사용해서는 안됩니다. lock 을 잡은 thread 가 switching out 되고 난 후에 다른 thread 가 lock 에 서 busy-waiting 하고 있으면, lock 을 잡은 thread 가 다시 switching in 되어 lock 을 풀어줄때까지 busy-waiting 만 하게 되므로 한 thread 의 time quantum 을 헛되이 쓰게 되어 프로그램이 엄청나게 느려지게 됩니다. |