进程间通信机制的分析与比较.ppt

上传人:sh****n 文档编号:7469649 上传时间:2020-03-21 格式:PPT 页数:49 大小:4.67MB
返回 下载 相关 举报
进程间通信机制的分析与比较.ppt_第1页
第1页 / 共49页
进程间通信机制的分析与比较.ppt_第2页
第2页 / 共49页
进程间通信机制的分析与比较.ppt_第3页
第3页 / 共49页
点击查看更多>>
资源描述
进程间通信机制的分析与比较 Ver20150302v0 1 为什么进程间需要通信 1 数据传输一个进程需要将它的数据发送给另一个进程 2 资源共享多个进程之间共享同样的资源 3 通知事件一个进程需要向另一个或一组进程发送消息 通知它们发生了某种事件 4 进程控制有些进程希望完全控制另一个进程的执行 如Debug进程 此时控制进程希望能够拦截另一个进程的所有操作 并能够及时知道它的状态改变 分类 进程间通信方式包括 1 管道 pipe 和有名管道 FIFO 2 信号 signal 3 消息队列4 共享内存5 信号量6 套接字 socket 信号 信号通信 信号 signal 机制是Unix系统中最为古老的进程间通信机制 很多条件可以产生一个信号 1 当用户按某些按键时 产生信号 2 硬件异常产生信号 除数为0 无效的存储访问等等 这些情况通常由硬件检测到 将其通知内核 然后内核产生适当的信号通知进程 例如 内核对正访问一个无效存储区的进程产生一个SIGSEGV信号 3 进程用kill函数将信号发送给另一个进程 4 用户可用kill命令将信号发送给其他进程 信号类型 下面是几种常见的信号 SIGHUP 从终端上发出的结束信号SIGINT 来自键盘的中断信号 Ctrl C SIGKILL 该信号结束接收信号的进程SIGTERM kill命令发出的信号SIGCHLD 标识子进程停止或结束的信号SIGSTOP 来自键盘 Ctrl Z 或调试程序的停止执行信号 信号处理 当某信号出现时 将按照下列三种方式中的一种进行处理 1 忽略此信号大多数信号都按照这种方式进行处理 但有两种信号却决不能被忽略 它们是 SIGKILL和SIGSTOP 这两种信号不能被忽略的原因是 它们向超级用户提供了一种终止或停止进程的方法 2 执行用户希望的动作通知内核在某种信号发生时 调用一个用户函数 在用户函数中 执行用户希望的处理 3 执行系统默认动作对大多数信号的系统默认动作是终止该进程 信号通信机制的局限性 这种通信方式主要的局限性就是开销太大 发送进程需要调用系统调用 这时核心会中断接收进程 且要管理它的堆栈 调用处理程序 恢复被中断的接收信号进程等 另外 信号的数量受到限制 并且只能传送有限的信息量 例如不能携带参数等 所以对于复杂的通信操作不适用 管道通信 什么是管道 管道是单向的 先进先出的 它把一个进程的输出和另一个进程的输入连接在一起 一个进程 写进程 在管道的尾部写入数据 另一个进程 读进程 从管道的头部读出数据 数据被一个进程读出后 将被从管道中删除 其它读进程将不能再读到这些数据 管道提供了简单的流控制机制 进程试图读空管道时 进程将阻塞 同样 管道已经满时 进程再试图向管道写入数据 进程将阻塞 样例 ls l less 在这个例子中 ls用于在Unix下列出目录内容 less是一个有搜索功能的交互式的文本分页器 这个管线使得用户可以在列出的目录内容比屏幕长时目录上下翻页 以less退出的管道 或more 这是个相似的标签页工具 与more相比less允许使用者往回卷动 是最常被使用的 这让用户可以阅览尚未显示的大量文字 受可用缓存限制 控制台的屏幕大小 屏幕缓存大小往往有限 不足以一次先输出所有输出内容 也不能自由滚动内容 若少了这工具则这些文字将会卷过终端机而无法阅读到 管道分类 管道包括无名管道和有名管道两种 前者用于父进程和子进程间的通信 后者可用于运行于同一系统中的任意两个进程间的通信 无名管道由pipe 函数创建 intpipe intfiledis 2 当一个管道建立时 它会创建两个文件描述符 filedis 0 用于读管道 filedis 1 用于写管道 管道创建 无名管道由pipe 函数创建 intpipe intfiledis 2 当一个管道建立时 它会创建两个文件描述符 filedis 0 用于读管道 filedis 1 用于写管道有名管道 FIFO intmkfifo constchar pathname mode tmode vpathname FIFO文件名vmode 属性 见文件操作章节 一旦创建了一个FIFO 就可用open打开它 一般的文件访问函数 close read write等 都可用于FIFO 无名管道 include include include includeintmain intpipe fd 2 if pipe pipe fd 0 printf pipecreateerror n return 1 elseprintf pipecreatesuccess n close pipe fd 0 close pipe fd 1 举例 pipe rw c SystemVIPC SystemV SystemV是AT T的第一个商业UNIX版本 UNIXSystemIII 的加强 传统上 SystemV被看作是两种UNIX 风味 之一 另一个是BSD BerkeleySoftwareDistribution 伯克利软件套件 然而 随着一些并不基于这两者代码的UNIX实现的出现 例如Linux和QNX 这一归纳不再准确 但不论如何 像POSIX这样的标准化努力一直在试图减少各种实现之间的不同 消息队列 消息队列就是一个消息的链表 可以把消息看作一个记录 具有特定的格式 进程可以向中按照一定的规则添加新消息 另一些进程则可以从消息队列中读走消息 和信号相比 消息队列能够传递更多的信息 与管道相比 消息队列提供了有格式的数据 这可以减少开发人员的工作量 信号量 信号量 又名 信号灯 与其他进程间通信方式不大相同 主要用途是保护临界资源 进程可以根据它判定是否能够访问某些共享资源 除了用于访问控制外 还可用于进程同步 分类 二值信号灯 信号灯的值只能取0或1 类似于互斥锁 但两者有不同 信号灯强调共享资源 只要共享资源可用 其他进程同样可以修改信号灯的值 互斥锁更强调进程 占用资源的进程使用完资源后 必须由进程本身来解锁 计数信号灯 信号灯的值可以取任意非负值 共享内存 共享内存 共享内存是被多个进程共享的一部分物理内存 共享内存是进程间共享数据的一种最快的方法 一个进程向共享内存区域写入了数据 共享这个内存区域的所有进程就可以立刻看到其中的内容 共享内存实现步骤 一 创建共享内存 使用shmget函数 二 映射共享内存 将这段创建的共享内存映射到具体的进程空间去 使用shmat函数 创建 intshmget key tkey intsize intshmflg key标识共享内存的键值 0 IPC PRIVATE 当key的取值为IPC PRIVATE 则函数shmget 将创建一块新的共享内存 如果key的取值为0 而参数shmflg中又设置IPC PRIVATE这个标志 则同样会创建一块新的共享内存 返回值 如果成功 返回共享内存标识符 如果失败 返回 1 映射 intshmat intshmid char shmaddr intflag 参数 shmid shmget函数返回的共享存储标识符flag 决定以什么方式来确定映射的地址 通常为0 返回值 如果成功 则返回共享内存映射到进程中的地址 如果失败 则返回 1 删除 当一个进程不再需要共享内存时 需要把它从进程地址空间中脱离 intshmdt char shmaddr
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!