Server 에서 왜 fork()를 사용하나요?

jwy22의 이미지

안녕하세요.
리눅스를 공부하다가 프로세서 쪽을 보다가 갑자기 생긴 의문점이 있어서 질문 올립니다.
fork라는 것이 자식 프로세서를 생성해주는 것이라는 알겠는데...
왜 서버에서 fork를 사용하는지에 대해서는 잘 모르겠습니다. :oops:
간단한 설명 부탁드립니다.

서지훈의 이미지

fork()를 사용하지 않으면 일반적으로...
한 서버는 한 유저의 접속밖에 허용하지 않습니다.
그러나 보통은 한 서버에 다수의 유저에 대한 서비스를 제공해주기 위해,
서버와 같은 일을 하는 프로세스를 생성시켜 새로 요청한 접속에 할당을 해주고,
다시 부모는 새로운 요청이 들어오면...
다시 자식 프로세스를 만들어 할당을 해주는 방식으로 합니다.

결국은 한 서버로 다수의 서비스를 해주기 위함입니다.

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

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

jwy22의 이미지

간단한 답변 감사합니다. ^^

내손안에는 아직 비장의 무기가 남아 있다.
그것은 희망이다.
-나폴레옹-

dgkim의 이미지

제가 아는 지식을 두개 설명드리겠습니다.

먼저 모든 프로세스는 (제가아는 바에 의하면) 부모 자식간의 관계를 가지게 설계 되었습니다.

그래서 하늘에서 뚝 떨어진 프로세스는 존재할 수 없는 것이죠.
(어디까지나 제가 아는 지식으로는)

그래서 리눅스의 경우 모든 프로세스는 init의 자식프로세스가 되는 것이죠..

그리고 자식의 생성시에 사용되는 것이 fork()죠..

(이건 프로그래밍과는 거리가 먼 제 소견입니다.)

그리고 서버측에서 fork()하는 이유..

서버는 하나의 서비스에 대해서 여러개의 클라이언트를 받아내야 합니다.

그래서 서버에서 하나의 프로세스가 클라이언트하나의 요청을 받으면,

그것을 자신이 바로 응답하는 것이 아니라, 자신의 자식을 fork()해서 전달하죠..

그리곤 자신은 또 다른 클라이언트의 요청을 기다리는 것이죠..

그래서, 서버의 프로세스는 접속을 받을 때 마다 요청을 처리할 프로세스를 만들어내는 것이죠..

revizes의 이미지

맞는지 몰겠지만...^^;
모든 프로그램이 실행되서 메모리에 올라오게 된것을
프로세스라고 합니다. 리눅스도 프로세스이구요...
근데..리눅스가 처음 부팅할때는 프로세스가 엄습니다. -_-;

그래서..부팅하면서 프로세스 디스크립터 및 스택을..할당해주면서..
swapper라는 0번 프로세스를 만듭니다. 이놈이..리눅스 최초의
프로세스고..그 담에..이넘을 이용해서 init라는 1번 프로세스를 만듭니다.

글구나서..init을 이용해서 다른 프로세스들을 만들어주게 됩니다.

서버가 프로세스를 하나면...그걸 처리하는 프로세스가 하나란 소립니다.
고로 여러 connection을 동시(?)에 처리할 수 없게 됩니다..

-_-; 내용이 딴데로...

다 덤벼! 다 받아줄께!!

jwy22의 이미지

답변감사합니다.
그렇다면 fork를 무한대로 사용할수는 없을것 같은데...
fork의 제한 갯수는 몇개고 어떻게 알수 있나요?
fork의 활용할수 있는 방법에 뭐가 있을까요?
fork()라고 해주면...사용가능한가요?
질문이 너무 많죠? 그래도 한가지만 더...
fork 방식이 비효율적이라서 지금은 select()와 polling()이 나온것으로 알고 있습니다. select와 polling에 대해서도 간단한 설명또는 참고할 만한 사이트 부탁드리겠습니다.

이제막 하나둘씩 개념을 잡아 가는 단계라...배울것이 너무 많네요.

내손안에는 아직 비장의 무기가 남아 있다.
그것은 희망이다.
-나폴레옹-

wafe의 이미지

http://www.joinc.co.kr/ 여기 강좌가 괜찮더군요.

Heejoon Lee

다즐링의 이미지

프로세서가 하나라도 처리하는 기술이 있습니다-_-;

thread를 사용하거나

비동기적인 방법을 사용하는겁니다 ( select , poll , epoll , kqueue 등 )

그리고 꼭 fork 가 비효율적인 것 만은 아닙니다.

어떤 써버냐에 따라 달라지겠지요.

select 나 poll 은 대충 설명을 드리자면.

어떤 fd에 대한 이벤트가 일어나는 것에 대해

핸들러가 있습니다.

poll은 커널가지 갔다가 오는걸로 압니다만.

이벤트가 생기면 관련된 걸 실행하고

그런식입니다.

revizes wrote:
맞는지 몰겠지만...^^;
모든 프로그램이 실행되서 메모리에 올라오게 된것을
프로세스라고 합니다. 리눅스도 프로세스이구요...
근데..리눅스가 처음 부팅할때는 프로세스가 엄습니다. -_-;

그래서..부팅하면서 프로세스 디스크립터 및 스택을..할당해주면서..
swapper라는 0번 프로세스를 만듭니다. 이놈이..리눅스 최초의
프로세스고..그 담에..이넘을 이용해서 init라는 1번 프로세스를 만듭니다.

글구나서..init을 이용해서 다른 프로세스들을 만들어주게 됩니다.

서버가 프로세스를 하나면...그걸 처리하는 프로세스가 하나란 소립니다.
고로 여러 connection을 동시(?)에 처리할 수 없게 됩니다..

-_-; 내용이 딴데로...

------------------------------------------------------------------------------------------------
Life is in 다즐링

jwy22의 이미지

많은 분들의 답변 정말 갑사합니다. ^^
리플이 바로 올라오니깐...공부할 맛(?) 납니다.

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