fork()와 exec() 개념 좀 설명해주세요.

firster의 이미지

유닉스 시스템을 접한 것이 몇일되지 않습니다.
나름대로 책도 구입하고 공부하고는 있습니다만, 모르는 것이 너무 많아서 막막해지는군요.
오늘은 오전부터 지금까지 fork와 exec,clone 시스템 호출의 개념을 잡지 못해서 열만받고 있습니다.
맨페이지 및 여기서도 검색을 해봤지만, 솔직히 이해가 되지 않더군요.
간단히라도 개념적인 설명 및 차이점을 알려주시면 정말 감사하겠습니다.
답변에 미리 감사드립니다.

june8th의 이미지

fork는 현재 돌아가고 있던 process를 복사해서 다른 process를 만드는 것입니다.
복사하기 때문에, 가지고 있던 메모리등의 시스템 자원을 모두 원래의 process와 공유하게 됩니다.

exec는 process로 하여금, 다른 binary를 가지고 새로 시작하도록 하는 겁니다.

김충길의 이미지

firster wrote:
유닉스 시스템을 접한 것이 몇일되지 않습니다.
나름대로 책도 구입하고 공부하고는 있습니다만, 모르는 것이 너무 많아서 막막해지는군요.
오늘은 오전부터 지금까지 fork와 exec,clone 시스템 호출의 개념을 잡지 못해서 열만받고 있습니다.
맨페이지 및 여기서도 검색을 해봤지만, 솔직히 이해가 되지 않더군요.
간단히라도 개념적인 설명 및 차이점을 알려주시면 정말 감사하겠습니다.
답변에 미리 감사드립니다.

처음 fork()을 대하는 경우 가장 혼동되는 부분이 프로그램이 어떻게 실행되는
가 일겁니다. fork가 호출되면 프로그램이 1개에서 2개가 됩니다. 부모와
자식으로요. 두개로 나뉜 다음 스케줄러에는 자식이 추가되면 프로그램 실행은
부모에서 fork()의 리턴이 한번 실행되고 자식에서 fork() 리턴이 실행되는
형태로 진행이 되는거죠.

프로그램 실행 ---> fork() 문 ---> 부모의 fork() 리턴이후
----> 자식의 fork() 리턴이후 실행

대부문의 코드는 이런씩으로 되어 있을 겁니다.
if (fork () == 0) {
/* 자식 프로세스에서 실행되는 코드 */
}
else {
/* 부모 프로세스에서 실행되는 코드 */
}

fork() 진입후 프로그램이 1개에서 2개로 되면서 스케줄러는 이제 1개에서
2개의 프로그램을 실행하게 되는 겁니다. 그래서 부모인 경우 fork의 리턴값이
0이 아닌 값이 되고 자식프로그램인 경우 fork의 리턴값이 0인 됩니다.

아마도 이부분이 이해안되신 부분이라고 생각됩니다.

그럼.

screen + vim + ctags 좋아요~

버그소년의 이미지

Quote:
fork는 현재 돌아가고 있던 process를 복사해서 다른 process를 만드는 것입니다.
복사하기 때문에, 가지고 있던 메모리등의 시스템 자원을 모두 원래의 process와 공유하게 됩니다.

딴지같아서 죄송하지만 빠트리신것 같아서요..

fork 시 파일기술자와 같은것은 fork시 공유(?) 되지만

메모리는 공유되지 않습니다.

공유가 아니라 복사라고 해야 더 정확하다고 생각합니다.

fork시점에서 똑같은 프로세스가 생성되고, 그 시점에 전혀다른 메모리에

같은 값이 복사되는거죠.

가끔은 밥을 굶어도 살 수 있다.

azoth의 이미지

http://www.linuxdoc.pe.kr/programming/fork.html
요거를 참고하시면 fork()에 대한 설명은 될 듯....

fork()는 프로세스 복제라고 하고, exec()는 프로세스 대체라고 하죠...
exec()를 실행하면, 원래 프로세스는 멈추고, 새로운 프로세스로
대체됩니다.

shint의 이미지

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

lapex의 이미지

