200 likes | 990 Views
운영체제 실습 - Reader/Writer 문제 구현하기 -. Hwan- hee Kim (hwanhee0920@kangwon.ac.kr ) 2013. 12. 12. 목 차. Reader/Writer 문제 개요 Reader/Writer 알고리즘 Reader/Writer 구현. 1. Reader/Writer 문제 개요. Reader 와 Writer 는 동시에 수행될 수 없다 . Reader 는 동시에 수행 가능
E N D
운영체제 실습- Reader/Writer 문제 구현하기 - Hwan-hee Kim (hwanhee0920@kangwon.ac.kr) 2013. 12. 12.
목 차 • Reader/Writer 문제 개요 • Reader/Writer 알고리즘 • Reader/Writer 구현
1. Reader/Writer 문제 개요 • Reader와 Writer는 동시에 수행될 수 없다. • Reader는 동시에 수행 가능 • 하지만 Reader가 계속 수행할 경우에 Writer의 기아현상이 발생할 수 있음 • 따라서 본 문제에서는 Reader 수행 중 Writer가 들어오면 Writer를 우선적으로 수행 • 이 때 Reader의 기아 현상이 발생할 수는 있음
2. Reader/Writer 알고리즘 Reader < 임계구역 > Reader Writer Writer
2. Reader/Writer 알고리즘 • Wikipedia -> Reader/Writer Problem semaphore wrt = 1, mutex = 1; writer() { wait(wrt); // writer 업무 수행 signal(wrt); }
2. Reader/Writer 알고리즘 • Wikipedia -> Reader/Writer Problem reader() { wait(mutex); readcount++; if(readcount == 1) wait(wrt); signal(mutex); // reader 업무 수행 wait(mutex); readcount--; if(readcount== 0) signal(wrt); signal(mutex); }
1. Reader/Writer 문제 구현 • 주요 함수 설명 • sem_init: 세마포 변수 초기화 • sem_init(세마포 변수, 프로세스 범위, 초기화 값) • sem_wait: 독자/필자에서 알고 있는 wait() 함수 • 세마포 변수의 값을 1 감소시킨다. (자원을 가져다 씀) • sem_post : 독자/필자에서 알고 있는 signal() 함수 • 세마포 변수의 값을 1 증가시킨다. (자원을 돌려줌) • sleep : 매개변수 할당한 수 만큼 대기(단위: 초)
1. Reader/Writer 문제 구현 • 주요 함수 설명 • pthread_create: 쓰레드 생성 함수 • pthread_create(쓰레드 명, 쓰레드 특성, 실행될 함수, 매개 변수) • pthread_join : 쓰레드가 종료할 때 까지 지연하는 함수 • pthread_join(쓰레드 명, 쓰레드 종료 시 반환 값) • time(NULL) : 현재 시간 반환 함수 • ctime: 시간을 ‘요일 월 일 시 분 초년도’ 단위로 출력하는 함수
3. Reader/Writer 문제 구현 (1/6) #include <stdio.h> #include <semaphore.h> #include <stdlib.h> #include <time.h> #include <pthread.h> typedefstruct _process { char name[10]; char type[10]; time_t time; int run_time; }Process; sem_t mutex1, mutex2, mutex3, r, w; int readcount = 0; int writecount = 0; time_t timer; time_tstart_time; time_tend_time; time_tcurrent_time;
3. Reader/Writer 구현 (2/6) void *reader(void *p) { Process *ps = p; sem_wait(&mutex3); sem_wait(&r); sem_wait(&mutex1); readcount++; if(readcount == 1) sem_wait(&w); sem_post(&mutex1); sem_post(&r); sem_post(&mutex3); current_time = time(NULL); printf("Start %s / Time : %s", ps->name, ctime(¤t_time)); sleep(ps->run_time); current_time = time(NULL); printf(" End %s / Time : %s", ps->name, ctime(¤t_time)); sem_wait(&mutex1); readcount--; if(readcount == 0) sem_post(&w); sem_post(&mutex1); }
3. Reader/Writer 구현 (3/6) void *writer(void *p) { Process *ps = p; sem_wait(&mutex2); writecount++; if(writecount == 1) sem_wait(&r); sem_post(&mutex2); sem_wait(&w); current_time = time(NULL); printf("Start %s / Time : %s", ps->name, ctime(¤t_time)); sleep(ps->run_time); current_time = time(NULL); printf(" End %s / Time : %s", ps->name, ctime(¤t_time)); sem_post(&w); sem_wait(&mutex2); writecount--; if(writecount == 0) sem_post(&r); sem_post(&mutex2); }
3. Reader/Writer 구현 (4/6) int main(void) { FILE *fp; fp = fopen("./Process.txt", "r"); Process process[10]; pthread_tpt[10]; time_tprocessing_time; sem_init(&mutex1, 0, 1); sem_init(&mutex2, 0, 1); sem_init(&mutex3, 0, 1); sem_init(&r, 0, 1); sem_init(&w, 0, 1); int count = 0; int minute, second; int i = 0; timer = time(NULL); if(fp == NULL) { printf("File Open Error\n"); } printf("< Input Process Information >\n"); printf("=============================\n");
3. Reader/Writer 구현 (5/6) while(feof(fp) == NULL) { fscanf(fp, "%s %s %d:%d %d\n", process[i].name, process[i].type, &minute, &second, &process[i].run_time); process[i].time = timer + minute*60 + second; printf("%s, %s, %d:%02d, %d\n", process[i].name, process[i].type, minute, second, process[i].run_time); i++; } printf("=============================\n"); i=0; start_time = time(NULL); while(i!=9) { if(process[i].time == time(NULL)) { if(strcmp(process[i].type, "Reader") == 0) { pthread_create(&pt[i], NULL, reader, &process[i]); } if(strcmp(process[i].type, "Writer") == 0) { pthread_create(&pt[i], NULL, writer, &process[i]); } i++; } }
3. Reader/Writer 구현 (6/6) for(i=0;i<9;i++) { pthread_join(pt[i], NULL); } end_time = time(NULL); printf("Total Processing Time : %d\n", (end_time - start_time)); return 0; } ※ 컴파일 시 옵션 추가 gcc –lpthread –lrt –o [실행파일] [소스파일]