进程的同步与通信,进程与线程同步的区别,进程与线程通信的区
进程同步与互斥的区别?
进程的同步⽅式有哪些?
进程的通信⽅式有哪些?
进程同步与通信的区别是什么?
线程的同步/通信与进程的同步/通信有区别吗?
在好多教材上(包括国内与国外的)也没有明确这些概念,现在对每个问题还没有准确的答案,下⾯将⾃⼰的理解记下来,以后再补充。
参考资料:
《操作系统教程》 孙钟秀主编 费翔林  骆斌  谢⽴参编 ⾼等教育出版社
《计算机操作系统》 何炎祥 李飞 李宁 编著 清华⼤学出版社(进程管理部分与《操作系统教程》中的类似)
进程互斥、同步的概念
进程互斥、同步的概念是并发进程下存在的概念,有了并发进程,就产⽣了资源的竞争与协作,从⽽就要通过进程的互斥、同步、通信来解决资源的竞争与协作问题。
下⾯是根据《操作系统教程》3.1.4 中的介绍,整理的进程互斥、同步的概念。
在多道程序设计系统中,同⼀时刻可能有许多进程,这些进程之间存在两种基本关系:竞争关系和协作关系。
松散进程的互斥、同步、通信都是基于这两种基本关系⽽存在的,为了解决进程间竞争关系(间接制约关系)⽽引⼊进程互斥;为了解决进程间松散
紧密的协作关系⽽引⼊进程通信。
直接制约关系)⽽引⼊进程同步;为了解决进程间紧密的协作
的协作
的协作关系(直接制约关系
第⼀种是竞争关系
系统中的多个进程之间彼此⽆关,它们并不知道其他进程的存在,并且也不受其他进程执⾏的影响。例如,批处理系统中建⽴的多个⽤户进程,分时系统中建⽴的多个终端进程。由于这些进程共⽤了⼀套计算机系统资源,因⽽, 必然要出现多个进程竞争资源的问题。当多个进程竞争共享硬设备、存储器、处理器 和⽂件等资源时,操作系统必须协调好进程对资源的争⽤。
资源竞争出现了两个控制问题:⼀个是死锁 (deadlock )问题,⼀组进程如果都获得了部分资源,还想要得到其他进程所占有的资源,最终所有的进程将陷⼊死锁。另⼀个是饥饿(starvation )问题,这是指这样⼀种情况:⼀个进程由于其他进程总是优先于它⽽被⽆限期拖延。
操作系统需要保证诸进程能互斥地访问临界资源,既要解决饥饿问题,⼜要解决死锁问题。
间接制约关系) 的⼿段。进程互斥指若⼲个进程要使⽤同⼀共享资源时,任何时刻最进程的互斥(mutual exclusion )是解决进程间竞争关系(间接制约关系
多允许⼀个进程去使⽤,其他要使⽤该资源的进程必须等待,直到占有资源的进程释放该资源。
第⼆种是协作关系
某些进程为完成同⼀任务需要分⼯协作,由于合作的每⼀个进程都是独⽴地以不可预知的速度推进,这就需要相互协作的进程在某些协调点上协调各⾃的⼯作。当合作进程中的⼀个到达协调点后,在尚未得到其伙伴进程发来的消息或信号之前应阻塞⾃⼰,直到其他合作进程发来协调信号或消息后⽅被唤醒并继续执⾏。这种协作进程之间相互等待对⽅消息或信号的协调关系称为进程同步。
进程间的协作可以是双⽅不知道对⽅名字的间接协作,例如,通过共享访问⼀个缓冲区进⾏松散式协作;也可以是双⽅知道对⽅名字,直接通过通信机制进⾏紧密协作。允许进程协同⼯作有利于共享信息、有利于加快计算速度、有利于实现模块化程序设计。
进程的同步(Synchronization)是解决进程间协作关系(直接制约关系
直接制约关系) 的⼿段。进程同步指两个以上进程基于某个条件来协调它们的活动。⼀个进程的执⾏依赖于另⼀
个协作进程的消息或信号,当⼀个进程没有得到来⾃于另⼀个进程的消息或信号时则需等待,直到消息或信号到达才被唤醒。
不难看出,进程互斥关系是⼀种特殊的进程同步关系,即逐次使⽤互斥共享资源,也是对进程使⽤资源次序上的⼀种协调。
进程通信的概念
下⾯是根据《操作系统教程》3.5 中的介绍,整理的进程通信的概念。
并发进程之间的交互必须满⾜两个基本要求:同步和通信。
进程竞争资源时要实施互斥,互斥是⼀种特殊的同步,实质上需要解决好进程同步问题,进程同步是⼀种进程通信,通过修改信号量,进程之间可建⽴起联系,相互协调运⾏和协同⼯作。但是信号量与PV操作只能传递信号,没有传递数据的能⼒。有些情况下进程之间交换的信息量虽很少,例如,仅仅交换某个状态信息,但很多情况下进程之间需要交换⼤批数据,例如,传送⼀批信息或整个⽂件,这可以通过⼀种新的通信机制来完进程之间互相交换信息的⼯作称之为进程通信IPC (InterProcess Communication)(主要是指⼤量数据的交换)。进程间通成,进程之间互相交换信息的⼯作称之为进程通信IPC (InterProcess Communication)(主要是指⼤量数据的交换)。
信的⽅式很多,包括:
信号(signal )通信机制;
信号量及其原语操作(PV、读写锁、管程)控制的共享存储区(shared memory )通信机制;
管道(pipeline)提供的共享⽂件(shared file)通信机制;
信箱和发信/ 收信原语的消息传递(message passing )通信机制。
级通信机制,相应地可把发信号/ 收信号及PV之类操作称为低级通信原语,仅适其中前两种通信⽅式由于交换的信息量少且效率低下,故称为低级通信机制
⽤于集中式操作系统。消息传递机制属于⾼级通信机制
⾼级通信机制,共享⽂件通信机制是消息传递机制的变种,这两种通信机制,既适⽤于集中式操作系统,⼜适⽤于分布式操作系统。
进程同步的⽅法
前⾯提到,进程互斥关系是⼀种特殊的进程同步关系,下⾯给出常见的进程同步的⽅法,实际上也可⽤于进程的互斥(个⼈理解)。
在何炎祥的《计算机操作系统》 3.2 节,将进程同步的机制与解决进程互斥⽅法看做是⼀样的,的明确指出互斥的软件解决⽅法为Dekker算法与Peterson算法,互斥的硬件解决⽅法为中断⽅法、以及使⽤机器指令的⽅法,后⾯⼜给出了信号量、管程、消息传递三种⽅法。
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操作申请资源:
  (1)S减1;
  (2)若S减1后仍⼤于等于零,则进程继续执⾏;
  (3)若S减1后⼩于零,则该进程被阻塞后进⼊与该信号相对应的队列中,然后转⼊进程调度。
  V操作 释放资源:
  (1)S加1;
  (2)若相加结果⼤于零,则进程继续执⾏;
  (3)若相加结果⼩于等于零,则从该信号的等待队列中唤醒⼀个等待进程,然后再返回原进程继续执⾏或转⼊进程调度。
4、事 件: 通过通知操作的⽅式来保持线程的同步,还可以⽅便实现对多个线程的优先级⽐较的操作 .
总结:
  1. 互斥量与临界区的作⽤⾮常相似,但互斥量是可以命名的,也就是说它可以跨越进程使⽤。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是⽤的话使⽤临界区会带来速度上的优势并能够减少资源占⽤量。因为互斥量是跨进程的互斥量⼀旦被创建,就可以通过名字打开它。
进程通信方式  2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使⽤来进⾏同步数
据操作,⽽其他的对象与数据同步操作⽆关,但对于进程和线程来讲,如果进程和线程在运⾏状态则为⽆信号状态,在退出后为有信号状态。所以可以使⽤WaitForSingleObject来等待进程和线程退出。
  3. 通过互斥量可以指定资源被独占的⽅式使⽤,但如果有下⾯⼀种情况通过互斥量就⽆法处理,⽐如现在⼀位⽤户购买了⼀份三个并发访问许可的数据库系统,可以根据⽤户购买的访问许可数量来决定有多少个线程/进程能同时进⾏数据库操作,这时候如果利⽤互斥量就没有办法完成这个要求,信号灯对象可以说是⼀种资源计数器。
⼆、进程间通信
通信⽅式
由于⽐较容易混淆,我们把进程间通信⽅法也列在这⾥做⽐较。
进程通信也就是所谓的IPC问题,主要是指进程间交换数据的⽅式。进程通信包括⾼级通信与低级通信,其中进程同步与互斥属于低级通信,主要⽤于插U农地控制信号;⾼级通信包括三种:共享存储系统(有的地⽅称作共享内存区)、消息传递系统(有的地⽅称作消息队列)、管道。
信号量是进程同步与互斥的常⽤⽅法,也可以作为低级的进程通信⽅法,⽤于传递控制信号。
管道、FIFO、消息队列、信号量、共享内存。
简⽽⾔之,进程间通信⽅式主要包括管道、FIFO、消息队列、信号量、共享内存。
1.管道,还有命名管道和⾮命名管道(即匿名管道)之分,⾮命名管道(即匿名管道)只能⽤于⽗⼦进程通讯,命名管道可⽤于⾮⽗⼦进程,命名管道就是FIFO,管道是先进先出的通讯⽅式
2.消息队列,是⽤于两个进程之间的通讯,⾸先在⼀个进程中创建⼀个消息队列,然后再往消息队列中写数据,⽽另⼀个进程则从那个消息队列中取数据。需要注意的是,消息队列是⽤创建⽂件的⽅式建⽴的,如果⼀个进程向某个消息队列中写⼊了数据之后,另⼀个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数
3.信号量,它与WINDOWS下的信号量是⼀样的,所以就不⽤多说了
4.共享内存,类似于WINDOWS下的DLL中的共享变量,但LINUX下的共享内存区不需要像DLL这样的东西,只要⾸先创建⼀个共享内存区,其它进程按照⼀定的步骤就能访问到这个共享内存区中的数据,当然可读可写
以上⼏种⽅式的⽐较:
1.管道:速度慢,容量有限,只有⽗⼦进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
且要注意第⼀次读的时候,要考虑上⼀次没有读完数据的问题
3.消息队列:容量受到系统限制,且要注意第⼀次读的时候,要考虑上⼀次没有读完数据的问题
4.信号量:不能传递复杂消息,只能⽤来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,⽐如⼀个进程在写的时候,另⼀个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以⽤作线程间通讯,不过没这个必要,线程间本来就已经共享了同⼀进程内的⼀块内存
  本质上,信号量是⼀个计数器,它⽤来记录对某个资源(如共享内存)的存取状况。⼀般说来,为了获得共享资源,进程需要执⾏下列操作:
  (1)测试控制该资源的信号量;
  (2)若此信号量的值为正,则允许进⾏使⽤该资源,进程将进号量减1;
  (3)若此信号量为0,则该资源⽬前不可⽤,进程进⼊睡眠状态,直⾄信号量值⼤于0,进程被唤醒,转⼊步骤(1);
  (4)当进程不再使⽤⼀个信号量控制的资源时,信号量值加1,如果此时有进程正在睡眠等待此信号量,则唤醒此进程。
套接字通信并不为Linux所专有,在所有提供了TCP/IP协议栈的操作系统中⼏乎都提供了socket,⽽所有这样操作系统,对套接字的编程⽅法⼏乎是完全⼀样的
同步机制与进程间通信机制⽐较
三、进程/线程同步机制与进程间通信机制⽐较
很明显2者有类似,但是差别很⼤
同步主要是临界区、互斥、信号量、事件
进程间通信是管道、内存共享、消息队列、信号量、socket
共通之处是,信号量和消息(事件)
⼩结:
进程互斥、同步与通信的关系:进程竞争资源时要实施互斥,互斥是⼀种特殊的同步,实质上需要解决好进程同步问题,进程同步是⼀种进程通信,由此看来,进程互斥、同步都可以看做进程的通信;
信号量是进程同步与互斥的常⽤⽅法,也可以作为低级的进程通信⽅法,⽤于传递控制信号;
管道与管程是不同的,管程是进程同步的⽅式,⽽管道则是进程通信的⽅式;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。