prefork는 어떨때? 왜?
왜 prefork를 사용할까요??
왜냐니.. 좀 엉뚱합니다만..
전.. 이런 질문을 혼자 많이 생각 했었습니다..
이곳 저곳 글도 읽어 봤구요..
요지는...
prefork라 하여 글들을 읽어보면 .. accept 이젠에 미리 fork를 하여
처리 프로세스를 띄워 놓는다.. 이때 accept하고 있는 처리 프로세스가
여럿이니 그중 하나만 깨어나서 처리 한다 였습니다.
의문이 위와 같은 방법 말고.
listen -> accept -> socket passing 하는 프로세스 와
recieve socket -> transaction processing 하는 프로세스처럼 하면
위의 prefork 처럼은 안써도 될 듯 한데..
또...... 서버 클라이언트간 connection을 유지해야 하는 경우라면...
prefork 일 경우.. 5개의 프로세스중 하나의 프로세스에 해당 클라이언트가
select fd_set에 등록 된 뒤.. 동일 클라이언트가 데이터를 또 보내면.. 등록된
하나의 프로세스만이.. 해당 클라이언트에 대한 등록된 fd_set 만을 가지고
있어 .. 데이터를 받을수 있고 만일 다른 프로세스가 받는다면...... 이것또한
문제 일거 같고..
웹서버 같은 경우 단일 처리이니 상관 없을 듯 하지만.. 컨넥션 연결이 필요한
서버 일 경우 위와 같은 경우 까지 고려를 한다면 정말 복잡할거 같습니다.
- - 죄송합니다. 글을 너무 복잡하게 요지 없게 쓴거 같아서.. 읽어주셔서 감사
합니다. ㅋ
많은 경우가 그러하겠지만.. prefork 또한 prefork 모델로 적
많은 경우가 그러하겠지만.. prefork 또한 prefork 모델로 적절한 경우에 사용합니다.. 말씀하신 웹서버 같은 모델이 그렇죠..
제 경우 하나의 커넥션이 이루어지면 fork해서 처리하고 종료하는 모델이었을 때 prefork을 사용한다면 큰 수정없이 framework만의 교체로 큰 효과를 얻을 수 있었습니다. 확실히 pre-spawn쪽이 응답이 빠르긴 하더군요..
prefork가 아닌 경우 accept 쓰레드에서 process 쓰레드로
prefork가 아닌 경우 accept 쓰레드에서 process 쓰레드로 소켓을 넘겨주는 시간을 생각해야 합니다. (이 경우에 보통은 mutex lock, queue 등의 중간 과정이 필요하겠지요.)
prefork는 웹 서버 처럼 신규 접속이 잦은 경우에 효율적입니다. 텔넷이나 메신저, 게임처럼 보통 연결이 오래 유지되는 경우에는 prefork를 별로 사용하지 않습니다. 어쨌든 prefork는 리소스를 실제 사용 전에 미리 준비시키기 때문에 리소스의 관점에서는 비효율적인 부분이 있으니까요.
이부분이 좀 이상하군요..[quote="하하"]데이터를 받
이부분이 좀 이상하군요..
다른 프로세스가 받는다는게 어떤 의미인지....
집에나 갈까?
prefork 는 fork 할때의 비용이 크기 때문에 여유 있을 때 미리
prefork 는 fork 할때의 비용이 크기 때문에 여유 있을 때 미리 해두어서 사용자가 정작 요청할때 응답을 빠르게 하기 위한거죠
prefork 를 하면 일단 fork 하는 비용이 사용자가 요청하기 전에 서버측에서 소비를 하고 응답을 바로 할 수 있는 상태 이미로
라는 효과를 얻을 수 있죠.
라고 볼 수도 있겠지만.
최신 커널, 음.. 리눅스의 경우 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이 등록된 프로세스로
올때 까지 해당 데이터를 처리 하지 못하지 않나 해서
쓴 말 이었습니다. ㅋ~
“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”
댓글 달기