[kernel] 스핀락

development 2012. 1. 4. 16:17
Table of content
  1. spin lock?
  2. example of spin_lock 












1. spin lock?
  프로세스 한개만 계속 수행되는 경우라면 critical section 에 대해서 신경쓸 필요가 없다.
  하지만, 현실은 여러 프로세스가 함께 동작하는 상황이므로 LOCK 에 대한 고민을 할 수 밖에 없다. 
 
  spin lock 은 커널에서 사용하는 LOCK 기법중의 하나이며 대표적인 기법이다.

  spin lock 의 API 들은 아래와 같다.

    spin_lock_init();
    spin_lock();
    spin_unlock();
    spin_locK_irqsave():
    spin_lock_irq();
    spin_lock_bh();
    spin_unlock_irqrestore();
    spin_unlock_irq();
    spin_unlock_bh();
    spin_trylock();
    spin_trylock_bh();

  spin lock() 이 커널의 LOCK 기법중 하나인 것을 감안하면 api 의 숫자가 많은 것에 놀랄수도 있다. 그만큼 LOCK 기법은 어렵고 신경써야 할 점이 많다는 것이라고 이해하면 된다. 


2. example of spin_lock
  spin lock 을 사용하려면
  
 
첫번째, spin lock 변수를 선언해야 하고
 
두번째, spin lock 변수를 초기화 해야 하며
    : static 과 dynamic 방식으로 구분된다. 
 
세번째, lock 을 얻어야 하며
    : spin_lock();
 
네번째, lock 을 풀어주어야 한다.
    : spin_unlock(); 

  아래는 spin lock 을 사용하는 가장 간단한 예제이다.

#include <asm/init.h>
#include <asm/kernel.h>
#include <asm/module.h>
#include <asm/version.h>
#include <asm/delay.h>
#include <asm/spinlock.h>
#include <asm/kthread.h>

spinlock_t g_this_lock;
struct task_struct *g_th_id1;
struct task_struct *g_th_id1;

static int
 thr_spin_lock_1(void *arg)
{
  int i = 0;
 
  printk(KERN_ALERT "@ %s() : called\n", __FUNCTION__);

  spin_lock(&g_this_lock);

  
printk(KERN_ALERT "@ %s() : get locked\n", __FUNCTION__);

  for(i=0;i<30;i++){
    
printk(KERN_ALERT "@ %s() : loop\n", __FUNCTION__);
    ssleep(1); 

  } 
 

  spin_unlock(&g_this_lock); 

  printk(KERN_ALERT "@ %s() : unlocked\n", __FUNCTION__);
 
 
return 0; 



static int
 thr_spin_lock_2(void *arg)

  printk(KERN_ALERT "@ %s() : called\n", __FUNCTION__);

  spin_lock(&g_this_lock);

  
printk(KERN_ALERT "@ %s() : get locked\n", __FUNCTION__);

  ssleep(10);

  spin_unlock(&g_this_lock); 


  
printk(KERN_ALERT "@ %s() : unlocked\n", __FUNCTION__);
  
  
return 0; 


static void __init only_spin_lock_init(void)
{
  spin_lock_init(&_ghis_lock);

  g_th_id1 = kthread_run(thr_spin_lock_1, NULL, "LOCK1");
  g_th_id2 = kthread_run(thr_spin_lock_2, NULL, "LOCK2");

  return 0; 



 위 예제는 문제를 내포하고 있는 코드입니다. spin_lock 이 걸려 있는 상태에서 rmmod 로 모듈을 제거하게 되면 "device is busy" 가 발생하게 됩니다. 
 

'development' 카테고리의 다른 글

[program] 2차원 배열 동적 할당  (0) 2012.02.10
[kernel] Top Half? Bottom Half? context?  (5) 2012.01.13
[program] Makefile  (0) 2012.01.04
[kernel] 커널 쓰레드  (0) 2012.01.04
[kernel] 시간지연  (1) 2012.01.02
블로그 이미지

김유석0

,