ISR과 프로세스 컨텍스트 사이에서 공유하고 있는 자원 상호배제 하는 방법 어떤게 있을까요?

athxue의 이미지

현재 상황은 ISR과 프로세스 컨텍스트가 하나의 변수를 공유하고 있습니다. 이 변수를 상호배제를 하고 싶은데
ISR에서 사용가능한 도구가 spinlock밖에 없는것 같습니다. 그런데 문제는 가령 프로세스 컨텍스트가 spinlock을 잡고 데이터를 조작하는 순간
ISR이 떠서 다시 spinlock을 시도하게 되고 이때 deadlock이 발생하게 됩니다. 이를 상호배제 할수 있는 좋은 방법이 없을까요?

sohn9086의 이미지

그냥 생각나는대로 주절주절 적어봅니다.

1) 꼭 변수를 공유해야하는지 다시 생각해본다.

2) 프로세스 컨텍스트에서 변수를 조작하는 동안 인터럽트를 마스크해 둔다.

3) 변수를 atomic_t 타입으로 바꾸어 atomicity를 보장하는 API로 조작한다.

4) spin lock의 사용법에 문제가 없는지 다시 확인해 본다. 실제로는 프로세스 컨텍스트와 ISR 사이에 데드락이 일어난 게 아니라, 먼저 일어난 ISR과 나중에 일어난 ISR사이에 데드락이 일어났을 수도 있음.

* ldd3 chapter 5 p117 아랫부분

If you have a spinlockthat can be taken by code that runs 
in (hardware or software) interrupt context, you must use 
one of the forms of spin_lock that disables interrupts. 
Doing otherwise can deadlockthe system, sooner or later.

http://lwn.net/images/pdf/LDD3/ch05.pdf

생산적인 댓글을 달자

sohn9086의 이미지

문득 프로세서가 atomic한 명령을 지원하지 않는 경우에는 atomic_xxx_xxx()함수가 어떻게 되어있는지 궁금해서 봤더니

/* linux-kernel-2.6.28.10 */ 
/* arch/h8300/include/asm/atomic.h */
 
static __inline__ int atomic_add_return(int i, atomic_t *v)
{
	int ret,flags;
	local_irq_save(flags);
	ret = v->counter += i;
	local_irq_restore(flags);
	return ret;
}

그냥 인터럽트 마스크해버리네요.

생산적인 댓글을 달자

라스코니의 이미지

ISR과 다른 함수와 공용으로 사용하는 변수를 없애는게 좋습니다.
ISR에서는 다른 alias 변수를 업데이트하고 엡데이트했다는 것을 알려주는 flag를 하나 주시면 가능하고요.
다른 함수에서는 flag를 확인한 후에 변수를 업데이트할 지를 판단하면 됩니다.

공용이 불가결 필요하다면 함수 실행할 때 interrupt를 disable 해도 되고,
세마포를 걸어주어도 됩니다.

spinlock이 뭔지는 모르지만 priority ceiling이 지원되면 deadlock은 안생길 것 같은데요.
배타적 semphore는 dead lock이 안생기는데 이상하네요.

sohn9086의 이미지

flag역시 ISR과 프로세스 컨텍스트에서 참조해야하는 공용변수이므로 여전히 배타처리가 필요하며, 문제의 근본적인 해결이 되지않습니다.

세마포는 sleep을 유발할 수 있으므로 ISR과 프로세스 컨텍스트 사이의 배타처리에 사용하면 데드락을 일으키는 원인이 될 수 있습니다.

priority ceiling이란 스레드간의 우선순위 역전현상을 억제해 데드락이나 우선순위가 높은 스레드의 응답성을 높이는 것으로, ISR과 프로세스 컨텍스트 사이의 배타처리와는 무관합니다.

생산적인 댓글을 달자

익명 사용자의 이미지

flag를 atomic_t로 쓰면 될 것 같습니다만..

라스코니의 이미지

기본적으로 flag는 atomic 해야 겠죠..

wariua의 이미지

프로세스 문맥에서 spinlock_irq()나 spinlock_irqsave()를 사용해서 현재 프로세서의 인터럽트를 비활성화 시키면 되긴 합니다. (sohn9086님의 2번 방안인 셈입니다.)

인터럽트를 오래 비활성화 시키면 대략 좋지 않은 일이 일어나므로 프로세스 문맥에서 락을 잡고 있는 시간은 최대한으로 짧게 해주시면 됩니다.

http://www.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/c214.html

$PWD `date`

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.