热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

操作系统④④:管道(匿名,命名)、消息队列、共享内存、信号量、信号、Socket、总结写的很好

进程间通信1管道通信效率低,不适合进程间频繁地交换数据。分为匿名管道和命名管道匿名管道,⽤完了就销毁。命名管道,也被叫做FIFO。
进程间通信
1 管道

通信效率低,不适合进程间频繁地交换数据。

分为匿名管道和命名管道
匿名管道,⽤完了就销毁。
命名管道,也被叫做 FIFO。

通信范围
对于匿名管道, 它的通信范围是存在⽗⼦关系的进程。因为管道没有实体,也就是没有管道⽂件,只能通过 fork 来复制⽗进程 fd ⽂件描述符,来达到通信的⽬的。
对于命名管道, 它可以在不相关的进程间也能相互通信。因为命令管道,提前创建了⼀个类型为管道的设备⽂件,在进程⾥只要使⽤这个设备⽂件,就可以相互通信。

不管是匿名管道还是命名管道,进程写⼊的数据都是缓存在内核中,另⼀个进程读取数据时候⾃然也是从内核中获取,同时通信数据都遵循先进先出原则,不⽀持 lseek 之类的⽂件定位操作。

2 消息队列

匿名管道的⽣命周期,是随进程的创建⽽建⽴,随进程的结束⽽销毁。
消息队列⽣命周期随内核,消息队列是保存在内核中的消息链表。

不足之处
⼀是通信不及时,⼆是附件也有⼤⼩限制
3 共享内存
解决了“消息队列”用户态和内核态之间消息拷贝的问题。
在这里插入图片描述
在这里插入图片描述
4 信号量

如果多个进程同时修改同⼀个共享内存,很有可能就冲突了。
为了防⽌多进程竞争共享资源,⽽造成的数据错乱,所以需要保护机制,使得共享的资源,在任意时刻只能被⼀个进程访问。正好, 信号量就实现了这⼀保护机制。

信号量其实是⼀个整型的计数器,主要⽤于实现进程间的互斥与同步,⽽不是⽤于缓存进程间通信的数据。

信号量也同样可以在线程间实现互斥与同步:
· 互斥的⽅式,可保证任意时刻只有⼀个线程访问共享资源;
· 同步的⽅式,可保证线程 A 应在线程 B 之前执⾏;

5 信号
信号事件的来源主要有硬件来源(如键盘 Cltr+C )和软件来源(如 kill 命令)
在这里插入图片描述
6 Socket

在这里插入图片描述
针对TCP协议通信的socket编程模型
两个Socket,一个监听socket,一个已完成连接socket。
在这里插入图片描述
针对UDP协议通信的socket编程模型
在这里插入图片描述
针对本地进程间通信的 socket 编程模型
在这里插入图片描述

7 总结-写的很好

在这里插入图片描述
在这里插入图片描述


推荐阅读
author-avatar
姿萱俊达俊宏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有