潍坊网站建设设计,如何用php数据库做网站,建网站优势,免费做网站公司推荐多进程通信方式
管道pipe#xff1a;管道是一种半双工的通信方式#xff0c;数据只能单向流动#xff0c;而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO#xff1a;有名管道也是半双工的通信方式#xff0c;但是它允许无亲缘关…多进程通信方式
管道pipe管道是一种半双工的通信方式数据只能单向流动而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO有名管道也是半双工的通信方式但是它允许无亲缘关系进程间的通信。消息队列MessageQueue消息队列是由消息的链表存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。共享存储SharedMemory共享内存就是映射一段能被其他进程所访问的内存这段共享内存由一个进程创建但多个进程都可以访问。共享内存是最快的 IPC 方式它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制如信号两配合使用来实现进程间的同步和通信。信号量Semaphore信号量是一个计数器可以用来控制多个进程对共享资源的访问。它常作为一种锁机制防止某进程正在访问共享资源时其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。套接字Socket套解口也是一种进程间通信机制与其他通信机制不同的是它可用于不同及其间的进程通信。信号 ( sinal ) 信号是一种比较复杂的通信方式用于通知接收进程某个事件已经发生。
个人对进程与线程的同步、通信的理解 同步 (互斥) 是为了多个进程完成同一个任务使用同一块资源而进行相互适应的操作这期间可能涉及到通信 通信是进程间信息的交换可能某些交换方式需要在实现同步互斥的前提下才能完成。
以下转自https://www.cnblogs.com/youngforever/p/3250270.html
这两天看进程的同步与通信看了几本书上的介绍也从网上搜了很多资料越看越迷惑被这几个问题搞得很纠结。
进程同步与互斥的区别进程的同步方式有哪些进程的通信方式有哪些进程同步与通信的区别是什么线程的同步/通信与进程的同步/通信有区别吗
在好多教材上包括国内与国外的也没有明确这些概念现在对每个问题还没有准确的答案下面将自己的理解记下来以后再补充。
参考资料
《操作系统教程》 孙钟秀主编 费翔林 骆斌 谢立参编 高等教育出版社
《计算机操作系统》 何炎祥 李飞 李宁 编著 清华大学出版社进程管理部分与《操作系统教程》中的类似
进程互斥、同步的概念
进程互斥、同步的概念是并发进程下存在的概念有了并发进程就产生了资源的竞争与协作从而就要通过进程的互斥、同步、通信来解决资源的竞争与协作问题。
下面是根据《操作系统教程》3.1.4 中的介绍整理的进程互斥、同步的概念。
在多道程序设计系统中同一时刻可能有许多进程这些进程之间存在两种基本关系竞争关系和协作关系。
进程的互斥、同步、通信都是基于这两种基本关系而存在的为了解决进程间竞争关系间接制约关系而引入进程互斥为了解决进程间松散的协作关系( 直接制约关系)而引入进程同步为了解决进程间紧密的协作关系而引入进程通信。
第一种是竞争关系
系统中的多个进程之间彼此无关它们并不知道其他进程的存在并且也不受其他进程执行的影响。例如批处理系统中建立的多个用户进程 分时系统中建立的多个终端进程。由于这些进程共用了一套计算机系统资源因而 必然要出现多个进程竞争资源的问题。当多个进程竞争共享硬设备、存储器、处理器 和文件等资源时操作系统必须协调好进程对资源的争用。
资源竞争出现了两个控制问题一个是死锁 deadlock 问题一组进程如果都获得了部分资源还想要得到其他进程所占有的资源最终所有的进程将陷入死锁。另一个是饥饿starvation 问题这是指这样一种情况一个进程由于其他进程总是优先于它而被无限期拖延。
操作系统需要保证诸进程能互斥地访问临界资源既要解决饥饿问题又要解决死锁问题。 进程的互斥mutual exclusion 是解决进程间竞争关系( 间接制约关系) 的手段。 进程互斥指若干个进程要使用同一共享资源时任何时刻最多允许一个进程去使用其他要使用该资源的进程必须等待直到占有资源的进程释放该资源。
第二种是协作关系
某些进程为完成同一任务需要分工协作由于合作的每一个进程都是独立地以不可预知的速度推进这就需要相互协作的进程在某些协调点上协 调各自的工作。当合作进程中的一个到达协调点后在尚未得到其伙伴进程发来的消息或信号之前应阻塞自己直到其他合作进程发来协调信号或消息后方被唤醒并继续执行。这种协作进程之间相互等待对方消息或信号的协调关系称为进程同步。
进程间的协作可以是双方不知道对方名字的间接协作例如通过共享访问一个缓冲区进行松散式协作也可以是双方知道对方名字直接通过通信机制进行紧密协作。允许进程协同工作有利于共享信息、有利于加快计算速度、有利于实现模块化程序设计。
进程的同步Synchronization是解决进程间协作关系( 直接制约关系) 的手段。进程同步指两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于另一个协作进程的消息或信号当一个进程没有得到来自于另一个进程的消息或信号时则需等待直到消息或信号到达才被唤醒。
不难看出进程互斥关系是一种特殊的进程同步关系即逐次使用互斥共享资源也是对进程使用资源次序上的一种协调。
进程通信的概念
下面是根据《操作系统教程》3.5 中的介绍整理的进程通信的概念。
并发进程之间的交互必须满足两个基本要求同步和通信。
进程竞争资源时要实施互斥互斥是一种特殊的同步实质上需要解决好进程同步问题进程同步是一种进程通信通过修改信号量进程之间可建立起联系相互协调运行和协同工作。但是信号量与PV操作只能传递信号没有传递数据的能力。有些情况下进程之间交换的信息量虽很少例如仅仅交换某个状态信息但很多情况下进程之间需要交换大批数据例如传送一批信息或整个文件这可以通过一种新的通信机制来完成进程之间互相交换信息的工作称之为进程通信IPC InterProcess Communication主要是指大量数据的交换。进程间通信的方式很多包括
信号signal 通信机制 信号量及其原语操作PV、读写锁、管程控制的共享存储区shared memory 通信机制管道pipeline提供的共享文件shared file通信机制 信箱和发信/ 收信原语的消息传递message passing 通信机制。 其中前两种通信方式由于交换的信息量少且效率低下故称为低级通信机制相应地可把发信号/ 收信号及PV之类操作称为低级通信原语仅适用于集中式操作系统。消息传递机制属于高级通信机制共享文件通信机制是消息传递机制的变种这两种通信机制既适用于集中式操作系统又适用于分布式操作系统。
进程同步的方法
前面提到进程互斥关系是一种特殊的进程同步关系下面给出常见的进程同步的方法实际上也可用于进程的互斥个人理解。
在何炎祥的《计算机操作系统》 3.2 节将进程同步的机制与解决进程互斥方法看做是一样的的明确指出互斥的软件解决方法为Dekker算法与Peterson算法互斥的硬件解决方法为中断方法、以及使用机器指令的方法后面又给出了信号量、管程、消息传递三种方法。
实际应用中不同的系统有不同的进程同步方法CSDN帖子http://bbs.csdn.net/topics/80156687中有一些讨论Linux 与Windows的主要同步、通信机制如下
Linux 下
Linux 下常见的进程同步方法有SysVIPC 的 sem信号量、file locking / record locking通过 fcntl 设定的文件锁、记录锁、futex基于共享内存的快速用户态互斥锁。针对线程pthread的还有 pthread_mutex 和 pthread_cond条件变量。 Linux 下常见的进程通信的方法有 pipe管道FIFO命名管道socket套接字SysVIPC 的 shm共享内存、msg queue消息队列mmap文件映射。以前还有 STREAM不过现在比较少见了好像。
Windows下在Windwos中进程同步主要有以下几种互斥量、信号量、事件、可等计时器等几种技术。
在Windows下进程通信主要有以下几种内存映射、管道、消息等但是内存映射是最基础的因为其他的进程通信手段在内部都是考内存映射来完成的。
线程的同步/通信与进程的同步/通信有区别吗
对于该问题教材上没有明确的回答教材上给出的一般是进程而非线程的同步、通信方式。但网络上很多说法将两者混为一谈。根据教材以及网上的说法个人的理解为
同步机制
信号量、管程、互斥是进程的同步机制而信号量、互斥也可用于线程的同步但管程只在进程同步中被用到
线程的同步除了信号量、互斥外还有临界区、事件没有看到教材上将这两种方式作为进程的同步方式
通信机制
管道、FIFO、消息队列、信号量、共享内存是进程的同步机制教材上没有线程的通信机制这样的说法但可以肯定这几种方法是进程的通信方式且其中的信号量既可用于进程的同步又可用于进程的通信在网络上还有说可以用于线程同步的。
管道与管程是不同的管程是进程同步的方式而管道则是进程通信的方式。
进程的同步/通信
下面是常见的线程之间的同步方式的详细介绍。
注下面转自网络下面的同步、通信方式对于进程与线程分的不是很清楚关于进程还是线程的解释见上面——线程的同步/通信与进程的同步/通信有区别吗
一、进程/线程间同步机制。
临界区、互斥区、事件、信号量四种方式临界区Critical Section、互斥量Mutex、信号量Semaphore、事件Event的区别1、临界区通过对多线程的串行化来访问公共资源或一段代码速度快适合控制数据访问。
在任意时刻只允许一个线程对共享资源进行访问如果有多个线程试图访问公共资源那么在有一个线程进入后其他试图访问公共资源的线程将被挂起并一直等到进入临界区的线程离开临界区在被释放后其他线程才可以抢占。2、互斥量采用互斥对象机制。
只有拥有互斥对象的线程才有访问公共资源的权限因为互斥对象只有一个所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享而且可以在不同应用程序的线程之间实现对资源的安全共享。3、信号量它允许多个线程在同一时刻访问同一资源但是需要限制在同一时刻访问此资源的最大线程数目 .
信号量对象对线程的同步方式与前面几种方法不同信号允许多个线程同时使用共享资源这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源但是需要限制在同一时刻访问此资源的最大线程数目。
PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数S大于等于零时代表可供并发进程使用的资源实体数但S小于零时则表示正在等待使用共享资源的进程数。 P操作申请资源 1S减1 2若S减1后仍大于等于零则进程继续执行 3若S减1后小于零则该进程被阻塞后进入与该信号相对应的队列中然后转入进程调度。 V操作 释放资源 1S加1 2若相加结果大于零则进程继续执行 3若相加结果小于等于零则从该信号的等待队列中唤醒一个等待进程然后再返回原进程继续执行或转入进程调度。4、事 件 通过通知操作的方式来保持线程的同步还可以方便实现对多个线程的优先级比较的操作 .
总结 1 互斥量与临界区的作用非常相似但互斥量是可以命名的也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建就可以通过名字打开它。 2 互斥量Mutex信号灯Semaphore事件Event都可以被跨越进程使用来进行同步数据操作而其他的对象与数据同步操作无关但对于进程和线程来讲如果进程和线程在运行状态则为无信号状态在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。 3 通过互斥量可以指定资源被独占的方式使用但如果有下面一种情况通过互斥量就无法处理比如现在一位用户购买了一份三个并发访问许可的数据库系统可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作这时候如果利用互斥量就没有办法完成这个要求信号灯对象可以说是一种资源计数器。
二、进程间通信方式
由于比较容易混淆我们把进程间通信方法也列在这里做比较。
进程通信也就是所谓的IPC问题主要是指进程间交换数据的方式。进程通信包括高级通信与低级通信其中进程同步与互斥属于低级通信主要用于插U农地控制信号高级通信包括三种共享存储系统有的地方称作共享内存区、消息传递系统有的地方称作消息队列、管道。
信号量是进程同步与互斥的常用方法也可以作为低级的进程通信方法用于传递控制信号。
简而言之进程间通信方式主要包括管道、FIFO、消息队列、信号量、共享内存。 1.管道还有命名管道和非命名管道(即匿名管道)之分非命名管道(即匿名管道)只能用于父子进程通讯命名管道可用于非父子进程命名管道就是FIFO管道是先进先出的通讯方式 2.消息队列是用于两个进程之间的通讯首先在一个进程中创建一个消息队列然后再往消息队列中写数据而另一个进程则从那个消息队列中取数据。需要注意的是消息队列是用创建文件的方式建立的如果一个进程向某个消息队列中写入了数据之后另一个进程并没有取出数据即使向消息队列中写数据的进程已经结束保存在消息队列中的数据并没有消失也就是说下次再从这个消息队列读数据的时候就是上次的数据 3.信号量它与WINDOWS下的信号量是一样的所以就不用多说了 4.共享内存类似于WINDOWS下的DLL中的共享变量但LINUX下的共享内存区不需要像DLL这样的东西只要首先创建一个共享内存区其它进程按照一定的步骤就能访问到这个共享内存区中的数据当然可读可写 以上几种方式的比较 1.管道速度慢容量有限只有父子进程能通讯 2.FIFO任何进程间都能通讯但速度慢 3.消息队列容量受到系统限制且要注意第一次读的时候要考虑上一次没有读完数据的问题 4.信号量不能传递复杂消息只能用来同步 5.共享内存区能够很容易控制容量速度快但要保持同步比如一个进程在写的时候另一个进程要注意读写的问题相当于线程中的线程安全当然共享内存区同样可以用作线程间通讯不过没这个必要线程间本来就已经共享了同一进程内的一块内存 本质上信号量是一个计数器它用来记录对某个资源如共享内存的存取状况。一般说来为了获得共享资源进程需要执行下列操作
1测试控制该资源的信号量2若此信号量的值为正则允许进行使用该资源进程将进号量减13若此信号量为0则该资源目前不可用进程进入睡眠状态直至信号量值大于0进程被唤醒转入步骤14当进程不再使用一个信号量控制的资源时信号量值加1如果此时有进程正在睡眠等待此信号量则唤醒此进程。套接字通信并不为Linux所专有在所有提供了TCP/IP协议栈的操作系统中几乎都提供了socket而所有这样操作系统对套接字的编程方法几乎是完全一样的三、进程/线程同步机制与进程间通信机制比较
很明显2者有类似但是差别很大
同步主要是临界区、互斥、信号量、事件
进程间通信是管道、内存共享、消息队列、信号量、socket
共通之处是信号量和消息事件
小结
进程互斥、同步与通信的关系进程竞争资源时要实施互斥互斥是一种特殊的同步实质上需要解决好进程同步问题进程同步是一种进程通信由此看来进程互斥、同步都可以看做进程的通信 信号量是进程同步与互斥的常用方法也可以作为低级的进程通信方法用于传递控制信号 管道与管程是不同的管程是进程同步的方式而管道则是进程通信的方式