prefork는 어떨때? 왜?

하하의 이미지

왜 prefork를 사용할까요??

왜냐니.. 좀 엉뚱합니다만..

전.. 이런 질문을 혼자 많이 생각 했었습니다..

이곳 저곳 글도 읽어 봤구요..

요지는...

prefork라 하여 글들을 읽어보면 .. accept 이젠에 미리 fork를 하여

처리 프로세스를 띄워 놓는다.. 이때 accept하고 있는 처리 프로세스가

여럿이니 그중 하나만 깨어나서 처리 한다 였습니다.

의문이 위와 같은 방법 말고.

listen -> accept -> socket passing 하는 프로세스 와

recieve socket -> transaction processing 하는 프로세스처럼 하면

위의 prefork 처럼은 안써도 될 듯 한데..

또...... 서버 클라이언트간 connection을 유지해야 하는 경우라면...

prefork 일 경우.. 5개의 프로세스중 하나의 프로세스에 해당 클라이언트가

select fd_set에 등록 된 뒤.. 동일 클라이언트가 데이터를 또 보내면.. 등록된

하나의 프로세스만이.. 해당 클라이언트에 대한 등록된 fd_set 만을 가지고

있어 .. 데이터를 받을수 있고 만일 다른 프로세스가 받는다면...... 이것또한

문제 일거 같고..

웹서버 같은 경우 단일 처리이니 상관 없을 듯 하지만.. 컨넥션 연결이 필요한

서버 일 경우 위와 같은 경우 까지 고려를 한다면 정말 복잡할거 같습니다.

- - 죄송합니다. 글을 너무 복잡하게 요지 없게 쓴거 같아서.. 읽어주셔서 감사

합니다. ㅋ

leilei의 이미지

많은 경우가 그러하겠지만.. prefork 또한 prefork 모델로 적절한 경우에 사용합니다.. 말씀하신 웹서버 같은 모델이 그렇죠..

제 경우 하나의 커넥션이 이루어지면 fork해서 처리하고 종료하는 모델이었을 때 prefork을 사용한다면 큰 수정없이 framework만의 교체로 큰 효과를 얻을 수 있었습니다. 확실히 pre-spawn쪽이 응답이 빠르긴 하더군요..

케인의 이미지

prefork가 아닌 경우 accept 쓰레드에서 process 쓰레드로 소켓을 넘겨주는 시간을 생각해야 합니다. (이 경우에 보통은 mutex lock, queue 등의 중간 과정이 필요하겠지요.)

prefork는 웹 서버 처럼 신규 접속이 잦은 경우에 효율적입니다. 텔넷이나 메신저, 게임처럼 보통 연결이 오래 유지되는 경우에는 prefork를 별로 사용하지 않습니다. 어쨌든 prefork는 리소스를 실제 사용 전에 미리 준비시키기 때문에 리소스의 관점에서는 비효율적인 부분이 있으니까요.

indie의 이미지

이부분이 좀 이상하군요..

하하 wrote:

데이터를 받을수 있고 만일 다른 프로세스가 받는다면...... 이것또한 문제 일거 같고..

다른 프로세스가 받는다는게 어떤 의미인지....

집에나 갈까?

ssehoony의 이미지

prefork 는 fork 할때의 비용이 크기 때문에 여유 있을 때 미리 해두어서 사용자가 정작 요청할때 응답을 빠르게 하기 위한거죠

prefork 를 하면 일단 fork 하는 비용이 사용자가 요청하기 전에 서버측에서 소비를 하고 응답을 바로 할 수 있는 상태 이미로

leilei wrote:
확실히 pre-spawn쪽이 응답이 빠르긴 하더군요..

라는 효과를 얻을 수 있죠.

케인 wrote:
어쨌든 prefork는 리소스를 실제 사용 전에 미리 준비시키기 때문에 리소스의 관점에서는 비효율적인 부분이 있으니까요.

라고 볼 수도 있겠지만.
최신 커널, 음.. 리눅스의 경우 2.4 부터 아마 될건데요. (정확하지 않습니다.)
fork를 하면 그 순간 프로세스의 자원을 복사하지 않습니다. 메모리를 공유하다가 메모리에 기록이 일어나면, 그때 실제로 복사가 발생하는 그런 방식을 최근에는 적용을 시켰기 때문에 prefork 로 인해 논리적으로는 자원을 많이 소모 하는 것 처럼 보이지만 물리적으로는 논리적인 것 만큼을 소비 하지는 않습니다.
이런 기능은 윈도우의 경우 95, 98 계열은 안되고 2000 과 같은 NT 계열은 되는데 2000부터 인지 2000 이전의 NT계열도 되는지는 모르겠네요.

응답 시간향상 (여기서 향상이란 짧아진다는 의미로... ^^) 과 fork 의 부하를 줄이기 위한 좋은 방법은 쓰레드를 사용하는 것이 아닐까 생각합니다.
쓰레드는 fork 보다 생성비용이 적고 자원을 한 프로세스 내에서는 공유하니깐 자원소비도 적고 프로세스간 통신이나 싱크하는 것보다 쓰레드간 통신이나 싱크가 훨씬 쉽다는 장점도 있져.
쓰레드 역시 prefork 처럼 쓰레드풀을 사용해서 더욱 효율적으로 사용할 수도 있고요.

하하의 이미지

Quote:

이부분이 좀 이상하군요..

Quote:

하하 씀:

데이터를 받을수 있고 만일 다른 프로세스가 받는다면...... 이것또한 문제 일거 같고..

다른 프로세스가 받는다는게 어떤 의미인지....

예.. 그건 prefork 된 여러개의 자식 프로세스가

동시에 select -> accept 할때.. 처음 client가

여러개의 자식 프로세스 중 하나에만 accept return

된 소켓을 fd_set에 등록 시켜 select 할텐대

그 client가 컨넥션을 끊지 않고 데이터를 계속 보낸다

면 ..... 다른 select -> accept 하는 프로세스는 받지

못할테고 스케줄링이 fd_set이 등록된 프로세스로

올때 까지 해당 데이터를 처리 하지 못하지 않나 해서

쓴 말 이었습니다. ㅋ~

“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”

댓글 달기

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