线程竞争

今日阅读《现代操作系统》颇有感触,此书的翻译质量还可以,内容也绝非晦涩难懂,可以作为一本操作系统的扫盲书。

处理线程竞争

我们处理竞争问题必须要满足下面几个条件

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

posted @ 2019-12-19 21:41  zhangyu63  阅读(338)  评论(0编辑  收藏  举报