进程同步与通信
操作系统教程:http://c.biancheng.net/cpp/html/2592.html
进程的同步与互斥是指进程在推进时的相互制约关系。
#进程同步:它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。为进程之间的直接制约关系。如生产者-消费者问题,哲学家进餐问题。
#进程互斥:它主要源于资源共享,是进程之间的间接制约关系。在多道系统中,每次只允许一个进程访问的资源称为临界资源,进程互斥就是保证每次只有一个进程使用临界资源。如访问控制台、打印机。
为禁止两个进程同时进入临界区,同步机制应遵循以下准则:
空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。
有限等待:对请求访问的进程,应保证能在有限时间内进入临界区。
让权等待:当进程不能进入临界区时,应立即释放处理器,防止进程忙等待。
进程同步和互斥在不同的系统中有不同的实现。
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)的区别
1、临界区:线程间的互斥机制,速度快,占用资源少;
2、互斥量:进程级的互斥机制,相对临界区代价更大。
3、信号量:进程同步机制,它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。例如:对数据库最多n个并发访问。信号灯对象可以说是一种资源计数器。
4、事件:进程同步机制,相对于信号量的资源共享功能,事件主要用于进程间的协作。事件对象可以由两种方式创建,一种为自动重置,在其他线程使用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下的进程通信与同步(待完成)。