-
2021-04-01 20:22:12
进程通信的类型
进程通信类型包括低级通信和高级通信类型。
进程通信指进程之间的信息交换,进程同步所交换的信息量少,称为低级通信。
如:信号量机制是有效的同步工具,但作为通信工具,不够理想。
缺点:(1)只能传递状态和整数值(控制信息),传送信息量小。(2)进程同步的细节由程序员实现,编程复杂。
高级进程通信是指用户可直接利用操作系统所提供的一组通信命令,高效传送大量数据的一种通信方式。
优点:其隐藏了进程通信的实现细节,减少了编程的复杂性。
高级通信机制可归结为三类:
1.共享存储器系统
(1)基于共享数据结构的通信方式
基于共享数据结构的通信方式,是指多个进程共用某些数据结构,实现进程间的信息交换。如生产者消费者问题中的有界缓冲区,只适合传输少量数据。
(2)基于共享存储区的通信方式
基于共享存储区的通信方式,是指在存储器中划出一个共享存储区,多个进程可通过对共享存储区中数据的读写,来实现通信。如复制粘贴操作,可以传输大量数据。
在UNIX中,通过不同的命令对共享存储区进行操作。
(1)创建或打开共享存储区:依据用户给出的整数值key,创建新区或打开现有区,返回一个共享存储区ID。
(2)连接共享存储区:连接共享存储区到本进程的地址空间,可以指定虚拟地址或由系统分配,返回共享存储区首地址。
(3)拆除共享存储区连接:拆除共享存储区与本进程地址空间的连接。
(4)共享存储区控制:对共享存储区进行控制。
2.消息传递系统
消息传递系统是应用最广泛的进程通信机制。程序员直接利用操作系统所提供的一组通信命令,以格式化的消息为单位,实现大量数据的传递,隐藏了进程通信的实现细节。
因实现方式的不同分为:
(1)直接通信方式
发送进程利用操作系统所提供的发送命令,直接把消息发送给目标进程。通常,系统提供下面两条通信原语:
send(receiver,message)发送一个消息给接收进程。
receive(sender,message)接收sender发来的消息。
(2)间接通信方式
在间接通信方式中,需要创建信箱;通过信箱进行消息的发送和接收。
信箱的创建和撤销
进程可利用创建信箱原语来建立一个新信箱。创建者进程应给出信箱名字、信箱属性;
信箱属性可分为以下三类:
(1)私用信箱
(2)公用信箱
(3)共享信箱
对于共享信箱,应给出共享者的名字。当进程不再需要读信箱时,可用信箱撤销原语撤销。
消息的发送和接收
send(mailbox,message)将一个消息发送到指定信箱
receive(mailbox,message)从指定信箱中接收一个消息
3.管道通信系统
管道是指用于连接一个读进程和一个写进程,以实现进程通信的一个共享文件,又名pipe文件。
向管道提供输入的发送进程,以字符流形式将大量的数据送入管道;而接受管道输出的接收过程,则从管道中接收数据。
由于发送进程和接收进程是利用管道进行通信的,故又称为管道通信。
UNIX管道
(1)通过pipe系统调用创建无名管道,得到两个文件描述符,分别用于写和读。
int pipe(int fildes[2]);
(2) 可通过mknod系统调用建立命名管道,
int mknod(const char *path, mode_ t mode, dev_ t dev)
消息传递系统实现中的若干问题
1.通信链路
根据通信链路的连接方法,又可把通信链路分为两类:
①点-点连接通信链路,一条链路只连接两个结点(进程)
②多点连接链路,用一条链路连接多个(n>2)结点(进程)。
根据通信方式的不同,则又可把链路分成两种:
①单向通信链路,只允许发送进程向接收进程发送消息
②双向链路,既允许由进程A向进程B发送消息,也允许进程B同时
向进程A发送消息
2.消息格式
消息格式分成消息头和正文两部分。
消息头包括消息在传输时所需要的控制信息,如源进程名、
目标进程名、消息长度、消息类型、消息编号、发送日期时间等;
正文是发送进程所发送的数据。
消息采用定长消息格式、不定长消息格式两种方式。
(1)采用比较短的定长消息格式,减少了对消息的处理和存储开销。
可用于办公自动化系统中;但这对要发送较长消息的用户是不方便的。
(2)不定长的消息格式,即进程所发送消息的长度是可变的。系统在
处理和存储变长消息时,须付出更多的开销,但方便了用户。
这两种消息格式各有其优缺点,在很多系统中同时都使用的。
3.进程同步方式
(1) 发送进程阻塞、接收进程阻塞。
发送进程和接收进程之间无缓冲,且进程之间紧密同步时,两进程平时处于阻塞状态,直到有消息传递时。
(2)发送进程不阻塞、接收进程阻塞。
发送进程可以发送多个消息,接收进程平时阻塞,直到发送进
程发来消息时被唤醒。
如:打印进程平时处于阻塞状态,直到发送进程发来打印消息
时被唤醒;处理完后,若无新请求,又阻塞。
(3)发送进程和接收进程均不阻塞。
这是常见的进程同步形式。发送进程和接收进程都忙于自己
的事情,仅当发生某事件无法继续执行时才阻塞。
如:多缓冲区的生产者消费者问题;只有缓冲区满时,生产
者才阻塞:只有缓冲区空时,消费者才阻塞。
消息缓冲队列通信机制
1.消息缓冲队列通信机制中的数据结构
(1) 消息缓冲区。在消息缓冲队列通信方式中,主要利用的数据结构是
消息缓冲区。它可描述如下:
type message buffer=record
sender;发送者进程标识符
size;消息长度
text;消息正文
next;指向下一个消息缓冲区的指针
end
(2) PCB中有关通信的数据项。
PCB中应增加的数据项可描述如下:
type processcontrol block=record
…
mq;消息队列队首指针
mutex;消息队列互斥信号量
sm;消息队列资源信号量
end
2.发送原语
(1) 发送进程先在自己的内存空间,设置一发送区a,把待发送的消息正文、发送进程标识符、消息长度等信息填入其中,然后调用发送原语,把消息发送给接收进程。
(2)发送原语根据发送区a中所设置的消息长度a. size来申请一 缓冲区i,把发送区a中的信息复制到缓冲区i中。
(3)先获得接收进程的内部标识符j,然后将i挂在j. mq上。
3.接收原语
接收进程调用接收原语receive (b),从自己的消息队列mq
中摘下第一个消息缓冲区i,并将其中的数据复制到以b为首址的
指定消息接收区内。更多相关内容 -
进程通信和线程详解
2022-02-11 21:51:052.6 进程通信 进程通信:指进程之间的信息交换 低级通信:进程间仅交换一些状态和少量数据。如:进程之间的互斥与同步2.6 进程通信
- 进程通信:指进程之间的信息交换
- 低级通信:进程间仅交换一些状态和少量数据。如:进程之间的互斥与同步
信号量机制作为通信工具的缺点:
- 1、效率低
- 2、通信对用户不透明
高级通信:进程间可交换大量数据
- 用户可直接利用操作系统提供的一组通信命令,高效地传送大量数据的一组通信方式。
- 操作系统隐藏了进程通信的细节,对用户透明,减少了通信程序编制上的复杂性。
进程通信(高级通信)
- 一、进程通信的类型
- 二、消息传递通信的实现方法
- 三、消息传递系统实现中的若干问题
- 四、消息缓冲队列通信机制
一、进程通信的类型
高级通信机制可归结为三大类:
- 共享存储器系统
- 消息传递系统
- 管道通信系统
1、共享存储器系统
相互通信的进程间共享某些数据结构或共享存储区,通过这些空间进行通信。
-
基于共享数据结构的通信方式(低级通信)
进程公用某些数据结构,借以实现诸进程间的信息交换
实现:
公用数据结构的设置及对进程间同步的处理,都是程序员的职责。
操作系统–提供共享存储器
特点:低效。只适合传递相对少量的数据。 -
基于共享存储区的通信方式
在存储区中划出一块共享存储区,诸进程可通过对共享存储区中数据的读或者写来实现通信。
2、消息传递系统
- 进程间的数据交换,以格式化的消息为单位。
- 程序员直接利用系统提供的一组通信命令(原语)进行通信。
- 例:计算机网络:网络报文
3、管道通信
二、消息传递通信的实现方法
1、利用直接通信原语解决生产者-消费者问题
当生产者生产处一个商品(消息)后,便用send原语将消息发送给消费者进程;而消费者进程则利用receive原语来得到一个消息。若消息尚未产生出来,消费者必须等待,直至生产者进程将消息发送过来。
2、间接通信------通过信箱通信
- 信箱用来暂存发送进程发送给目标进程的消息,接收进程则从信箱中取出发送给自己的消息。
- 消息在信箱中可安全保存,只允许核准的目标用户随时读取
- 利用信箱方式,既可实时通信,又可非实时通信。
- 信箱可由操作系统创建,也可由用户进程创建,创建者是信箱的拥有者。
信箱分类:
私用信箱 用户进程自己创建 单向 公用信箱 操作系统创建 双向 共享信箱 某个进程创建
公用信箱与共享信箱的区别:创建者不同。
三、消息传递系统实现中的若干问题
1、通信链路
分类:
(1)根据通信链路的建立方式:
- 显式连接:先用“建立连接”命令(原语)建立一条通信链路;进行通信;然后用显式方式拆除链路。用于计算机网络。
- 隐式连接:发送进程无须明确提出建立链路的要求,直接利用系统提供的发送命令(原语),系统会自动地为之建立一条链路。用于单机系统。
2、消息的格式
- 单机系统环境:环境相同,消息格式简单
- 计算机网络环境:环境不同,消息的传输距离很远消息格式也比较复杂。
3、进程同步方式
在进程之间进行通信时,辅以进程同步机制,使诸进程间能协调通信。
发送进程或接收进程在完成消息的发送或接收后,都存在两种可能性:进程或者继续发送(接收)或者阻塞。
发送进程阻塞、接收进程阻塞 (紧密同步 没有缓冲区,发送进程发送的数据由接收进程直接接收) 发送进程不阻塞、接收进程阻塞 (发送速度<接收速度) 发送进程和接收进程均不阻塞 (发送速度和接收速度差不多,基本同步)
四、消息缓冲队列通信机制
原理:
(2)PCB中有关通信的数据项
2、发送原语
3、接收原语
2.7 线程的基本概念
线程的引入
1、进程的两个基本属性
(1)进程是一个可以拥有资源的独立单位
(2)进程是一个可以独立调度和分派的基本单位由此使进程成为了能独立运行的基本单位,构成了进程并发执行的基础。
2、程序并发执行所需付出的时空开销
- 进程拥有资源,使进程的创建、撤销和调度要付出较大的时空开销。
- 这就限制了系统中所设置进程的数目,而且进程切换也不宜过于频繁,从而限制了并发程度的进一步提高。
- 因此,将进程的两个属性由系统分开处理,其中第二个属性由线程来实现。
3、线程——作为调度和分配的基本单位
- 轻型实体
- 独立调度和分派的基本单位
- 可并发执行
- 共享进程资源
线程与进程的比较
- 调度的基本单位
在引入线程的OS中,已把线程作为调度和分派的基本单位,因而线程是能独立运行的基本单位。当线程切换时,仅需保存和设置少量寄存器内容,切换代价远低于进程。在同一进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时,必然会引起进程的切换。 - 并发性
在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行,甚至还允许在一个进程中的所有线程都能并发执行。同样,不同进程中的线程也能并发执行。 - 拥有资源
进程可以拥有资源,并作为系统中拥有资源的一个基本单位。然而线程本身并不拥有系统资源,而是仅有一点必不可少的、能保证独立运行的资源。 - 独立性
在同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多。因为要防止进程之间彼此干扰和破坏,每个进程都拥有一个独立的地址空间和其他资源,除了共享全局变量外,不允许其他进程的访问。但是同一进程中的不同线程往往是为了提高并发性以及进行相互之间的合作而创建的,它们共享进程的内存地址空间和资源,如每个线程都可以访问他们所属进程地址空间中的所有地址,如一个线程的堆栈可以被其他线程读写,甚至完全清除。由一个线程打开的文件可以供其他线程读、写。 - 系统开销
线程创建和撤销所付出的开销要远低于进程,在线程切换时,其代价也远低于进程。 - 支持多处理机系统
关于线程的基本状态,就绪、执行与阻塞与进程类似
关于线程的控制块TCB,与PCB类似。
- 线程标识符,为每个线程赋予一个唯一的线程标识符
- 一组寄存器,包括程序寄存器PC,状态寄存器和通用寄存器的内容
- 线程运行状态,用于描述线程正处于何种运行状态
- 优先级,描述线程执行的优先程度
- 线程专有存储区,用于线程切换时存放现场保护信息,和与该线程相关的统计信息等
- 信号屏蔽,对某些信号加以屏蔽
- 堆栈指针,在线程运行时,经常会进行过程调用
线程控制块TCB,用于记录所有用于控制和管理线程的信息。
多线程OS的进程有以下属性
- 进程是一个可拥有资源的基本单位
- 多个线程可并发执行
- 进程已不是可执行的实体
-
进程通信的类型
2016-06-15 23:09:323.5.1 进程通信的类型 1、进程通信的定义 进程之间的信息交换。 2、按进程通信机制发展来分 ◆ 低级进程通信机制 ◇ 少量...3.5.1 进程通信的类型 1、进程通信的定义 进程之间的信息交换。
2、按进程通信机制发展来分 ◇ 少量的信息交换,没有专门的通信机制,如信号量机制(同步和互斥); ◇ 效率低,通信对用户不透明。 大量的信息交换,有专门的通信机制。 ◇ 共享存储器系统(Shared-Memory System) 相互通信的进程共享某些数据结构和共享存储区,进程之间能够通过它们进行通信。 ▲ 基于共享数据结构的通信方式 要求各进程公用某些数据结构,进程通过它们交换信息。效率低,只适于少量数据传递。 ▲ 基于共享存储区的通信方式 在存储器中划出一块共享存储区,各进程通过对共享存储区中的数据进行读或写来实现通信。 ◇ 消息传递系统(Message passing system) 进程间的数据交换以消息(Message—在计算机网络中称为报文)为单位,程序员直接利用系统提供的一组通信命令(原语)来实现通信。能够通过它们进行通信。目前系统中的主要进程通信方式。 不论是单机系统、多机系统,还是计算机网络,消息传递机制都是用得最广泛的一种进程间通信的机制。在消息传递系统中,进程间的数据交换,是以格式化的消息(message)为单位的;在计算机网络中,又把message称为报文。程序员直接利用系统提供的一组通信命令(原语)进行通信。操作系统隐藏了通信的实现细节,大大减化了通信程序编制的复杂性,而获得广泛的应用。消息传递系统的通信方式属于高级通信方式。又因其实现方式的不同而进一步分成直接通信方式和间接通信方式两种。 ▲ 直接通信方式 发送进程直接将消息发送给接收进程,并将其挂在接收进程的消息缓冲队列上。接收进程从消息缓冲队列中取得消息。 ▲ 间接通信方式 发送进程将消息发到某种中间实体(一般称为信箱)中,接收进程从中取得消息。 ◇ 管道(Pipe)通信 所谓“管道”,是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程), 以字符流形式将大量的数据送入管道;而接受管道输出的接收进程(即读进程),则从管道中接收(读)数据。由于发送进程和接收进程是利用管道进行通信的,故又称为管道通信。这种方式首创于UNIX系统,由于它能有效地传送大量数据,因而又被引入到许多其它操作系统中。 为了协调双方的通信,管道机制必须提供以下三方面的协调能力:① 互斥,即当一个进程正在对pipe执行读/写操作时,其它(另一)进程必须等待。 ② 同步,指当写(输入)进程把一定数量(如4 KB)的数据写入pipe,便去睡眠等待, 直到读(输出)进程取走数据后,再把他唤醒。当读进程读一空pipe时,也应睡眠等待,直至写进程将数据写入管道后,才将之唤醒。③ 确定对方是否存在,只有确定了对方已存在时,才能进行通信。 3.5.2 消息传递通信的实现方法 1、直接通信方式 是指发送进程利用OS所提供的发送命令,直接把消息发送给目标进程。此时,要求发送进程和接收进程都以显式方式提供对方的标识符。通常,系统提供下述两条通信命令(原语):
Send(Receiver, message); 发送一个消息给接收进程。 Receive(Sender, message); 接收Sender发来的消息。 如原语Send(P2,m1)表示将消息m1发送给接收进程P2;而原语Receive(P1,m1)则表示接收由P1发来的消息m1。
在某些情况下,接收进程可与多个发送进程通信,因此,它不可能事先指定发送进程。例如,用于提供打印服务的进程,它可以接收来自任何一个进程的“打印请求”消息。对于这样的应用,在接收进程接收消息的原语中的源进程参数,是完成通信后的返回值,接收原语可表示为:
Receive (id, message); 我们还可以利用直接通信原语,来解决生产者-消费者问题。当生产者生产出一个产品(消息)后,便用Send原语将消息发送给消费者进程;而消费者进程则利用Receive原语来得到一个消息。如果消息尚未生产出来,消费者必须等待,直至生产者进程将消息发送过来。生产者-消费者的通信过程可分别描述如下:
repeat … produce an item in nextp; … send(consumer, nextp); until false; repeat receive(producer, nextc); … consume the item in nextc; until false; 2、间接通信方式 进程可利用信箱创建原语来建立一个新信箱。创建者进程应给出信箱名字、信箱属性(公用、私用或共享);对于共享信箱,还应给出共享者的名字。当进程不再需要读信箱时,可用信箱撤消原语将之撤消。
当进程之间要利用信箱进行通信时,必须使用共享信箱,并利用系统提供的下述通信原语进行通信。
Send(mailbox, message); 将一个消息发送到指定信箱 Receive(mailbox, message); 从指定信箱中接收一个消息 信箱可由操作系统创建,也可由用户进程创建,创建者是信箱的拥有者。据此,可把信箱分为以下三类。
◇ 私用信箱 用户进程可为自己建立一个新信箱,并作为该进程的一部分。信箱的拥有者有权从信箱中读取消息,其他用户则只能将自己构成的消息发送到该信箱中。这种私用信箱可采用单向通信链路的信箱来实现。 当拥有该信箱的进程结束时,信箱也随之消失。 ◇ 公用信箱 它由操作系统创建,并提供给系统中的所有核准进程使用。核准进程既可把消息发送到该信箱中,也可从信箱中读取发送给自己的消息。显然,公用信箱应采用双向通信链路的信箱来实现。通常,公用信箱在系统运行期间始终存在。 ◇ 共享信箱 它由某进程创建,在创建时或创建后,指明它是可共享的,同时须指出共享进程(用户)的名字。信箱的拥有者和共享者,都有权从信箱中取走发送给自己的消息。 在利用信箱通信时,在发送进程和接收进程之间,存在以下四种关系:
◇ 一对一关系 这时可为发送进程和接收进程建立一条两者专用的通信链路,使两者之间的交互不受其他进程的干扰。 ◇多对一关系 允许提供服务的进程与多个用户进程之间进行交互,也称为客户/服务器交互(client/server interaction)。 ◇一对多关系 允许一个发送进程与多个接收进程进行交互,使发送进程可用广播方式,向接收者(多个)发送消息。 ◇多对多关系 允许建立一个公用信箱,让多个进程都能向信箱中投递消息;也可从信箱中取走属于自己的消息。 3.5.3 消息传递系统实现中的若干问题 1、通信链路(communication link) ◇ 显式建立链路 ◇ 隐式建立链路 ◇ 按连接方法 ▲ 点—点连接通信链路 一条链路只连接两个结点(进程); ▲ 多点连接链路 指用一条链路连接多个(n>2)结点(进程)。 ◇ 按通信方式 ▲ 单向通信链路 只允许发送进程向接收进程发送消息; ▲ 双向链路 既允许由进程A向进程B发送消息,也允许进程B同时向进程A发送消息。 ◇ 按通信线路的容量 ▲ 无容量通信链路 在通信链路上没有缓冲区,不能暂存任何消息。 ▲ 有容量通信链路 在通信链路中设置了缓冲区,能暂存消息。缓冲区数目愈多,容量越大。 2、消息的格式(Message Format) 3、进程同步方式(Process Synchronous Mode) ◆ 发送进程阻塞、 接收进程阻塞——汇合 ◆ 发送进程不阻塞、 接收进程阻塞 ◆ 发送进程和接收进程均不阻塞 3.5.4 消息缓冲队列通信机制 1、消息缓冲队列通信机制中的数据结构 Struct message buffer { sender; /*发送者进程标识符*/ size; /*消息长度*/ text; /消息正文*/ netxt; /指向下一个消息缓冲区的指针*/ } 在设置消息缓冲队列的同时,还应增加用于对消息队列进行操作和实现同步的信号量,并将它们置入进程的PCB中。
Struct process_control_block { … mq; /*消息队列队首指针*/ mutex; /*消息队列互斥信号量*/ sm; /*消息队列资源信号量*/ … } 2、发送原语与接受原语 发送进程在利用发送原语发送消息之前,应先在自己的内存空间,设置一发送区a,见下图所示,把待发送的消息正文、发送进程标识符、消息长度等信息填入其中,然后调用发送原语,把消息发送给目标(接收)进程。发送原语首先根据发送区a中所设置的消息长度a.size来申请一缓冲区i,接着,把发送区a中的信息复制到缓冲区i中。为了能将i挂在接收进程的消息队列mq上,应先获得接收进程的内部标识符j,然后将i挂在j.mq上。由于该队列属于临界资源,故在执行insert操作的前后,都要执行wait和signal操作。
Send(receiver,a) Receive(b) { getbu(a.size,i); { j=internal name; i.sender=a.sender; wait(j.sm; i.size=a.size; wait(j.mutex); i.text=a.text; remove(j.mq,i); i.next=0; signal(j.mutex); getid(PCB set,receiver,j); b.sender=i.sender; wait(j.mutex); b.size=i.size; insert(j.mq,i); b.text=i.text; signal(j.mutex); } signal(j.sm); 接收原语 } 发送原语 -
进程通信方式总结与盘点
2019-11-20 14:25:23 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只... 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。
首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为:
- 效率低:一次只可操作少量的共享数据,比如生产者消费者问题,生产者一次只可向缓冲池中投放一个消息;
- 通信对用户不透明:OS只为进程提供了共享存储器,而关于进程之间通信所需的共享数据结构的设计、数据的传递、进程的互斥与同步,都必须要有开发者去实现,显然,这对开发者来说很不方便,增加了程序设计的难度和复杂度。
既然是说到了低级进程通信,并且解释了原因,那我们也来看一下高级进程通信的特点:
- 使用方便:这也是针对低级进程通信中的第二点—通信对用户不透明,OS对开发者隐藏了进程通信的具体细节,对于用户来说,只需要使用有OS提供的一组原语(实现高级通信的命令),就可以方便的直接使用并实现进程间的通信。就像我么使用第三方的jar包一样,直接调用封装好的方法即可。
- 高效的传送大量数据:可以通过OS提供的原语快速的传输大量数据。
说完了两种级别的进程通信,下面我们就具体的来看一看进程的通信方式都有哪些。通信机制也是随着OS的发展而不断进步的,目前通信机制可分为四大类:共享存储器系统、管道通信系统、消息传递系统以及客户机-服务器系统。我们依次来进行讲解,对于下面出现的每种通信方式,我们采用序号来进行标记。
共享存储器系统
在共享存储器系统中,相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。因此按照共享内容的不同,可将其分为以下两种类型:
1.基于共享数据结构的通信方式
也称为我们上面讲到的信号量机制,此方式要求诸进程共用某些数据结构,借以实现进程间的信息交换,共享数据结构的一个例子就是存放消息的共享缓冲池,对其的操作需要使用信号量来保证诸进程间同步的进行。
2.基于共享数据区的通信方式
为了传输大量数据,OS在内存中划出一块共享存储区域,诸进程通过该共享区域读或写交换信息,实现通信。数据的形式、位置、访问控制都是由进程来控制的。需要通信的进程在通信前,先向系统申请获得共享存储区的一个分区,并将其附加到自己的地址空间中(如果不添加,访问时会产生地址越界中断,后续的内存管理中进行详细讲解),便可对其中的数据进行正常的读、写,操作完成或者不在需要时,再讲分区归还给共享存储区。也因为其一次可以操作一个分区,并可将大量的数据读取或者写入分区,所以这种方式也属于高级通信。另外因为数据不需要在进程之间复制,所以这是最快的一种进程通信机制。
管道(pipe)通信系统
所谓“管道”是指连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。管道系统可分为两种:
3.无名管道
这是Unix早期的一种通信方式,是半双工通信,只能用于父子进程或兄弟进程间,并且它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
4.命名管道(FIFO)
可以用于在无关进程间交换数据,FIFO也就是先进先出,有路径名与命名管道关联,它以一种特殊设备形式存在于文件系统中,并且可以实现半双工或全双工的通信。FIFO 常用于客户-服务器应用程序中,被作为汇聚点,在客户进程和服务器进程之间传递数据。
消息传递系统
在该机制中,进程不必借助任何共享存储区或数据结构,而是以格式化的消息(message)为单位,将通信的数据封装在消息中,并利用OS提供的一组通信原语,在进程间进行消息传递,完成进程间的数据交换。
该方式隐藏了通信细节,使通信过程对用户透明化,降低了程序设计的复杂性和错误率,这也让它成为当前应用最广泛的一类进程间通信机制;并且该机制可以很好的支持多处理机系统、分布式系统和计算机网络,下面我们按照其实现方式,来分别讲解下消息传递系统:
5.直接通信方式(消息缓冲队列)
直接通信方式,是直接通过原语将消息发送到指定的进程,因此要求放松和接收的进程都必须以显示的方式提供对方的标识符。下面是两个OS提供的两条通信原语:
send(receiver, message); //发送一个消息给接收进程 receive(sender, message); //接收sender发来的消息
下图是一个直接通信方式的示意图,图中可以很清晰的看到进程P1和P2各自发送了一条消息给对方,并从对方那接收了一条消息。
6.间接通信方式(消息队列)
间接通信方式是指发送和接收进程都通过共享中间实体(OS中称为信箱)的方式进行消息的发送和接收,完成进程间的通信。
我们来看下信箱通信的一个示意图,从图中我们可以看到,两个进程通过信箱来进行消息的发送和接收。
我们现在常用的消息队列比如ActiveMQ、RocketMQ、RabbitMQ等,都是间接通信的一种,通过这种共享的中间实体(不一定要在当前主机的内存中),可以实现进程间的通信,并且可以很容易的实现不同主机上的进程通信。
客户机-服务器系统
讲到客户机-服务器系统,大家可能都会想到C/S架构,想到的可能是QQ或者WinForm等应用,但是C/S模式是一个逻辑上的概念,在进程通信中,发起请求的进程为客户机,进行响应的进程为服务器,在客户机-服务器系统中,除了客户机和服务器,还有用与连接所有客户机和服务器的网络系统。在网络环境的各种应用领域,客户机-服务器系统已经成为当前主流的通信机制。
其主要的方法有三类:套接字、远程过程调用和远程方法调用。
7.套接字(Socket)
说起套接字大家应该都比较熟悉,ip+port,可以定位到哪个主机下的哪个进程,这样就可以对其进行请求,这个就是网络套接字。另一种套接字是文件套接字,基于本地文件系统实现的,一个套接字关联到一个特殊文件,通信双放通过这个文件进行读写实现通信,其原理类似管道。
套接字的优势就在于,他不仅适用于同一台计算机内部的进程通信,也适用于网络环境中不同计算机间的进程通信;可以保证通信双方逻辑链路的唯一性(ip+port对ip+port可以保证逻辑链路唯一),并与实现数据传输的并发服务;隐藏了通信设施及实现细节,采用统一的接口进行处理。
8.远程过程调用和远程方法调用(RPC)
远程过程调用RPC(Remote Procedure Call)是一个通信协议,用于通过网络连接的系统。该协议允许运行于一台主机(本地)系统上的进程调用另一台主机(远程)系统上的进程,而对开发人员表现为常规的过程调用,无须额外的为此编程。如果设计的软件采用面向对象编程,也可称之为远程方法调用。
总结
最后,我们对这几种通信方式进行一个总结,其中的某几种通信方式,被别的博主同一成了一个,比如消息传递系统中的直接通信和间接通信,统称为消息队列,这里不做正确性的评价,本文是把所有的通信机制大的方向做一个总结,具体的实现方式是有很多种的,故不做一一叙述。
1.共享数据结构(信号量):仅适用于传递相对少量的数据,通信效率低,属于低级通信;
2.共享存储区:允许多个进程共享一个给定的存储区,可以从中申请缓存区。因为数据不需要在进程之间复制,所以这是最快的一种通信机制,但要对诸进程的访问进行同步控制;
3.无名管道:半双工、速度慢,容量有限,只有父子进程能通信;
4.命名管道(FIFO):任何进程间都能通讯,但速度慢 ,可以实现半双工或全双工通信;
5.消息缓冲队列:直接使用OS提供的原语,隐藏通信细节,需要知道接收进程的id和发送进程的id;
6.消息队列:直接通过共享信箱或者队列,两个进程可以实现通信,可实现实时和非实时通信,两种消息传递系统容量都容易收到系统的限制;
7.Socket:可以用于本机和不同主机间的进程通信,隐藏通信细节;
8.RPC:无须额外编程,隐藏通信细节。
又到了分隔线以下,本文到此就结束了,本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,如果有什么错误,还请批评指正。对其中有什么疑惑的,可以评论区留言,欢迎你的留言与讨论;另外原创不易,如果本文对你有所帮助,还请留下个赞,以表支持。
如有兴趣,还可以查看我的其他几篇博客,都是OS的干货(目录),喜欢的话还请点赞、评论加关注_。
-
操作系统:进程通信-进程之间的信息交换
2020-05-17 13:31:47但是进程之间的信息交换又是必须实现的(例如:在QQ里看到一张有趣的表情包想要分享给微信好友)。为了保证进程间的安全通信,操作系统提供了一些方法: 共享存储 消息传递 管道通信 一、共享存储 操作系统为两个... -
OS 进程的通信方式(进程间的信息交换方式)
2019-09-14 23:15:19在通信进程之间存在一块可以直接访问的共享存储空间,通过对该共享空间进行读/写操作实现信息交换。 注意 用户进程空间一般都是独立的,进程运行期间一般不能访问其他进程的空间,要想让两个用户进程共享空间,... -
Python 多进程及进程间通信
2020-09-03 21:32:33作者:billy 版权声明:著作权归作者所有,商业...进程(Process)是计算机中已运行程序的实体。进程与程序不同,程序本身只是指令、数据及其组织形式的描述,进程才是程序的真正运行实例。 创建进程的常用方式 在 Pyth -
Linux进程间通信
2022-03-28 23:12:32目录进程间通信介绍进程间通信的概念进程间通信目的进程间通信分类进程间通信的本质 进程间通信介绍 进程间通信的概念 进程间通信又称IPC(Inter-Process Communication),指多个进程之间相互通信,交换信息。 进程间... -
操作系统之进程通信:高级通信机制四大类
2021-08-25 21:02:39在进程同步之中,也需要进程间交换一些信息,所以也可以归入进程通信中,但只能称为低级的进程通信。因为进程同步间的消息交换效率低、对用户不透明。 在进程间要传送大量数据的时候,可以使用OS提供的高级通信工具... -
进程间通信和线程间通信
2020-08-18 20:26:22进程间通信 转自 ...而进程则不同,它是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映... -
关于C语言中进程通信的5种方式
2020-07-30 18:10:49Unix/Linux系统中C语言进程通信的5种方式进程通信广义进程通信方式单机环境中常见的进程通信方式管道通信命名管道内存映射信号共享内存 进程通信 操作系统中每个进程地址空间相互独立,进程间通信必须经过内核。 ... -
java进程通信方式
2019-08-26 18:24:43由于内存管理的一些机制,导致两个进程间并不能直接的进行通信(在独立的用户空间),因此我们需要利用一些介质来完成两个进程之间的通信。以下是常用的进程间通信方式。 管道(Pipe):管道是一种半双工的通信方式,... -
Android进程间通信总结
2021-09-06 21:26:37IPC IPC为 (Inter-Process ... 在移动设备上(性能受限制的设备,比如要省电),广泛地使用跨进程通信对通信机制的性能有严格的要求,Binder相对于传统的Socket方式,更加高效。Binder数据拷贝只需要一 -
TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念
2022-03-10 14:33:33TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念 一、单机系统中进程通信方法 进程和进程通信是操作系统中最基本的概念,首先通过回忆操作系统课程中,关于单击系统中进程和进程通信的问题描述: 1)... -
ContentProvider跨进程通信
2022-03-16 16:44:24A进程插入数据到数据库,步骤如下 1.创建数据库表: package com.example.demoa import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper... -
QT间进程通信之共享内存
2013-12-09 15:42:50Qt提供了一种安全的共享内存的实现QSharedMemory,以便在多线程和多进程编程中安全的使用。比如说QQ的聊天的客户端,这里有个个性头象,当点击QQ音乐播放器的时候,启动QQ音乐播放(启动一QQ音乐播放器的进程)这时... -
运行在不同主机上的进程通信
2021-09-04 21:37:13而在计算机网络知识中比较关注的是运行在不同端系统之间的进程通信。在两个不同端系统上的进程,通过计算机网络交换报文而相互通信。发送进程生成并向网络中发送报文;接受进程接受这些报文并可能通过回送报文进行... -
计算机理论/进程间通信
2019-04-20 14:14:45进程间通信(IPC, Inter-Process Communication)是指在不同的进程之间,相互传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)消息队列、信号量、共享存储、socket、streams等… 通过以上所述,... -
进程之间的通信方式
2020-09-03 17:19:07命名管道,可以在不关联的两个进程之间使用,因为它创建了一个类型为管道的设备文件,使用这个设备文件就可以通信。 管道只能承载无格式的字节流 信号 信号是进程之间唯一的异步通信机制,信号的主要来源主要有... -
进程间通信方式有哪些?
2019-05-07 08:56:22进程能够单独运行并且完成一些任务,但是也经常免不了和其他进程传输数据或互相通知消息,即需要进行通信,本文将简单介绍一些进程之间相互通信的技术--进程间通信(InterProcess Communication,IPC)。由于篇幅... -
Python进程间通信
2022-03-07 15:30:02通信方式 进程彼此之间互相隔离,要实现进程间通信(IPC)...需要注意的一点是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态 Queue介绍: ... -
Android跨进程通信Binder机制与AIDL实例
2021-12-03 23:10:34文章目录进程通信1.1 进程空间划分1.2 跨进程通信IPC1.3 Linux跨进程通信1.4 Android进程通信Binder 跨进程通信2.1 Binder简介2.2 Binder驱动2.3 Binder原理AIDL编程Demo3.1 服务端3.2 客户端 在操作系统中,进程与... -
进程通信之三 父进程传参数与子进程返回值
2013-03-21 13:39:15《进程通信之三 父进程传参数与子进程返回值》 ...配套程序。...2.父进程要获取子进程的返回值可以在等待子进程结束后通过GetExitCodeProcess并传入子进程句柄来获取子进程中main或WinMain函数的返回值。 -
进程间通信有哪几种方式?进程间通信的方法详解
2021-10-16 14:54:31进程间通信(IPC,Interprocess communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为... -
操作系统实验--进程间通信
2020-09-27 21:00:28在Linux系统下用signal()函数进行进程间通信,pipe()函数创建管道进行数据传送。 四、源代码 1.软中断通信 #include<unistd.h> #include<stdio.h> #include<signal.h> void waiting(),stop(); int... -
【Android】进程间通信——Binder
2022-04-10 09:54:33当Client端与Server端发送数据时,Client(作为数据发送端)先从自己的进程空间把IPC通信数据copy_from_user拷贝到内核空间,而Server端(作为数据接收端)与内核共享数据,不再需要拷贝数据,而是通过内存地址空间... -
多进程通信
2018-08-18 18:53:54多进程: 首先,先来讲一下fork之后,发生了什么事情...将子进程id返回给父进程的理由是:因为一个进程的子进程可以多于一个,没有一个函数使一个进程可以获得其所有子进程的进程id。对子进程来说,之所以fork返回0... -
操作系统实验一:父子进程通信
2021-05-29 17:25:30操作系统实验一:进程的建立 一、 实验目的: ...设计思路:实验要求在 父子进程 之间实现进程通信,所以可以采用 fork() 函数来通过一个进程创建他的一个子进程。关于父子进程之间通信可以采用 无名 -
Linux进程间通信——管道通信详解
2021-11-25 21:44:00进程间通信:管道引言...在Linux系统中,有时候需要多个进程之间相互协作,共同完成某项任务,进程之间或线程之间有时候需要传递信息,有时候需要同步协调彼此工作,则就会出现进程间通信。 信号也是进程间通信的一种 -
进程中的五种通信方式介绍
2019-03-16 09:10:47进程间通信(InterProcess Communication)是指在不同的进程之间传播或者交换信息。 IPC的方式通常有管道(无名和有名)、消息队列、共享存储、信号量、Socket以及Streams等。 其中Socket和Streams支持不同主机之间...