进程同步与通讯html
操做系统教程:http://c.biancheng.net/cpp/html/2592.html数据库
进程的同步与互斥是指进程在推动时的相互制约关系。服务器
#进程同步:它主要源于进程合做,是进程间共同完成一项任务时直接发生相互做用的关系。为进程之间的直接制约关系。如生产者-消费者问题,哲学家进餐问题。网络
#进程互斥:它主要源于资源共享,是进程之间的间接制约关系。在多道系统中,每次只容许一个进程访问的资源称为临界资源,进程互斥就是保证每次只有一个进程使用临界资源。如访问控制台、打印机。数据结构
为禁止两个进程同时进入临界区,同步机制应遵循如下准则:并发
空闲让进:临界区空闲时,能够容许一个请求进入临界区的进程当即进入临界区。app
忙则等待:当已有进程进入临界区时,其余试图进入临界区的进程必须等待。函数
有限等待:对请求访问的进程,应保证能在有限时间内进入临界区。工具
让权等待:当进程不能进入临界区时,应当即释放处理器,防止进程忙等待。this
进程同步和互斥在不一样的系统中有不一样的实现。
Windows中的进程同步方法有信号量、事件,互斥方法有临界区、互斥锁。
Linux中的进程同步方法有?? 互斥方法有??
信号量是一种功能较强的机制,可用来解决互斥与同步的问题,它只能被两个标准的原语wait(S)和signal(S)来访问,也能够记为“P操做”和“V操做”。
Wait原语的实现
|
Signal 原语实现
|
//生产者-消费者的信号量实现(包含同步和互斥) semaphore mutex=1; //临界区互斥信号量 semaphore empty=n; //空闲缓冲区 semaphore full=0; //缓冲区初始化为空 producer () { //生产者进程 while(1){ produce an item in nextp; //生产数据 P(empty); //获取空缓冲区单元 P(mutex); //进入临界区. add nextp to buffer; //将数据放入缓冲区 V(mutex); //离开临界区,释放互斥信号量 V(full); //满缓冲区数加1 } }
consumer () { //消费者进程 while(1){ P(full); //获取满缓冲区单元 P(mutex); // 进入临界区 remove an item from buffer; //从缓冲区中取出数据 V (mutex); //离开临界区,释放互斥信号量 V (empty) ; //空缓冲区数加1 consume the item; //消费数据 } }
|
进程通讯:
进程通讯是指进程之间的信息交换。PV操做是低级通讯方式(进程同步互斥也是一种进程通讯方式),髙级通讯方式是指以较高的效率传输大量数据的通讯方式。高级通讯方法主要有如下三个类:
共享存储:
在通讯的进程之间存在一块可直接访问的共享空间,经过对这片共享空间进行写/读操做实现进程之间的信息交换。在对共享空间进行写/读操做时,须要使用同步互斥工具(如 P操做、V操做),对共享空间的写/读进行控制。共享存储又分为两种:低级方式的共享是基于数据结构的共享;高级方式则是基于存储区的共享。
对应Windows中文件映射、剪贴板、共享内存、
对应Linux中的???
消息传递:
在消息传递系统中,进程间的数据交换是以格式化的消息(Message)为单位的。若通讯的进程之间不存在可直接访问的共享空间,则必须利用操做系统提供的消息传递方法实现进程通讯。进程经过系统提供的发送消息和接收消息两个原语进行数据交换。
1) 直接通讯方式:发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。Windows下实现方式有?? Linux下实现方式有??, 。
2) 间接通讯方式:发送进程把消息发送到某个中间实体中,接收进程从中间实体中取得消息。这种中间实体通常称为信箱,这种通讯方式又称为信箱通讯方式。该通讯方式普遍应用于计算机网络中,相应的通讯系统称为电子邮件系统。Windows下实现方式有邮件槽,Linux下实现方式有??
管道通讯:
管道通讯是消息传递的一种特殊方式。所谓“管道”,是指用于链接一个读进程和一个写进程以实现它们之间通讯的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入(写)管道;而接收管道输出的接收进程(即读进程),则从管道中接收(读)数据。为了协调双方的通讯,管道机制必须提供如下三方面的协调能力:互斥、同步和肯定对方的存在, Windows 和Linux下均有相应实现。
Socket:不在多说。
Windows下的进程同步互斥机制有:
http://blog.csdn.net/jannet262/article/details/576445
http://blog.csdn.net/chainsmoker2010/article/details/6038678
临界区、互斥区、事件、信号量
临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别
一、临界区:线程间的互斥机制,速度快,占用资源少;
二、互斥量:进程级的互斥机制,相对临界区代价更大。
三、信号量:进程同步机制,它容许多个线程在同一时刻访问同一资源,可是须要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不一样,信号容许多个线程同时使用共享资源,这与操做系统中的PV操做相同。它指出了同时访问共享资源的线程最大数目。它容许多个线程在同一时刻访问同一资源,可是须要限制在同一时刻访问此资源的最大线程数目。例如:对数据库最多n个并发访问。信号灯对象能够说是一种资源计数器。
四、事件:进程同步机制,相对于信号量的资源共享功能,事件主要用于进程间的协做。事件对象能够由两种方式建立,一种为自动重置,在其余线程使用WaitForSingleObject等待到事件对象变为有信号后该事件对象自动又变为无信号状态,一种为人工重置在其余线程使用WaitForSingleObject等待到事件对象变为有信号后该事件对象状态不变。例若有多个线程都在等待一个线程运行结束,咱们就可使用人工重置事件,在被等待的线程结束时设置该事件为有信号状态,这样其余的多个线程对该事件的等待都会成功
Windows下进程通讯(IPC)的几种方式:
http://blog.csdn.net/weiwangchao_/article/details/7104940
http://blog.csdn.net/sszgg2006/article/details/8508882
进程间通讯主要包括管道, 系统IPC(包括消息队列,信号量,共享存储), SOCKET.
# 匿名管道( pipe ):管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用。进程的亲缘关系一般是指父子进程关系。
# 命名管道 (named pipe) : 命名名管道也是半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。
#文件映射((Memory-Mapped Files)):共享存储区的一种。文件映射能使进程把文件内容看成进程地址区间一块内存那样来对待。所以,进程没必要使用文件I/O操做,只需简单的指针操做就可读取和修改文件的内容
#邮件槽(Mailslots):属于消息传递。邮件槽提供进程间单向通讯能力,任何进程都能创建邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,能够经过邮件槽的名字给邮件槽服务器进程发送消息。进来的消 息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既能够是邮件槽服务器也能够是邮件槽客户,所以可创建多个邮件槽实现进程间的双向通讯。
#剪贴板:属于共享内存。剪贴板是一个很是松散的交换媒介,能够支持任何数据格式,每一格式由一无符号整数标识,对标准(预约义)剪贴板格式,该值是Win32 API定义的常量;对非标准格式可使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或均可以转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。
#Socket,DDE等其余方式;
Linux下的进程通讯与同步(待完成)。
<script>alert("gao")</script>