【操作系统入门到成神系列 十】进程间的通信方式_苹果手机能时时显示网速吗(1)

系统化学习路径:IT技术提升的关键环节与协作交流

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


往期推荐


进程间的通信方式

在这里插入图片描述

我们的进程一般处于用户空间,如果需要通信的话,需要借助内核:
在这里插入图片描述

一、引言

本文参考 小林coding 的《图解操作系统》,也是我十分喜欢的一个公众号博主,为他打 call

老读者知道我之前再写 Kafka 的博文,为什么突然开始写操作系统的呢?

原因在于:

当我看到 Kafka 服务端的一些 IO 操作时,我发现我看不懂了,了解之后发现这里 Netty 的概念。

当我尝试了解 IO 时,我发现一些内存、磁盘的交换,搞的我焦头烂额,于是,想静下心来从头开始。

当我把 小林coding 的 《图解操作系统》看完之后,我发现对操作系统的理解更上一层楼。

用一段话,作为今天的开场白:

  • 读书的根本目的,未必是解决现实问题,它更像一场心灵的抚慰。
  • 一个喜欢读书的人,可能不会记得自己读过哪些书。
  • 但是那些看过的故事、收获的感悟、浸染过的气质,
  • 就像一颗种子,会在你的身体里慢慢发芽长大,不断提升你的认知,打开你的视野。
二、管道

管道分为匿名管道和命名管道

匿名管道:将前一个命令(ps auxf)作为后一个命令(grep mysql)的输入,匿名管道用完就销毁。

$ ps auxf | grep mysql

命名管道:也被称为 FIFO,通过 mkfifo 的方式创建

$ mkfifo myPipe

我们通过 ls -l 查看当前 myPipe 的信息。

基于一切皆文件的理念,文件的类型为 P,也就是 **pipe(管道)**的意思

$ ls -l
prw-r--r--. 1 root    root         0 Jul 17 02:45 myPipe

当我们向 myPipe 写入数据时,我们会发现命令执行之后会卡住,等待管道数据被读取:

$ echo "hello" > myPipe  // 将数据写进管道
                  // 停住了 ...

我们需要执行另外的一条命令来读取管道:

$ cat < myPipe  // 读取管道里的数据
hello

管道通信的效率极低,不适合进程间频繁的交换数据。当然,他的好处在于简单

那管道如何创建呢,背后原理是什么?

匿名管道的通信范围是存在父子关系之间的进程,因为管道没有实体,只能通过 fork 来赋值父进程的 fd 描述符

命名管道,可以在不相关的进程中相互通信。提前创建了一个类型为管道的设备文件,只要使用该文件,就可以通信。

当管道创建时,系统调用为:

int pile(int fd[2])

一个匿名管道,存在 2 个文件描述符,读端和写端

在这里插入图片描述

所谓管道,就是内核的一段缓存

  • 父进程与子进程的通信

在这里插入图片描述

  • 子进程与子进程的通信
    在这里插入图片描述
三、消息队列

简单来说:消息队列是保存在内核的消息链表A 向消息队列中发送消息,B 需要时去拉取消息。

缺点:

  • 通信不及时
  • 发送的消息大小有限制(内核中的 MSGMAXMSGMNB 定义了消息的最大长度和队列的最大长度)

另外,消息队列通信的过程中,也存在用户态向内核态之间的数据拷贝开销。

进程是用户态的,如果想要发送消息,必须 通过系统调用从用户态切换到内核态,并将数据发送至消息队列。

反之,拉取消息时,通过系统调用从用户态切换到内核态 去拉取对应的消息。

四、共享内存

上述我们可以发现,消息队列的发送读取,都会存在用户态到内核态的切换、消息拷贝等过程,如果我们能够降低这种切换,就解决了这种问题。

对于每个进程,都会有独立的虚拟内存,虚拟内存映射到物理内存中。所以,即使进程A和进程B的虚拟内存一样,其实访问的也是不同的物理内存。

使用 共享内存 的技术,从我们的虚拟内存中拿出一块地址,映射到相同的物理内存中,这样两个进程之间的传输速度大大加快。

在这里插入图片描述

五、信号量

我们学习过多线程的知道,凡是牵扯到多线程处于同一份数据,必然存在并发异常。

我们的共享内存也是如此,为了避免多进程同时访问资源而造成的数据混乱,在任意的时刻只允许一个进程访问,利用 信号量 这一机制避免了数据混乱。

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

信号量有两种操作:

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

5715041957)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值