fork()를 사용해서 여러개의 프로세스를 생성한다???

dbsthqkf의 이미지

네 fork의 기능이 부모 프로세스를 복제하여 자식 프로세스를 생성한다라는 것은 알겠습니다.

1. 그렇다면 부모 프로세스를 복제하면 똑같은 프로세스가 하나더 생성되는데 왜 굳이 똑같은 프로세스를 생성하는 것일까요?
똑같은 프로세스를 다른 프로세스로 바꾸어서 다른 기능을 하도록 하는 것이 exec()함수인가요?

2. 그렇다면 fork()를 한 후에 반드시 exec()를 사용해야 fork함수가 존재하는 이유가 되는 건가요?

3. 꼭 exec()함수를 쓰지 않는다면 왜 똑같은 프로세스를 만드는 것인가요?

4. 컴퓨터의 cpu는 1개당 1개의 프로그램을 실행시킬 수 있는데 여러가지 프로그램이 작동하는 것 처럼 보이는 이유는
컴퓨터가 시분할 시스템이기 때문에 가능하다는 것인데. 그렇다면 인터넷, power point, 미디어 프로그램 등등 여러가지 프로그램을 실행시키는 것이 가능한 이유가
fork()를 사용했기 때문인가요?

5. 제가 앞에서 말한 것들이 틀리다면.. fork를 실제 우리가 친숙하게 쓰이는 예로 설명해주세요 ㅠ_ㅠ

쓰다보니까 말이 뒤죽박죽인데
결론은……
unix공부를 하다보면 fork나 thread와 같은게 뭐고 어떤 기능을 하는건지는 알겟는데
정작 그것들이 실제로 어느부분에 쓰이는지를 잘 가늠이 안되네요ㅠ ㅠ
개발자는 상상력이 많이 필요한 직업인것 같아요..

익명 사용자의 이미지

말씀하신 것도 하나의 방법이고,
같은 프로그램이 다르게 동작하게 하기도 하죠.

if(is_parent) run_sender()
else run_receiver()

gosuchoi의 이미지

간단히 설명드릴께요
Linux에서 login을 하면 shell프로그램이 돌면서 prompt를 띄웁니다. 사용자에게서 command를 입력받으면(예를 들어 copy), shell프로그램은 fork를 이용해서 자신과 똑같은 자식프로세스를 만듭니다. 부모프로세스(shell)는 wait call을 해서 자식프로세서(shell)가 끝나기를 기다리고, 자식프로세서는 exec를 call 해서 자신의 메모리 영역에 copy프로그램의 메모리 영역으로 초기화하고 실행합니다. 자식프로세서가 끝나면 부모프로세스는 wait 에서 벗어나서 자식프로세스의 결과를 output으로 내보내고, 다시 command를 받기위해 prompt를 띄웁니다.

만약 shell에서 바로 exec를 콜하면 shell이 없어지고 대신 copy가 돌다가 copy가 끝나면 이미 shell이 끝났기 때문에, 다시 prompt가 나오지 않고, 다시 시스템으로부터 서비스를 받을 수가 없겠지요.

사용자 입장에서는 fork를 이용해서 몇개의 process든 생성이 가능합니다.(시스템에서 설정한 제한을 넘지 않으면). 멀티프로세스 시스템이지요. 예를 들면, 웹서버에서 커넥션 리퀘스트를 받을때마다, 프로세스를 만들수가 있겠지요.. fork를 이용해서. 물론 이게 효율적이지는 않지만 말입니다.

fork를 이용할 수 있는 이유는 바로 Linux가 multi process를 지원하기 때문이지요. single process를 지원하는 시스템이라면 아마 fork라는게 필요없겠지요.

dbsthqkf의 이미지

감사합니다 이해가 잘되네요 ^^

댓글 달기

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