热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多处理器编程的艺术第3章并发对象

3.3静态一致性+如果一个方法的调用事件已经发生,但其响应事件还未发生,则这个方法调用是未决的。+若一个对象中不存在未决(pending)的方
3.3 静态一致性
      + 如果一个方法的调用事件已经发生,但其响应事件还未发生,则这个方法调用
      是未决的。
      + 若一个对象中不存在未决(pending)的方法调用,则该对象是静态的。
      - 静态一致性,是指在任一时刻若对象变为静态的,那么到此刻为止的执行等价于
      目前已经完成的所有方法调用的某种顺序执行。
      
      静态一致性:
       原则3.3.1 方法调用应呈现出以某种顺序次序执行且每个时刻只有一个调用发生。
       原则3.3.2 由一系列静止状态分隔开的方法调用应呈现出与按照它们的真实的调用
        次序相同的执行效果。
     - 在并发执行中,对于完全方法的任何一个未决调用,都必存在一个静态一致的响应。
     - 静态一致性是可复合的,也是一种非阻塞的正确性条件。
3.4 顺序一致性
      + 一个单线程的方法调用次序称为该线程的程序次序。
      原则 3.4.1 方法调用应该呈现出按照某种顺序次序的执行效果。
      
      - 顺序一致性要求方法调用的执行行为具有按照某种顺序次序的执行效果,
      并且这种顺序执行的次序应该与程序次序保持一致。就是说,在任意的并发执行
      中,都存在着一种办法能使得方法调用按照某种顺序次序排序,并且这种顺序次序
      1> 与程序次序相一致 2> 满足对象的顺序规范说明。
       以上,可以用来判断执行是否是顺序一致的。
       
3. 5 可线性化性

-  When defining a correctness condition for concurrent objects, two requirements
   seem to make intuitive sense: First, each operation should appear to “take effect”
   instantaneously,  and second, the order of nonconcurrent    operations should be
   preserved.
        
-   Processes are sequential: each process applies a sequence
of operations to objects, alternately issuing an invocation and then receiving the
associated response. (Dynamic process creation can be modeled simply by treating
each child process as an additional process that executes no operations before
the fork or after the join.)

-  A history H is sequential if:
(1) The first event of H is an invocation.
(2) Each invocation, except possibly the last, is immediately followed by a
    matching response. Each response is immediately followed by a matching
    invocation.
A history that is not sequential is concurrent.

-    A sequential history H is legal if each object subhistory H | x belongs to the sequential specification
     for x.  
以上内容参考:Linearizability: A Correctness Condition for Concurrent Objects
               MAURICE P. HERLIHY and JEANNETTE
               Carnegie Mellon University

- 可线性化的判断:


 

-  是否可线性化的判断的实例:


 


 


- 可线性化的性质:

  * 可线性化是可复合的:
     定理 3.6.1 对于每个对象x,当且仅当H|x是可线性化的,H是可线性化的。
     
     复合性是个重要的特性, 它使得并发系统的设计和构造能够采用模块化的方式,
     不同的可线性化对象可以独立地实现、验证和执行。
  * 非阻塞特性:
      + 如果一个方法对对象的所有状态都给出了定义,则称该方法是完全的。
     可线性化是一种非阻塞特性: 一个完全方法的未决调用不需要等待另一个未决调用
     完成。
    定理3.6.2  令inv(m)是完全方法的一个调用。如果 是可线性化经历 H中的一个

    未决调用,则必定存在一个响应使得 H·是可线性化的。

 3.7 演进条件(Progress Conditions)         
  -    Such an implementation is called blocking, because an unexpected delay by one
        thread can prevent others from making progress.

   - A method is wait-free if it guarantees that every call finishes its execution in a finite number of steps.
     *  Being wait-free is an example of a nonblocking progress condition, meaning that an arbitrary and
       unexpected delay by one thread (say, the one holding a lock) does not necessarily prevent the
        others from making progress.

    Example of 'Wait Free'
     class WaitFreeQueue {
        volatile int head = 0, tail = 0;
        T[] items;
        public WaitFreeQueue(int capacity) {
          items = (T[])new Object[capacity];
          head = 0; tail = 0;
        }
        public void enq(T x) throws FullException {
          if (tail - head == items.length)
            throw new FullException();
          items[tail % items.length] = x;
          tail++;
        }
        public T deq() throws EmptyException {
          if (tail - head == 0)
            throw new EmptyException();
          T x = items[head % items.length];
          head++;
          return x;
        }
     }
