단지 뭔가 보호하시고 싶은 변수가 있으신 거라면, 또는 프로세스끼리 경합하는 거라면 세마포어나 뮤텍스를 쓰시거나 아니면 직접 만드실 수도 있을 겁니다 ^^; test-and-set 같은 인스트럭션을 사용해서 인라인 어셈으로 짜면 됩니다. 속도는 이게 빠르지욥. 왠지 재밌고..
kldp.net 코드라이브러리에 ARM용은 올려놨는데 위엣분께서 말씀하신 atomic_... 부분을 끌어다 썼습니다. 커널 레벨로 내려가지 않고 자기 어플에서 관리할 수 있는 게 속도상 더 좋을 것 같아서요(사실 그게 커널레벨에서 실행되는 루틴인 지는 잘 모릅니다만 아마 그럴 것 같아욥. 왜냐면 test-and-set 인스트럭션이 지원안되면 인터럽트를 disable해야 하니까요.)
여기에 제가 올렸던 인라인 어셈 뮤텍스 구현이 있습니다. test-and-set(사실은 스왑) 인스트럭션을 사용했지요. ARM용 이지만... 사용법도 소스로 남겨놓았습니다.
/////////////////// how to use /////////////////
int my_function( int *critical_variable)
{
//////// get mutex
if(my_io_get())
return FAILED;
*critical_variable++;
//////// release mutex
my_io_rel();
}
int my_function2( int *critical_variable)
{
//////// get mutex
if(my_io_get())
return FAILED;
*critical_variable--;
//////// release mutex
my_io_rel();
}
요렇게요.
어쨌든 그 소스에 있는 인라인부분이 atomic_..부분을 끌어다 쓴 것입니다.
정확히 말하면 spin_lock입니다. (spinlock인가?)
커널 소스에 있는 것으로 기억하고요.
커널에서 구현해놓은 방법은 int형을 가진 구조체를 정의해놓고(이걸 atomic_...라고 선언한 것으로 기억..) 그걸 변화시키는 함수를 만들어두었었습니다. 그리고 그걸 사용해서 lock, unlock하는 함수를 만들어두었고요.
더 궁금하시면 커널 소스를 찾아보시는 것이 좋을 듯 싶습니당.. 사실 세마포어도 그걸 사용합니다.
에잇. 그냥 찾아버리자.
/usr/src/linux-2.4/arch/i386/kernel/semaphore.c 정도를 찾아보시면 될 듯..
if (!atomic_add_negative(sleepers - 1, &sem->count)) {
sem->sleepers = 0;
break;
}
sem->sleepers = 1; /* us - see -1 above */
spin_unlock_irq(&semaphore_lock);
원자성이 kernel 수준의 scheduling을 피하시려면..kerne
원자성이 kernel 수준의 scheduling을 피하시려면..kernel 함수를 써야하지 않을까요?
http://kernelnewbies.org/documents/kdoc/kernel-api/x71.html
도움이 되시길.
---
http://coolengineer.com
윗분 말씀 맞습니다 맞고요.단지 뭔가 보호하시고 싶은 변수가 있으
윗분 말씀 맞습니다 맞고요.
단지 뭔가 보호하시고 싶은 변수가 있으신 거라면, 또는 프로세스끼리 경합하는 거라면 세마포어나 뮤텍스를 쓰시거나 아니면 직접 만드실 수도 있을 겁니다 ^^; test-and-set 같은 인스트럭션을 사용해서 인라인 어셈으로 짜면 됩니다. 속도는 이게 빠르지욥. 왠지 재밌고..
kldp.net 코드라이브러리에 ARM용은 올려놨는데 위엣분께서 말씀하신 atomic_... 부분을 끌어다 썼습니다. 커널 레벨로 내려가지 않고 자기 어플에서 관리할 수 있는 게 속도상 더 좋을 것 같아서요(사실 그게 커널레벨에서 실행되는 루틴인 지는 잘 모릅니다만 아마 그럴 것 같아욥. 왜냐면 test-and-set 인스트럭션이 지원안되면 인터럽트를 disable해야 하니까요.)
rommance.net
[re]
a();
b();
이때 a(); 함수와 b(); 함수가 실행되는 사이에 다른 프로세스에 의해 CPU 를 빼앗기지 않도록 하고 싶으신거면.. 크리티컬 섹션을 사용하시면 될듯합니다. 윗분 말씀대로 세마포어나 뮤텍스를 사용해서도 구현할 수 있고요, 굳이 커널레벨까지 내려가지 않아도 됩니다.
답변감사합니다.
답변감사합니다.
일단 처리는 세마포어로 처리했구요.
atomic 함수는 한번도 사용해본적이 없는터라 어디
간단한 예제 같은건 없을까요?
----------------------------------------------------------------------------
http://kldp.net/snippet/detail.php?type=
http://kldp.net/snippet/detail.php?type=snippet&id=10
여기에 제가 올렸던 인라인 어셈 뮤텍스 구현이 있습니다. test-and-set(사실은 스왑) 인스트럭션을 사용했지요. ARM용 이지만... 사용법도 소스로 남겨놓았습니다.
요렇게요.
어쨌든 그 소스에 있는 인라인부분이 atomic_..부분을 끌어다 쓴 것입니다.
정확히 말하면 spin_lock입니다. (spinlock인가?)
커널 소스에 있는 것으로 기억하고요.
커널에서 구현해놓은 방법은 int형을 가진 구조체를 정의해놓고(이걸 atomic_...라고 선언한 것으로 기억..) 그걸 변화시키는 함수를 만들어두었었습니다. 그리고 그걸 사용해서 lock, unlock하는 함수를 만들어두었고요.
더 궁금하시면 커널 소스를 찾아보시는 것이 좋을 듯 싶습니당.. 사실 세마포어도 그걸 사용합니다.
에잇. 그냥 찾아버리자.
/usr/src/linux-2.4/arch/i386/kernel/semaphore.c 정도를 찾아보시면 될 듯..
정도로 나옵니다.
rommance.net
이 주제는 어떤 용도냐에 따라서 semaphore를 쓸지, kernel
이 주제는 어떤 용도냐에 따라서 semaphore를 쓸지, kernel level 함수를 쓸지 결정해야합니다.
경쟁하고 있는 process가 직접작성하신 code 끼리라면, semaphore를 쓰는 것이 맞구요.
process context switching 이 일어나지 않는 atomicity 라면 kernel level을 사용하는 것이겠지요?
질문하신 분이 고민하는 환경을 설명해주시죠~~
그러면, 이해가 더 빠를 것입니다.
---
http://coolengineer.com
UNP 2권을 참조하셔도
도움이 많이 될겁니다.
개념 정리가 잘되어 있거든요..^^
한번 보심이....
댓글 달기