1 / 15

운영체제 실습 - Reader/Writer 문제 구현하기 -

운영체제 실습 - Reader/Writer 문제 구현하기 -. Hwan- hee Kim (hwanhee0920@kangwon.ac.kr ) 2013. 12. 12. 목 차. Reader/Writer 문제 개요 Reader/Writer 알고리즘 Reader/Writer 구현. 1. Reader/Writer 문제 개요. Reader 와 Writer 는 동시에 수행될 수 없다 . Reader 는 동시에 수행 가능

mariah
Download Presentation

운영체제 실습 - Reader/Writer 문제 구현하기 -

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 운영체제 실습- Reader/Writer 문제 구현하기 - Hwan-hee Kim (hwanhee0920@kangwon.ac.kr) 2013. 12. 12.

  2. 목 차 • Reader/Writer 문제 개요 • Reader/Writer 알고리즘 • Reader/Writer 구현

  3. 1. Reader/Writer 문제 개요 • Reader와 Writer는 동시에 수행될 수 없다. • Reader는 동시에 수행 가능 • 하지만 Reader가 계속 수행할 경우에 Writer의 기아현상이 발생할 수 있음 • 따라서 본 문제에서는 Reader 수행 중 Writer가 들어오면 Writer를 우선적으로 수행 • 이 때 Reader의 기아 현상이 발생할 수는 있음

  4. 2. Reader/Writer 알고리즘 Reader < 임계구역 > Reader Writer Writer

  5. 2. Reader/Writer 알고리즘 • Wikipedia -> Reader/Writer Problem semaphore wrt = 1, mutex = 1; writer() { wait(wrt); // writer 업무 수행 signal(wrt); }

  6. 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); }

  7. 1. Reader/Writer 문제 구현 • 주요 함수 설명 • sem_init: 세마포 변수 초기화 • sem_init(세마포 변수, 프로세스 범위, 초기화 값) • sem_wait: 독자/필자에서 알고 있는 wait() 함수 • 세마포 변수의 값을 1 감소시킨다. (자원을 가져다 씀) • sem_post : 독자/필자에서 알고 있는 signal() 함수 • 세마포 변수의 값을 1 증가시킨다. (자원을 돌려줌) • sleep : 매개변수 할당한 수 만큼 대기(단위: 초)

  8. 1. Reader/Writer 문제 구현 • 주요 함수 설명 • pthread_create: 쓰레드 생성 함수 • pthread_create(쓰레드 명, 쓰레드 특성, 실행될 함수, 매개 변수) • pthread_join : 쓰레드가 종료할 때 까지 지연하는 함수 • pthread_join(쓰레드 명, 쓰레드 종료 시 반환 값) • time(NULL) : 현재 시간 반환 함수 • ctime: 시간을 ‘요일 월 일 시 분 초년도’ 단위로 출력하는 함수

  9. 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;

  10. 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(&current_time)); sleep(ps->run_time); current_time = time(NULL); printf(" End %s / Time : %s", ps->name, ctime(&current_time)); sem_wait(&mutex1); readcount--; if(readcount == 0) sem_post(&w); sem_post(&mutex1); }

  11. 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(&current_time)); sleep(ps->run_time); current_time = time(NULL); printf(" End %s / Time : %s", ps->name, ctime(&current_time)); sem_post(&w); sem_wait(&mutex2); writecount--; if(writecount == 0) sem_post(&r); sem_post(&mutex2); }

  12. 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");

  13. 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++; } }

  14. 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 [실행파일] [소스파일]

More Related