리눅스의 심도 있는 포크!!

morecs의 이미지

서버에 클라이언트가 소켓으로 접속할 경우 서버는 fork해서 프로세스를 생성하여 각 클라이언트들과 연결하여 멀티 프로세스를 만들려고 합니다.
근데 fork를 하면 메모리가 복사되어 변수 값들을 공유할 수가 없는데 서버에서 어떠한 값을 누적하고 있고 이러한 값을 각 클라이언트에게 알려줄려고 하는데
좋은 방법이 없을까요?

각 프로세스들이 계산하여 값을 누적시켜도 그 프로세스 안에서만 누적이 되고 부모 자식 간의 프로세스 끼리도 공유가 되지 않아 누적이 이루어지지 않네요..
파이프로 전달하는 것도 최초 포크할 때 전달이 되고 그 뒤부터는 부모 자식간의 파이프 연결도 되지않고..
어디서부터가 잘 못된건지..
어떻게 풀어가면 좋을지 조언 부탁드립니다.

gosuchoi의 이미지

Process들 사이에서 데이터를 공유할 경우에는 IPC(Inter process communication)을 이용하면 됩니다. 다양한 옵션이 있는데, 아래 위키 페이지를 참조해서 보시면 됩니다. 저는 개인적으로 Shared Memory 나 socket은 많이 이용해 봤는데, 다른 것은 크게 경험이 없습니다.

http://en.wikipedia.org/wiki/Inter-process_communication

morecs의 이미지

일반적인 프로세스들끼리 공유는 어떻게 할 수 있을꺼같은데 부모 자식간에 계속해서 주고 받는 것을 어떻게 해야할지 잘 감을 못잡겠어요. IPC 중 하나인 파이프로 2개의 연결 통로를 만들어서 데이터를 공유해봤는데 처음 포크 될때만 파이프가 동작하고 그 뒤부터는 부모프로세스가 돌지가 않네요. 이건 다른 방법 없을까요..?공유메모리말고 파이프로는..?

cinsk의 이미지

threaded application으로 만들던지, memcache/membase/redis 등 key/value DB를 쓰는 것이 나아보이네요.

ssehoony의 이미지

부모:자식이 1:1관계가 아니고 1:n 관계이고 공유해야할 자료의 사이즈가 크다면, 파이프 보다는 공유메모리(shared memory)가 좋을 것 같네요.
공유메모리의 동시 접근을 제어해야 한다면 공유메모리 and 세마포어 콤비네이션으로 하면 되죠.
만약 메모리의 변경을 하고 변경이 됐음을 다른 프로세스에 빨리 알려야 한다면 소켓이나 파이프를 이용해서 알려주면 됩니다. (코드 복잡도는 많이 올라갑니다.)

파이프로 처음 포크 될때만 되고 파이프가 동작 안한다고 하셨는데, 파이프 사용을 잘 못 하신 부분이 있을 것 같은데요.
파이프를 어느 한쪽에서 close 하지 않았다면 파이프는 계속 동작 합니다.
예상 되는 실수는 이렇습니다.
1. 부모 파이프를 fork해서 자식하고 공유합니다.
2. 자식의 작업을 끝내고 종료하면서 파이프를 close합니다. (이때 부모의 파이프도 close됩니다.)
3. 부모는 새로운 자식 생성을 위해 fork합니다. (이때 부모의 파이프는 닫혀 있으로 자식의 파이프도 닫혀 있고 통신이 안됩니다.)

2번과 같이 자식이 close를 해버렸을 것 같군요.
그리고 이런 구조의 문제는 자식이 많을 때, 부모가 특정 자식에게 데이터를 골라서 보낼 수가 없습니다. 부모가 데이터를 송신하면 어느 자식이 받게 될지 알 수 없고, 또한 모든 자식이 받는게 아니고 자식중에 먼저 파이프를 read하는 녀석이 데이터를 가져가게 됩니다.

한개의 파이프를 여러 자식이 공유하는 부분을 해결하시려면 fork할때 마다 fork 전에 부모가 새로운 파이프를 생성한 후 fork를 해야 하고 이렇게 생성된 파이프는 부모 측에서 이전 자식을 fork할때 생성한 파이프와 구분 할 수 있도록 새로운 변수에 할당을 해서 계속 누적 시켜야 하며, 다수의 자식중에 작업을 완료하고 종료한 자식의 파이프는 잘 제거를 해줘서 리소스 릭이 발생하지 않도록 해야합니다.

댓글 달기

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