快牵着我的袜子

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1、进程之间的通信方式?

  管道、有名管道、信号量、消息队列、共享内存。

2、管道怎么实现的?

  管道实际是在内核中开辟出的一块缓冲区,用于进程间通信,这块缓冲区称为管道,管道有一个读端一个写端,只能写端写入数据,读端读出数据。管道是单向通信,只能一个write,一个read。

  匿名管道:只有具有血缘关系的进程才能进行通信,如父子进程,父进程在fork出子进程后,子进程拥有了和父进程一样的代码,当然也拥有和父进程

一样的文件描述符。创建的时候需要指定读写端,int pipe(int fd[2])

  fd[0]表示读端,fd[1]代表写端。写入或者读出过快都会导致一端堵塞。管道的大小为一页,即4k。

  命名管道:命名管道能使不存在血缘关系的进程能够通信。不同于匿名管道它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。进程间

只要可以访问该路径名,就能够通过FIFO相互通信。

3、什么是信号量?

  信号量的本质是计数器,,用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量

也属于临界资源),使得资源在一个时刻只有一个进程独享。

4、消息队列怎么实现的?

    消息队列本质上是位于内核空间的链表,链表的每个节点都是一条消息。消息队列存放在内核中并由队列标识符标识。

  消息队列的通信模式:A 进程要给 B 进程发送消息,A 进程把数据放在对应的消息队列后就可以正常返回了,B 进程需要的时候再去读取数据就可以了。

  同理,B 进程要给 A 进程发送消息也是如此。

  特点:

    1)是一种面向记录的通信方式,具有特定的格式和消息优先级。

    2)支持查询方式获取消息,不一定只是先进先出的对消息的存取,可以针对消息类型进行读取。

    3)消息队列是独立于发送端和接收端进程,进程终止时,消息队列和其中的消息也不会消失。

5、共享内存怎么实现的?

  系统加载一个进程的时候,分配给进程的内存并不是物理内存,而是虚拟内存,那么两个进程通过页表将自身的虚拟地址空间映射到同一片物理地址,

构成了进程间的双向通信。共享内存的生命周期随内核。两个进程都拿出一块虚拟地址,映射到相同的物理内存中。这样进程间需要传送的数据就不需要

来回拷贝了,这边一写那边立马看到了。

6、五种通讯方式总结

  1)管道:效率低下,读写会阻塞,A进程给B进程传输数据,必须等到B取走数据才返回,不适合频繁的交换数据;容量有限(4k);只有有血缘关系的

  进程能通讯(使用 fork 创建子进程,创建的子进程会复制父进程的文件描述符)。

  2)FIFO:任何进程间都能通讯,但速度慢(读写会阻塞)。

  3)信号量:本质是一个计算器,不能传递复杂消息,用来实现进程之间的同步和互斥。

  4)消息队列:容量受到系统限制(内核中每个消息体都有一个最大长度的限制,所有队列所包含的全部消息体的总长度也是有上限),存在用户态与

  内核态之间的数据拷贝开销,因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程。

  5)共享内存区:能够很容易控制容量,速度快(虚拟内存),但要保持同步。

7、mmap原理是什么?

  将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。

  1)进程启动映射过程,并在进程虚拟地址空间中为映射创建虚拟映射区域。

  2)调用内核空间的系统调用函数mmap(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系。

  3)进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝。

  对于传统的 read 系统调用来说,他们需要将磁盘中的文件先 copy 到内核缓冲区中,再将该数据 copy 到用户缓冲区中。相较于 mmap ,后者节省了

一次 copy ,免去了将页缓存的数据复制到用户空间缓冲区的过程。

 

 

 

8、mmap和shm有什么区别?

  mmap:mmap保存到实际硬盘,实际存储并没有反映到主存上。优点:储存量可以很大(多于主存);缺点:进程间读取和写入速度要比主存的要慢。

  shm:shm保存到物理存储器(主存),实际的储存量直接反映到主存上。优点,进程间访问速度(读写)比磁盘要快;缺点,储存量不能非常大

(多于主存)。

9、虚拟内存是什么?有什么用?

  虚拟内存:核心原理是为每个程序设置一段"连续"的虚拟地址空间,把这个地址空间分割成多个具有连续地址范围的页 (Page),并把这些页和物理内存

做映射,在程序运行期间动态映射到物理内存。当程序引用到一段在物理内存的地址空间时,由硬件立刻执行必要的映射;而当程序引用到一段不在物理

内存中的地址空间时,操作系统会引发一个缺页中断,通过页表将缺失的部分装入物理内存并重新执行失败的指令。

  作用:

    1)把外存当做内存来使用,即用硬盘来模拟内存使用,可以缓解物理内存不足的压力,有利于提升资源使用率。

    2)防止恶意进程修改其他程序数据。一个恶意进程一旦知道别的进程的物理地址,那不是很容易就把别的进程的数据篡改了嘛。

    3)降低开发难度。每个进程提供一个一致的地址空间,这样程序员就不需要管理内存了。

posted on 2022-04-26 23:24  快牵着我的袜子  阅读(45)  评论(0编辑  收藏  举报