fork() 후에 execv() 실행
글쓴이: whatisid / 작성시간: 월, 2003/11/10 - 11:40오전
서버 소스를 보고 있는데요.
fork() 후에 child process에서 execv()를 호출해서 다른 바이너리를
실행하더군요.
제가 짠 로직은
if ( (pid = fork()) == 0) { function_child(); }
이거고, 해당 소스는
if ( (pid == fork()) == 0) { execv("./child_binary",argv); }
더군요.
제 짧은 지식으로는 굳이 execv()를 수행할 필요가 있는지 모르겠습니다.
그냥 child process 에서 함수로 해당 로직을 수행해버리면 되는거 아닌가요?
다른 바이너리로 굳이 넘어갈 필요가 있는지 궁금합니다. 오히려 이게
더 오버헤드를 일으키는 것 같다는 생각이 드는데요.
무슨 장점이 있길래 이렇게 execv()를 쓰는지 알고 싶습니다.
Forums:
흠..
쉘을 작성한다고 생각해보세요
bash 같은..쉘을 직접 만든다면..
bash 는 fgetc() 나 fgets 같은 함수를 통해
사용자의 키보드입력(실행할 명령어)을 읽어들입니다.
예를 들어 ls 명령이라고 한다면..
bash 에서 ls 명령의 코드를 일일이 코딩하기는 힘들겠죠
bash 는 fork 한후에 exec("ls") 의 형식으로 실행을 시켜줍니다.
a.out 명령을 실행시킬때도 bash는 fork 한후에 exec("a.out")로
실행해줍니다.
이해 되셨는지..
그리구.. 멀티 프로세스형 서버 프로그램이라면..
하나의 프로세스를 컴포넌트처럼 생각하도록 만들수 있겠죠
프로세스는 입력에 대해 동작을 하도록 정의되어 있는
하나의 컴포넌트로 생각할수 있겠네요(단지 제 느낌입니다.)
만약 컴포넌트의 동작을 바꾸고 싶다면..
쉽게... 그 프로세스만 수정해주면 될것 같습니다.
또는 기존의 프로그램을
수정없이 사용하기 위해 exec를 사용할 수 있겠죠.
만약..컴포넌트형 성격이 떨어지는 코드라면..
fork한 후에 바로 코드를 적어주면 될 것 입니다.
근데.. exec한다고 해서..그렇게 성능이 떨어지는 것은 아닙니다.
copy on write 기술을 사용하기 때문에 fork() 의 오버헤드가
굉장히 적거든요. copy on write 기술은 한마디로 fork()한담에
exec() 하는 방식의 프로그램에서 최상의 성능을 나타낸다고 볼수 있습니다.
스티븐스 어드밴스드 유닉스 프로그래밍을 참조하시면
잘 나옵니다.
근데...님이 궁금해하시는 부분이 exec의 용도라면..
사실..책의 예제를 통해서 이해가 될것 같군요
제경험으론 리눅스 시스템 플밍 책 두권정도 같이 보면서..
예제코드를 모두 작성해보시면.. exec의 용도가 이해 될 것 같습니다.
어쨌거나 .............
근데...
서버의 성능중에서..
중요한 시점은...서버가 실행을 시작하는 시간이 아니라
서버가 서비스를 하는 시간일 것입니다.
한 5초정도 늦게 시작된다고 해도...
서비스 시간동안 아주 좋은 성능을 낸다면..
대부분의 사람들이 만족하리라 봅니다.
자바같은 경우도 시작시간이 무척느리잔아요
서비스 시간중에 exec를 하는 것이 아니라면
exec의 오버해드는 무시하셔도 될것 같아요.....
경우에 따라 다르겠죠.
부모 프로세스가 기본적으로 리소스를 많이 잡아 먹는다면...
또 자식이 그 리소스를 전부 필요로 하지 않는다면...
이런경우 exec를 실행하는게 리소스 측면에서는 분명히 유리 합니다.
Do you think that's the air you are breathing now?
일반적인 network 서버는 아니지만, inetd 만 생각하셔도...
일반적인 network 서버는 아니지만, inetd 만 생각하셔도...
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
댓글 달기