并发编程模型

并发编程模型

一.分类

按照线程通信机制可以分为共享内存模型消息传递模型

1.共享内存模型:线程之间共享程序的公共状态,编程之间通过读写内存中的公共状态来隐式进行通信。相互通信的进程共享某些数据结构或共享存储区,进程通过这些空间进行通信,因此又可以分为两种类型:

1).基于共享数据结构的通信方式。在这种通信方式中要求各进程公用某些数据结构来实现进程间的信息交换。比如用有界缓冲区这种数据结构实现生产者-消费者问题。在这里公用数据结构的设置和进程间同步的处理,会增加负担,所以这种通信方式是低微的,只适用于传递相对少量的数据。

2).基于共享存储区的通信方式。为了大量传输数据,在存储器中划分出了一块共享存储区;各个进程可以通过对数据的读或写来实现通信。这种方式下,进程在通信前,先向系统申请获得共享存储区的一个分区并指定该分区的关键字;若系统已经给其他进程分配了这样的分区,则返回该分区的描述符,申请者将获得的共享存储分区连接到本进程上,然后就可以像读写普通存储器一样地读写公共存储分区。

2.消息传递模型:线程之间没有公共状态,线程之间必须通过明确的发送消息来显示进行通信,当任务在不同的计算机上运行时通常使用。 当任务需要与另一个进行通信时,它会发送遵循预定义协议的消息。 如果发送方在发送消息后继续执行,发送方被阻塞等待响应或异步,则该通信可以是同步的。消息系统的功能是允许进程与其它的进程进行通信。我们已经看到了消息传递在微内核中的应用。在这种方案下,服务作为普通的用户进程提供,服务在内核之外。用户进程之间的通信通过传递消息完成。IPC 至少提供了两种操作:send和receive。 进程发送的消息可以是定长的也可以是变长的。如果只可以发送定长的消息,那么系统层的实现就很简单。然而,这种限制增加了 程序设计的难度。另一方面,变长的消息需要更复杂的系统层实现,但是 程序设计工作更简单

如果进程P 和Q要进行通信,那么它们必须能够互相发送和接收消息;二者之间必须要建立一条通信链路。有多种方法可以实现这条链路。在这儿,我们并不关心链路的物理实现,而是要考虑它的逻辑实现。有如下几种用于逻辑实现send/receive 操作的方法:

  1. 直接或间接通信

  2. 对称或不对称通信

  3. 自动或手动缓冲

  4. 发送拷贝或引用

  5. 定长消息或变长消息

同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模 型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之 间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前, 因此同步是隐式进行的。

实现同步的机制主要有临界区、互斥、信号量和事件

临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资 源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。

信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 。信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 。

:Java 的并发采用的是共享内存模型,Java 线程之间的通信总是隐式进行,整个通 信过程对程序员完全透明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值