본문 바로가기

대학교시절

운영체제 과제 #2 (뮤텍스와 세마포어 사용하기)

Producer/Consumer 문제를 해결하는 프로그램을 작성 하라.


- 자료를 저장할 큐를 만들고 Pthread를 사용하여 Producer/Consumer thread를 생성한다. Producer thread는 큐의 자료를 1로 계속 채우고, Consumer thread는 큐의 자료를 소모하여 0으로 만든다. 이때, Consumer thread는 큐의 가장 오래된 자료부터 소모하고, Producer thread는 큐의 가장 최근에 자료를 생성했던 다음 빈자리부터 자료를 채운다. (최초의 자료 생성시 큐의 가장 왼쪽부터 생성하고, 큐의 가장 오른쪽에 도달 시 큐의 가장 왼쪽으로 이동한다.) Consumer thread가 자료를 소모하거나 Producer thread가 자료를 생성하는 것을 각각 1번의 Request라고 취급한다. 프로그램을 시작할 때, 큐의 사이즈, 실행할 Request의 수, Producer thread의 수, Consumer thread의 수를 인자로 입력 받을 수 있고 입력방법은 다음과 같다. 그리고 입력 받은 만큼의 수만큼 Request가 일어났을 때, 프로그램을 종료한다.


$hw02 -q “큐의 사이즈” -r “Request의 수” -p “Producer thread의 수” –c “Consumer thread의 수”


예)$hw02 –q 100 –r 1000 –p 2 –c 5


프로그램 실행 시 위와 같이 입력 받았을 때, 100개의 자료를 저장할 수 있는 큐를 만들고, 2개의 Producer thread가 자료를 생성, 5개의 Consumer thread가 자료를 소모하고, 총 1000개의 Request가 수행 되었을 때 프로그램을 종료한다.


인자들 중에 제한범위를 벗어난 것이 있으면 오류 메시지를 출력하고 바로 프로그램을 종료하고, 만약 프로그램을 실행 시 인자를 생략한다면 default값으로 프로그램을 실행한다.


 

 제한범위

 디폴트 값 

 -q

 1~200

 100 

 -r

 1`~50000

 5000 

 -p

 1~10

 3 

 -c

 1~10

 3 


프로그램이 실행되면 Request가 수행 될 때마다 Request의 번호와 큐의 내용을 한 줄로 출력한다.

출력의 예시는 다음과 같다.




Request를 모두 수행하고 난 후에 아래와 같이 각thread들이 수행한 request 수를 출력하고 프로그램을 종료한다.






과제 1 Mutex를 이용한 동기화 – 위의 Producer/Consumer 문제를 mutex를 이용하여 동기화 시킨다.



과제 2.Semaphore를 이용한 동기화 - 위의 Producer/Consumer 문제를 Semaphore를 이용하여 동기화 시킨다.




Appendix


*자세한 내용은 man 페이지를 참조


1) int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);


2) int pthread_join(pthread_t thread, void **retval);


3) 

int pthread_mutex_lock(pthread_mutex_t *mutex); 

int pthread_mutex_unlock(pthread_mutex_t *mutex);


4) int sem_init(sem_t *sem, int pshared, unsigned int value);


5) int sem_destroy(sem_t *sem);


6) int sem_wait(sem_t *sem);


7) int sem_post(sem_t *sem);


*기타 참고사항


Pthread API를 사용하는 프로그램은 컴파일시 –lpthread 옵션을 사용하여 libpthread 라이브러리를 링크해야 오류가 나지 않는다.


사용 예) $gcc –o hw02 hw02.c -lpthread