第3章 进程同步与通信2_第1页
第3章 进程同步与通信2_第2页
第3章 进程同步与通信2_第3页
第3章 进程同步与通信2_第4页
第3章 进程同步与通信2_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3 5进程通信 进程通信是指进程之间的信息交换 进程互斥与同步交换的信息量较少且效率较低 因此称这两种进程通信方式为低级进程通信方式 相应地也将P V原语称为两条低级进程通信原语 高级进程通信方式是指进程之间以较高的效率传送大量数据 3 5 1进程通信的类型 高级进程通信方式可分为三大类 共享存储器系统消息传递系统管道通信系统或共享文件系统 共享存储器系统 相互通信的进程共享某些数据结构或共享存储区 基于共享数据结构的通信方式 诸进程通过公用某些数据结构交换信息 如生产者 消费者问题 基于共享存储区的通信方式 在存储器中划出一块共享存储区 诸进程可通过对共享存储区进行读或写来实现通信 包括建立共享存储区 附接及断接 消息传递系统 在消息传递系统中 进程间的数据交换以消息为单位 程序员直接利用系统提供的一组通信命令 原语 来实现通信 消息传递系统因其实现方式不同可分为 直接通信方式 发送进程将消息发送到接收进程 并将其挂在接收进程的消息队列上 接收进程从消息队列上取消息 间接通信方式 发送进程将消息发送到信箱 接收进程从信箱中取消息 管道 共享文件 通信 管道 共享文件 通过连接读进程和写进程的共享文件来实现读写进程之间通信 3 5 2消息传递系统 消息传递系统是实现进程通信的常用方式 这种通信方式既可以实现进程间的信息交换 也可以实现进程间的同步 1 消息缓冲通信 消息缓冲通信是直接通信方式的一种实现 消息缓冲队列通信机制中的数据结构 所谓消息是指一组信息 消息缓冲区的数据结构如下 structmessage sender 发送者进程标识符size 消息长度text 消息正文next 指向下一个消息缓冲区的指针 在PCB中还应增加 structPCB mq 消息队列队首指针mutex 消息队列互斥信号量sm 消息队列资源信号量 消息缓冲通信的实现思想 为了实现消息通信 发送进程应先在自己的工作区中设置一个发送区 把欲发送的消息填入其中 然后再用发送原语将其发送出去 接收进程调用接收原语从自己的消息缓冲队列中摘下第一个消息 并将其内容复制到自己的消息接收区内 send B a sender Asize 6text Hello 两个进程进行通信的过程 进程A PCB B 进程B receive b sender Asize 6text Hello mqmutexsm sender Asize 6text Hello next 0 a b 第一个消息缓冲区 发送原语描述 voidsend receiver a receiver为接收者标识号 a为发送区首址 向系统申请一个消息缓冲区i 将发送区a中的消息复制到i中 获得接收进程的内部标识j P mutex 把消息插入j的消息队列上 V mutex V sm 接收原语描述 voidreceive b b为接收区首址 获得接收进程内部标识j P sm P mutex 将消息队列中的第一个消息移出 V mutex 将消息复制到接收区b 2 信箱通信 信箱通信方式中 进程之间通信需要通过共享数据结构实体 信箱来进行 信箱是一种数据结构 其中存放信件 信箱逻辑上分成信箱头和信箱体两部分 信箱头中存放有关信箱的描述 信箱体由若干格子组成 每格存放一个信件 格子的数目和大小在创建信箱时确定 信箱通信原语 信箱通信原语包括 信箱的创建和撤消 消息的发送和接收 Send mailbox message Receive mailbox message 消息通信中的同步问题1 进程间的消息通信存在同步关系对于发送进程来说 它在执行发送原语后有两种可能选择 发送进程阻塞 直到这个消息被接收进程接收到 这种发送称为阻塞发送 发送进程不阻塞 继续执行 这种发送称为非阻塞发送 消息通信中的同步问题2 对于一个接收进程来说 在执行接收原语后也有两种可能选择 如果一个消息在接收原语执行之前已经发送 则该消息被接收进程接收 接收进程继续执行 如果没有正在等待的消息 则该进程阻塞直到有消息到达 或者该进程继续执行 放弃接收的努力 前者称为阻塞接收 后者称为非阻塞接收 消息通信中的同步问题3 根据发送进程和接收进程采取方式的不同 通常有三种常用的组合方式 非阻塞发送 阻塞接收 非阻塞发送 非阻塞接收 阻塞发送 阻塞接收 3 管道 使用管道通信时 基本上采用文件系统的原有机制实现 包括创建 打开 关闭 读写等 管道机制应提供以下三方面的协调能力 互斥 诸进程互斥读写管道同步 管道空 满情况处理存在 确定对方是否存在 管道通信示意图1 初始时 其长度为4 系统将管道看成一个循环队列 按先进先出的方式读写 写入字符E后 管道长度为5 管道通信示意图2 读一个字符后 管道长度为4 若管道容量为n且in n时 再写入一个字符 则in移到管道的另一端 习题 P733 1 3 3 3 6 3 8 UNIX的进程同步与通信 UNIX的早期版本中 为进程的同步与通信提供了 软中断信号管道机制在UNIXSYSTEM 中 推出了新的进程通信机构IPC 消息机制共享存储区机制信号量机制 软中断信号 软中断信号 简称信号 是一种实现进程间简单通信的设施 用于通知对方发生了异常事件 UNIXSYSTEM 中 共有19个软中断信号 软中断是对硬件中断的一种模拟 接收进程在收到软中断信号后 将按照事先的规定去执行一个软中断处理程序 软中断处理程序必须等到接收进程执行时才能生效 信号的发送 信号的发送是指由发送进程把信号发送到指定进程信号域的某一位上 如果目标进程正在一个可被中断的优先级上睡眠 核心便将它唤醒 发送过程就此结束 一个进程可能在其信号域中有多个位被置位 代表有多种类型的信号到达 但对于一类信号 进程却只能记住其中的一个 发送信号 系统调用kill向一个进程或一组进程发送一个信号 该系统调用的语法格式如下 intkill pid sig intpid sig 其中 sig是要发送的信号 pid参数是进程标识号 pid参数除了可以取进程标识号之外 还可以取下列一些特殊值 pid参数特殊值 pid为0 表示把信号发送给与发送进程同组的所有进程 也包括发送进程自己 pid为 1且发送进程的有效用户标识符不是超级用户 表示把信号发送给其实际用户标识符与发送进程的有效用户标识符相同的所有进程 也包括发送进程本身在内 pid为 1且发送进程的有效用户标识符为超级用户 表示把信号发送给除了一些特殊系统进程之外的所有进程 pid是一个非 1的负数 表示把信号发送给组号为pid绝对值的进程组中的所有进程 设置信号的处理方式 系统调用signal用于设置信号的处理方式 其语法格式如下 void func signal sig func 其中 func为收到软中断信号sig后进程希望调用函数的地址 19类信号如表所示 func的取值情况 func的取值可以分成三种情况 func 1时 进程对信号sig不予理睬 func 0时 即缺省处理 对大多数软中断信号的缺省处理是终止进程 func为其他整数值时 它的值是指向信号处理程序的指针 信号的处理 检查软中断信号的时机 进入或退出低优先级睡眠状态即将从核心态返回用户态信号的处理方式 忽略缺省处理 即终止进程执行用户设置的软中断处理程序 管道 管道是指能连接某些读进程和写进程的 专门用于进程通信的共享文件 管道允许读 写进程按先进先出的方式传送数据 即写进程从管道的一端向管道写入数据 读进程从管道的另一端读出数据 管道的类型 管道的类型有 无名管道有名管道有名管道和无名管道的读写方式是相同的 无名管道 无名管道是用系统调用pipe 建立的无名文件 用该系统调用所返回的文件描述符来标识该文件 只有调用pipe的进程及其子孙进程才能利用该管道文件进行通信 有名管道 有名管道是利用mknod系统调用建立的 是可以在文件系统中长期存在的具有路径名的文件 其他进程可以知道有名管道的存在并能利用路径名来访问该文件 对有名管道的访问方式象访问其他文件一样 都需先用open系统调用去打开它 pipe文件的建立 pipe系统调用建立一个无名管道 其语法格式如下 intpipe fdes intfdes 2 核心创建一个管道时须完成下述工作 分配磁盘和内存索引节点 为读进程和写进程分配文件表项 分配用户文件描述符 在读进程和写进程的用户文件描述符表中 分别分配一个表项 并将文件描述符fdes 0 和fdes 1 分别返回给读进程和写进程 Pipe涉及的数据结构 读进程 写进程 用户文件描述符表 文件表 内存索引节点表 外存 fp fp 文件指针 文件指针 索引节点 PIPE文件 pipe文件的大小限制 pipe文件只使用索引节点中的直接地址项 核心将索引节点中的直接地址项作为一个循环队列来管理 为它设置一个读指针和一个写指针 按先进先出顺序进行读和写 进程写管道 进程向管道写数据时 可能有以下两种情况 管道中有足够的空间存放要写的数据 此时每写一数据块后核心便自动增加地址项的大小 写操作完成后 核心修改索引节点中的写指针 并唤醒所有因该管道空而睡眠等待的读进程 管道中无足够的空间存放要写入的数据 此时核心对该索引节点作标记后让写进程睡眠 等待数据从管道中排出 上述情况的一个例外是 当进程写的数据量大于管道的容量时 核心将尽可能多的数据写到管道中 然后使进程睡眠 直到获得更多的空间 进程读管道 当进程从管道读数据时 同样会有两种情况 管道中有足够的数据供进程读 此时 进程便从读指针所指位置开始读数据 每读出一个数据块后 便增加地址项的大小 读操作结束后 核心修改索引节点中的读指针 并唤醒所有睡眠的写进程 进程要读的数据比管道中的数据多 此时 读进程将返回管道中当前所有的数据 如果管道为空 进程一般将进入睡眠 直到一个写进程将数据写入管道 再将读进程唤醒 消息 消息是一个格式化的可变长的信息单元 消息机制允许进程向其他进程发送消息 当一个进程收到多个消息时 可将这些消息排成一个队列 在UNIX中 消息机制向用户提供了四个系统调用 分别用于建立 发送 接收和管理消息 消息机制的数据结构 UNIX的消息机制中使用了两种数据结构 消息首部 消息首部中记录消息的类型 大小 指向消息数据区的指针 消息队列的链接指针等 消息队列头标 每个消息队列的消息头标中 包含了指向消息队列中第一个消息的指针和指向最后一个消息的指针 队列中消息的数目 队列中消息数据的总字节数 队列所允许的消息数据的最大字节总数 还可以含有最近一次执行发送操作的进程标识号和时间等 消息和消息队列示意图 消息队列头标 消息首部 数据区 消息队列的建立和描述符的获取 在UNIX系统中 系统调用msgget用来建立消息队列或者获取消息队列的描述符 该系统调用的语法格式如下 intmsgget key msgflg key tkey intmsgflg 其中 key是用户指定的消息队列的名字 msgflg是用户设置的标志和访问方式 如IPC CREAT表示系统中若无以key命名的消息队列 则建立消息队列 若该队列已存在 则返回该消息队列的描述符 消息的发送 系统调用msgsnd 向指定的消息队列发送一个消息 并将发送消息链接到该消息队列的尾部 系统调用的语法格式为 intmsgsnd msgid msgp msgsz msgflg intmsgid msgsz msgflg structmsgbuf msgp 其中 msgid是由msgget返回的消息队列描述符 msgp是指向用户消息缓冲区的指针 msgsz是消息的长度 msgflg规定了当无内存空间存储消息时 进程是等待还是立即返回 消息的接收 系统调用msgrcv 从指定消息队列中接收指定类型的消息 其语法格式如下 intmsgrcv msgid msgp msgsz msgtyp msgflg intmsgid msgsz msgflg structmsgbuf msgp longmsgtyp 其中 msgid msgp msgsz msgflg与msgsnd中的对应参数相似 msgtyp是接收消息的类型 msgtyp的取值 msgtyp的取值有 msgtyp 0时 核心寻找消息队列中的第一个消息 并将它返回给调用者 msgtyp为正整数时 核心返回给定消息类型的第一个消息 msgtyp为负整数时 核心应在其类型值小于或等于msgtyp绝对值的所有消息中 选出其类型值最低的一个消息返回 消息队列的操纵 用户在建立了消息队列后 可以利用msgctl系统调用来读取它的状态信息并进行修改 如查询消息队列描述符 修改消息队列的许可权等 msgctl的语法格式为 intmsgctl msgid cmd buf intmsgid cmd structmsgid ds buf 其中 buf是用户缓冲区地址 供用户存放控制参数和查询结果 cmd是规定的命令 共享存储区 共享存储区可使若干进程共享主存中的某一个区域 且使该区域出现在多个进程的虚地址空间中 当进程间欲利用共享存储区进行通信时 必须首先在主存中建立一个共享存储区 然后将它附接到自己的虚地址空间上 此后 进程对该区的访问操作 与对其虚地址空间中其他部分的操作完全相同 进程之间以后便可以通过对共享存储区中数据的读 写来进行直接通信 两进程通过共享存储区通信的例子 共享存储区的建立 系统调用shmget建立一个共享存储区 如果该共享存储区已由其他进程建立 则返回其描述符shmid shmget的语法说明如下 intshmget key size shmflg key tkey intsize shmflg 其中 key是共享存储区的名字 size是其大小 shmflg是用户设置的标志 如IPC CREAT 表示若系统中尚无指名的共享存储区则由核心建立一个共享存储区 若系统中已有该共享存储区 便忽略IPC CREAT 共享存储区的附接 系统调用shmat 将共享存储区附接到进程的虚地址空间上 该系统调用的语法格式如下 char shmat shmid shmaddr shmflg intshmid shmflg char shmaddr 其中 shmaddr是用户想要使共享存储区附接到的进程虚地址 shmflg是共享存储区的读写标志 该系统调用的返回值是共享存储区所附接到的进程虚地址 共享存储区的断接 系统调用shmdt 将共享存储区与进程断接 其语法格式如下 intshmdt shmaddr char shmaddr 其中 shmaddr是要断接的虚地址 即以前由系统调用shmat 所返回的虚地址 共享存储区的操纵 系统调用shmctl 对共享存储区的状态信息进行读取和修改 当所有进程都与共享存储区断接时 便可以删除该共享存储区 shmctl系统调用的语法格式为 intshmctl shmid cmd buf intshmid cmd structshmid ds buf 其中 buf是用户缓冲区地址 cmd是操作命令 信号量 UNIXSystem 中采用的是信号量集机制 即由一组信号量构成的信号量数组 传统的信号量机制是对信号量施加P和V操作 而UNIXSystem 中利用semop 系统调用来对指定信号量进行操作 信号量集的建立 系统调用semget 建立信号量集 其语法格式如下 intsemget key nsems semflg key tkey intnsems semflg 其中 key是信号量集的名字 nsems定义了信号量集中信号量的数目 而semflg的含义与msgget系统调用中的msgflg含义相同 系统调用的返回值是信号量集的描述符 信号量集的操纵 系统调用semop 对信号量数组进行操作 其语法格式为 intsemop semid sops nsops intsemid structsembuf sops unsignednsops 其中 semid是semget 返回的描述符 sops是指向信号量操作结构数组的指针 nsops是该数组的大小 信号量操作结构 structsembuf shortsem num shortsemop shortsem flg sem num是信号量的编号 sem op为所要进行的操作 可以为正值 相当于v 或负值 相当于p sem flg为标志 如取值IPC NOWAIT表示立即返回 选择题1 若信号量S的初值为2 当前值为 1 则表示有 等待进程 A 2个B 1个C 0个D 3个在操作系统中 P V操作是一种 A 机器指令B 系统调用命令C 作业控制命令D 低级进程通信原语 选择题2 下述那个选项不是管程的组成部分 A 对局部于管程的数据结构设置初值的语句B 局部于管程的共享数据说明C 管程内对数据结构进行操作的一组过程D 管程外过程调用管程内数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论