개발자
WSL2 우분투 리눅스 22.04에서 c언어로 fork() 함수를 사용하여 간단한 멀티 프로세스 프로그램을 작성하였는데요. 이와 동일한 작업을 수행하는 단일 프로세스의 실행시간과 비교하였는데 수행 시간이 동일하게 나왔습니다. 시간 측정 방법은 리눅스 명령어 중 “time ./실행파일명” 을 사용하여 측정하였습니다. 해당 작업은 1~1000 까지 각 숫자에 7을 곱한 값을 출력하는 것입니다. 두 코드의 수행 시간이 동일하면 안 되고 멀티 프로세스가 단일 프로세스보다 수행시간이 작아야 하는 것으로 알고 있습니다. 아래는 저의 멀티 프로세스 코드입니다. 수행 시간이 단일 프로세스와 동일하니 멀티 프로세스가 제대로 되지 않는다고 생각됩니다... 해당 코드에서 프로세스가 제대로 생성되지 않는 이유가 뭘까요??
답변 1
hyperfine 이라는 툴로 벤치마크 해보았는데요. user 모드의 cpu 사용시간보다 system 모드의 사용 시간이 길게 나오네요 [User: 147.4 µs, System: 496.2 µs] 새로운 프로세스를 할당하는 데에 시간을 많이 사용한 것으로 보입니다. 동시성의 이득을 보려면 입력이 더 커야 합니다. 다음과 같이 입력을 100배로 늘렸더니 동시성 코드가 더 빠르네요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
//single.c #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> int main() { int x=1; // 작업 for(int i=x; i<=700000; i++) { printf("%d ", i); } printf("\n\n"); } //multi.c #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> int main() { pid_t pid; int x=1; // 총 2개의 프로세스 생성 switch(pid=fork()) { case -1: // fork 실패 perror("fork"); exit(1); break; case 0: // 자식 프로세스 x+=50000; break; default: // 부모 프로세스 break; } // 총 4개의 프로세스 생성 switch(pid=fork()) { case -1: // fork 실패 perror("fork"); exit(1); break; case 0: // 자식 프로세스 x+=25000; break; default: // 부모 프로세스 break; } // 총 8개의 프로세스 생성 switch(pid=fork()) { case -1: // fork 실패 perror("fork"); exit(1); break; case 0: // 자식 프로세스 x+=12500; break; default: // 부모 프로세스 break; } printf("CurrentPID : %d\n", (int)getpid()); // 작업 for(int i=x; i<=x+12400; i++) { printf("%d ", i * 7); } printf("\n\n"); }
익명
작성자
2024년 03월 24일
작업 수행시간이 프로세스 할당 시간에 비해 매우 짧다면 동시성으로 이득을 얻을 수 없다는 것이군요! 답변 감사합니다!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!