2012-04-10 55 views
5

Đây là phần tiếp theo của bài trước question. Tôi đang sử dụng ngã ba để tạo ra quá trình con. Bên trong con, tôi cho lệnh để chạy một quá trình như sau:thời gian thực hiện bởi quá trình con chia hai

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

runBinary của tôi có chức năng đo bao nhiêu thời gian từ lúc bắt đầu đến khi kết thúc.

Điều làm tôi ngạc nhiên là khi chạy runBinary trực tiếp trên dòng lệnh, phải mất ~ 60 giây. Tuy nhiên, khi tôi chạy nó như là một quá trình con, nó mất nhiều hơn, như ~ 75 hoặc nhiều hơn. Có điều gì mà tôi có thể làm hoặc hiện đang làm sai, điều này dẫn đến điều này?

Cảm ơn bạn đã trợ giúp trước. CHI TIẾT THÊM: Tôi đang chạy trên máy chủ RHEL Linux, với 24 lõi. Tôi đang đo thời gian CPU. Tại một thời điểm, tôi chỉ ngã ba 8 đứa trẻ (tuần tự), mỗi trong số đó là ràng buộc với lõi khác nhau, bằng cách sử dụng bộ công cụ (không được hiển thị trong mã). Hệ thống không được tải trừ chương trình của riêng tôi.

+1

Có thể mất 15 giây để quy trình cha mẹ ngủ của bạn bị đánh thức bởi o/s sau khi đứa trẻ ra khỏi? –

+0

@JonathanLeffler bạn có thể nói cách xác nhận điều đó không? Cảm ơn – user984260

+0

@ sarnold thực sự nó là runBinary đó là chính nó đo thời gian. – user984260

Trả lời

2

Hàm system() là để gọi trình bao. Bạn có thể làm bất cứ điều gì bên trong nó, bao gồm cả chạy một kịch bản. Điều này mang lại cho bạn rất nhiều sự linh hoạt, nhưng nó đi kèm với một mức giá: bạn đang tải một trình bao, và sau đó runBinary bên trong nó. Mặc dù tôi không nghĩ rằng tải vỏ sẽ chịu trách nhiệm cho sự khác biệt rất nhiều thời gian (15 giây là rất nhiều, sau khi tất cả), vì nó không có vẻ bạn cần điều đó - chỉ để chạy các ứng dụng - hãy thử sử dụng một cái gì đó từ exec() thay vào đó.

+0

Cảm ơn. Câu trả lời của bạn rất thuyết phục. Bạn có nghĩ rằng gia đình exec là nhanh hơn? Lý do tôi đã không sử dụng execvp là trong hệ thống tôi có thể làm hệ thống ("./Binary argument1 argument2") ;, trong khi, tôi không thể làm như vậy trong execvp. Bạn có thể nói. – user984260

+1

Vâng, chỉ cần không phải tải vỏ và giải thích dòng lệnh đưa ra nên cung cấp một sự gia tăng tốc độ. Về dòng lệnh, tôi không hiểu, những gì bạn nói bạn không thể làm được? Bạn có thể chuyển đối số cho nó, công việc bổ sung duy nhất là bạn phải đặt các đối số trong một mảng - nếu sử dụng các biến thể execv - hoặc ít nhất có tên nhị phân trong một chuỗi riêng biệt - nếu sử dụng các biến thể execl. Những thứ đó có thể được thực hiện, ví dụ, với strtok. –

+0

Cảm ơn. Tôi thấy và làm theo. – user984260

0

Nếu không có hồ sơ ứng dụng, nếu quá trình cha mẹ mà dĩa có một không gian bộ nhớ lớn, bạn có thể thấy rằng có thời gian đã cố gắng để ngã ba quá trình riêng của mình, và cố gắng để nhân đôi không gian bộ nhớ.

Đây không phải là vấn đề trong Red Hat Enterprise Linux 6, nhưng trong các phiên bản trước của Red Hat Enterprise Linux 5.

Các vấn đề liên quan