linux 进程通信机制,LINUX内核进程高效通信机制研究

摘要:进程间的通信是多任务、多用户操作系统必须考虑的重大问题,Linux继承了Unix的基本设计思想,其安全性和稳定性得到了人们的认可,但随着其应用领域的不断拓展,其通信机制已经不能满足用户的需求。本文在分析Linux内核进程通信机制的基础上,就如何提高Linux内核进程间的通信效能进行了研究。

关键词: Linux操作系统;内核进程;高效通信息;优化措施

中图分类号:TP311.52 文献标识码:A 文章编号:1007-9599 (2012) 08-0000-02

一、引言

Linux是一种可运行于多种平台的,源代码公开的多任务、多用户操作系统,Linux继承了Unix的基本设计思想,在安全性和稳定性方面得到了大量使用者的认可,对于这种多任务、多用户的操作系统,其内核进程间的通信可以说是整个系统的核心要素,是保证其它子系统能获得相应的系统资源得以正常运行的根本。近年来,随着Linux系统的应用领域的不断拓展,基于Linux系统的应用软件不断增多,使得系统负荷不断加重,虽然Linux操作系统提供了多种进程通信机制,但这些通信机制在承担大容量数据传输时效率较差,已经不能满足用户日益增长的需求,如何针对Linux系统进程通信机制的不足进行改进,建立高速有效的通信机制,成为Linux系统应用所必须关注的问题。下面,本文在分析Linux内核进程通信机制的基础上,就如何提高Linux内核进程间的通信效能进行探讨。

二、 Linux内核结构组成

进程实质上就是处于执行状态的程序,但并不仅限于程序代码,通常还包括其它资源如打开的文件、处理器状态、地址空间、存放全局变量的数据段等。Linux系统下的进程应当包含一段可执行程序、专用的系统堆栈空间、进程控制块、独立的存储空间几个要素。Linux建立这种基于多用户、多任务的大型应用系统,主要是倾向于通过大型、复杂、孤立的进程来提供应用功能,为了真正实现多任务、多用户应用环境,Linux充分利用了任务切换机制,从而有效的降低了对硬件配置的要求,并支持多种处理器芯片,但严格来说Linux并不是实时操作系统,因此要提高其实时性能,必须从其进程调度策略入手,提高其通信效能,从而改进其实时性。

Linux内核主要分为进程调度、内存管理、虚拟文件系统、网络接口、进程间通信五个子系统。进程调度控制进程对CPU的访问,当需要进行下一个进程时,进程设度程序即依据需求选择最值得运行的进程。可运特进程则是等待CPU资源程,Linux所采用的进程调度算法是这种基于优先级的简单的算法。在五个子系统之间关系十分密切,进程调度承担控制与沟通的作用,当存在多个程序时,程序要获取CPU资源运行就必须为该程序创建进程,而创建进程首先就必须将程序和相关数据写入内存之中。进程间的通信主要依靠内存管理来进行,依靠共享内存通信机制,允许两个进程除了拥有自己的私有内存外,还可以存取共同的内存区域。虚拟文件子系统是利用网络接口支持网络文件的系统,该系统也同样依靠内存管理的支持,来实现虚拟文件系统的进程交换,进程的交换由调度程序来定期进行调度,因此内存管理需要依赖于进程调度。

可以看出,在Linux内核五个子系统中,进程调度子系统是整个内核其它系统顺利工作的关键部分,无论是文件系统进程还是网络服务进程,都依靠进程调度来获取CPU资源才能正常运行。虽然Linux是多用户、多任务操作系统,但其多个进程之间是分离的任务,各个进程有着自己的权利和责任,任何一个进程崩溃了,不应该影响到其它进程导致其它进程崩溃,每个独立的进程都运行在自己的虚拟地址空间之中。

三、 Linux内核进程通信手段分类

Linux内核进程通信所采用的通信机制,基本上是延用UNIX平台所采用的进程通信机制,其中,AT&T的贝尔实验室和加州大学伯克利分校的伯克利软件发布中心在进程通信机制方面的侧重点并不相同,贝尔实验室在对UNIX早期进程间通信手段改进和扩充的基础上,形成了“System VIPC”通信机制,该通信机制将通信进程局限于单个计算机内,而伯克利软件发布中心则跳过了单个计算机的限制,形成了Socket进程通信机制。Linux在继承两者的基础上,提供了管道、信号、跟踪、命名管道、报文、共享内存、信号量以及插口等通信手段。其中,管道、信号、跟踪通信手段属于“System VIPC”通信机制,而其余几种通信手段则属于Socket通信机制。

管道通信机制是通过在父子进程间或者兄弟进程间通过系统调用建立一个单向的通信管道来实现进程通信的通信机制。这种管道路是由父进程所建立的,对子进程来说是静态的,是采用先入先出的原则来进行进程间内容的传递,其每个管道都是单向的,因此要实现双向通信就需要建立两个管道。信号通信机制严格的来说并不是为进程间通信而设置的,但也用于进程间的通信,这种通信机制更多的偏向于“中断”机制的软件模拟,一般将信号发送者作为中断源,接受者作为处理器,采用发送中断请求的方式来实现通信。跟踪是通过调用ptraceO读写其它子进程地址空间中的内容的方法, 来实现跟踪子进程执行的目的。这几类进程通信机制,都只能应用于父进程和子进程之间,或者兄弟进程之间,在发送信号时需要对方的PID,整个通信管道对于子进程来说是静态的,单向的,在实际使用中通常还需要在建立动态通信管道来辅助通信。

