想问一下
不管是原文书或洪逸笔记
都说:
在多处理器系统下采用Diasble/Enable Interrupt方法,
只要Disable all CPU’s Interrupt 就可解决C.S. Problem,(但会造成系统产能低落
)
但我觉得就算Disable all CPU’s interrupt了,
感觉还是不能防止在不同CPU上执行的process/thread去同样的C.S.执行,进而违反mutua
l exclusion,无法解决C.S. Problem,
在这部分想请教是我的观念有误吗?感谢!
作者:
TWkobe (中华柯比)
2019-04-25 10:18:00你说的没错 课本这说法很有问题 假设c.s问题最低要求是只要自增自减某个变量 那用atomic instr和disable interrupt有机会做到更别说要扯到乱序、mem、cache的影响 我猜课本是理想的假设
一般而言单核会使用interrupt disable + preemtiondisable然而你说的没有错除非你绑定在同一颗cpu不然没有用至于out of order/ cache,TLB flush 的问题在hardware会解决掉另外值得注意的事情是补习班不会跟你说的,所谓的spinlock 本身会带有disable preemtion的效果所以spinlock里面不能sleep,而且在单核的状态下spinlock也纯粹只是disable preemtion然后我发现一直把preemption打错字XD
作者:
TWkobe (中华柯比)
2019-04-25 10:52:00楼上说的没错 至于为什么spinlock 不能sleep 考量有二:第一 要是睡了就没人能取回了 第二 spinlock就是要快 要睡处理时间长请改用semaphore
作者:
DLHZ ( )
2019-04-25 10:59:00推
preemption是指能不能去做task switchtimer可以发interrupt近来然后cpu跳去处理interruptroutine,但如果结束时去call sched,会因为preemption关掉,所以sched继续回去执行原本的taskdisable interrupt跟disable preemption是不一样的事另外一点是spin lock通常是kernel implement在用的
作者:
TWkobe (中华柯比)
2019-04-25 13:16:00补充一下 spinlock 本来是kernel structure不适合直接用在 user space , user space请用pthread spinlock