尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

操作系统笔记-2.1.5.1 进程通讯

操作系统笔记-2.1.5.1 进程通讯 王道操作系统笔记视频链接2.1.5.1 进程通讯知识总览进程通讯的三种方式共享存储基于数据结构的共享基于存储区的共享消息传递直接通信的方式间接通信的方式管道通信进程通信进程通信定义进程间通信Inter-Process Communication,IPC是指两个进程之间产生数据交互。比如微博文案转发分享到微信为什么进程通信需要操作系统支持进程是分配系统资源的单位包括内存地址空间因此各进程拥有的内存地址空间相互独立。PS为了保证安全一个进程不能直接访问另一个进程的地址空间。共享存储原理如果操作系统支持共享存储的功能一个进程可以申请一块共享存储区这部分的内容也可以让其它进程共享。比如进程P要给进程Q传递信息可以在共享存储区写入需要传递的信息然后Q再从共享存储区读出数据即可。举例Linux中可以通过 shm_open 系统调用申请一片共享内存区通过 mmap 系统调用将共享内存区映射到进程自己的地址空间虚拟地址空间第三章会讲也就是通过“增加页表项/段表项”将同一片共享内存区映射到各个进程的地址空间中。为避免出错类似同时写入同一片区域这种错误各个进程对共享空间的访问应该是互斥的。各个进程可使用操作系统内核提供的同步互斥工具如P、V操作这在2.3小节会讲解。基于存储区的共享操作系统在内存中划出一块共享存储区数据的形式、存放位置都由通信进程控制而不是操作系统。这种共享方式速度很快是一种高级通信方式。基于数据结构的共享比如共享空间里只能放一个长度为10的数组可以当成特殊的全局变量。这种共享方式速度慢、限制多是一种低级通信方式。PS为什么会慢(来自deepseek)基于存储区是“放之四海而皆准”的进程1可以随便放任意大小的结构体进程2直接拿。而数据结构被卡死为“固定长度数组”。如果进程1的输出是 20 个字节而数组每个元素只能存 8 字节你就得手动拆分成 3 个元素存进去进程2再拼回来。一旦涉及手动拆分拼接就会多出额外的CPU运算和内存复制这才变慢。消息传递原理进程间的数据交换以格式化的消息Message为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。这里的格式化的消息由消息头与消息体构成消息头包括发送进程ID、接受进程ID、消息长度等格式化的信息。消息体保存的就是一个进程要传给另一个进程的数据。消息传递分为直接通信方式与间接通信方式两种前者消息发送进程要指明接收进程的ID后者通过“信箱”间接地通信。因此又称“信箱通信方式”。直接通信方式举例在进程Q的PCB中包含有一个进程Q的消息队列其它进程要给进程Q发送消息都会挂在进程Q的消息队列中。假设进程P希望发送一个消息给QP先在自己的地址空间完善生成一条格式化的消息msg然后使用发送原语send(Q,msg)将消息传递给操作系统内核内核接收到这个消息然后将这个消息挂在进程Q的消息队列中。也就是这个msg是由进程P的地址空间复制到内核空间的。进程Q可以使用接收原语receive(P,msg)进程Q执行接收原语后操作系统检查进程Q的消息队列然后将对应的消息从操作系统内核区复制到进程Q的地址空间。直接通信方式需要点名道姓的消息传递无论是发送还是接收都要指明对象。间接通信方式举例以进程P给进程Q发送信息为例进程P利用系统调用向操作系统申请一个或多个新的“邮箱”并在自己的地址空间生成完善msg然后调用发送原语send(A,msg)往信箱A发送消息msg此处没有指明某个特定的进程只指明了哪个邮箱所以算是间接通信。进程Q使用接收原语指明邮箱receive(A,msg)从信箱A接受消息。可以多个进程往同一个信箱send详细也可以多个进程从同一个信箱中receive消息。间接通信方式以“邮箱”作为中间实体进行消息传递。PS两者区别来自deepseek- 直接通信 微信私聊你必须加对方好友知道PID消息只在你俩之间传输离线就收不到。- 间接通信 朋友圈/公告栏你只管发动态塞邮箱谁爱看谁看谁爱评论谁评论发的人不指定给谁看的人也不在乎是谁发的。管道通信如图定义管道通信的方向与水管一样是单向的这里的“管道”是一个特殊的共享文件又名pipe文件。其实就是在内存中开辟一个大小固定的内存缓冲区。读写文件遵循先进先出原则可以当作一个巨大的循环队列。与基于存储区的共享存储的区别共享存储从哪里写入、从哪里读取都没有限制而管道通讯要求数据的读写都是先进先出。管道只能采用半双工通信某一时间段内只能实现单向的传输传输完毕后可以更改传输的方向但是同一时刻只能一个方向传输。如果要实现双向同时通信则需要设置两个管道。PS同一时刻支持双向的传输叫做全双工通信这是计网的概念。各进程要互斥地访问管道由操作系统实现当管道写满时写进程将阻塞直到读进程将管道中地数据取走即可唤醒写进程。当管道读空时读进程将阻塞直到写进程往管道中写入数据即可唤醒读进程。管道中的数据一旦被读出就彻底消失。因此当读个进程读同一个管道时可能会错乱。对此通常有两种解决方案一个管道允许多个写进程一个读进程2014年408真题高教社官方答案允许有多个写进程多个读进程但系统会让各个读进程轮流从管道中读数据Linux方案PS这两个解决方案存在争议在应试角度以“多个写进程一个读进程”为准但是现实角度来说“多个写进程多个读进程”也完全没有问题。知识回顾与重要考点注意写进程往管道写数据即便管道没被写满只要管道没空读进程就可以从管道读数据读进程从管道读数据即便管道没被读空只要管道没满写进程就可以往管道写数据
返回列表