3.5进程通信 ●并发进程之间的交往本质上是互相交换 信息。有些情况下进程之间交换的信息 量很少,例如仅仅交换某个状态信息 有些情况下进程之间交换大批数据,例 如传送一批信息或整个文件。进程之间 互相交换信息的工作称之为进程通信 IPC (InterProcess Communication) 08:48
08:48 3.5 进程通信 ⚫ 并发进程之间的交往本质上是互相交换 信息。有些情况下进程之间交换的信息 量很少,例如仅仅交换某个状态信息。 有些情况下进程之间交换大批数据,例 如传送一批信息或整个文件。进程之间 互相交换信息的工作称之为进程通信 IPC(InterProcess Communication)
进程间通信的方式包括 通过软中断提供的信号( signal)通信机制 使用信号量及其原语操作(PV、读写锁、管程或 其他操作)控制的共享存储区( shared memory)通 信机制 ●通过管道( pipeline)提供的共享文件( shared file)通信 机制; ●使用信箱和发信/收信原语的消息传递( message passing)通信机制 其中前两种通信方式属于低级通信机制,仅适用 于集中式操作系统。消息传递机制属于高级通信机 制,共享文件通信机制是消息传递机制的变种,这 两种通信机制,既适用于集中式操作系统,又适用 于分布式操作系统。 08:48
08:48 进程间通信的方式包括 ⚫ 通过软中断提供的信号(signal)通信机制; ⚫ 使用信号量及其原语操作(PV、读写锁、管程或 其他操作)控制的共享存储区(shared memory)通 信机制; ⚫ 通过管道(pipeline)提供的共享文件(shared file)通信 机制; ⚫ 使用信箱和发信/收信原语的消息传递(message passing)通信机制。 其中前两种通信方式属于低级通信机制,仅适用 于集中式操作系统。消息传递机制属于高级通信机 制,共享文件通信机制是消息传递机制的变种,这 两种通信机制,既适用于集中式操作系统,又适用 于分布式操作系统
3.5.1信号通信机制 信号机制又称软中断,是一种简单的通信机 制,通过发送一个指定信号来通知进程某个 异常事件发生。 信号不但能从内核发给一个进程,也能由 个进程发给另一个进程。 08:48
08:48 3.5.1 信号通信机制 ⚫ 信号机制又称软中断,是一种简单的通信机 制,通过发送一个指定信号来通知进程某个 异常事件发生。 ⚫ 信号不但能从内核发给一个进程,也能由一 个进程发给另一个进程
Un系统信号多达几十种(不超过32种),主要分成 以下几类 与进程终止相关的信号 SIGCLD、 SIGHUP、 SIGKILI SIGCHLD等,如进程结束、进程杀死子进程, ●与进程例外事件相关的信号 SIGBUS、 SIGSEGV SIGPWR、 SIGFPE等,如进程执行特权指令、写只读区、地 址越界、总线超时,硬件故障; 与进程执行系统调用相关的信号 SIGPIPE、 SIGSYS SIGILL等如进程执行非法系统调用、管道存取错; ●与进程终端交互相关的信号 SIGINT、 SIGQUT等,如进程挂 断终端、用户按 delete键或 break健。 用户进程发信号 SIGTERM、 SIGALRM、 SIGUSR1 SIGUS2等如进程向另一进程发一个信号、要求报警; ●●跟踪进程执行的信号 SIGTRAP等。 08:48
08:48 Unix系统信号多达几十种(不超过32种),主要分成 以下几类: ⚫ ⚫与进程终止相关的信号SIGCLD、SIGHUP、SIGKILL、 SIGCHLD等,如进程结束、进程杀死子进程,; ⚫ ⚫ 与 进 程 例 外 事 件 相 关 的 信 号 SIGBUS、SIGSEGV、 SIGPWR、SIGFPE等,如进程执行特权指令、写只读区、地 址越界、总线超时,硬件故障; ⚫ ⚫与进 程执行系 统调用相 关的信号 SIGPIPE、SIGSYS、 SIGILL等,如进程执行非法系统调用、管道存取错; ⚫ ⚫ 与进程终端交互相关的信号SIGINT、SIGQUT等,如进程挂 断终端、用户按delete键或break健。 ⚫ ⚫ 用 户 进 程 发 信 号 SIGTERM、SIGALRM、SIGUSR1、 SIGUS2等,如进程向另一进程发一个信号、要求报警; ⚫ ⚫ 跟踪进程执行的信号SIGTRAP等
352共享文件通信机制 管道( pipeline)是连接读写进程的一个特 殊文件,允许进程按先进先出方式传送 数据,也能使进程同步执行操作。如下图 所示,发送进程以字符流形式把大量数 据送入管道,接收进程从管道中接收数 据,所以,也叫管道通信。 08:48
08:48 3.5.2 共享文件通信机制` ⚫ 管道(pipeline)是连接读写进程的一个特 殊文件,允许进程按先进先出方式传送 数据,也能使进程同步执行操作。如下图 所示,发送进程以字符流形式把大量数 据送入管道,接收进程从管道中接收数 据,所以,也叫管道通信
●管道的实质是一个共享文件,因此管道 通信基本上可以借助于文件系统原有的 机制实现,包括(管道)文件的创建 打开、关闭和读写。但是,写入进程和 读出进程之间的相互协调单靠文件系统 机制是解决不了的。读写进程相互协调, 必须做到以下三点 08:48
08:48 ⚫ 管道的实质是一个共享文件,因此管道 通信基本上可以借助于文件系统原有的 机制实现,包括(管道)文件的创建、 打开、关闭和读写。但是,写入进程和 读出进程之间的相互协调单靠文件系统 机制是解决不了的。读写进程相互协调, 必须做到以下三点:
●进程对通信机构的使用应该是互斥的,一个进程正在使用 某个管道写入或读出数据时,另一个进程就必须等待。这 点是进程在读写管道之前通过测试文件节点的特征位来保证 的 发送者和接收者双方必须能够知道对方是否存在,如果对 方已经不存在,就没有必要再发送信息。这时会发出 SIGPIPE信号通知进程; ●由于管道长度有限,发送信息和接收信息之间一定要实现正 确的同步关系。管道文件最多只能提供5120字节的缓冲,管道 的长度对 write和read操作会有影响。如果执行一次写操作,且 管道有足够空间,那么, write把数据写入管道后立即返回;如果 这次操作会引起管道溢出,则本次 write操作必须暂停,直到其 他进程从管道中读出数据,使管道有空间为止,这叫 write阻塞 解决此问题的办法是:把数据进行切分每次最多5120字节,写 完后该进程睡眠,直到读进程把管道中的数据取走,并判别有进 程等待时应唤醒他,以便继续写下一批数据。反之,当读进程读 空管道时,要出现读阻塞,读进程应睡眠,直到写进程唤醒他 08:48
08:48 ⚫ ⚫进程对通信机构的使用应该是互斥的,一个进程正在使用 某个管道写入或读出数据时,另一个进程就必须等待。这一 点是进程在读写管道之前,通过测试文件i节点的特征位来保证 的; ⚫ ⚫发送者和接收者双方必须能够知道对方是否存在,如果对 方 已经 不存 在, 就没 有必 要再 发送 信息 。这 时会发 出 SIGPIPE信号通知进程; ⚫ ⚫由于管道长度有限,发送信息和接收信息之间一定要实现正 确的同步关系。管道文件最多只能提供5120字节的缓冲,管道 的长度对write和read操作会有影响。如果执行一次写操作,且 管道有足够空间,那么,write把数据写入管道后立即返回;如果 这次操作会引起管道溢出,则本次write操作必须暂停,直到其 他进程从管道中读出数据,使管道有空间为止,这叫write阻塞。 解决此问题的办法是:把数据进行切分,每次最多5120字节,写 完后该进程睡眠,直到读进程把管道中的数据取走,并判别有进 程等待时应唤醒他,以便继续写下一批数据。反之,当读进程读 空管道时,要出现读阻塞,读进程应睡眠, 直到写进程唤醒他
共享文件
08:48 共享文件
UNIX中,管道的定义如下: int pipe(files) int files 21; 08:48
08:48 UNIX中,管道的定义如下: int pipe(files); int files[2];
父子进程通过管道传送信息的一个例子: ●# include< stdio.h #define msgsize 16 ●char*msg1=” hello, world#1”; ●char*msg2=”helo, world#2”; ● char msg3=”hell, world#3”; 08:48
08:48 父子进程通过管道传送信息的一个例子: ⚫ #include ⚫ #define MSGSIZE 16 ⚫ char *msg1=”hello,world#1”; ⚫ char *msg2=”hello,world#2”; ⚫ char *msg3=”hello,world#3”;