浅谈操作系统的进程通信对于数据库的影响

最近在温习操作系统相关的基本原理,结合以前的数据库实践,就简单说一说最基础的操作系统进程通信部分对数据库的一些影响。

进程间的通信

操作系统内的进程在执行时可以分为独立的或者是协作的。
独立进程的含义是该进程不能影响其他进程或受其他进程影响,反之,则是协作的进程。
协作进程的意义通常在于以下理由:
1、加速计算:这也是计算机发展到多个处理内核和进行进程间调度的原因,充分利用cpu资源以达到加快程序处理的作用。如果需要一个进程能够快速计算,那么应将其拆分为多个子程序或者说是子任务,在多处理器内核上并行执行。
2、模块化的要求:在一个计算机系统中,可能会需要用模块化的方式构造系统,会将系统功能拆分成独立的进程或线程,这些进程或线程共同组成了一个完整的系统。
3、信息的共享:多用户系统中,由于多个用户可能需要访问同样的信息,所以就需要提供一套信息共享的环境来允许这些用户并发的访问这些信息。
4、多任务的并行要求:从小处说是进程需要并行执行来提高效率,从大处来说,用户可以并行的进行编写代码、听音乐等工作。

那进程之间要如何进行协作?这里就需要提到IPC(进程间通信:InterProcess Communication)机制,以便进程间交互信息。
进程之间的通信有两种模式:共享内存、管道通信和消息传递。
消息传递这种模式适合于交换较小数量的数据,消息传递有个缺点是它的实现经常要采用系统调用,所以就需要更多的时间来让内核介入到进程的处理中,因此在一个分布式的系统中,消息传递的模式要比共享内存更容易实现。
共享内存的模式,需要通信进程建立共享内存区域来实现信息的共享,在建立共享内存区域时采用系统调用,而一旦建立好该区域,对于该区域的访问就无需内核介入了,直接读取,不需要拷贝数据。
这里多说一嘴,对于多个处理内核的系统,消息传递的模式要优于内存共享的模式,虽然共享内存是最快的IPC模式。但在共享内存的模式中,共享数据会在多个高速缓存之间迁移,会有高速缓存一致性的问题。对于多个进程对共享内存区域的并发读写问题,共享内存模式并没有提供同步的机制,所以引入了信号量的机制来实现对共享内存的同步访问控制。这里如果熟悉数据库或分布式系统的人很容易就会联想到其中的读写一致性问题。

共享内存的实现

在Linux中,每个进程都有属于自己的进程控制块(PCB:进程实体的一部分,记录了操作系统所需要的、用于描述进程和控制进程运行的全部信息)和地址空间(Addr Space),并且都有一个与之对应的页表,负责将进程的虚拟地址与物理地址进行映射(逻辑关联),通过内存管理单元(MMU)进行管理。两个不同的虚拟地址通过页表映射到物理空间的同一块区域,它们所指向的这块区域即共享内存,这种方法称为内存映射(memory mapping)文件。
在这里插入图片描述

共享内存与Oracle SGA

SGA是orace中的一个巨大的内存共享区域,在linux中,其设置与系统内核参数shamax有关。
shamax参数的作用是系统允许的单个共享内存段的最大值,如果这个参数远小于oracle sga的大小,那么SGA可能被分配成很多个共享内存段。
在Oracle的使用中,我们一般不希望Oracle的共享内存段跨区,我们希望共享内存是在一个段中或者减少共享内存段的数量,来减少碎片的产生和提升一些特定场景下的性能,所以我们会建议调整shamax参数来限制共享内存段的数量。
在linux中,我们可以通过ipcs命令来管理共享内存。
查看:
在这里插入图片描述

关于共享内存段的题外话:大家可能会在某些场景下碰到共享内存段没有释放导致的oracel无法启动的问题,这时就需要手动释放这些共享内存。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