线程竞争
今日阅读《现代操作系统》颇有感触,此书的翻译质量还可以,内容也绝非晦涩难懂,可以作为一本操作系统的扫盲书。
处理线程竞争
我们处理竞争问题必须要满足下面几个条件
1)任何两个进程不能处于同一个临界区
2)不应对CPU的速度和数量做假设
3)临界区外的进程不得阻塞任何进程
4)不能使进程无限期等待进入临界区
几种 方式
1.轮换,锁变量的一种方式
这属于一种忙等待,一直while跑,浪费性能,也叫自旋锁。但是它违背了阻塞原则。
2.屏蔽中断
因为CPU只有发生时钟中断或其他中断时才能进行线程切换,所以可以在每个进程进入临界区就屏蔽中断。但是屏蔽只对执行屏蔽disabled的CPU有效,所以会导致多核CPU根本不能达到预期效果。
3.Peterson解法,也是锁变量,一种互斥算法,很cool
1.如果只有线程0进入,到了while会不满足interested[other] == true,执行完返回
2.如果在0进入后1又想进入,此时线程1的interested[other] == true,所以会卡住,只有等线程0调用leave,才会让other = false,进而0的while循环才能通过。
避免锁
read-copy-update:将更新过程种的移除和再分配分离开来。
添加一个节点:
移除两个节点
这两个过程都不涉及锁,只是把操作分离。
可参考下面一个简单的示例介绍
https://blog.usejournal.com/java-multithreading-part-1-ec0c42bbead6
一个没有高级趣味的人。
email:hushui502@gmail.com