分布试系统中经常出现多个进程请求访问同一临界资源的问题。
目前, 对临界区进行控制访问的方法主要有三种: 集中式算法、令牌环算法和分布式算法。
集中式算法类似于单处理机上的信号量方法, 先在分布式系统中选出一个协调者, 由它负责临界区使用情况的登记与管理。
令牌环算法在分布式系统中将各进程组织成一个逻辑环, 并在系统中设置象征权力的令牌作为进程能否进入临界区的标志。以此来实现进程互斥且确保无进程受饥。
分布式算法是基于时间戳的算法, 它先假定系统中有统一的时间以保证系统中所有的事件都是全序。当某进程欲进入临界区时, 它向其他进程广播请求, 其他进程收到后再采取相应行动。
在集中式算法中当协调者一旦崩溃, 整个系统便瘫痪。而令牌环算法一旦令牌丢失, 它必须重新生成。而且要检测令牌是否丢失也是很困难的。
========================================
协同需要一个协调者,信号量就是一种协调者。
信号量 PV操作
http://hanzhengyang0126.blog.163.com/blog/static/1175039452010912104337743/
信号量
http://baike.baidu.com/link?url=7DB2C-iUV_jfwTkSB00OaGe71GxSCFuriGHmgGbhxRCLrBGi70wAhQPr3SFD9OYTTYD9jDr9QPfdNBZUMOryia
PV原语
http://baike.baidu.com/view/809762.htm#2
把信号量视为一个加锁标志位,实现对一个共享变量的互斥访问。
把信号量视为是某种类型的共享资源的剩余个数,实现对一类共享资源的访问。
把信号量作为进程间的同步工具
同步(二)Posix信号量
http://blog.csdn.net/seu_lyr/article/details/8914068
http://zh.wikipedia.org/wiki/信號標
如果信号量只有二进制的0或1,称为二进制信号量(binary semaphore)又称Mutex。
如果信号量是一个任意的整数,通常被称为计数信号量
System.Threading 命名空间
http://msdn.microsoft.com/zh-cn/library/ms173179(VS.80).aspx
http://msdn.microsoft.com/zh-cn/library/system.threading.interlocked(v=vs.100).aspx
Monitor |
提供同步访问对象的机制。lock变型,临界资源,二进制信息对象 |
Mutex |
一个同步基元,也可用于进程间同步。二进制信息量 |
Interlocked |
为多个线程共享的变量提供原子操作。线程安全的数值操作。可实现计数信号量 |
Semaphore |
限制可同时访问某一资源或资源池的线程数。 |
SpinLock |
提供一个相互排斥锁基元,在该基元中,尝试获取锁的线程将在重复检查的循环中等待,直至该锁变为可用为止
|
AutoResetEvent |
通知正在等待的线程已发生事件。 此类不能被继承。通知协同方式。 |
ManualResetEvent |
通知一个或多个正在等待的线程已发生事件。 此类不能被继承。通知协同方式。 |
lock只能一个对象,相当于
二进制信号量,semaphore如果是计数信号量。Interlocked(if(i>0)){} release{},多个lock或if(i>0),然后对i操作lock
线程池,可以限定线程数据,线程池处理队列。
数据库事务,实现计数信号量,可以实现分布式集中式锁。
分布式信息号,lock(obj){i=i-1},release(i){}, webservice, interlockd或数据库事务。
http://www.cnblogs.com/zhili/archive/2012/07/23/Mutex_And_Semaphore.html
信号量包含的几个操作原语:
CreateSemaphore() 创建一个信号量
OpenSemaphore() 打开一个信号量
ReleaseSemaphore() 释放信号量
WaitForSingleObject() 等待信号量
mutex 与监视器类似;它防止多个线程在某一时间同时执行某个代码块。事实上,名称“mutex”是术语“互相排斥 (mutually exclusive)”的简写形式。然而与监视器不同的是,mutex 可以用来使跨进程的线程同步。mutex 由 Mutex 类表示。
========================
线程同步的方式和机制
编辑
临界区、互斥区、事件、信号量四种方式
临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。(lock,)
2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享(lock)
3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目
4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作
进程之间的通讯:
1、 Windows专门定义了一个消息:WM_COPYDATA,用来在线程之间搬移数据,――不管两个线程是否同属于一个进程。
2、 使用共享内存(Shared Memory),CreateFileMapping
3.IPC
1)Anonymous Pipes。Anonymous Pipes只被使用于 点对点通讯。当一个进程产生另一个进程时,这是最有用的一种通讯方式。
2)Named Pipes。Named Pipes可以是单向,也可以是双向,并且可以跨越网络,不局限于单机。
3)Mailslots。Mailslots为广播式通讯。Server进程可以产生Mailslots,任何Client进程可以写数据进去,但是只有Server进程可以取数据。
4)OLE Automation。OLE Automation和UDP都是更高阶的机制,允许通讯发生于不同进程间,甚至不同机器间。
5)DDE。DDE 动态数据交换,使用于16位Windows,这一方式应尽量避免使用。
[3]
用事件(Event)来同步线程是最具弹性的了。一个事件有两种状态:激发状态和未激发状态。也称有信号状态和无信号状态。事件又分两种类型:手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被设置为激发状态后,会唤醒“一个”等待中的线程,然后自动恢复为未激发状态。
http://baike.baidu.com/link?url=iPX-NPIM-xMGNi2gOI7d7mop7faquvzZImtD5jND9YEDdlTzjAuUqqfVBhFpCWDvy6qzqbDjlWytr0cxl5hHl_