[완료] Priority가 다른 task간의 동기화 문제.

kalstein의 이미지

지금까지는 주로 Linux,Windows에서 동등한 스레드간의 Performance 향상을 위한 동기화를 사용하다보니... 스레드간의 Priority는 동등하고 다만 Critical Section의 range를 줄이는 쪽으로만 생각했습니다만...
임베디드 시스템으로 작업을 하게되면서...ISR이라던가...Priority가 높은 task가 치고들어온다거나...그럴때 동기화에 대해서 생각해보지 않을 수 없더군요.

기존소스코드는 일반적으로 공유변수 (주로 전역변수지요)에다가 값을 1이라고 쓰면 data영역에 값을 다 쓴것이니까 읽어도 좋다. 라는 식으로 사용을 하더군요. reader와 writer 둘간의 priority의 차이가 없다면...기존에 알던 방식 그대로 사용하면 되지만...

그게 아니라 priority가 낮은 task와, 매우 높은 ISR이 서로 경쟁할 경우 참 난감할것 같더라구요. 예를 들어...task가 lock을 소유하고 있는데 ISR이 치고 들어와서 lock을 acquire하려고 한다면...당연히 dead lock 상태로 빠져들것입니다.

임베디드 상황에선...저런경우가 비일비재 할 것 같은데 어떤식으로 해결하는지 궁금합니다.

anfl의 이미지

우선 reader와 writer 관계와 같이 priority의 개념이 그다지 필요하지 않거나 중요도의 차이가 크게 나지 않는 task 관계라면, 서로 동등한 priority를 주고 RR을 하게 하는게 프로그래밍 모델을 간단하게 하는 방법입니다.
동일 priority에서 RR을 지원하지 않고 FIFO만 지원하는 kernel이라면 yield하게 해서 RR과 같은 효과를 줄수도 있습니다.
그다지 중요도가 높지 않은 task들은 위와 같이 구성하고 중요도가 높은 task만 보다 높은 priority를 주면 real-time을 해치지도 않기 때문에 나쁘지 않은 방법입니다.

==== 인용 ================================
그게 아니라 priority가 낮은 task와, 매우 높은 ISR이 서로 경쟁할 경우 참 난감할것 같더라구요. 예를 들어...task가 lock을 소유하고 있는데 ISR이 치고 들어와서 lock을 acquire하려고 한다면...당연히 dead lock 상태로 빠져들것입니다.
==========================================

시스템 설계의 원칙중 하나는 어떠한 경우라도 ISR과 task가 lock을 가지고 경쟁하게 해서는 안된다는 것입니다. ISR 내에서는 wait가 발생할수 있는 어떠한 lock primitive도 사용할수 없습니다.
lock이 이미 locked 되었다면 필연적으로 task를 wait하게되는데 ISR에서는 wait할 task 주체가 개념적으로 없기 때문에 시스템이 deadlock 빠져버리거나 혹은 아예 뻗어버립니다.

ISR과 경쟁할 자원을 이미 획득하고 있던 task에서 IRQ가 발생하면 deadlock이 발생하고, 다른 task가 자원을 획득하고 있었는데 ISR과 경쟁하지 않는 task에서 IRQ가 발생하면 나중에 scheduling시 뻗어버립니다.
이는 stack과 관계된 문제로써 대부분의 RTOS들은 별도의 IRQ stack을 두고 IRQ nesting이 발생할때 context를 IRQ stack에 save하는데 wait는 task의 stack에 context를 save하는것을 전재하고 설계되어 있는데 IRQ stack에 task의 context를 save 함으로써 발생하는 문제입니다.

결국 이러한 원인 역시 wait할 task의 주체가 ISR에서는 개념적으로 존재하지 않기 때문에 발생하는 현상중에 하나입니다.

때문에 임베디드 상황에서는 절대 이렇게 설계하지 않기 때문에 이 문제에 대해서는 고민안하셔도 될것 같네요.


댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.