zoukankan      html  css  js  c++  java
  • 线程竞争

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

    处理线程竞争

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

    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
  • 相关阅读:
    Python深入05 装饰器
    Python深入04 闭包
    Python深入03 对象的属性
    Ubuntu (虚拟机同样) 更换内核?
    .out
    GCC 编译详解
    linux 编译内核 /boot空间不足?
    Java Swing提供的文件选择对话框
    Java Swing 实时刷新JTextArea,以显示不断append的内容?
    为什么要编译Linux内核?
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12070395.html
Copyright © 2011-2022 走看看