CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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
  을 헛되이 쓰게 되어 프로그램이 엄청나게 느려지게 됩니다.

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.