제 생각에 결국 이벤트라는건 없는 것 같은데, 도움좀 부탁 드립니다.

tyolee83의 이미지

프로그래밍을 하다보면 이벤트 드리븐 이라는 것을 많이 접하게 됩니다.

UI에서 사용자가 버튼을 누르는 행위 등을 말하거나,

아니면 어떤일을 시키고 나서 다른것을 하다가 그 일이 완료되었다는 신호(인터럽트) 등을 말하는 것으로 이해하고 있는데요,

저는 컴퓨터 아키텍쳐 low level로 가면 이게 결국 busy waiting이 될 수 밖에 없을 것 같습니다.

결국엔 내가 변수를 가지고 있으면서 그 변수를 "짧은 주기"로 체크하고, 외부에서는 그 변수의 값을 변경함으로써 이벤트가 구현될 수 밖에 없을 것 같다는게 저의 생각입니다. (의견이 아니라 그렇게 이해하고 있다는 말입니다)

아니면 인터럽트를 보더라도 내가 인터럽트 테이블을 주기적으로 체크해 보고, 그 인터럽트 값을 누군가가 변경해야지만 그제서야 인터럽트가 발생했구나를 알수 있을거 같구요...

이렇게 되면 결국은 busy waiting이 될 수 밖에 없고 cpu를 점유하게 될거 같은데,

어떻게 이벤트 드리븐 아키텍쳐가 cpu 점유없이 알림을 주고 받는지 정확하게 이해가 되지 않습니다.

고수분들 조언 부탁 드립니다.

미리 감사 드립니다.

divetou의 이미지

제가 질문을 명확히 이해를 한 것인지는 잘 모르겠네요..

이벤트 드리븐이라는 용어는 이해하시는 것 같은데요,
말씀하신 것 처럼 event를 detect 하는 부분은 busy wait 일 수도 있지만
event handling 하는 부분은 busy waiting 이 아니라, 어떤 event가 있을 때 실행이 됩니다.

event detect 를 A, event handling 을 B라고 한다면,
A+B가 항상 실행되는 것과, A가 실행되고 event에 따라 B가 실행되는 것은 다르죠..

저는 이렇게 생각합니다만, 맞는지는 잘 모르겠네요.. ^^;
관련 서적이나 자료를 찾아보시는 것도 도움이 될 것 같습니다.

==============================
꿈꾸는소년

lucidite의 이미지

이벤트 드리븐 아키텍쳐는 소프트웨어 아키텍쳐 아닌가요?
CPU 수준과 같이 어플리케이션 아래의 로우 레벨에서 이벤트가 실제로 어떻게 구현되는가는
이벤트 드리븐 아키텍쳐 상에서 프로그래밍을 하는 것과는 크게 상관없지 않나 생각합니다.
다시 말해 이벤트라는 것이 하이 레벨에서 추상화된 개념이라고 알고 있습니다만...

혹시 "이벤트 드리븐 아키텍쳐가 cpu 점유없이 알림을 주고 받는"다는 말은 이해해서 쓰신 것인지,
출처가 있는 것인지 궁금합니다.
이벤트라는 것이 소프트웨어 상의 개념이고 그 이름을 현실에서 존재하는 이벤트의 개념에서 빌려온 것이라면
이를 지원하는 특수한 하드웨어가 없는 윈도우즈 등의 환경에서의 이벤트에는,
어떤 식으로든 글을 쓰신 분이 생각하시는 것처럼 연산이 들어가게 되지 않을까 합니다.
다만 이벤트 드리븐 아키텍쳐에서 프로그래밍을 할 때 이런 로우 레벨 구현 부분에 대해서는 고려할 필요가 없고...
프로그래머가 원하는 바와 같이 - divetou 님께서 쓰신 것처럼 핸들러 부분은 이벤트가 발생하기 전에는 실행되지 않겠죠.

저도 제가 질문을 제대로 이해한 것인지 잘 모르겠습니다^^;

jick의 이미지

여러 레벨의 이야기가 섞여 있어서 좀 혼란스러운데, 가장 로우레벨만 얘기하자면 인터럽트는 입출력장치가 능동적으로 CPU에 대고 발생시킬 수 있습니다.

이를테면 CPU가 네트웍 카드한테 "새 패킷이 오면 알려줘" 하고 자기는 열심히 딴일하고 있다가 네트웍 카드가 새 패킷을 받으면 인터럽트를 발생시켜서 CPU에게 알릴 수 있는 거죠. 이 경우 CPU가 주기적으로 체크를 하고 있을 필요는 전혀 없습니다.

kaeri17의 이미지

논리회로 레벨까지 들어가면 인터럽트도 뭐 특정 스위치가 On 되었을때 특정 루틴을 처리하는 것 입니다. 특정 스위치가 On 되어있는 걸 어떻게 아냐라는 질문까지 들어가면 결국 회로 자체가 그렇게 설계되었다는 것이고요, 결국 이 레벨에서는 busy waiting이냐 이벤트 드리븐이냐가 의미가 없어집니다.

tyolee83의 이미지

제가 질문을 두서없이 해서 혼란을 가중시켰네요...

저는 application 레벨이 아닌 cpu/디바이스간, 또는 회로쪽 얘기를 하고 싶었던 것입니다.

jick 님께서 말씀하신대로 인터럽트 방식으로 동작하는건 알고 있는데, 그럼 그 인터럽트라는걸 어떻게 알려줄거냐 라는게 제 의문이었구요..

kaeri17님께서 말씀하신대로 회로레벨에서 특정 스위치를 On 시키면 그걸 인터럽트로 인식하는것 같네요. 뭐 어느정도 예상대로...

근데 전 이게 busy wait이라고 생각했던 것입니다. 결국 회로가 매 사이클마다 스위치 on/off를 체크한다는것인데, 이건 busy wait이라기 보다 회로가 그렇게 생겼다고 이해해야 하는걸까요... 회로에 대해선 아는바가 전혀 없어서 ㅠ

모두들 답변 감사 드립니다 :)

//TODO

snowall의 이미지

회로를 공부해보시면 알겠지만, 각 사이클마다 스위치 on/off에 따라서 하는 일이 달라집니다. 말 그대로 "원래 그런 거임"이죠.

간단하게 그려보면

Cycle -> A(on) -> B
         A(off)-> C

Cycle신호가 들어갈 때마다 A가 실행되는데, A가 on이냐 off냐에 따라서 그 다음 할 일이 결정되죠. 이런 구조가 각 인터럽트마다 다 들어가 있다고 보면 됩니다. (물론 이건 실제 상황을 극단적으로 단순화 시킨 예...)

피할 수 있을때 즐겨라! http://melotopia.net/b

댓글 달기

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