作者ken52011219 (ken52011219)
看板Grad-ProbAsk
標題Re: [理工] 104 台大資工 線代 OS DS 對答案
時間Wed Sep 21 19:21:41 2016
※ 引述《tzutengweng (神奇的湯姆)》之銘言:
我先附題目
Consider a process synchrinization problem , in which we have 5 people
competing for 4 chairs , and each chair can be used by one person at a time
Let the competing go by rounds. That is , 5 people compete for 4 chairs in the
begining of each round , and the 4 winners release their chairs at the end of
each round so that the next round starts .
Please use semaphores to write programs for the entry and exit section of
the 5 people so that every person will win at least ine time in competing
the chairs for every 3 consecutive rounds.
: : 【OS】
: : 8.好像表達的沒有很好 想參考一下大家怎麼寫的QQ
: : Chair: semaphone=4;
: : Pi: int=0;
: : while(前兩輪)
: : {
: : Pi++;
: : wait(chair);
: : C.S.
: : signal(chair);
: : }
: : if(Pi==0)then wait(chair);
: : wait(chair);
: : C.S.
: : signal(chair);
: ---------------------------------------------------
: 我寫出我的想法,請大家指教,我覺得好像有bug可是我想不出來
: 以下表示第i個人的結構(共5人)
: semaphore chairs=4; //總共四張椅子,相當於四單位資源
: int waitround[i]=0; //第i個人等待的次數,一開始設為0
: do{
: wait(chairs);
: //sitting
: signal(chairs);
: } while(true)
: 其中Semaphore之wait修改如下
: wait(S)
: { while(S<=0&&waitround[i]%3!=0)
: waitround[i]++; //等待期間增加等待次數
: //每個人都等待三次之後至少必須拿到一次椅子
: //也就是不能存在有人連續三次都沒拿到椅子
: S--;
: }
這裡wait(S)
{
S--
if(S<=0)
{
add this process to S ->list
block();
}
}
原本wait()應該是這樣,假如如你所說的這個wait()就喪失原本的機制了
而且私心不太建議改掉wait、singal內部的程式碼
畢竟這是System提供給Semaphore的內建指令
我會比較傾向於處理 synchronization 問題
Semaphore Mutex = 1 ;
Semaphore Prority = 1 ; // 當等待3次時的優先判定
int n = 0 ; // 椅子上的人數
int wait_times[5] // 5 people 等待次數
i = 1 ~ 5
Process i( int i ) │ Winner()
do{ │
wait_times[i]++; │ do{
if (wait_times[i] = 3) │ if ( n = 4)
//除非n=4 否則只有其他
{ │ {
process 互斥解除
wait(Priority); │ wait(mutex);
//n = 4 互斥解除
wait_time[i]=0; │
/*休息時間*/
n++; │ int n = 0;
//先將 n 初始化
} │ for( int j = 0 ;j<i;j++)
else │ {
{ │ if(wait_times[j] = 3)
wait(mutex); │ signal(Priority);
n++; │
wait_time[i]=0; │ }
//優先檢測是否有等超過3次的
} │ signal(mutex);
│
//沒有了話就交給process自行決定誰是winner
│ }
signal(mutex); │ } while(true);
}while(true);
歡迎各位大大幫小弟糾正錯誤 感謝 Q_Q
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.224.4.233
※ 文章網址: https://www.ptt.cc/bbs/Grad-ProbAsk/M.1474456904.A.D62.html
※ 編輯: ken52011219 (36.224.4.233), 09/21/2016 19:28:30
→ ken52011219: 我的code 滿足同步標準的 1.mutex 2. Progress 但3可 09/22 10:36
→ ken52011219: 能會不滿足09/22 10:36
→ ken52011219: 但要滿足3.bound waiting 的條件我認為需要知道五個09/22 10:39
→ ken52011219: 人怎麼競爭的 才能更詳細地寫出 否則我就先以process09/22 10:39
→ ken52011219: 本身得到進入許可速度為基準 反正才五個process XDD09/22 10:39
※ 編輯: ken52011219 (49.216.192.93), 09/22/2016 10:45:44