您好、欢迎来到现金彩票网!
当前位置:2019正版免费全年资料 > 同步通信量 >

第3章 进程同步与通信2ppt

发布时间:2019-07-17 11:20 来源:未知 编辑:admin

  1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

  填空题1 如果信号量的当前值为-4,则表示系统中在该信号量上有 _____ 个等待进程。 对于信号量可以做 ① 操作和 ② 操作, ③ 操作用于阻塞进程, ④ 操作用于释放进程。程序中的 ⑤ 和 ⑥ 操作应谨慎使用,以保证其使用的正确性,否则执行时可能发生死锁。 * 填空题2 信号量的物理意义是:当信号量值大于0时表示 ① ;当信号量值小于0时,其绝对值为 ② 。 有m个进程共享同一临界资源,若使用信号量机制实现对临界资源的互斥访问,则信号量值的变化范围是 _____ 。 * 填空题3 访问临界资源的进程应该遵循的条件有: ① 、 ② 、 ③ 、和 ④ 。 每个信箱可以包含 ① 和 ② 两部分。 为了实现消息缓冲通信,在PCB中应增加的数据项有 ① 、 ② 和 ③ 。 * 填空题4 临界资源是指_____的资源。 进程的高级通信方式有 ① 、 ② 和 ③ 。 管程由 ① 、 ② 和 ③ 三部分组成。 * 管道 管道是指能连接某些读进程和写进程的、专门用于进程通信的共享文件。 管道允许读/写进程按先进先出的方式传送数据,即写进程从管道的一端向管道写入数据,读进程从管道的另一端读出数据。 * 管道的类型 管道的类型有: 无名管道 有名管道 有名管道和无名管道的读写方式是相同的。 * 无名管道 无名管道是用系统调用pipe()建立的无名文件,用该系统调用所返回的文件描述符来标识该文件。 只有调用pipe的进程及其子孙进程才能利用该管道文件进行通信。 * 有名管道 有名管道是利用mknod系统调用建立的,是可以在文件系统中长期存在的具有路径名的文件, 其他进程可以知道有名管道的存在并能利用路径名来访问该文件。 对有名管道的访问方式象访问其他文件一样,都需先用open系统调用去打开它。 * pipe文件的建立 pipe系统调用建立一个无名管道。其语法格式如下: int pipe(fdes); int fdes[2]; 核心创建一个管道时须完成下述工作: 分配磁盘和内存索引节点。 为读进程和写进程分配文件表项。 分配用户文件描述符。在读进程和写进程的用户文件描述符表中,分别分配一个表项,并将文件描述符fdes[0]和fdes[1]分别返回给读进程和写进程。 * Pipe涉及的数据结构 读进程 写进程 用户文件描述符表 文件表 内存索引节点表 外存 … … fp … … fp … … 文件指针 文件指针 … … 索引节点 … … PIPE文件 * pipe文件的大小限制 pipe文件只使用索引节点中的直接地址项。 核心将索引节点中的直接地址项作为一个循环队列来管理,为它设置一个读指针和一个写指针,按先进先出顺序进行读和写。 * 进程写管道 进程向管道写数据时,可能有以下两种情况: 管道中有足够的空间存放要写的数据,此时每写一数据块后核心便自动增加地址项的大小。写操作完成后,核心修改索引节点中的写指针,并唤醒所有因该管道空而睡眠等待的读进程。 管道中无足够的空间存放要写入的数据,此时核心对该索引节点作标记后让写进程睡眠,等待数据从管道中排出。上述情况的一个例外是,当进程写的数据量大于管道的容量时,核心将尽可能多的数据写到管道中,然后使进程睡眠,直到获得更多的空间。 * 进程读管道 当进程从管道读数据时,同样会有两种情况: 管道中有足够的数据供进程读。此时,进程便从读指针所指位置开始读数据,每读出一个数据块后,便增加地址项的大小。读操作结束后,核心修改索引节点中的读指针,并唤醒所有睡眠的写进程。 进程要读的数据比管道中的数据多。此时,读进程将返回管道中当前所有的数据。如果管道为空,进程一般将进入睡眠,直到一个写进程将数据写入管道,再将读进程唤醒。 * 消息 消息是一个格式化的可变长的信息单元。消息机制允许进程向其他进程发送消息。当一个进程收到多个消息时,可将这些消息排成一个队列。 在UNIX中,消息机制向用户提供了四个系统调用,分别用于建立、发送、接收和管理消息。 * 消息机制的数据结构 UNIX的消息机制中使用了两种数据结构: 消息首部:消息首部中记录消息的类型、大小、指向消息数据区的指针、消息队列的链接指针等。 消息队列头标:每个消息队列的消息头标中,包含了指向消息队列中第一个消息的指针和指向最后一个消息的指针,队列中消息的数目,队列中消息数据的总字节数,队列所允许的消息数据的最大字节总数,还可以含有最近一次执行发送操作的进程标识号和时间等。 * 消息和消息队列示意图 消息队列头标 消息首部 数据区 ┆ ┆ * 消息队列的建立和描述符的获取 在UNIX系统中,系统调用msgget用来建立消息队列或者获取消息队列的描述符。该系统调用的语法格式如下: int msgget(key,msgflg); key_t key; int msgflg; 其中,key是用户指定的消息队列的名字;msgflg是用户设置的标志和访问方式。如IPC_CREAT表示系统中若无以key命名的消息队列,则建立消息队列;若该队列已存在,则返回该消息队列的描述符。 * 消息的发送 系统调用msgsnd( )向指定的消息队列发送一个消息,并将发送消息链接到该消息队列的尾部。系统调用的语法格式为: int msgsnd(msgid,msgp,msgsz,msgflg); int msgid,msgsz,msgflg; struct msgbuf *msgp; 其中,msgid是由msgget返回的消息队列描述符;msgp是指向用户消息缓冲区的指针。msgsz是消息的长度,msgflg规定了当无内存空间存储消息时,进程是等待还是立即返回。 * 消息的接收 系统调用msgrcv( ) 从指定消息队列中接收指定类型的消息,其语法格式如下: int msgrcv (msgid, msgp, msgsz, msgtyp, msgflg); int msgid,msgsz,msgflg; struct msgbuf * msgp; long msgtyp; 其中,msgid、msgp、msgsz、msgflg与msgsnd中的对应参数相似,msgtyp是接收消息的类型。 * msgtyp的取值 msgtyp的取值有: msgtyp=0时,核心寻找消息队列中的第一个消息,并将它返回给调用者; msgtyp为正整数时,核心返回给定消息类型的第一个消息; msgtyp为负整数时,核心应在其类型值小于或等于msgtyp绝对值的所有消息中,选出其类型值最低的一个消息返回。 * 消息队列的操纵 用户在建立了消息队列后,可以利用msgctl系统调用来读取它的状态信息并进行修改,如查询消息队列描述符、修改消息队列的许可权等。msgctl的语法格式为: int msgctl(msgid,cmd,buf); int msgid,cmd; struct msgid_ds *buf; 其中,buf是用户缓冲区地址,供用户存放控制参数和查询结果;cmd是规定的命令。 * 共享存储区 共享存储区可使若干进程共享主存中的某一个区域,且使该区域出现在多个进程的虚地址空间中。 当进程间欲利用共享存储区进行通信时,必须首先在主存中建立一个共享存储区,然后将它附接到自己的虚地址空间上。 此后,进程对该区的访问操作,与对其虚地址空间中其他部分的操作完全相同。进程之间以后便可以通过对共享存储区中数据的读/写来进行直接通信。 * 两进程通过共享存储区通信的例子 进程A的虚空间 内存空间 进程B的虚空间 栈 共享 存储区 B 正文 数据 栈 正文 数据 Aˊ A Bˊ * 共享存储区的建立 系统调用shmget建立一个共享存储区。如果该共享存储区已由其他进程建立,则返回其描述符shmid。shmget的语法说明如下: int shmget(key,size,shmflg); key_t key; int size,shmflg; 其中,key是共享存储区的名字;size是其大小;shmflg是用户设置的标志,如IPC_CREAT,表示若系统中尚无指名的共享存储区则由核心建立一个共享存储区;若系统中已有该共享存储区,便忽略IPC_CREAT。 * 共享存储区的附接 系统调用shmat( )将共享存储区附接到进程的虚地址空间上。该系统调用的语法格式如下: char *shmat(shmid,shmaddr,shmflg); int shmid,shmflg; char *shmaddr; 其中,shmaddr是用户想要使共享存储区附接到的进程虚地址, shmflg是共享存储区的读写标志。 该系统调用的返回值是共享存储区所附接到的进程虚地址。 * 共享存储区的断接 系统调用shmdt( )将共享存储区与进程断接。其语法格式如下: int shmdt(shmaddr); char *shmaddr; 其中,shmaddr是要断接的虚地址,即以前由系统调用shmat( )所返回的虚地址。 * 共享存储区的操纵 系统调用shmctl( ) 对共享存储区的状态信息进行读取和修改。当所有进程都与共享存储区断接时,便可以删除该共享存储区。shmctl系统调用的语法格式为: int shmctl(shmid,cmd,buf); int shmid,cmd; struct shmid_ds, *buf; 其中,buf是用户缓冲区地址,cmd是操作命令。 * 信号量 UNIX System Ⅴ中采用的是信号量集机制,即由一组信号量构成的信号量数组。 传统的信号量机制是对信号量施加P和V操作,而UNIX System Ⅴ中利用semop( )系统调用来对指定信号量进行操作。 * 信号量集的建立 系统调用semget( )建立信号量集。其语法格式如下: int semget(key,nsems,semflg); key_t key; int nsems,semflg; 其中,key是信号量集的名字;nsems定义了信号量集中信号量的数目;而semflg的含义与msgget系统调用中的msgflg含义相同。系统调用的返回值是信号量集的描述符。 * 信号量集的操纵 系统调用semop( ) 对信号量数组进行操作。其语法格式为: int semop(semid,sops,nsops); int semid; struct sembuf * *sops; unsigned nsops; 其中,semid是semget( )返回的描述符;sops是指向信号量操作结构数组的指针;nsops是该数组的大小。 * 信号量操作结构 struct sembuf { short sem_num; short semop; short sem_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.管程外过程调用管程内数据结构的说明 在直接通信方式中,系统提供两条通信原语进行发送和接收,其中Send原语中参数应是_____。 A. receiver,mailbox B. sender,mailbox C. receiver,message D. sender,message * 选择题3 临界区是_____。 A.一段共享数据区 B. 一段程序 C.一个互斥资源 D.一个缓冲区 信箱通信是一种_____通信方式。 A.信号量 B.间接通信 C. 低级通信 D.直接通信 * 选择题4 某通信方式通过共享存储区来实现,其属于_____。 A. 消息通信 B. 低级通信 C.高级通信 D.管道通信 用P、V操作管理临界区时,信号量的初值应定义为_____。 A. 1 B. 2 C. -1 D. 0 * 选择题5 对于两个并发进程,设互斥信号量为mutex,若mutex=0则_____。 A.表示有一个进程进入临界区,另一个进程等待进入 B. 表示没有进程进入临界区 C.表示有一个进程进入临界区 D. 表示有两个进程进入临界区 对信号量S执行V操作后,下述选项正确的是_____。 A.当S小于0时唤醒一个阻塞进程 B.当S小于等于0时唤醒一个阻塞进程 C.当S小于0时唤醒一个就绪进程 D.当S小于等于0时唤醒一个就绪进程 * 3.5 进程通信 进程通信是指进程之间的信息交换。 进程互斥与同步交换的信息量较少且效率较低,因此称这两种进程通信方式为低级进程通信方式,相应地也将P、V原语称为两条低级进程通信原语。 高级进程通信方式是指进程之间以较高的效率传送大量数据。 3.5.1 进程通信的类型 高级进程通信方式可分为三大类: 共享存储器系统 消息传递系统 管道通信系统或共享文件系统 * 共享存储器系统 相互通信的进程共享某些数据结构或共享存储区。 基于共享数据结构的通信方式:诸进程通过公用某些数据结构交换信息。如生产者-消费者问题。 基于共享存储区的通信方式:在存储器中划出一块共享存储区,诸进程可通过对共享存储区进行读或写来实现通信。包括建立共享存储区、附接及断接。 * 消息传递系统 在消息传递系统中,进程间的数据交换以消息为单位,程序员直接利用系统提供的一组通信命令(原语)来实现通信。 消息传递系统因其实现方式不同可分为: 直接通信方式:发送进程将消息发送到接收进程,并将其挂在接收进程的消息队列上;接收进程从消息队列上取消息。 间接通信方式:发送进程将消息发送到信箱,接收进程从信箱中取消息。 * 管道(共享文件)通信 管道(共享文件)通过连接读进程和写进程的共享文件来实现读写进程之间通信。 * 3.5.2 消息传递系统 消息传递系统是实现进程通信的常用方式,这种通信方式既可以实现进程间的信息交换,也可以实现进程间的同步。 * 1. 消息缓冲通信 消息缓冲通信是直接通信方式的一种实现。 * 消息缓冲队列通信机制中的数据结构 所谓消息是指一组信息,消息缓冲区的数据结构如下: struct message { sender; 发送者进程标识符 size; 消息长度 text; 消息正文 next; 指向下一个消息缓冲区的指针 } * 在PCB中还应增加 struct PCB { ┇ mq;消息队列队首指针 mutex;消息队列互斥信号量 sm;消息队列资源信号量 ┇ } * 消息缓冲通信的实现思想 为了实现消息通信,发送进程应先在自己的工作区中设置一个发送区,把欲发送的消息填入其中,然后再用发送原语将其发送出去。 接收进程调用接收原语从自己的消息缓冲队列中摘下第一个消息,并将其内容复制到自己的消息接收区内。 * send(B,a); ┇ sender:A size:6 text:Hello! 两个进程进行通信的过程 进程A PCB(B) 进程B receive(b) ┇ sender:A size:6 text:Hello! ┇ mq mutex sm sender:A size:6 text:Hello! next:0 a b 第一个消息缓冲区 * 发送原语描述 void send(receiver,a)receiver为接收者标识号,a为发送区首址 { 向系统申请一个消息缓冲区i; 将发送区a中的消息复制到i中; 获得接收进程的内部标识j; P(mutex); 把消息插入j的消息队列上; V(mutex); V(sm); } * 接收原语描述 void receive(b)b为接收区首址 { 获得接收进程内部标识j; P(sm); P(mutex); 将消息队列中的第一个消息移出; V(mutex); 将消息复制到接收区b; } * 2.信箱通信 信箱通信方式中,进程之间通信需要通过共享数据结构实体--信箱来进行。 信箱是一种数据结构,其中存放信件。 信箱逻辑上分成信箱头和信箱体两部分。 信箱头中存放有关信箱的描述。 信箱体由若干格子组成,每格存放一个信件,格子的数目和大小在创建信箱时确定。 * 信箱通信原语 信箱通信原语包括: 信箱的创建和撤消: 消息的发送和接收: Send(mailbox,message); Receive(mailbox,message); * 消息通信中的同步问题1 进程间的消息通信存在同步关系 对于发送进程来说,它在执行发送原语后有两种可能选择: 发送进程阻塞,直到这个消息被接收进程接收到,这种发送称为阻塞发送。 发送进程不阻塞,继续执行,这种发送称为非阻塞发送。 * 消息通信中的同步问题2 对于一个接收进程来说,在执行接收原语后也有两种可能选择: 如果一个消息在接收原语执行之前已经发送,则该消息被接收进程接收,接收进程继续执行。 如果没有正在等待的消息,则该进程阻塞直到有消息到达;或者该进程继续执行,放弃接收的努力。前者称为阻塞接收,后者称为非阻塞接收。 * 消息通信中的同步问题3 根据发送进程和接收进程采取方式的不同,通常有三种常用的组合方式: 非阻塞发送、阻塞接收。 非阻塞发送、非阻塞接收。 阻塞发送,阻塞接收。 * 3.管道 使用管道通信时,基本上采用文件系统的原有机制实现。包括创建、打开、关闭、读写等。 管道机制应提供以下三方面的协调能力: 互斥:诸进程互斥读写管道 同步:管道空、满情况处理 存在:确定对方是否存在 * 管道通信示意图1 初始时,其长度为4,系统将管道看成一个循环队列。按先进先出的方式读写。 in out A B C D 写入字符E后,管道长度为5 in out A B C D E * 管道通信示意图2 读一个字符后,管道长度为4 in out B C D E 若管道容量为n且in=n时,再写入一个字符,则in移到管道的另一端。 in out D E … X * 习题 P73 3(1) 3(3) 3(6) 3(8) * UNIX的进程同步与通信 UNIX的早期版本中,为进程的同步与通信提供了: 软中断信号 管道机制 在UNIX SYSTEM Ⅴ中,推出了新的进程通信机构IPC: 消息机制 共享存储区机制 信号量机制 * 软中断信号 软中断信号(简称信号)是一种实现进程间简单通信的设施,用于通知对方发生了异常事件。 UNIX SYSTEM Ⅴ中,共有19个软中断信号。 软中断是对硬件中断的一种模拟,接收进程在收到软中断信号后,将按照事先的规定去执行一个软中断处理程序。 软中断处理程序必须等到接收进程执行时才能生效。 * 信号的发送 信号的发送是指由发送进程把信号发送到指定进程信号域的某一位上。 如果目标进程正在一个可被中断的优先级上睡眠,核心便将它唤醒,发送过程就此结束。 一个进程可能在其信号域中有多个位被置位,代表有多种类型的信号到达,但对于一类信号,进程却只能记住其中的一个。 * 发送信号 系统调用kill向一个进程或一组进程发送一个信号。该系统调用的语法格式如下: int kill(pid,sig); int pid,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为其他整数值时,它的值是指向信号处理程序的指针。 * 信号的处理 检查软中断信号的时机: 进入或退出低优先级睡眠状态 即将从核心态返回用户态 信号的处理方式: 忽略 缺省处理,即终止进程 执行用户设置的软中断处理程序 *

  “原创力文档”前称为“文档投稿赚钱网”,本网站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有【成交的100%(原创)】

http://disyu.com/tongbutongxinliang/521.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有