谢谢
1.mutex 方式的临界区域是指 mutex.lock
到 mutex.unlock
吗?
2.如果临界区域的修改操作只占一小部分,cas 可以获得更大的并发度 这句话要怎么理解?
1
hhx 2019-11-17 12:32:23 +08:00 via Android 1
说下我的理解。mutex 即互斥信号量,它首先是个信号量,并且初始值为 1。信号量的 pv 操作可以理解成 Java 中的内置锁,即对象监视器 monitor。大家知道,获取锁失败后,进程将进入锁的阻塞队列,并进入阻塞态,等待被释放锁的进程唤醒。再看 cas,典型用法时 cas 失败时,不进入阻塞态,而是继续执行 cas,直到成功,这叫自旋。因此说 mutex 的加锁解锁,伴随着进程的阻塞与唤醒,而 cas 没有。要知道进程的阻塞与唤醒是代价较高的操作,伴随着 pcb 的检索,进程状态修改,pcb 入队出队,以及进程 cpu 上下文的切换。如果临界区的代码较少,显而易见,cas 自旋方式性能更高。
|
2
hhx 2019-11-17 12:42:20 +08:00 via Android 1
临界区完整的结构是,进入区,临界区,退出区和剩余取。进入区即 Lock.Lock,退出区即 Lock.unLock,剩余区即不需同步的代码段,临界区即需同步代码段。
|