locale 명령으로 코드셋 확인
1) locale-gen ko_KR.UTF-8
2) /etc/environment 내에 LANG="ko_KR.UTF-8" 추가
3) /etc/profile 마지막에 LANG="ko_KR.UTF-8" 추가
이 후 2), 3) 의 파일 적용(source or reboot)
locale 명령으로 정상 적용되었는지 확인
우분투 11.04에서 그놈 3 설치
$ sudo add-apt-repository ppa:gnome3-tea/gnome3
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install gnome-shell
설치한 그놈 3 제거 및 유니티로 복구
$ sudo apt-get install ppa-purge
$ sudo ppa=purge ppa:gnome3-team/gnome3
직접 작성한 글 복사해온거니 불펌은 아니곘지....
강의자료(그리고 책)에서 readers-writers problem에 대한 solution으로 제공하고 있는 것은
the first-readers-writers 방식입니다.
이 방식의 특징은
writer가 먼저 권한을 얻은 상태가 아닌 이상
reader는(바로 이어서 다른 reader가 들어와 있어도) writer에게 권한을 뺏기거나 기다리지 않고 계속 read를 실행한다.
입니다.
이런 방식이라면 writer가 wait 되고 있는 동안 reader가 계속해서 들어올 경우
writer가 권한이나 resource를 얻지 못하고 starvation에 걸리게 되지요.
(다른 방식은 the second-readers-writers 방식으로
이는 writer 가 작동하는 동안 어떤 새로운 reader도 들어오지 못하는 방식입니다.
이는 write가 계속 수행된다면 reader에 starvation이 걸리게 되는데
이 방식에 대해선 책의 내용을 좀 더 자세히 참고하시길.)
code 영역을 보시면 semaphore 변수로 wrt와 mutex, 두 가지를 놓고 쓰는 것을 보실 수 있습니다.
do{
wait(wrt);
...
// writing is performed
...
signal(wrt);
}while(TRUE);
do{
wait(mutex);
readcount++;
if(readcount == 1)
wait(wrt);
signal(mutex);
...
//reading is performed
..
wait(mutex);
readcount--;
if(readcount == 0)
signal(wrt);
signal(mutex);
}while(TRUE);
wrt는 writer가 reader의, reader가 write의, 혹은 다른 writer가 writer의 critical section에 들어가는 것을 방지하기 위한 semaphore 입니다.
제가 mutex에 대해 착각을 했는데요,(이게 다 강의 준비를 게을리해서....)
mutex는 reader에 대해 새로운 reader가 수행되고자 할 때, reader 자신의 critical section을 보호하기 위한 semaphore입니다.
우선 mutex에 대해 좀 더 자세히 설명드리자면
reader 함수에서 readcount를 변화시키는 부분을 잘 생각해보시기 바랍니다.
mutex에 대해 wait를 거는 이유는 read 두개가 동시에 readcount 값을 변경시키는 것을 막기 위한 목적이 있습니다.
do{
wait(mutex);
readcount++; <--the fisrt & the second reader
if(readcount == 1)
wait(wrt);
signal(mutex);
...
//reading is performed
..
wait(mutex);
readcount--;
if(readcount == 0)
signal(wrt);
signal(mutex);
}while(TRUE);
두 read process가 동시에 readcount 값을 증가시키려고 하는 상황을 생각해봅시다.
만약 reader 두 개가 동시에 들어와서 동시에 readcount 값을 ++로 증가하면,
read가 if문에 대해 readcount가 1임을 check하지 못하는 상황이라면,
이렇게 되면 wrt 값이 0이 되지 않은 상태이기 때문에(wait에서 최초 수행 시 while에 걸리지 않고 Semaphore value를 먼저 감소시킴을 상기합시다.)
writer가 바로 들어와서 data 영역의 값을 깨뜨릴 수 있습니다.
또, 하나의 reader가 read 함수의 마지막 영역을 수행하고 있을 때.
즉, readcount-- 를 수행하고 있고
뒤늦게 들어온 reader가 readcount++를 수행하고 있는 경우를 생각해봅시다.
do{
wait(mutex);
readcount++; <--second reader
if(readcount == 1)
wait(wrt);
signal(mutex);
...
//reading is performed
..
wait(mutex);
readcount--; <--first reader
if(readcount == 0)
signal(wrt);
signal(mutex);
}while(TRUE);
readcount의 현재 값이 1이라면 readcount를 0으로 만들면서 write에 대한 권한을 복구해줘야 합니다.
근데 readcount-- 위에 mutex에 대한 wait가 수행되지 않으면,
if문에서 readcount를 check하기도 전에 secont reader가 readcount 값을 다시 증가시켜
if문의 조건에 부합하지 않게 됩니다.
write에 대한 starvation이 발생하게 되지요.
이와같은 이유로 read 상호간의 critical section을 보호하기 위한 semaphore 가 mutex입니다.
두 semaphore인 mutex와 wrt에 대해 어느정도 이해가 되셨을 겁니다.
이제 몇 가지 상황에 대해 생각해보면 되겠습니다.
reader가 1개 들어와서 돌고 있는 상황이라면
reader는 mutex값은 자신의 critical section을 수행하는 경우엔 0으로, 그 밖에 read 자체를 수행하고 있는 도중엔 1로 setting 함을 알 수 있습니다.
그리고 '첫번째 수행되는 reader'가 wrt 값을 0으로 setting해놓고 수행되는 것을 볼 수 있지요.
이 상태에서 writer를 봅시다.
reader가 수행되고 있는 도중엔 wrt 값은 계속 0입니다.
고로 writer는 시작 단계에서 부터 wait에 걸려 수행되지 못하고 모든 reader가 빠져나갈 때 까지 기다려야만 합니다.
reader가 계속해서 N개 들어온다고 해서
wrt 값이 -로 내려가지는 않습니다.
단지 readcount 값이 N으로 증가하고 이들이 모두 빠져나가면서 readcount를 0으로 만들기 전 까지는
wrt 값이 1로 setting 되지 않아 계속 wait 하는 방법 밖에 없을 뿐이죠.
read의 경우 readcount를 증가시키면서 계속해서 들어올 수 있습니다.
mutex 값의 경우도 critical section을 빠져나오면서 계속해서 signal을 수행해 값을 초기화해주므로
read가 되고 있다고 해서 read를 못하는 상황은 발생하지 않습니다.
단지 writer가 먼저 선점되어 수행되고 있을 경우엔
read는 첫번 째 read가 수행되는 상황에 걸려
(readcoutn가 1인 경우의 if문에 걸려)
wait(wrt)에 의해 write가 끝나면서 signal이 수행되기를 기다리는 수 밖에 없습니다.
write는 wrt 하나에 의해 synch가 이루어지고 writing 수행 영역 자체를 critical section으로 관리하고 있기 때문에(그 이유는 잘 생각해보시길)
write가 돌고 있는 상태에서 또다른 write가 들어온다 해소 write를 수행하지 않습니다.