2012-03-23 2 views
1

나는 다음과 같은 experinment를 고려했다 : 단지 0을 반환하는 간단한 C 프로그램이지만, gcc가 링크를 허용하는 모든 라이브러리와 연결됨 - 총 207 개. 이 프로그램을 실행하려면 많은 시간이 필요합니다. -2.1 콜드 스타트, 0.24 워밍업. 그래서 다음 단계는 프로그램을 작성하는 것인데, 라이브러리와 연결된이 힙은 & exec on request입니다. 이미 라이브러리를로드하고 fork가 프로세스의 동일 복사본을 만든다면 처음 프로그램 을 매우 빠르게 실행할 생각입니다. 그러나 차이점을 발견하지 못했습니다. 쉘을 통해 첫 번째 프로그램을 실행하거나 모든 라이브러리와 연결된 두 번째 프로그램을 통해 프로그램을 실행했습니다. 내 실수는 무엇입니까?포크와 동적 라이브러리 상호 작용

편집 : 그래, 나는 간부의 포인트를 놓쳤다. 그러나 응용 프로그램 시작 속도를 높이는 것이 내 아이디어의 가능한 개선일까요? 나는 prelink에 관해 알고있다. 그러나 그것은 약간 다른 생각을한다.

+0

실험 내용에 대해 자세히 알려주십시오. 나는 아마도 똑같은 결과를 보지 못했고 157 라이브러리 ('ldd'에 의해 주어진), 0.54 초의 콜드 스타트, 0.07 리얼 초의 웜 스타트를 보았을 것입니다. –

+0

@Basile : 정확한 라이브러리 세트 나 문제의 기계를 알지 못하기 때문에 절대 번호를 비교하는 것이 실제로 의미가 없습니다. 게다가 둘 다 따뜻한 시동이 감기 시작보다 대략 빠른 속도로 시작됩니다. –

답변

0

당신이하는 유일한 장점은 디스크에서 읽은 모든 라이브러리를 파일 시스템 캐시로 가져 오는 것입니다 ("웜 스타트"와 동일). 그렇지 않으면, 당신이하고있는 일은 쉘이 프로그램 (forkexec)을로드하는 방법입니다. 그래서 그것이 더 빠를 것이라고 기대하지 않습니다. fork뿐 아니라 exec 인 경우 프로세스가 "복사"한다는 아이디어가 사실입니다.

파일 시스템에서 "복사"비유로 만들려면 실제로 생성 속도가 느린 파일을 복사 한 다음 rm이라는 파일을 복사하여 복사본을 사용하는 대신 다시 생성 한 것과 같습니다.

0

fork은 프로세스의 정확한 복사본을 생성하지만 exec은 프로세스 메모리를 지 웁니다. 따라서 모든 라이브러리를 다시로드해야합니다 (또는 적어도 초기화 된 - 코드 세그먼트를 공유 할 수 있음).