2012-04-10 17 views
5

To jest kontynuacja mojego poprzedniego question. Używam widelca do tworzenia procesu potomnego. Wewnątrz dziecko, daję polecenie, aby uruchomić proces następująco:czas potrzebny na rozwidlenie procesu potomnego

if((childpid=fork())==0) 
{ 
system("./runBinary "); 
exit(1) 
} 

Moja runBinary posiada funkcjonalność mierzenia ile czasu trwa od początku do końca.

Co mnie zaskakuje, to że po uruchomieniu polecenia runBinary bezpośrednio na linii poleceń, zajmuje to około 60 sekund. Jednak gdy uruchamiam go jako proces potomny, potrzeba go więcej, np. ~ 75 lub więcej. Czy jest coś, co mogę zrobić, czy robię obecnie coś złego, co prowadzi do tego?

Dzięki za pomoc z góry. WIĘCEJ SZCZEGÓŁÓW: Używam serwera RHEL dla Linuxa z 24 rdzeniami. Zmierzam czas procesora. W tym samym czasie widzę tylko 8 potomków (kolejno), z których każdy jest związany z innym rdzeniem, używając zestawu zadań (nie pokazanego w kodzie). System nie został załadowany, z wyjątkiem mojego własnego programu.

+1

Może to trwa 15 sekund do procesu macierzystego do spania, aby obudził o/s po wyjściu dziecka? –

+0

@ JonathanLeffler możesz powiedzieć, jak to potwierdzić? Dzięki – user984260

+0

@sarnold faktycznie jest runBinary, który sam mierzy czas. – user984260

Odpowiedz

2

Funkcja system() służy do wywołania powłoki. Możesz zrobić wszystko w środku, włączając w to uruchomienie skryptu. Daje to dużą elastyczność, ale ma swoją cenę: ładujesz powłokę, a następnie uruchamiasz Binary. Chociaż nie sądzę, aby ładowanie powłoki było odpowiedzialne za tak dużą różnicę czasu (15 sekund to dużo, mimo wszystko), ponieważ wydaje się, że tego nie potrzebujesz - wystarczy uruchomić aplikację - spróbuj użyć czegoś z poziomu exec() zamiast tego rodzina.

+0

Dzięki. Twoja odpowiedź jest bardzo przekonująca. Myślisz, że rodzina exec jest szybsza? Powodem, dla którego nie korzystałem z execvp było to, że w systemie mogłem wykonać system ("./ Binary argument1 argument2") ;, podczas gdy nie mogłem tego zrobić w execvp. Możesz mi powiedzieć. – user984260

+1

Cóż, po prostu nie trzeba ładować powłoki i interpretować podanej linii poleceń, należy zapewnić wzrost prędkości. O linii poleceń, nie rozumiem, co dokładnie powiedziałeś, że nie możesz zrobić? Możesz przekazać do niego argumenty, jedyną dodatkową pracą jest to, że musisz umieścić argumenty w tablicy - jeśli używasz wariantów execv - lub przynajmniej mieć nazwę binarną w oddzielnym ciągu - jeśli używasz wariantów execl. Te rzeczy można zrobić, na przykład, za pomocą strtok. –

+0

Dzięki. Widzę i podążam. – user984260

0

Bez profilowania aplikacji, jeśli proces nadrzędny, który widły ma dużą przestrzeń pamięci, może się okazać, że jest czas spędzony na próbie rozwidlenia samego procesu i próba duplikowania przestrzeni pamięci.

To nie jest problem w Red Hat Enterprise Linux 6, ale było we wcześniejszych wersjach systemu Red Hat Enterprise Linux 5.

Powiązane problemy