并发模型列表

时间:2010-11-11 09:50:57

标签: concurrency

-edit-我想要一个大型列表,所以我可以参考这个想法。一些答案已经启发了

什么是并发模型?我听说过没有共享内存的消息传递。期货会立即返回一个对象(因此它不会阻塞)并允许您在以后需要阻止时取消引用原始函数返回值,如果结果尚未准备就绪。我听说过coroutines,软件事务内存和随机的其他内容。

我搜索了一个列表或wiki并且找不到任何好的(很多没有列出我上面提到的3)并且许多结果给了我一个复杂的描述,解释它是如何工作的,而不是它的作用或如何成为使用

什么是并发模型以及它们的作用的简单描述是什么?每个答案一个。

11 个答案:

答案 0 :(得分:8)

Actor Model

  

我听说过没有共享内存的消息传递。

是关于Erlang风格的演员吗?

Scala在其Actors框架中使用了这个想法(因此,在Scala中它不是语言的一部分,只是一个库),它看起来很性感!

简而言之,Actors是根本没有共享数据的对象,但可以使用异步消息进行交互。 Actor可以位于一个或不同的主机上,并使用有趣的错误处理策略(当错误发生时 - actor就会死掉)。

您应该在Erlang和Scala文档中阅读更多内容,这是非常简单和渐进的方法!

第3章,第17章,第17章:

http://www.scala-lang.org/sites/default/files/linuxsoft_archives/docu/files/ScalaByExample.pdf https://en.wikipedia.org/wiki/Actor_model

答案 1 :(得分:6)

COM Threading (Concurrency) Model

  • 单线公寓
  • 多线程公寓
  • 混合模型开发
  

COM对象可以在进程的多个线程中使用。条款   “单线程公寓* t”(STA)和   “ *多线程公寓”(MTA)是   用于创建概念框架   用于描述这种关系   在对象和线程之间,   并发关系   对象,方法的手段   调用被传递给一个对象,和   传递接口的规则   线程之间的指针。组件和   他们的客户选择   以下两个公寓型号   目前由COM支持:

     

单线程公寓模型(STA):   进程中的一个或多个线程使用   COM和调用COM对象是   由COM同步。接口是   在线程之间编组。一个   退化的单线程案例   公寓模型,这里只有一个线程   在给定的进程中使用COM,被调用   单线程模型。以前   微软信息和   文档有时会提到   简单地将STA模型作为   “公寓模特。”多线程   公寓模型(MTA):一个或多个   线程使用COM并调用COM   与MTA关联的对象是   由所有线程直接制作   与MTA相关联而没有任何   在...之间插入系统代码   来电者和对象。因为多个   同时客户可能正在呼叫   对象或多或少同时   (同时在多处理器上   系统),对象必须同步   他们自己的内部状态。   接口之间没有编组   线程。以前的微软   信息和文件有   有时将此模型称为   “自由线程模型”。这俩   STA模型和MTA模型都可以   在同一过程中使用。这是   有时也被称为a   “混合模式”过程。


Other models according to Wikipedia

  

有几种并发模式   计算,可以用来   理解和分析并发   系统。这些模型包括:

     

答案 2 :(得分:4)

Futures

  

未来是一个持有者   未确定的结果(并发)   计算。一旦计算完毕   提供结果,相关联   全球消除了未来   用结果值替换它。   这个价值可能是一个独立的未来。

     

每当一个人要求未来时   并发计算,即它尝试   访问它的值,那个计算   自动同步   通过阻止直到它成为未来   确定或失败。

     

有四种期货:

     
      
  • 并发期货代表并发计算的结果,
  •   
  • 懒惰的期货代表只在请求时执行的计算结果,
  •   
  • 承诺期货代表承诺将通过明确方式交付的价值,
  •   
  • 失败的期货代表以异常终止的计算结果。
  •   

答案 3 :(得分:4)

还有map / reduce。

这个想法是产生子问题的许多实例,并在完成后将答案组合起来。一个简单的例子是矩阵乘法,它是几个点积的总和。您为每个点积生成一个工作线程,当所有线程都完成后,您将对结果求和。

这就是GPU,LISP / Scheme / APL等功能语言和一些框架(Google的Map / Reduce)处理并发的方式。

答案 4 :(得分:3)

Software transactional memory

  

在计算机科学,软件方面   事务性内存(STM)是一种   并发控制机制   类似于数据库事务   控制对共享内存的访问   并发计算。它是一个   替代基于锁的   同步。这是一个交易   context是一段代码   执行一系列读写操作   共享内存。这些读取和   写入逻辑上发生在一个单一的   及时;中间状态   对其他人不可见(成功)   交易。提供的想法   硬件支持交易   起源于1986年的论文和专利   汤姆奈特[1]。这个想法是   由Maurice Herlihy和J.推广   艾略特·B·莫斯[2]。 1995年Nir Shavit   和Dan Touitou将这个想法扩展到了   纯软件事务内存   (STM)[3]。 STM最近一直是   专注于研究和支持   实际的实现是   越来越大。

答案 5 :(得分:2)

Coroutines

  

在计算机科学中,协同程序是   概括的程序组件   子程序允许多次输入   暂停和恢复的要点   在某些地点执行。   协同程序非常适合   实施更熟悉的计划   合作任务等组件,   迭代器,无限列表和管道。

答案 6 :(得分:1)

还有非阻塞并发,例如比较和交换以及加载链接/存储条件指令。例如,compare-and-swap(cas)可以这样定义:

bool cas(int new_value,int current_value,int * location);

然后,此操作将尝试将location的值设置为new_value中传递的值,但前提是该位置中的值与current_value相同。这只需要一条指令,通常是如何实现阻塞并发(互斥/信号量等)。

答案 7 :(得分:1)

IPC(包括MPIRMI

您好,
在维基页面中,您可以发现MPI(消息传递接口)是一种通用IPC技术的方法:http://en.wikipedia.org/wiki/Inter-process_communication
另一个有趣的方法是远程过程调用。例如,Java的RMI可以帮助您 只关注您的应用程序域和通信模式。这是一个“应用程序级”并发 http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136424.html

有各种设计模式/工具可用于辅助共享内存模型并行化。除了上述期货,人们还可以利用:
1.线程池模式 - 侧重于固定线程数之间的任务分配:http://en.wikipedia.org/wiki/Thread_pool_pattern
2.调度程序模式 - 根据选定的调度策略http://en.wikipedia.org/wiki/Scheduler_pattern控制线程执行 3.反应器模式 - 在并行环境http://en.wikipedia.org/wiki/Reactor_pattern中嵌入单线程应用程序 4. OpenMP(允许通过预处理程序编译指示并行化部分代码)

的问候,
马尔钦

答案 8 :(得分:1)

并行随机访问机器(PRAM)对复杂性/易处理性问题很有用(有关详细信息,请参阅nice book)。

关于模特,您还可以找到here(由Blaise Barney提供)

答案 9 :(得分:1)

tuple space怎么样?

  

元组空间是关联存储器范例的实现   用于并行/分布式计算。它提供了元组的存储库   可以同时访问。作为说明性示例,   考虑到有一组处理器可以生产   数据和一组使用该数据的处理器。制片人张贴他们的   数据作为空间中的元组,然后消费者从中检索数据   与特定图案匹配的空间。这也被称为   黑板上的隐喻。元组空间可以被认为是一种形式   分布式共享内存。

答案 10 :(得分:1)

LMAX的破坏程序模式保持数据到位,并确保一次只有一个线程(使用者或生产者)是数据项(=队列槽)的所有者。