Quote:
fork 시 파일기술자와 같은것은 fork시 공유(?) 되지만

아마 file descripter 도 공유 되는 것이 아닐 겁니다.
단순이 copy 되는 것이 맞을 것 같군여..

윗 분들이 잘 설명을 해 주셨지만 질문하신 분께서
UNIX 를 접한지 몇일 안 되셨다고 하니 좀더 제가 아는 한도 내에서만
덧붙이려고 합니다.

------
우선, process 는 stack, code(text), data 영역을 갖고 있습니다.
따라서 fork(2) 로 새로운 프로세스(child process)를 만들면
calling process(parent process)와 다른 stack, code, data 영역을 갖게 됩니다.
fork 되는 순간 child process 의 code, data 영역에 들어 가는 내용은
parent process의 내용을 copy 해 오는 것이구여..
linux에서는 COW(Copy-On-Write) 라고 해서
child process 에서 write 가 수행될 때
parent 의 data,code 의 내용을 copy 해 오는 방식을 사용하고 있습니다.

----
fork(2) :
parent 와 완전이 별도의 stack, code, data 영역을 갖고 있는
새로운 child process 를 만드는 시스템 콜
그리고 그 둘 사이의 context 의 share 는 존재 하지 않음
(context: PCB(Process Control Block) 와 같이 registers 값,
file destriptors, p_id, process state, memory info. etc. 를 가리키는 말)

clone(2) :
fork(2) 와 같이 새로운 child process 만든다.
차이점은 parent 와 child 가 context 를 share 하도록 한다는 것입니다.

----
여담으로...
리눅스는 토발즈가 설계할 당시 부터 thread 를 지원하지 않았습니다.
그래서 현재 linux 에 깔려 있는 LinuxThread(gcc 3.2 버전에서는
nptl이 들어 간다고 들었으니 아닌 분도 있을 지 모르겠군여) 는
pthread_*() 가
실제로는 process 로 돌아갑니다. ps 를 해 보면 확인해 볼 수 있져

sandro의 이미지

서로 다른 프로세스 끼리 또는 fork된 프로세스 끼리
메모리를 공유 하고 싶으면 공유 메모리를 쓰시면 됩니다.

無心

고도리의 이미지

리눅스 커널에 대한 접근보다는 유닉스 커널혹은 시스템의 구조얘기군요.

설명을 하자면 꽤 길어질 것 같으니 책을 보란 얘기밖에 못하겠군요.

자세하게 유닉스를 알고 싶으면 유닉스의 시스템 레벨에서의 구조를
어느 정도 이해해야 하는데 제가 지금까지 봤던 책들에는

그런 개괄적인것이 거의 없더군요. 그나마 있어도 코드(리눅스 커널관련책)
위주로 되어 있어서 더 헷갈리더군요....^^

그래서, 가끔 이런 질문을 받을때나 강의할 경우는 다음 책의 한 챕터를
복사해서 보라고 하거나, 줍니다.

"초보자와 중급자를 위한 유닉스완성"이란 책인데, 지금 책이 없어서
정확히는 모르겠고요. 원서는 prentice hall에서 나온건데
번역판이 서점가면 있습니다.

이 책의 가장 보석같은 부분은 뭐니뭐니해도 유닉스 시스템의 구조에
대해 정말로 간략하고, 잘 알아먹을 수 있게 설명해 놓은 13(?)장인데

어떤 책보다도 설명이 뛰어납니다. 초보자가 봐도 어느정도 감이 잡힐
정도로 잘 써놨습니다. 번역도 특이하게(?, 우리나라 책치고는)아주
뛰어나고요.

그냥 서점가서 쭉 살펴보세요. 아님 학교 도서관같은데 있으면 보시고,
없으면? 신청하고 들어올때까지 기다리면 되겠지요...^^

그럼....

p.s> 오늘은 책장사가 된 기분이네요...

서명.....음, 서명이라...

아싸!!! Three Go!

namo의 이미지

좀 오래 되었기는 하지만 대학 때 읽었던
W.Richard Stevens의 Advanced Programming in the UNIX Environment 책에 잘 나와 있더군요.

댓글 달기

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