Readers & Writers 운영체제 7조 배 영 빈(200316263) 서 준 교(200316269) 배 영 빈(200316263) 서 준 교(200316269) 조 민 혁(200316341)
순 서 “Readers & Writers”? 기본 용어 정의(사전지식) 문제 정의 문제 해결 실행 결과
“Readers & Writers”? 자원이 두 가지 유형(읽기, 쓰기)의 접근을 허용하는 상황 1. Many readers are accessing the file concurrently but no writers are currently accesing the database 2. At most one writer (and no readers) is accessing the database. 기본적인 IPC 관련 동기화 문제 하나 / 데이터베이스, 비행기예약시스템 프린터를 생각해 보자. 공유 디스크에 기록자가 기록한 후에 판독자가 읽어야 한다. 기록자가 기록할 때는 판독자가 읽어서는 안된다(P(writing), V(writing)). 판독자가 읽기 시작할 때도 기록을 하면 데이터가 훼손되므로 P(writing), V(writing) 연산이 필요하다.
기본 용어 정의(사전지식) 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” IPC(interprocess communication) : 프로세스 사이의 통신 동기화 : 병행 프로세스 사이에 협력 동기화 상호배제 : 공유자원을 상호배타적으로 사용 세마포어 : 공유자원에 접근을 제한 하는 방법으로 행동을 조절하기 위해 선언된 변수 뮤텍스 : 세마포어에서 카운트 기능을 생각하지 않은 단순화된 변수 세마포어 차단을 원하는 자원에대해서 세마포어를 생성하면 해당자원을 가리키는 세마포어 값이 할당된다. 이 세마포어 값에는 현재 세마포어를 적용하고 있는 자원에 접근할수 있는 프로세스의 숫자를 나타낸다. 이 값이 0이면 이 자원에 접근할수 있는 프로세스의 숫자가 0이라는 뜻이며, 자원), 0보다 큰 정수면 해당 정수의 크기만큼의 프로세스가 자원에 접근할수 있다라는 뜻이 된다.
문제 정의 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” 파일 등의 데이터는 다수의 프로세서에 의해서 공유된다. 일부 프로세스(Readers)는 자료를 읽고 또 다른 프로세스(Writers)는 자료를 생산 해야한다. 요구 사항(전제조건) – 2개 이상의 판독자(Readers) 프로세스의 동시 접근을 허용 판독자 프로세스와 기록자 프로세스는 동시 접근 불가능 (2개 이상의 기록자 프로세스도 당연히 접근 불가능해야함) 기록자는 항상 배타적으로 접근(판독자의 수행이 끝날 때 까지 기다림)
건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” typedef int semaphore; /*세마포어 사용 선언*/ semaphore mutex = 1; /*rc를 컨트롤 하기 위한 세마포어 */ semaphore db = 1; /*데이터베이스 액세스를 위한 세마포어 */ int rc = 0; /* # readers 프로세스의 숫자를 세기 위한 카운트 */ void writer(void) { while(TRUE){ think_up_data(); /*비중요 지역(공유영역이 아닌 곳에서의 쓰기)*/ down(&db); /*단독 엑세스를 얻음(DB 사용허가)*/ write_data_base(); /*자료 등록*/ up(&db); /*단독 엑세스 반납(DB 사용반납)*/ } void reader(void) down(&mutex); /* rc의 접근을 한다'*/ rc = rc +1; /* 하나의 reader process 추가*/ if(rc == 1)down(&db); /* 만약 첫번째 reader라면 db권한을 얻는다 */ up(&mutex); /*rc 접근을 반납한다'*/ read_data_base(); /* 데이터베이스 읽기*/ down(&mutex); /* rc에 접근을 다시 한다*/ rc = rc -1; /* 하나의 읽기 과정이 끝났으므로 rc를 줄인다*/ if(rc ==0) up(&db); /* 이때 rc가 0이면 reader프로세스가 없다는 뜻이기 때문에 db에 대한 엑세스를 반납한다.*/ up(&mutex); /*rc에 대한 접근을 다시 반납한다.*/ use_data_read(); /*공유지역이 아닌 곳에서 읽기 사용*/
문제 해결 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” typedef int semaphore; /*세마포어 사용 선언*/ semaphore mutex = 1; /*rc를 컨트롤 하기 위한 세마포어 */ semaphore db = 1; /*데이터베이스 액세스를 위한 세마포어 */ int rc = 0; /* # readers 프로세스의 숫자를 세기 위한 카운트 */ Rc는 리더의 숫자이기도 하지만, 접근을 원하기 위한 프로세스의 숫자로 봐도 무방
문제 해결 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” void writer(void) { while(TRUE){ think_up_data(); /*비중요 지역(공유영역이 아닌 곳에서의 쓰기)*/ down(&db); /*단독 엑세스를 얻음(DB 사용허가)*/ write_data_base(); /*자료 등록*/ up(&db); /*단독 엑세스 반납(DB 사용반납)*/ } down(&db); /*단독 엑세스를 얻음(DB 사용허가)*/ up(&db); /*단독 엑세스 반납(DB 사용반납)*/ ‘db’ 세마포어를 up&down으로 공유메모리(여기서는 DB) 사용을 허가하고 취소
문제 해결 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” void reader(void) { while(TRUE){ down(&mutex); /* rc의 접근을 한다'*/ rc = rc +1; /* 하나의 reader process 추가*/ if(rc == 1)down(&db); /* 만약 첫번째 reader라면 db권한을 얻는다 */ up(&mutex); /*rc 접근을 반납한다'*/ read_data_base(); /* 데이터베이스 읽기*/ down(&mutex); /* rc에 접근을 다시 한다*/ rc = rc -1; /* 하나의 읽기 과정이 끝났으므로 rc를 줄인다*/ if(rc ==0) up(&db); /* 이때 rc가 0이면 reader프로세스가 없다는 뜻이기 때문에 db에 대한 엑세스를 반납한다.*/ up(&mutex); /*rc에 대한 접근을 다시 반납한다.*/ use_data_read(); /*공유지역이 아닌 곳에서 읽기 사용*/ } down(&mutex); /* rc의 접근을 한다'*/ up(&mutex); /*rc 접근을 반납한다'*/ rc = rc +1; if(rc == 1)down(&db); /* 만약 첫번째 reader라면 db권한을 얻는다 */ if(rc ==0) up(&db); /* 이때 rc가 0이면 reader프로세스가 없다는 뜻이기 때문에 db에 대한 엑세스를 반납한다.*/ read_data_base(); down(&mutex); /* rc에 접근을 다시 한다*/ up(&mutex); /*rc에 대한 접근을 다시 반납한다.*/ rc = rc -1; Mutex는 rc카운터를 사용하기 위해 Db는 데이터베이스를 사용하기 위해.. void reader(void) { while(TRUE){ down(&mutex); /* rc에 베타적인 접근을 한다'*/ rc = rc +1; /* 하나의 reader process 추가*/ if(rc == 1)down(&db); /* 만약 첫번째 reader라면 db권한을 얻는다 */ up(&mutex); /*rc 접근을 반납한다'*/ read_data_base(); /* 데이터베이스 읽기*/ down(&mutex); /* rc에 접근을 다시 한다*/ rc = rc -1; /* 하나의 읽기 과정이 끝났으므로 rc를 줄인다*/ if(rc ==0) up(&db); /* 이때 rc가 0이면 reader프로세스가 없다는 뜻이기 때문에 db에 대한 엑세스를 반납한다.*/ up(&mutex); /*rc에 대한 접근을 다시 반납한다.*/ use_data_read(); /*공유지역이 아닌 곳에서 읽기 사용*/ }
실제 소스 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” sem_t *mutex, *db; // 두 개의 세마포어값 int *rc; /* # readers 프로세스의 숫자를 세기 위한 카운트 */ ... for(icount=0;icount<2;icount++) { sem_wait(mutex); /* rc의 접근을 허락한다'*/ (*rc)++; /* 하나의 reader process 추가*/ if((*rc) == 1) sem_wait(db); /* 첫번째 reader//db권한을 얻는다 */ sem_post(mutex); /*rc 접근을 반납한다'*/ printf("%d reader : %d's readers is reading now \n", now_reader_value, (*rc)); sleep(10); sem_wait(mutex); /* rc에 접근을 다시 한다*/ (*rc)--; /* 하나의 읽기 과정이 끝났으므로 rc를 줄인다*/ if((*rc) == 0) sem_post(db); /* 이때 rc가 0이면 reader프로세스가 없다는 뜻이기 때문에 db에 대한 엑세스를 반납한다.*/ sem_post(mutex); /*rc에 대한 접근을 다시 반납한다.*/ }
실제 소스 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” while(1) { sem_wait(db); /*단독 엑세스를 얻음(DB 사용허가)*/ printf("writers update database. writers say : Now readers value = %d\n", (*rc)); sleep(5); sem_post(db); /*단독 엑세스 반납(DB 사용반납)*/ }
실행 출력값 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” Readers 실행시, - 현재 두 개의 세마포어 mutex, db 의 값 출력 - 현재 rc값 출력 semapore mutex data (value = 1). semapore db data (value = 1). reader add, readers count value = 1 -> 2 1 reader : 1 reader is reading now
실행 출력값 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” Writers 실행시, - DB 접근처리 용 세마포어 db 값 출력 - 자료처리 출력(소스는 간단한 출력문), 현재의 RC값도 출력 semapore db data (value = 1). writers update database. writers say : Now readers value = 0
건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” 소스 실행(유닉스 환경)
readers 실행 중 writers 실행 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” 실행결과 cslab:~/os/rw(499)% readers & [1] 3178 cslab:~/os/rw(500)% Pointer to shared memory has been obtained. semapore mutex data (value = 1). semapore db data (value = 1). reader add, readers count value = 0 -> 1 1 reader : 1 reader is reading now 실행결과 Writers Pointer to shared memory has been obtained. Semapore db data (value=0) 임계구역에서 DB를 처리하는 과정인 writers update database. writers say : Now readers value = 0 은 출력이 되지 않는다. 즉, readers 프로세스가 실행 중일 때는 writers 가 접근이 불가능하다. Semapore db data (value=0) DB 세마포어가 0임을 Writers 프로세스에서도 확인가능하다!
writers 독자실행 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” 실행결과 Writers Pointer to shared memory has been obtained. Semapore db data (value=1) writers update database. writers say : Now readers value = 0 Writer 만 독자적으로 실행 했을 시, writers의 db처리 문장이 출력되고, db 세마포어 값도 1임을 확인 할 수 있다.
기본적인 Readers Writers의 문제 만약 판독자가 진행 되는 중에 기록자가 온다면 판독자가 끝나기 까지 계속 해서 기다리는 문제점이 있다. 이 때문에 다른 방법으로는 뒤에 오는 기록자를 블록시킨 후 현재 진행 되고 있는 판독자가 끝난 후 기록자를 활성화 시키는데, 이 방법은 기록자가 후에 오는 판독자를 위해 기다려주지는 않기 때문에 병행성이 떨어지고 성능도 저하된다. 기록자에게 우선권을 주면 판독자의 작업이 끝날 때까지 기다지만, 기록자 이후에 오는 판독자에 대해선 기다리지 않기 때문에 병행성이 떨어지고 성능도 저하 된다는 점이 있다. - 기록자 자체에 우선 순위를 부여하는 해결책?
우선 순위로 해결 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” 두 프로세스 중 어느 곳에 우선 순위를 준다 판독자 우선 동기화(strong reader synchronization) 기록자가 쓰고 있지 않다면 항상 판독자에게 우선권을 줌 기록자 우선 동기화(strong reader synchronization) 기록자에게 항상 우선권을 준다. 대기중이거나 쓰기 중인 기록자가 완료될 때까지 판독자를 지연
C language source(unix) 건국대학교 소프트웨어 운영체제 7조 “Readers & Writers” <<<실행소스 및 토의 그룹>>> 구글 그룹스 “건국대 운영체제 Readers & Writers” http://groups.google.co.kr/group/kku_rw 토론 및 발표용 PPT C language source(unix)