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 을 사용하는 가장 간단한 예제이다.
위 예제는 문제를 내포하고 있는 코드입니다. spin_lock 이 걸려 있는 상태에서 rmmod 로 모듈을 제거하게 되면 "device is busy" 가 발생하게 됩니다.
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 |