오랫만에 게시판 뒤적이다 보니깐

bw001730의 이미지

제가 틀린 부분 있으면 답글좀 달아주십시요

멀티 스레드 프로그래밍에서 fork 할때는 조심해야 합니다.
fork() 호출은 부모 프로세스의 메모리를 자식 프로세스에게 그대로 복사하는 동작을 합니다.

한 프로세스에 10개의 스레드가 있는데 5번 스레드가 fork()를 했다면
자식 프로세스에도 10개의 스레드가 생성되어질 것인가? 하는 것이 문제의 핵심이 됩니다.

정답은 "생성된다" 입니다.
생성은 되는데...... 자식 프로세스에서는
정지상태에 있는 스레드로 생성됩니다. 메모리만 차지하고 있는.........
5번 스레드만 실행을 계속합니다.
프로세스가 종료하기 전까지는 9개의 스레드는 메모리만 잡아먹습니다.
그런데 더 심각한 문제가 있습니다.

만약 3번(예를 들어) 스레드가 mutex 을 가지고 있는 상태에서
5번 스레드가 fork를 했다면............
그리고 자식 프로세스의 5번 스레드가 이 mutex lock을 얻기를 시도한다면
어떻게 될까요

당연히 데드락입니다. 왜냐하면 3번 스레드는 더이상 동작을 하지 않기 때문입니다.

방법은 없는가?
있습니다.
fork at handler 라는 개념이 있습니다.
정확한 함수가 기억이 안나서.. 개념만 설명드리자면
fork 직전에 호출될 함수와 fork 직후에 호출될 함수 이런 함수를 등록해주고
fork 호출시 자동으로 호출하게 하는 것입니다.
호출할때 부모 프로세스의 모든 mutex를 5번 스레드에게 가도록 설정하는 것입니다.
죽, 5번 스레드가 프로세스의 모든 lock을 가진 상태에서 fork를 하는 것입니다.
그러면 자식 프로세스에서 5번 스레드는 lock을 풀어줄수 있겠죠

그래서....... 이런말을 합니다.
"이런 지지한 작업을 하느니보다는 멀티스레드에서 fork를 피하라~"

System()함수는 fork 후에 exec하기 때문에 문제는 없습니다.
exec 하면 낭비되는 메모리들이 사라질때니깐요
그래서 System() 함수가 문제가 없는 것입니다.

그렇지만 fork()만 한다면 조심해서 사용해야 할 것입니다.

사실 예전에 책에서 본 내용을 정리해봤습니다.
벌써 6개월동안 jsp 와 java script만 하고 있네요
리눅스에서 시스템 프로그래밍 하고 싶은데.....
ㅠㅠ

sjpark의 이미지

이런건 안될까요?

fork한후, 자식 프로세스라면 필요없는 쓰레드를 죽이는 등의 처리 작업을 선행하게 하고 부모라면 그대로 진행하고..

fork 전/후 호출 함수 등록과, <-- 이건 어떻게 하나요?
fork 후 자식 프로세스만 선행 처리해야할 일 처리 후 작업

후자에 대해 생각해 보았습니다.

jsp와 javascript만 하시려면.. 깝깝하시겠네요;;

bw001730의 이미지

답글이 있길래 함 찾아봤습니다.
pthread_atfork() 이구요

근데 나는 분명히 어떤 글의 답글로 썼는데
왜 새글을 쓴것처럼 되었죠? ( -_-; )

흠..

프로토 타입은 아래와 같구요

int pthread_atfork(void (*prepare)  (void),  void  (*parent)
     (void), void (*child) (void));

3개의 함수포인터를 인자로 받습니다.
첫번째 인자 prepare는 5번스레드(fork()를 호출한 스레드)에서 fork하기전에
호출하는 것이구요
fork() 직후 부모는 두번째 인자로 주어진 함수 호출
자식은 세번째 인자 호출합니다.

특정 스레드에게 시그널을 전달할 방법은 없을 것이구
전역변수에 flag설정한 담에
flag가 참이면 스레드 루틴에서
pthread_cancel() 해주면 될것도 같지만
그것도 스레드가 실행이 되어야 pthread_cancel을
호출할수 있을 것 같은데요

P.S:
왜 세상은 리눅스 인력을 안구하는 거죠
초고수가 아니면 다 웹프로그래밍 해야 하니......에휴
나좀 누가 뽑아주세요

sunyzero의 이미지

실제적으로 MPMT 프로그램에서조차도 fork -> thread 를 만드는 식으로 가죠. 따라서 미리 어느정도의 fork 를 해서 적정한 갯수를 가진후에 thread를 만듭니다. 보통 thread안에서 fork하는 정도로 설계를 했다면 뭔가 잘못된것이겟죠. 굳이 exec 계열을 사용해서 다른 프로그램의 입출력을 받아야 한다고 해도 thread 내부에서 처리하기보다는 다른 별개의 프로그램을 만들어서 이 녀석이 실행하고 결과는 큐나 소켙, 메모리맵같은곳으로 받는게 일반적이죠.

그리고 웹프로그래밍에서 탈출하고 싶으신가보군요... 시스템프로그래밍을 하시고자 한다면 운영체제를 열심히 파고드셔서 뭔가 회사에게 보여줄 포트폴리오를 만들어서 가져가보세요. 그러면 시스템프로그래머로 채용해줄 가능성이 큽니다. 네트워크 관련 회사라면 간단한 ftpd, telnetd 같은것을 만들어서 가져가면 대부분 채용해줄 겁니다.

========================================
* The truth will set you free.

댓글 달기

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