두개의 인터럽트 핸들러 사이에서의 mutex 사용...

jaeswith의 이미지

제가 이해하기로는 BH를 실행할때, 다른 인터럽트가 발생하는 경우에는
BH에서 수행하는 task 가 끝날때까지 인터럽트 핸들러가 수행되지 않는다고 알고 있습니다.
즉, BH의 수행이 premptive 되지 않는다는...
(물론 non-premptive 커널에서)

제가 이해한 것이 맞습니까?

그렇다면, 두개의 인터럽트 핸들러 사이에서 mutex 를 사용해서 공유 변수를
보호할 필요가 없는거겠죠?

즉, 하나는 NIC로 부터 오는 인터럽트이고, 하나는 BH에 의해서 생기는 흐름이거든요.

errai의 이미지

BH는 Multi process 환경에서도 오직 한번에 한개의 BH만 수행됩니다.
그래서 BH 사이의 메모리 공유에서는 별다른 동기화가 필요없습니다.
아마도 이해하신 부분이 이 부분일 겁니다.

하지만 말씀하신 글을 읽어보니까 하나는 NIC에서 오는 interrupt라고
하셨습니다. 그럼 하드웨어 인터럽트니까 BH와 다르게 process context
가 아닌 interrupt context code 입니다. 이 둘 사이에 메모리를 공유하고
있다고 한다면 BH 수행중에 하드웨어 인터럽트 컨텍스트는 실행될 수
있으므로 특별한 동기화가 필요합니다. 제 생각에는 BH 코드 내에 Disable
interrupt 함수를 추가해주는것이 데드락을 피할 수 있을 것입니다.
참고가 되셨길 바랍니다. :-)

ps. 참고로 BH는 커널 2.5부터 성능상 제외되었습니다.

kyong의 이미지

jaeswith wrote:
제가 이해하기로는 BH를 실행할때, 다른 인터럽트가 발생하는 경우에는
BH에서 수행하는 task 가 끝날때까지 인터럽트 핸들러가 수행되지 않는다고 알고 있습니다.
즉, BH의 수행이 premptive 되지 않는다는...
(물론 non-premptive 커널에서)

제가 이해한 것이 맞습니까?

아닙니다.
인터럽트 핸들러가 블럭된다면 performance 에 심각한 문제가 생깁니다.
bottom half가 고안된 원인은 인터럽트 핸들러에서는 최대한 빨리 일을 처리하
고 좀 걸리는 일은 bottom half에서 처리하고자함입니다.
Quote:

그렇다면, 두개의 인터럽트 핸들러 사이에서 mutex 를 사용해서 공유 변수를
보호할 필요가 없는거겠죠?
즉, 하나는 NIC로 부터 오는 인터럽트이고, 하나는 BH에 의해서 생기는 흐름이거든요.

인터럽트 핸들러 사이에 공유할 때는 인터럽트를 disable 시키고 lock이 필요
합니다. Semaphore는 sleep할 수 있기 때문에 여기서는 쓰면 않됩니다.
Bottom half 는 구현된 방식이 조금씩 다르기 때문에 걸맞게 사용해야
합니다.
kyong의 이미지

errai wrote:

하지만 말씀하신 글을 읽어보니까 하나는 NIC에서 오는 interrupt라고
하셨습니다. 그럼 하드웨어 인터럽트니까 BH와 다르게 process context
가 아닌 interrupt context code 입니다.

bottom half 가 process context 인 경우는 2.6에서 소개된 Work queue입
니다.
totohero의 이미지

kyong wrote:
errai wrote:

하지만 말씀하신 글을 읽어보니까 하나는 NIC에서 오는 interrupt라고
하셨습니다. 그럼 하드웨어 인터럽트니까 BH와 다르게 process context
가 아닌 interrupt context code 입니다.

bottom half 가 process context 인 경우는 2.6에서 소개된 Work queue입
니다.

기초적인 질문같아 죄송합니다만, context의 종류는 무엇인지, 그 분류는 linux에 국한된 것인지, 각 context에서의 제약은 무엇인지, 어디에 그런 내용이 나와있는지 궁금합니다 ^^
kyong의 이미지

totohero wrote:
kyong wrote:
errai wrote:

하지만 말씀하신 글을 읽어보니까 하나는 NIC에서 오는 interrupt라고
하셨습니다. 그럼 하드웨어 인터럽트니까 BH와 다르게 process context
가 아닌 interrupt context code 입니다.

bottom half 가 process context 인 경우는 2.6에서 소개된 Work queue입
니다.

기초적인 질문같아 죄송합니다만, context의 종류는 무엇인지, 그 분류는 linux에 국한된 것인지, 각 context에서의 제약은 무엇인지, 어디에 그런 내용이 나와있는지 궁금합니다 ^^

어려운 질문이네요. 제가 감히 대답한다는 것이 좀 그렇지만 토를
달아봅니다...:)

커널에서는 processor의 state를 context라고 합니다.
IA-32 Intel

댓글 달기

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