作者jerry900287 ()
看板Grad-ProbAsk
標題[理工] OS Disable interrupt
時間Sun Nov 12 11:47:02 2017
想請教各位大大們
小弟在讀 OS "Race Condition" Problem 的時候
針對兩大策略 Disable Interrupt 和 Critical Section Design
的 Disable Interrupt 有個疑問
---------------------------------------------------------=
假設說 今天有兩顆CPU
CPU1 做 Process1
CPU2 做 Process2
而 Process1 和 Process2 都有個作共用變數 S 之存取
------------------------------------------------------------
那麼現在 Process1 以及 Process2 都已經進入CPU
而 Process1 比 Process2 先作 S 之存取
因此 Disable Interrupt
可是 Disable Interrupt 不是只是關掉 CPU 中斷而已嗎?
根據洪毅的筆記
它是確保Process在存取共享變數期間
CPU不被其他Process Preempted
那怎麼防止已經進入 CPU2 的 Process2 去存取 S 呢 ?
謝謝!!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.243.94.96
※ 文章網址: https://www.ptt.cc/bbs/Grad-ProbAsk/M.1510458426.A.407.html
※ 編輯: jerry900287 (111.243.94.96), 11/12/2017 11:49:51
推 can18: 這邊我之前也有相同疑問 11/12 12:00
→ can18: 我自己覺得這邊是有bug 11/12 12:09
→ can18: 上網查有一個實作的方法是 CPU1 會lock memory bus 不讓 CP 11/12 12:11
→ can18: U2 去讀寫 11/12 12:11
所以就把Disable Interrupt 直接當作
關閉其他Process對共享變數存取 且 不被其他Process Preempted
就好了嗎 XD
※ 編輯: jerry900287 (111.243.94.96), 11/12/2017 12:19:58
→ TMDTMD2487: 基本上上課沒講都預設單處理器做討論的樣子 11/12 12:29
→ TMDTMD2487: 多核多處理器可能不能講得這麼簡單因 11/12 12:30
→ TMDTMD2487: 因為還有cache還有TLB要做同步,就會變成另一個大課題 11/12 12:31
→ TMDTMD2487: 至少你lock bus但別顆處理器有它自己的cache你也要想 11/12 12:33
→ TMDTMD2487: 辦法讓他不能對再cache的共享變數做存取 11/12 12:34
推 nat99up: Disable interrupt是走硬體控制 跟變數存取沒有直接關係 11/12 12:34
→ TMDTMD2487: 可是現在有很多顆cpu你關掉了還是會同時有多個在run 11/12 12:37
→ TMDTMD2487: 只是單核心就只會有一個在run所以關掉中斷可以很簡單 11/12 12:38
→ TMDTMD2487: 的解決共享變數存取的問題 11/12 12:38
推 can18: 不過我記得課本有提到多處理器不太適合用disable interrupt 11/12 12:40
→ TMDTMD2487: 因為就像我講的你會讓你的每個cpu都有諸多的限制 11/12 12:41
→ nat99up: 多處理器要關就要全關...然後users就可開轟趴了哈哈 11/12 12:41
→ TMDTMD2487: 單純的關掉所有cpu中斷不能解決歐 11/12 12:43
→ TMDTMD2487: 會存取共享變數的程式還是同時在執行中 11/12 12:44
→ nat99up: 只要其他顆上的process不參與到那個共享變數就可以吧 11/12 12:44
→ TMDTMD2487: 沒問題的把cpu都power down就可以解決了XD 11/12 12:44
→ TMDTMD2487: 可是你不知道別顆cpu上的process會不會存取壓 11/12 12:45
→ nat99up: 都可以把別顆CPU的中斷關掉了知道這點應該不難哈哈哈 11/12 12:46
→ TMDTMD2487: 把中斷關掉他們還是可以讀memory的押 11/12 12:46
推 can18: 想法同t大 基本上要轉成類似單核的模式disable才有用 11/12 12:47
→ TMDTMD2487: 對呀所以要lock住data bus 11/12 12:48
→ nat99up: 我的意思是確保其他顆上process沒參與這個變數就可以啦 11/12 12:48
→ TMDTMD2487: 把bus lock住了你整個系統就真的是什麼都不能做了XD 11/12 12:48
→ can18: 要怎麼確保 啊如果有參與的話怎麼辦 11/12 12:49
→ can18: 基本上除了把其他cpu關掉跟鎖bus無法確保吧 11/12 12:50
→ nat99up: 把別人的PCB抓出來看 但討論這個也太沒意義XD 11/12 12:50
→ TMDTMD2487: 明明就有很棒的cs設計為什麼我們要執著在關掉中斷呢XD 11/12 12:50
→ can18: 我只是覺得 n 大的方法比關cpu還複雜XD 11/12 12:52
→ nat99up: 當然啊哈哈 只是幫這個方法找個藉口說他堪用 11/12 12:53
→ TMDTMD2487: 通常越簡單的方法效率越低XD 11/12 12:53
→ nat99up: 連Kernel都幾乎捨棄的方法只能幫他QQ 11/12 12:53
OK!! 那我大概知道了XD
只是想說洪毅這塊講這麼順 都沒有提及關於這些的討論
害我念的心理不安
總之 感謝尼們QQ!
※ 編輯: jerry900287 (111.243.94.96), 11/12/2017 12:55:47
推 can18: 弘毅優點是都講很順 不過有些都會有小bug 11/12 12:57
→ TMDTMD2487: 是沒麼小bug拉跟他的書比起來xd 11/12 12:59
→ nat99up: OS課本的背面最扯 11/12 13:01
推 leoone: 無法OS就是個理論性質的學科 拿到實際面本來就很多bug 舉 11/12 13:37
→ leoone: 個例子 實際上是沒有kernel thread這種東西的 11/12 13:37
推 shownlin: 我記得洪逸上課不是有說多處理器不適合嗎,所以才接後 11/12 16:00
→ shownlin: 面的臨界區間設計... 11/12 16:00
推 TWkobe: 多處理器一般會在cpu上多一個port叫bus lock 11/22 19:15
→ TWkobe: 誰先搶到會先鎖住bus然後就可以安心disable自己的interrup 11/22 19:16