멀티 쓰레드에서 쓰레드간 signal통신 질문드립니다ㅠ

kysu5095의 이미지

안녕하세요 가입하고 처음 글 씁니다.
현재 막히고 있는 부분 말씀드리겠습니다.

먼저 main에서 f1함수를 실행하는 쓰레드 생성 > f1(1)에서 f2(2), f3(3), f4(4)함수를 실행하는 3개의 쓰레드 생성
(쓰레드 생성은 clone으로 생성합니다. 괄호는 우선순위이고 낮을수록 높습니다.)

쓰레드는 우선순위 라운드로빈 방식으로 실행되기 때문에 쓰레드는 생성과 동시에 SIGSTOP을 사용하여 멈춰주고
스케쥴러를 구현하여 돌아가면서 실행하고 있습니다.

여기서 문제는 f1이 우선순위가 가장 높아 f2, f3, f4쓰레드를 생성하지만 f1을 중지하거나 종료하지 않는이상
f2, f3, f4쓰레드는 실행되지 않기 때문에 f1이 특정 쓰레드가 끝날때 까지 중지하는 pthread_join과 같은 함수를
만드려고 하고있습니다.

그래서 join함수 안에 현재 쓰레드(f1)을 waiting시키고 SIGSTOP을 걸어준 후 특정 쓰레드(ex, f2)가 종료되면
SIGCHLD 시그널을 받아서 sighandler에서 f1을 다시 실행시키고 싶습니다.

이렇게 구현하였을 때 문제점은
1. join에서 SIGSTOP하는 경우말고 스케쥴러가 실행되는 과정에서 context_switching을 해주는데 이 과정에서도
SIGSTOP, SIGCONT 작업을 해 주어서 이런 시그널도 모두 받아버리는 것 입니다.

2. SIGCHLD를 받았을 때 f1을 다시 실행시키려면 정확히 f2가 종료됐다는 걸 f1에게만 시그널을 보내야 하는데
보낼 수 있는 방법을 모르겠습니다.

3. f1이 SIGSTOP상태인데 시그널을 받을 수 있는지 의문입니다.

시그널이외에 wait, pthread, sleep등 다른 시스템콜은 사용하면 안됩니다.
이 문제를 해결 못해서 너무 고생하고 있습니다. 아이디어를 아신다면 답변 남겨주시면 감사하겠습니다.

pynoos의 이미지

thread 사용시 signal 로 동기화를하는 것은 추천하지 않는 설계인데, 굳이 사용하려면, thread 초기화후에 signal mask를 적당히 해서 받는 thread를 한정하면 될 것 같습니다.

kysu5095의 이미지

답변 감사합니다. 답변주신 sig_mask에 대해 공부하다 https://molrayo.tistory.com/entry/Signal-sigaction%ED%95%A8%EC%88%98%EC%97%90-%EA%B4%80%ED%95%9C-%EC%98%88%EC%A0%9C 사이트의 마지막 예제에서 sigaction의 세번째 인자를 통해서 호출하기 전 상황으로 돌린다고 하는데 호출하기 전 상황을 쓰레드가 종료되기 전 상황으로 돌릴 수 있는건가요?

pynoos의 이미지

시그널 핸들러 설정을 하는 함수이고, 이전 핸들러를 받아오는 것에 불과합니다.

--

대략 지금 처한상황을 추정해보니, unix의 시그널이라는 개념을 이해하고, 샘플도 몇개 돌려보면서 잘 알고 있어야합니다.

시그널은 매우 전통적인 예외 처리 메커니즘이죠, 콜스택이 main으로부터 기인하지 않고, 시그널 핸들러로 등록된 함수가 불리는 동안 사용되는 스택은 불안한(?) 상태이며 왠만하면 복잡한 작업보다는 간단한 플래그 설정하는 정도로 끝내는 정도로 설계합니다.

그런 시그널이라는 것이 쓰레드 구현에 어떤 영향을 주는지 고민을 하면서 나온 쓰레드의 시그널 처리 함수들이 있습니다.
시그널을 어떤 쓰레드가 받을 것이냐, 무시할 것이냐 이런 류의 개념을 이해하는 정도가 아마도 풀어야할 숙제겠군요.

kysu5095의 이미지

감사합니다 공부해 보겠습니다!

라스코니의 이미지

시그널이외에 wait, pthread, sleep등 다른 시스템콜은 사용하면 안됩니다.

위 부분이 이해가 안되네요. 혹시 과제인데 wait, pthread를 쓰면 안되는 제약이 있는 건가요? 그렇지 않다면 쓰레드간 동기로 시그널을 사용하는 것은 pynoos 님 말대로 매우 권장되지 않는 방법입니다.

kysu5095의 이미지

답변 감사합니다.
넵 과제중에 도저히 아이디어가 떠오로지 않아서 질문드렸습니다ㅠ
방법이 없을까요..?ㅜㅜ

댓글 달기

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