一.分类程序员
按照线程通讯机制能够分为共享内存模型和消息传递模型:编程
1.共享内存模型:线程之间共享程序的公共状态,编程之间经过读写内存中的公共状态来隐式进行通讯。相互通讯的进程共享某些数据结构或共享存储区,进程经过这些空间进行通讯,所以又能够分为两种类型:安全
1).基于共享数据结构的通讯方式。在这种通讯方式中要求各进程公用某些数据结构来实现进程间的信息交换。好比用有界缓冲区这种数据结构实现生产者-消费者问题。在这里公用数据结构的设置和进程间同步的处理,会增长负担,因此这种通讯方式是低微的,只适用于传递相对少许的数据。数据结构
2).基于共享存储区的通讯方式。为了大量传输数据,在存储器中划分出了一块共享存储区;各个进程能够经过对数据的读或写来实现通讯。这种方式下,进程在通讯前,先向系统申请得到共享存储区的一个分区并指定该分区的关键字;若系统已经给其余进程分配了这样的分区,则返回该分区的描述符,申请者将得到的共享存储分区链接到本进程上,而后就能够像读写普通存储器同样地读写公共存储分区。多线程
2.消息传递模型:线程之间没有公共状态,线程之间必须经过明确的发送消息来显示进行通讯,当任务在不一样的计算机上运行时一般使用。 当任务须要与另外一个进行通讯时,它会发送遵循预约义协议的消息。 若是发送方在发送消息后继续执行,发送方被阻塞等待响应或异步,则该通讯能够是同步的。消息系统的功能是容许进程与其它的进程进行通讯。咱们已经看到了消息传递在微内核中的应用。在这种方案下,服务做为普通的用户进程提供,服务在内核以外。用户进程之间的通讯经过传递消息完成。IPC 至少提供了两种操做:send和receive。 进程发送的消息能够是定长的也能够是变长的。若是只能够发送定长的消息,那么系统层的实现就很简单。然而,这种限制增长了 程序设计的难度。另外一方面,变长的消息须要更复杂的系统层实现,可是 程序设计工做更简单并发
若是进程P 和Q要进行通讯,那么它们必须可以互相发送和接收消息;两者之间必需要创建一条通讯链路。有多种方法能够实现这条链路。在这儿,咱们并不关心链路的物理实现,而是要考虑它的逻辑实现。有以下几种用于逻辑实现send/receive 操做的方法:异步
直接或间接通讯操作系统
对称或不对称通讯线程
自动或手动缓冲设计
发送拷贝或引用
定长消息或变长消息
同步是指程序用于控制不一样线程之间操做发生相对顺序的机制。在共享内存并发模 型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码须要在线程之 间互斥执行。在消息传递的并发模型里,因为消息的发送必须在消息的接收以前, 所以同步是隐式进行的。
实现同步的机制主要有临界区、互斥、信号量和事件
临界区:经过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只容许一个线程对共享资源进行访问,若是有多个线程试图访问公共资 源,那么在有一个线程进入后,其余试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其余线程才能够抢占。
互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,由于互斥对象只有一个,因此能保证公共资源不会同时被多个线程访问。互斥不只能实现同一应用程序的公共资源安全共享,还能实现不一样应用程序的公共资源安全共享 .互斥量比临界区复杂。由于使用互斥不只仅可以在同一应用程序不一样线程中实现资源的安全共享,并且能够在不一样应用程序的线程之间实现对资源的安全共享。
信号量:它容许多个线程在同一时刻访问同一资源,可是须要限制在同一时刻访问此资源的最大线程数目 。信号量对象对线程的同步方式与前面几种方法不一样,信号容许多个线程同时使用共享资源,这与操做系统中的PV操做相同。它指出了同时访问共享资源的线程最大数目。它容许多个线程在同一时刻访问同一资源,可是须要限制在同一时刻访问此资源的最大线程数目。
事件:经过通知操做的方式来保持线程的同步,还能够方便实现对多个线程的优先级比较的操做 。
注:Java 的并发采用的是共享内存模型,Java 线程之间的通讯老是隐式进行,整个通 信过程对程序员彻底透明。