[질문] 프로세스 생성시 부모 프로세스를 복제해야하는 이유는?

misun의 이미지

이곳에 질문을 올리는게 맞는지 모르겠네요...^^
프로세스 생성에 대해 잘 이해가 되지 않아서 질문드립니다.

리눅스 공부하는 초보 개발자 입니다.
질문이 이상하더라도 이해해주시고
답변 부탁으립니다. ^^

새로운 프로세스를 생성과정 중에서
fork()로 현재 태스크를 복제하여 자식 프로세스를 생성한다.

는 내용이 있는데

왜 복제해야 하는지를 그 이유를
잘 모르겠어요.

공유자원때문인가요?

이 말은 똑같은 내용을 두군데 가지고 있다는 말로 들리는데..
그러면 비효율적인거 같아서요..공간낭비...

그냥 자식 프로세스가
부모 프로세스의 공간을 참조하는 포인터만 가지면 안되나요?

으~머리속이 너무 복잡해집네요
간단하고 단순하게 설명해주시면
너무 너무 고마울꺼에요~^^

서지훈의 이미지

fork()를 하게 되면은 아무것도 공유를 하지 않습니다.
자원 공유는 IPC를 통해서 가능합니다.
그리고 이러한 fork()를 하는 이유는 ...
여러 작업을 한꺼번에 하기 위해서이지요.

좀 더 자세한 설명을 드리고 싶으나...
google에서 좀 나은 자료를 찾아 보시는게 더 나으실듯 하군요.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

sangwoo의 이미지

리눅스는 fork()시에 copy-on-write를 사용해서, 말씀하신대로 같은 공간을 쓰다가, 자식 프로세스의 내용이 수정되는 경우 그 부분만을 별도로 기록하는 등의 방법을 씁니다. fork() 할 때마다 모든 주소공간이 복사되지는 않습니다. ^^;

----
Let's shut up and code.

익명 사용자의 이미지

엄밀하게 말해서 '공유'가 아니라 fork 전의 리소스(간단히 variable이라고 하죠)를
자식프로세스가 복사해 가지는 것인데, 리소스자체가 많으면 무거워지는 단점이 있지만(그래서 쓰레드가 나온걸로 알고 있습니다), 자식프로세스와 부모프로세스간 또는 자식프로세스간의 통신을 위해서 IPC의 동일한 키값을 갖기 위해서는 이것만큼 쉬운 방법이 없는것 같더군요. 직접 멀티 프로세스 프로그램을 해 보시면 금방 느끼실 수 있을 겁니다.

dotri의 이미지

misun wrote:
이곳에 질문을 올리는게 맞는지 모르겠네요...^^
프로세스 생성에 대해 잘 이해가 되지 않아서 질문드립니다.

리눅스 공부하는 초보 개발자 입니다.
질문이 이상하더라도 이해해주시고
답변 부탁으립니다. ^^

새로운 프로세스를 생성과정 중에서
fork()로 현재 태스크를 복제하여 자식 프로세스를 생성한다.

는 내용이 있는데

왜 복제해야 하는지를 그 이유를
잘 모르겠어요.

공유자원때문인가요?

이 말은 똑같은 내용을 두군데 가지고 있다는 말로 들리는데..
그러면 비효율적인거 같아서요..공간낭비...

그냥 자식 프로세스가
부모 프로세스의 공간을 참조하는 포인터만 가지면 안되나요?

으~머리속이 너무 복잡해집네요
간단하고 단순하게 설명해주시면
너무 너무 고마울꺼에요~^^

1. 프로세스를 만드는데, 왜 "복제" 라는 방법을 써야 하는가?
이유는, 프로세스를 만들기 위해 해야 할 일이 너무나 많기 때문입니다. 커널 내에는 프로세스와 관련한 수 많은 자료구조가 있는데 그걸 일일이 채워넣는것보다는.. 그냥 이미 만들어져있는 다른 프로세스의 자료구조를 복사하는게 낫죠. 프로세스가 존재하기 위한 자료구조들을 직접 일일히 채워넣는것은 부팅시에 실행되는 init 프로세스 하나 뿐입니다. 그 외에 모든 프로세스는 이 init 프로세스를 복제하여 생성됩니다.

2. "복제"하지 않고 프로세스를 생성할때 발생하는 문제점은?
뭐 프로세스를 만드는 과정이 무척 복잡하고 시간이 오래 걸리는 작업이기 때문에 속도나 효율성 문제가 당연히 발생하겠지만.. 그것보다는 제 생각은 조금 다릅니다.
새로 생성된 프로세스의 엔트리 포인트를 어디로 할 것인가, 저는 이것이 문제라고 봅니다. 일반적으로, 프로그램은 실행될때 main() 함수를 엔트리 포인트로 하는데..그렇다고 새로 생성된 모든 프로세스가 main() 함수부터 시작하는것은 대단히 비합리적이고, 또 그로 인해서 야기될 수 많은 문제가 있습니다(부모-자식간의 IPC 문제가 대표적). 그 대신, 부모 프로세스를 복제하면 부모 프로세스가 fork() 를 호출한 시점을 엔트리 포인트로 하는것이 직관적이고, 잠재된 문제를 최소화할 수 있기 때문에 쉽게 납득할 수 있습니다.

3. fork() 함수로 프로세스를 생성하면 실제로 복제가 이루어지는가?
그렇지 않습니다. 수 많은 자료구조를 채워넣는 과정이 복잡하기 때문에 속도나 편의성면에서 복제를 하긴 하지만.. 메모리를 복제한다는 것은 그 나름대로 시간이 오래 걸리는 작업입니다. 그래서 fork() 를 호출한다고 곧바로 복제가 이루어지는 것은 아니고.. 위에 답변 다신 분들 말씀대로 "생성된 새 프로세스의 메모리 구간에 뭔가 변화가 일어났을때"에 실제 복사가 수행됩니다.

4. 자식 프로세스가 부모 프로세스의 메모리 공간을 참조하는 포인터를 가지면 왜 안되는가?
우선.. 위에 3번에서 설명했듯이, 메모리 복사가 즉시 일어나는 것은 아닙니다. 메모리 복사가 발생할 필요가 나타나기 전까지는, 님이 말씀하신것처럼 자식 프로세스는 부모 프로세스의 메모리 공간을 참조하는 포인터만 가지고 있을 뿐입니다. 복사할 필요성이 생기면, 즉 자식 프로세스의 메모리 공간에 뭔가 write 동작이 일어나면 그때 복사가 이루어집니다.
자식 프로세스의 메모리 공간에 write 동작이 일어날때, 메모리 복사가 이루어지지 않는다면 어떻게 될까요. 자식 프로세스의 메모리는 부모 프로세스의 메모리 공간을 가르키고 있을테고, 자식 프로세스 메모리 공간의 변화가 곧바로 부모 프로세스 메모리 공간의 변화로 반영되어서 결국은 부모-자식 프로세스의 구분이 의미가 없어집니다.

5. see also
프로세스와 더불어서, 프로그램의 실행 흐름을 분기할 수 있는 또 다른 메쏘드로 thread 라는 것이 있습니다. 이건 그냥 fork() 하는것보다 어렵지만..더 유용합니다.

misun의 이미지

lol
흐..."복제"의 이유를 알고나니
이젠 이해하기 한결 수월하네요
막혔던게 쑥 내려가는 기분
명쾌한 답변 감사합니다

댓글 달기

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