目 录 1.引言... 2 内容来自论文无忧网 www.paper51.com
2.Linux操作系统与进程通信概述... 2 内容来自www.paper51.com 3.Linux进程通信机制... 2 paper51.com 3.1 Linux进程通信机制的渊源... 2 内容来自www.paper51.com 3.2几种常见的进程通信机制... 3 内容来自www.paper51.com 4.进程通信的实现... 5 http://www.paper51.com 4.1消息队列... 5 paper51.com 4.2共享内存... 8 paper51.com 4.3消息队列与共享内存性能比较... 11 http://www.paper51.com
5.总结... 11 内容来自www.paper51.com
参考文献: 12 http://www.paper51.com 致 谢... 13 内容来自www.paper51.com
copyright paper51.com 1 引言 内容来自www.paper51.com 操作系统中进程间的通信(Inter-Process Communication,IPC)[1]是指并发进程传播或交换信息,通过通信相互协调,独立实现各种功能。进程间的通信保障了整个系统有条不紊地工作。Linux提供了多种进程通信机制,常见的有信号、管道、消息队列、共享内存、信号量和套接字等,通信机制不同通信的复杂度也不同。通信是一个广义上的意义,不仅仅指大批量数据传送,还包括控制信息的传送,它们的通信方法是基本相同的。 内容来自论文无忧网 www.paper51.com
本文追溯了Linux通信机制的渊源,并分别介绍了各种通信机制。重点探讨了消息队列和内存共享两种机制的工作原理,通过两个简短的程序对两种机制的实现作进一步的分析。 paper51.com 2 Linux操作系统与进程通信概述 内容来自www.paper51.com 操作系统(Operating Systems,OS)[2]是控制应用程序执行,充当硬件系统和应用程序之间的界面的软件。OS大致包括5个方面的管理功能:进程与处理机管理、作业管理、存储管理、设备管理、文件管理。目前微机上常见的操作系统有DOS、UNIX、LINUX、Windows、Netware等。Linux是当前最具发展潜力的计算机操作系统,这与Linux操作系统的优良性能是不可分割的。它是一款真正的多用户多任务操作系统,具有良好的兼容性和可移植性,而且稳定性也极高。它的安全性是很多企业选择其作为服务器操作系统的主要因素。许多最新的Linux桌面版产品在界面风格上越来越接近Windows,而且也突破了以往在Linux操作系统上缺乏应用软件的缺陷。 内容来自www.paper51.com 为了提高计算机系统的效率,增强计算机系统内各种硬件的并行操作能力,操作系统要求程序结构必须适应并发处理的需要,为此引入了进程的概念。进程是设计和分析操作系统的有力工具。然而不同的进程之间,即使是具有家族联系的父子进程,都具有各自不同的进程映像。由于不同的进程运行在各自不同的内存空间中,一方对于变量的修改另一方是无法感知的[3]。因此,进程之间的信息传递不可能通过变量或其它数据结构直接进行,只能通过进程间通信来完成。并发进程之间的相互通信是实现多进程间协作和同步的常用工具,具有很强的实用性。 copyright paper51.com 在操作系统中,不论多复杂的程序都会涉及到某种形式的进程间通信IPC(Inter-process Communication)。把应用程序设计成一组彼此通信的小片段比设计成单个庞大的程序更好,这时就需要把完成一个给定应用所涉及的工作散布到多个进程中也许还散布到进程内的线程中;在多处理器的系统中,多个进程可能在不同的处理器上同时运行,一个给定进程的多个线程也可能同时运行。因此,利用IPC把一个应用的工作散布到多个进程或线程可以提高程序效率。对于Linux这样一个多用户、多任务的操作系统,进程间的通信(Inter-Process Communication,IPC)是非常重要的,它是使整个系统得以有条不紊工作的基础。深入学习和理解进程间各种通信机制及实现方式,是编写Linux程序,开发Linux应用的基础。 copyright paper51.com
3 Linux进程通信机制 http://www.paper51.com Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。 内容来自www.paper51.com 3.1 Linux进程通信机制的渊源 copyright paper51.com 对Unix发展做出重大贡献的两大主力AT&T(美国电报电话公司)的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同[4]。AT&T的贝尔实验室对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了System V IPC,通信进程局限在单个计算机内;BSD则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。由于UNIX本身版本的多样性,国际电子电气工程协会IEEE开发了一个新的ANSI UNIX标准POSIX(计算机环境的可移植性操作系统界面)。Linux则把几者继承了下来,如图一所示: paper51.com
http://www.paper51.com 其中,最初Unix IPC包括:管道、FIFO(有名管道)、信号;System V IPC包括:System V消息队列、System V信号灯、SystemV共享内存区;Posix IPC包括: Posix消息队列、 paper51.com Posix信号灯、Posix共享内存区。有两点需要简单说明一下:(1)现有的大部分Unix和流行版本都是遵循POSIX标准的,而Linux从一开始就遵循POSIX标准;(2)BSD并不是没有涉足单机内的进程间通信(socket本身就可以用于单机内的进程间通信)。事实上,很多Unix版本的单机IPC留有BSD的痕迹,如4.4BSD支持的匿名内存映射、4.3+BSD对可靠信号语义的实现等等[4]。上图给出了Linux所支持的各种IPC手段,在本文接下来的讨论中,为了避免概念上的混淆,将尽可能少的提及Unix的各个版本,所有问题的讨论最终都会归结到Linux环境下的进程间通信上来。 copyright paper51.com 3.2 几种常见的进程通信机制 内容来自论文无忧网 www.paper51.com 1) 信号 http://www.paper51.com 信号是一种简单且最基本的进程间通信机制,它最大的特点是提供了一种简单的处理异步事件的方法。信号用于通知接收进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。 http://www.paper51.com 信号(signal,称为软中断)机制是在软件层次上对中断机制的一种模拟,也是Unix系统中的最古老的进程间通讯方式。异步进程可以通过彼此发送信号来实现简单通信,系统预先规定若干个不同类型的信号,各表示发生了不同的事件,每个信号对应一个编号。进程遇到相应的事件或出现特定要求时(如进程终止或运行中出现某些错误——非法指令、地址越界等),就把一个信号写到相应进程task_struck结构的signal位图(表示信号的整数)中[5]。接收信号的进程在运行过程中要检测自身是否收到了信号,如果已收到信号,则转去执行预先规定好的信号处理程序。处理之后,返回原先正在执行的进程。利用信号机制实现进程间通信的过程如图二所示: paper51.com
copyright paper51.com
大部分信号是由核心程序发出的,但也可以由某些进程发出。进程可以用系统调用kill()或是killpg()来向另一个进程或进程组发信号,内核也可以响应不同事件所产生的内部信号,如由用户终端对目标进程输入的中断(ctrl+c)、删除等功能键。进程接收到信号后,可能有多种处理方式,可以忽略信号,可以暂停进程,或者重新启动被暂停的进程,或者执行一个处理此信号的函数,多数情况还是采取系统默认,即终止进程。 paper51.com |