网站大量收购独家精品文档,联系QQ:2885784924

实验六进程间通信概要.ppt

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验六进程间通信概要

实验六 进程间通信 实验六 进程间通信 预备知识 Linux进程间通信 进程软中断通信 管道和消息队列 实验指导 软中断通信函数 管道通信的使用 消息队列的应用 实验目的、内容 1.1 Linux进程间通信 实现数据传输、数据共享、事件通知、资源共享和进程控制等 Linux的进程间通信方式 管道(Pipe)和有名管道(Named Pipe) 信号(Signal) 消息(Message)队列 共享内存 信号量(Semaphore) 套接口(Socket) 1.1 Linux进程间通信—管道和有名管道 管道用于具有亲缘关系进程间的通信 管道是半双工的,数据只能单向流动(双方通信需建立两个管道) 管道只能用于父子进程或兄弟进程之间 管道对于管道两端的进程而言就是一个文件,并单独构成一种文件系统,存在于内存中 写管道的内容添加在管道缓冲区的末尾,读管道则从缓冲区头部读出 有名管道在普通管道具备功能基础上,通过给管道命名的方法变成管道文件,允许无亲缘关系进程间通过访问管道文件进行通信 1.1 Linux进程间通信—信号 在一个或多个进程之间传递异步信号 类似于Windows下的消息,用于通知接收进程有某种事件发生 当某个信号出现时,系统有三种处理方式: 忽略信号:大多数信号使用,但SIGKIL和SIGSTOP不能被忽略 捕捉信号:通知内核在某种信号发生时,调用一个用户函数 执行系统默认动作:异常终止(abort)、退出(exit)、忽略(ignore)、停止(stop)或继续(continue) 1.1 Linux进程间通信—消息队列 也叫报文队列,是消息的链接表 有两种类型的消息队列:POSIX消息队列和系统V消息队列 运行于同一台机器上的进程间通信,与管道类似 消息内存可根据需要自行定义,可忽略信号承载信息量少、管道只能承载无格式字节流以及缓冲区大小受限等缺点 可以用流管道或套接口方式取代 1.1 Linux进程间通信—共享内存 在系统内核分配一块缓冲区,多个进程都可以访问该缓冲区 效率高:进程可以直接读写内存,不需任何数据拷贝,避免了内核空间与用户空间的切换 同步和协议都不受程序员控制,必须确保将句柄传递给子进程和线程,需与其它通信机制结合使用,来达到进程间的同步及互斥 多用于存储应用程序的配置信息 1.1 Linux进程间通信—信号量 也称信号灯,用来协调不同进程间的数据对象 提供对进程间共享资源访问控制的手段,用来保护共享资源 还可用于进程间及同一进程不同线程间的进程同步 两种类型 二值信号灯:取值只能为0或1,类似于互斥锁 计算信号灯:取值可以为任意非负值(受内核本身约束) 1.1 Linux进程间通信—套接口 也称套接字,用于不同机器之间的进程间通信 通信域是用来说明套接口通信的协议,创建套接口时要指明它的通信域 常见的有:UNIX域套接口、网际通信域 系统的网络编程接口,以文件的形式实现(属于sockfs特殊文件系统) 1.2 进程软中断通信 即信号,提供一种简单的处理异步事件的方法 信号机制是对中断机制的一种模拟,又称为软中断 信号与中断的相似点 采用了相同的异步通信方式 当检测出有信号或中断请求时,暂停正在执行的程序而转去执行相应的处理程序 处理完毕后返回到原来的断点 对信号或中断可以进行屏蔽 信号与中断的区别 中断有优先级,而信号没有优先级,所有的信号都是平等的 信号处理程序在用户态下运行,而中断处理程序在核心态下运行 中断响应是及时的,而信号响应通常都有较大的时间延迟 1.2 进程软中断通信—信号机制的功能 发送信号 发送进程把信号送到指定进程信号域的某一位上,如目标进程正在一个可被中断的优先级上睡眠,核心便将其唤醒 预置对信号的处理方式 进程处于核心态时,即使受到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号 收受信号的进程按事先规定完成对相应事件的处理 1.3 管道和消息队列—无名管道 int pipe(int fd[2]);一般的文件I/O函数都可用 读数据规则 若管道的写端不存在,读出字节数为0 写端存在时,若请求字节数大于PIPE_BUF,则返回管道中的现有数据;否则返回请求的字节数 写入规则 不保证写入的原子性,若有空闲区域,写进程就会试图写入管道,若读进程不读走数据,则写操作将一直阻塞 管道读端存在时,写入数据才有意义;否则,写进程将收到内核传来的SIFPIP信号,应用程序处理该信号或忽略(默认终止应用程序) 1.3 管道和消息队列—命名管道(1) int mkfifo(const char * pathname, mode t_mode); 增加了打开操作: 若当前打开操作是为读而打开,若已有进程为写而打开,则打开成功;否则,阻塞直到有相应进程为写而打开(设置了阻

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档