交易系统开发技能及面试之进程间通信(共享内存)
Posted BBinChina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交易系统开发技能及面试之进程间通信(共享内存)相关的知识,希望对你有一定的参考价值。
文章目录
摘要
共享内存是进程间通信的最常用的方式,所以其在面试中也是高频知识点。通常,共享内存的使用场景多用于持久化进程的内存数据,以及实现进程间通信的共享内存队列中间件。
Q1 当最后一个附加到共享内存的进程意外退出时,会发生什么?
在windows时,共享内存是通过FileMapping 实现的,可以调用CreateFileMapping 创建一个内存文件映射对象。这个对象是由内存管理的,当使用这个对象的进程意外退出时,这个对象是持续存在未销毁的,需要调用CloseHandle关闭内核对象句柄。
同理在Linux中,共享内存是通过shmget创建一个共享内存对象,需要通过调用shmctl来释放掉,否则当附加进程意外退出时该对象仍然存在。
Q2 为什么内存共享是最快的进程通讯方式?
因为共享内存不需要将数据从进程A拷贝到进程B,而仅需要考虑进程间对共享内存的竞争问题,通常采用信号量的方式实现进程间同步互斥。
Q3 可以在运行时调整共享内存大小么?
共享内存在创建时就确定了大小,不能在运行时修改
Q4 使用mmap实现进程间通讯有什么优点?当一个进程正在写内存时会发生什么?
mmap()是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。
mmap最大的优势在于只要进程在内存上进行读操作,那么他们都可以直接读取到相同地址的磁盘文件上,减少内存的使用。而如果有一个进程正在写操作时,那么会采用COW(copy on write)的方式,复制一份专用的副本给写操作进程使用,而其他读进程依然读取相同的资源。
Q5 操作系统为什么需要虚拟内存?
1、通过使用虚拟内存,每个程序有足够大的操作内存(大小取决于操作系统位数),因为操作系统可以将虚拟内存地址映射到物理内存地址。操作系统通过页切换的方式,将内存的页存储到磁盘物理位置,而将不存在内存的页从磁盘上加载到内存中。
2、通过虚拟内存系统这个中间件模块,使每个程序能操作虚拟内存到物理内存映射的同时,它可以控制每个程序只能访问自己的物理内存映射,而不能访问到其他程序的内存空间,因此可实现每个程序独占“内存”空间。
总结:虚拟内存可以让操作系统同时运行多个进程,而互不干扰。相同程序同时运行时,假如他们需要运行一个函数, 那么他们需要加载相同物理地址的函数,如果不使用虚拟内存技术,为每个程序独立分配虚拟内存来映射相同的物理地址,那么会进行覆盖,导致非法行为。
Q6 Application Binary Interface(ABI)和 Application Programming Interface(API)的区别?
ABI(Application Binary Interface)为应用程序二进制接口,描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的二进制层面的底层接口。影响 ABI 的因素非常多,硬件、编程语言、编译器、链接器、操作系统等都会影响 ABI。比如 数据压入寄存器或者栈后,又或者函数调用之后谁将弹出栈等等。
API(Application Programming Interface)是应用程序编程接口,是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需了解源码和内部实现细节。比如,POSIX 标准,C99 标准等都是对 API 的规定。
描述的内容不同。ABI 规定了二进制文件的格式、内容、装载/卸载程序的要求、函数调用时的参数传递规则、寄存器、堆栈的使用;API 规定操作系统、硬件平台、服务组件、语言函数库等需要提供的功能函数接口;
作用的层面不同。ABI描述二进制层面的接口,API描述代码级层面的接口;
兼容的难度不同。ABI的兼容程度比API更为严格,即ABI实现兼容更加困难。
以上是关于交易系统开发技能及面试之进程间通信(共享内存)的主要内容,如果未能解决你的问题,请参考以下文章