命名管道是采用FIFO文件的形式存在于文件系统之中,当进程间需要通信时,通过使用其文件名来打开管道,因此管道的使用不再局限于近亲进程之间。报文队列通信机制是通过系统调用设立一个报文队列,进程通过系统调用向该队列发送消息或从队列中接收消息,以报文传递的形式来实现进程通信。共享内在是通过系统调用为进程设立共享内存区,其它进程通过系统调用将该内存区映射到用户地址空间中,即可像正常内存访问一样读写该共享内存区。虽然共享内存通信机制快速有效,但共享内存通信机制不像其它通信机制那样能够在写入后就立即唤醒睡眠等待中的进程,因此需要与其它通信机制相配合使用。

四、进程通信机制对比分析

采用管道通信机制,父进程与子进程之间,或者兄弟进程这类近亲进程之间, 可以通过系统调用建立一个简单的通信管道,但这类通信管道只能由父进程建立,管道两端的进程都将该管道看作是一个文件,通过管道一个进程向其中写入数据,另一个进程从管道内读取数据,所采用的是先入先出的原则。这种依据于管道所进行的通信是单向的,因此在利用管道通信时,如果一个进程有大量数据需要写入管道,会出现缓冲区溢出现象形成危险,据统计依靠缓冲区溢出进行的攻击即占了系统攻击总数的80%以上。此外,如果当一个进程需要写入数据但管道已满时,则要等另一个进程从管道中读走一些数据后才能写入,这时候如果该进程读走数据后退出,那如果还存在未写完的数据,即将会产生崩溃。因此,在管道与利用管道进行的两个进程三者之间,是否最终能够取得稳定的通信状态,是管道通信能否正常工作的根本保证。

Socket通信机制除了适应于同一台计算机上进程间的通信,还适用于网络环境内的网络进程间的通信,这也是网络操作系统所必须具备的基本功能。实质上,一个Socket就相当于一个通信线路的插口,当需要通信的两个进程双方都有这样的插口,并有通信线路进行连接,即可完成双方间的通信。简单的看来,Socket通信和管道通信并没有太大的区别,但二者之间的不同在于,管道两端通信的进程只能在同一台计算机上,而Socket两端通信的进程则可以存在于计算机网络中不同节点上,在实现和使用起来同管道有着极大的区别。

虽然从理论上来讲,不论是管道通信还是Socket通信,都能有效的实现进程间的通信,但众所周知,在Linux中可能存在一种僵尸进程,这种进程是一个已经终止了的,但父进程尚未对其进行善后处理的进程。在一个进程调用exit命令结束自己生命周期的时候,其实并没有真正被销毁,而是存在一个僵尸进程的数据结构,出现这类情况时,将会严重影响通信效能,形成系统冗余。

而采用内存映射通信机制,通信双方都必须保证在任何时候都不能越界访问没有被映射到虚拟地址的物理内存,否则将会因为段错误而导致进程被强行退出。同时,使用直接内存映射通信机制时,进程均必须自行管理用来存储通信数据的物理内存块,需要保证同步、互斥的访问机制以保持交换数据的一致性,因此这种通信机制更多应用于对通信效率要求很高的进程。

五、结束语

Linux操作系统的安全性和稳定性为人们所公认,随着其技术的日益成熟,应用越来越为广泛,所包含的东西也越来越多。Linux内核已经成为一个覆盖多方面应用的一体化内核,作为一种多用户、多任务操作系统,其进程间的通信效能极为重要,对整个系统的性能起着至关重要的影响作用,尤其是随着系统规模的扩大和复杂程度的提高,采用高效的通信机制变为提升系统性能的关键。在实际应用中,许多内核进程间都需要保持通信,以实现数据的分析和处理,不论是采用管道通信机制还是Socket通信机制,抑或是采用内存映射通信机制,都存在一定的缺陷,在具体应用中需要根据进程通信的具体需求和进程特点选择合适的通信机制,以此来实现进程间的高效通信,保证系统的稳定性和可靠性。

参考文献:

[1] Daniel P.Bovet, Marco Cesati. Understanding the Linux Kernel. 3rd Edition. O’Reilly,2006

[2]董昱,马鑫.基于netlink机制内核空间与用户空间通信的分析[J].计算机工程,2007(15)

[3]Jonathan Corber, Alessandro Rubini, Greg Kroah-Hartman. Linux 设备驱动程序3rd Edition. O’Reilly,2006

[4]费彭.Linux 底层通信的分析与改进[D].吉林大学硕士学位论文,2005

[5]彭小玲.Linux2.6内核进程调度策略与算法分析[J].科技创新导报,2008(22)

[6]赵旭,夏靖波,王哲.Linux内核进程调度的研究与改进[J].测控技术,2009(28)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值