标签:html 停止 消息格式 size str 多个 流程 写入 基本概念
这篇博客写得很详细https://www.cnblogs.com/UnfriendlyARM/p/10148520.html
一、进程通信基本概念(IPC,Inter-Process Communication)
1. 定义:进程通信时进程进行通信和同步的机制
2. IPC提供两个基本操作
3. 进程通信流程
4. 进程链路特征
5. 通信方式
分为直接通信和间接通信
5.1 直接通信
(1)进程必须正确地命名对方
(2)通信链路的属性
5.2 间接通信
(1)通过操作系统维护的消息队列实现进程间的消息接受和发送
(2)通信链路的属性
(3)通信流程
(4)基本通信操作
6. 阻塞与非阻塞通信
进程通信可划分为阻塞(同步)或非阻塞(异步)
(1) 阻塞通信
(2)非阻塞通信
7. 通信链路缓冲
进程发送的消息在链路上可能有3种缓冲方式
二、信号
1. 定义:
信号是进程间的软件中断通知和处理机制,如:SIGKILL,SIGSTOP,SIGCONT等。
2. 信号的接收处理
3. 信号的实现
4. 不足:传送的信息量小,只有一个信号类型
5. 信号使用示例
二、管道
1. 定义:进程间基于内存文件的通信机制
进程不知道(或不关心)的另一端:可能从键盘、文件、程序读取;可能写入到终端、文件、程序。
2. 管道的数据结构图
3. 与管道相关的系统调用
3. 管道示例
三、消息队列
1. 定义:消息队列是由操作系统维护的以字节序列为基本单位的间接通信机制。每个消息(Message)是一个字节序列,相同标识的消息组成按先进先出顺序组成一个消息队列(Message Queues)
信号量和PV操作可以实现进程的同步和互斥,但是这种低级通信方式并不方便,而且局限性较大。当不同进程之间需要交换更大量的信息时,甚至是不同机器之间的不同进程需要进行通信时,就需要引入更高级的通信方式——消息队列机制。
消息队列的难点在于,发送方不能直接将要发送的数据复制进接收方的存储区,这时就需要开辟一个共享存储区域,可供双方对这个存储区进行读写操作。这个共享区域就叫做信箱。每个信箱都有一个特殊的标识符。每个信箱都有自己特定的信箱容量、消息格式等。信箱被分为若干个分区,一个分区存放一条消息。
原语具有不可分割性,执行过程不允许被中断。
(1)发送消息原语(send):如果信箱就绪(信箱还未存满),则向当前信箱指针指向的分区存入一条消息,否则返回状态信息(非阻塞式)或者等待信箱就绪(阻塞式)。
(2)接收消息原语(receive):如果信箱就绪(信箱中有消息),则从当前信箱指针指向的分区读取一条消息,否则返回状态信息(非阻塞式)或者等待信箱就绪(阻塞式)。
注:在信箱非空的情况下,每读取一次信箱,信箱中的消息就会少一条,直到信箱变为空状态。
(1)如果一个进程要和另外一个进行通信,则这两个进程需要开辟一个共享存储区(信箱);
(2)消息通信机制也可以用在一对多通信上,一个server和n个client通信时,那么server就和这n个client各建立一个共享存储区;
(3)一个进程可以随时向信箱中存储消息,当然一个进程也可以随时从信箱中读取一条消息。
采用消息队列通信机制,可以实现进程间的同步操作。在介绍同步功能之前,需要先介绍两个名词,阻塞式原语和非阻塞式原语。阻塞式原语是指某进程执行一个指令时,如果当前环境不满足执行条件,则该进程会在此停止,等待系统环境满足执行条件,然后继续向下执行。非阻塞式原语是指某进程执行一个指令时,如果当前环境不满足执行条件,则立即返回一个状态信息,并继续执行接下来的指令。
(1)非阻塞式发送方+阻塞式接收方:两个进程开始运行后,接收方会进入等待状态,等待发送方给接收方发送一条消息,直到接收到相应的消息后,接收方进程才会继续向下执行。
(2)非阻塞式发送方+非阻塞式接收方:发送方和接收方共享一个信箱,发送方随时可以向信箱中存入一条消息,接收方可以随时从信箱读取一条消息。当信箱满时,发送方进入阻塞状态;当信箱空时,接收方进入阻塞状态。
7. 消息队列的系统调用
msgget()函数的作用是创建一个新的或打开一个已经存在的消息队列,此消息队列与key相对应。函数格式为
int msgget(key_t key, int msgflag);
参数key是用户指定的消息队列的名称;参数flag是消息队列状态标志,其可能的值有:IPC_CREAT(创建新的消息队列)、IPC_EXCL(与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误)、 IPC_NOWAIT(读写消息队列要求无法满足时,不阻塞);返回值是创建的消息队列标识符,如果创建失败则则返回-1。函数调用方法是:
msgget(key,IPC_CREAT|0777);
0777是存取控制符,表示任意用户可读、可写、可执行。如果执行成功,则返回消息队列的ID号(注意和队列KEY值作区分,这二者不同),否则返回-1。
msgsnd()函数的作用是将一个新的消息写入队列,msgrcv()函数的作用是从消息队列读取一个消息。函数格式是
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
参数msqid是消息队列的ID号;参数msgp是指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下
struct msgbuf {
long mtype; /* 消息类型,必须 > 0 */
char mtext[1]; /* 消息文本 */
};
参数msgsz是消息大小;参数msgtyp是消息类型(大于0则返回其类型为msgtyp的第一个消息,等于0则返回队列的最早的一个消息,小于0则返回其类型小于或等于mtype参数的绝对值的最小的一个消息),msgflag这个参数依然是是控制函数行为的标志(取值0,表示忽略,那么进程将被阻塞直到函数可以从队列中得到符合条件为止;取值IPC_NOWAIT,表示如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程)。
msgctl()函数的作用是对相应消息队列进程控制操作。函数格式是
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
参数msqid表示消息队列ID号;cmd表示对队列的控制操作,其可能值有IPC_STAT(读取消息队列的数据结构msqid_ds,并将其存储在buf指定的地址中)、IPC_SET(设置消息队列的数据结构msqid_ds中的ipc_perm元素的值,这个值取自buf参数)、IPC_RMID(从系统内核中移走消息队列);参数*buf用来表示队列的当前状态,可以设置为空。
四、共享内存
1. 定义
共享内存是把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制。对于进程来说,每个进程都有私有内存地址空间,每个进程的内存地址空间需要明确设置共享内存段。对于线程来说,同一进程中的线程总是共享相同的内存地址。
2. 优点:快送、方便地共享数据
3. 不足:必须用额外的同步机制来协调数据访问
4. 共享内存的实现
5. 共享内存系统调用
标签:html 停止 消息格式 size str 多个 流程 写入 基本概念
原文地址:https://www.cnblogs.com/cjsword/p/12253978.html