disable/enable interrupt:
效果最直接,但是代價也最大,一旦將中斷停掉,運行一個process就絕不會受任何東西干擾,也不會引發context switch,但是會因忽略掉中斷而影響到系統效能,其影響大小與停掉的時間成正比,在多處理器的狀況甚至必須牽一髮而動全身的影響到所有CPU才能確保沒有process去同時存取critical section,代價相當龐大,因此能避則避,使用的區段也越短越好。
lock/unlock scheduler:
代價比前者小些,而且對中斷的處理依然能進行,但是反過來說,卻也因此保護不了ISR會去動到的部份,使用的時機必須去注意,此外,也可能造成本來就沒有存取到該區域的process即便有更高的優先權,也拿不到它應有的CPU執行時間,對於系統排程而言是一種損失。
semaphore:
也是代價相對較小的保護方式,在可動用的名額不足的情形下,將會被系統放入waiting queue中等待,但是依然無法防止被ISR修改,而且執行的overhead比lock/unlock scheduler大些。
大致上來說每種做法都各有優缺點,使用的時機與方式最好視狀況來衡量。
沒有留言:
張貼留言