여러 개의 프로세스를 사용해서 소수를 출력[C, Linux]

여러 개의 프로세스를 사용해서 소수를 출력[C, Linux]

안녕하세요.

오늘은 유닉스라는 과목을 들으면서 제가 만든 코드를 올려보려고 합니다.

  • 100,000까지의 모든 prime number(소수)를 출력하는 프로그램
  • 위의 프로그램과 동일하지만 여러개의 프로세스를 이용하는 프로그램(병렬처리)
  • time 명령을 이용해서 몇 초가 걸리는지 확인

코드

코드는 아래와 같습니다.

코드 파일은 깃허브에서 다운받으실 수 있습니다.

(귀찮아서 나중에 링크 올릴게요.)

1. 하나의 프로세스로 소수를 출력하는 프로그램

2. 4개의 프로세스를 사용해서 소수를 출력하는 프로그램 

실행

아래의 사진은 라즈베리파이 3b+ (라즈비안)에서 실행했을 때의 사진입니다.

1. 하나의 프로세스로 소수를 구하는 프로그램을 실행했을 때

대충 21초

2. 4개의 프로세스로 소수를 구하는 프로그램을 실행했을 때

대충 9초

위 의 사진을 보고 알 수 있는 점은 여러개의 프로세스를 사용한 프로그램이 더 빠르다는 점입니다.

주요 코드 설명

1. time함수 time ./실행파일 <--이런 식으로 실행했습니다.

2. 소수를 구하는 부분의 코드는 간단하기 때문에 설명하지 않겠습니다.(코드만 봐도 대충 아실 겁니다.)

3. fork에 대한 설명은 아래의 스크린샷을 참고해주세요.

fork에 대해 요약

1. 리눅스 환경에서 제공되는 c언어 함수

2. 존재하는 프로세스(부모 프로세스)가 새로운 프로세스를 생성(자식 프로세스)

3. 자식 프로세스는 부모와 동일한 동작을 하고 fork함수 호출 이후부터 각자의 메모리를 사용.

4. pid가 -1이라면 fork가 실패, 0이라면 자식 프로세스, 나머지는 부모 프로세스이다.

추가

위의 실행 결과에서 하나의 프로세스보다 여러 개의 프로세스를 이용해서 만든 프로그램이 더 빠르게 나왔습니다.

하지만 여러개의 프로세스가 구역을 나누어 병렬적으로 실행되기 때문에 결과물을 살펴보면 숫자들이 뒤죽박죽으로 출력이 되는 것을 확인할 수 있었습니다.

이를 해결하기 위해서 wait를 사용해서 해결했지만 이 wait은 자식 프로세스의 작업이 끝날때까지 기다렸다가 자식프로세스의 작업이 다 끝나면 부모 프로세스의 작업을 하는 것이기 때문에 다시 속도가 느려졌습니다.

(이 부분은 코드에 주석처리를 해 놓았습니다.)

 

Designed by JB FACTORY