- 👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,Java领域新星创作者。
- 📝个人公众号:爱敲代码的小黄(回复 “技术书籍” 可获千本电子书籍)
- 📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙、操作系统从入门到成神
- 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
- 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
- 🍂博主正在努力完成2022计划中:以梦为马,扬帆起航,2022追梦人
文章目录
往期推荐
进程间的通信方式
我们的进程一般处于用户空间,如果需要通信的话,需要借助内核:
一、引言
本文参考 小林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 需要时去拉取消息。
缺点:
- 通信不及时
- 发送的消息大小有限制(内核中的
MSGMAX
和MSGMNB
定义了消息的最大长度和队列的最大长度)
另外,消息队列通信的过程中,也存在用户态向内核态之间的数据拷贝开销。
进程是用户态的,如果想要发送消息,必须 通过系统调用从用户态切换到内核态,并将数据发送至消息队列。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
img-0liEU9PR-1714446769602)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新