Figure 3.3 A single-enqueuer/single-dequeuer FIFO queue.  

 Example of  'Not Wait Free'
   class LockBasedQueue {
     int head, tail;
     T[] items;
     Lock lock;
     public LockBasedQueue(int capacity) {
       head = 0; tail = 0;
       lock = new ReentrantLock();
       items = (T[])new Object[capacity];
     }
     public void enq(T x) throws FullException {
       lock.lock();
       try {
         if (tail - head == items.length)
           throw new FullException();
         items[tail % items.length] = x;
          tail++;
       } finally {
         lock.unlock();
       }
     }
     public T deq() throws EmptyException {
       lock.lock();
       try {
         if (tail == head)
           throw new EmptyException();
         T x = items[head % items.length];
         head++;
         return x;
       } finally {
         lock.unlock();
       }
     }
   }
 
-    A method is lock-free if it guarantees that infinitely often some method call finishes in a finite number
     of steps.

Lock-free 算法的基础是 CAS (Compareand-Swap) 原子操作。当某个地址的原始值等于某个比较值时,把值改成新值,无论有否修改,返回这个地址的原始值。目前的cpu 支持最多64位的CAS。并且指针 p 必须对齐。

 注:原子操作指一个cpu时钟周期内就可以完成的操作,不会被其他线程干扰。

一般的 CAS 使用方式是:

假设有指针 p, 它指向一个 32 位或者64位数,

   1.
      复制p 的内容(*p)到比较量 cmp (原子操作)
   2.
      基于这个比较量计算一个新值 xchg (非原子操作)
   3.
      调用 CAS 比较当前 *p 和 cmp, 如果相等把 *p 替换成 xchg (原子操作)
   4.
      如果成功退出,否则回到第一步重新进行

第3步的 CAS 操作保证了写入的同时 p 没有被其他线程更改。如果*p已经被其他线程更改,那么第2步计算新值所使用的值(cmp)已经过期了,因此这个整个过程失败,重新来过。多线程环境下,由于 3 是一个原子操作,那么起码有一个线程(最快执行到3)的CAS 操作可以成功,这样整体上看,就保证了所有的线程上在“前进”,而不需要使用效率低下的锁来协调线程,更不会导致死锁之类的麻烦。//参考 http://blog.csdn.net/arau_sh/article/details/6636371
+  We say that a method call executes in isolation if no other threads take steps.
- Definition 3.7.1. A method is obstruction-free if, from any point after which it
   executes in isolation, it finishes in a finite number of steps.


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 关于CMS收集器的知识介绍和优缺点分析
    本文介绍了CMS收集器的概念、运行过程和优缺点,并解释了垃圾回收器的作用和实践。CMS收集器是一种基于标记-清除算法的垃圾回收器,适用于互联网站和B/S系统等对响应速度和停顿时间有较高要求的应用。同时,还提供了其他垃圾回收器的参考资料。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了在序列化时如何对SnakeYaml应用格式化,包括通过设置类和DumpSettings来实现定制输出的方法。作者提供了一个示例,展示了期望的yaml生成格式,并解释了如何使用SnakeYaml的特定设置器来实现这个目标。对于正在使用SnakeYaml进行序列化的开发者来说,本文提供了一些有用的参考和指导。摘要长度为169字。 ... [详细]
author-avatar
vincent
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有