目录
编辑
一.什么是进程之间的通信
二.进程之间的通信所访问的数据
三.进程之间的通信是如何做到的
四.基于内存文件级别的通信方式——管道
1.什么是管道
2.管道的建立过程——匿名管道
a.什么是匿名管道
b.匿名管道特点:
c.使用匿名管道的四种情况:
五.具有血缘关系的进程之间的通信的代码实现
六.使用匿名管道实现简易版本的进程池
七.匿名管道和我们之前在bash命令行中使用的 | 有什么关系
八.命名管道
九.使用命名管道通信并完成程序日志的打印
十.通过system V 共享内存实现的进程之间的通信
1.什么是system V 共享内存
2.从共享内存的申请到共享内存的使用
3.共享内存的释放
4.问题
一.什么是进程之间的通信
定义:两个或多个进程之间实现数据层面的交互。
进程之间的通信实现的成本是很高的,因为我们都知道在操作系统中,进程之间的是有独立性的。
二.进程之间的通信所访问的数据
1.基本数据
2.发送命令
3.某种协议
4.通知
三.进程之间的通信是如何做到的
1.进程之间的通信必须让不同的进程之间看到同一份“资源”。
2.这个“资源”是指特定形式的存储空间。
3.这个特定形式的存储空间是谁来提供的:
假设a:如果这个特定的存储空间是由进行通信的双方的其中一方提供的。
那么这个资源属于谁? 属于该进程独有的。
那么此时我们在进行进程之间的通信那么势必会破会进程之间的独立性,这是个万万不可以的。
假设b:如果这个特定的存储空间是又操作系统提供的。
在两个进程要发生进程之间的通信时,操作系统会为两者开辟一段第三方空间来满足进程通信的需要。
那么访问这个空间,进行通信,本质就是访问操作系统,进程代表的就是用户,“资源”从创建到使用到释放,这一系列过程都是由操作系统来提供系统级别的调用接口的。
从底层设计,从接口设计 都是要由操作系统独立设计的。
一般的操作系统都是有一个独立的通信模块-隶属于文件系统-----IPC通信模块
4.关于进程通信是有标准的:system V (本机内部的通信)&& posix(网络之间的通信)。
四.基于内存文件级别的通信方式——管道
1.什么是管道
管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。其思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。由于这种方式具有单向传递数据的特点,所以这个作为传递消息的共享文件就叫做“管道”。
2.管道的建立过程——匿名管道
a.什么是匿名管道
这种使带有血缘关系的进程之间可以通信的管道称匿名管道。
b.匿名管道特点:
c.使用匿名管道的四种情况:
读写端正常,管道如果为空,读端就会被阻塞。
读端慢,写端快
会一瞬间将管道文件写满,此时写端会被阻塞,然后读端在自己的用户级缓存区没满的前提下,有多少读多少。
管道文件的是有大小的:使用 ulimit -a 指令可以查看重要文件的规定。
其中可以看到这个里面表明管道的大小是4kb,但是实际的管道大小是4kb吗?
我们将读端关闭,然后此时一直向管道写入一个字符:
我们发现:
此时管道文件的大小是64kb。不同的内核平台下这个大小不同
如何查看Linux的内核是什么版本:uname -r
那么我们上面查到的4kb是什么,实际上在我们进行读写时有一个大小是PIPE_BUF 这个大小是4kb,如果单次写入时写入的数据是小于PIPE_BUF的那么此时读写就是原子的,此时即使管道有数据,但是写端还没有写完,读端也不会从管道中读取数据。
读写端不正常
读正常,写不正常:
此时读文件时文件中没有数据,read接口会识别到文件的结尾,所以什么都不会读到。
写端正常,但是读端关闭:
此时写端在向管道文件中写入数据是没有意义的,而其操作系统也不会允许友这样的行为存在,此时操作系统会像进程发送型号,使进程退出。
五.具有血缘关系的进程之间的通信的代码实现
Linux-模拟实现基于内存级文件的单向进程通信-CSDN博客
六.使用匿名管道实现简易版本的进程池
Linux-使用管道实现简易版本的进程池-CSDN博客
七.匿名管道和我们之前在bash命令行中使用的 | 有什么关系
eg:cat test.txt | head -10 | tail -5
此时这里使用的管道就是匿名管道,这三个指令在启动为进程后,都有同样的父进程bash。
八.命名管道
1.什么是命名管道
命名管道就是创建在当前工作目录的一个系统级文件。
命名管道是用于没有血缘关系的进程之间的通信,也是单向通信。
2.如何定义命名管道
使用mkfifo 加管道名称就可以创建一个命名管道。
命名管道和匿名管道除了适用对象不同其他的基本相同。
九.使用命名管道通信并完成程序日志的打印
Linux-实现小型日志系统-CSDN博客
十.通过system V 共享内存实现的进程之间的通信
1.什么是system V 共享内存
共享内存就是由操作系统为进程之间想要通信在物理内存上所开辟的一段存储空间。
2.从共享内存的申请到共享内存的使用
a.进程向操作系统发出请求,希望操作系统为它开辟一段共享内存,以满足它通信的需求。
b.操作系统接收进程发来的请求完成对共享内存的开辟。
c.操作系统将在物理内存中开辟好的共享内存通过页表和发出请求的进程的进程地址空间进行建立链接。
d.为了使发出请求的进程可以使用操作系统开辟好的共享内存,在建立关联时操作系统还会将共享内存在进程地址空间中的启始虚拟地址返回给进程。
3.共享内存的释放
首先因该先去关联,然后在使用系统调用接口来释放共享内存。
4.问题
a.从共享内存的创建到共享内存的管理,都是又操作系统来完成的,为什么不能是进程自己完成。
因为共享内存如果是由进程之间创建的话,因为进程有独立性的原因,其他的进程是没有办法去访问它的空间的,此时就没有办法实现进程间的通信了。
b.系统中会开辟很多的共享内存来实现不同进程之间的通信的需要,所以操作系统会将它们管理起来。 先描述在组织。
5.代码实现通过system v共享内存实现的进程间的通信
Linux-代码实现通过system v共享内存实现的进程间的通信-CSDN博客
6.共享内存的特点
a.共享内存没有同步和互斥的特点。
b.共享内存是所有的进程之间通信速度最快的。
c.共享内存中的数据由用户自己管理。