网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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 需要时去拉取消息。
缺点:
- 通信不及时
- 发送的消息大小有限制(内核中的
MSGMAX
和MSGMNB
定义了消息的最大长度和队列的最大长度)
另外,消息队列通信的过程中,也存在用户态向内核态之间的数据拷贝开销。
进程是用户态的,如果想要发送消息,必须 通过系统调用从用户态切换到内核态,并将数据发送至消息队列。
反之,拉取消息时,通过系统调用从用户态切换到内核态 去拉取对应的消息。
四、共享内存
上述我们可以发现,消息队列的发送读取,都会存在用户态到内核态的切换、消息拷贝等过程,如果我们能够降低这种切换,就解决了这种问题。
对于每个进程,都会有独立的虚拟内存,虚拟内存映射到物理内存中。所以,即使进程A和进程B的虚拟内存一样,其实访问的也是不同的物理内存。
使用 共享内存 的技术,从我们的虚拟内存中拿出一块地址,映射到相同的物理内存中,这样两个进程之间的传输速度大大加快。
五、信号量
我们学习过多线程的知道,凡是牵扯到多线程处于同一份数据,必然存在并发异常。
我们的共享内存也是如此,为了避免多进程同时访问资源而造成的数据混乱,在任意的时刻只允许一个进程访问,利用 信号量 这一机制避免了数据混乱。
信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。
信号量有两种操作:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
5715041957)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!