欢迎来到天天文库
浏览记录
ID:29013459
大小:77.00 KB
页数:8页
时间:2018-12-16
《对话UNIX:通过共享内存进行进程间通信.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、对话UNIX:通过共享内存进行进程间通信从表面上看,UNIX®应用程序单独控制底层主机。它随时可以访问处理器,它的内存是神圣不可侵犯的,连接它的设备只为它服务。但是表面现象会骗人,这样有如君主一般的绝对地位只是幻想而已。UNIX系统同时运行大量应用程序,有限的物理资源要在它们之间共享。处理器能力被划分为时间片,应用程序映像经常被换入和换出真实内存,设备访问由需求驱动,还受到访问权限的限制。尽管您的shell提示符不断闪烁,但是UNIX系统并非只是等着您发出命令,在幕后有许多活动正在进行。常用缩略词·API:应用程序编程接口·IPv4:Internet协议第4版·IPv6:Inte
2、rnet协议第6版·POSIX:UNIX的可移植操作系统接口尽管涉及一些复杂的机制,但是大多数应用程序不会注意到资源实际上是共享的,它们似乎是独享资源。但是,可以编写相互交互的应用程序。例如,一个应用程序收集或生成数据,而另一个应用程序同时监视进度并分析信息。另一个例子是即时交换消息的聊天系统,其中有两个对等的应用程序相互收发数据。SecureShell(ssh)也是这样,它可以在两个完全不同的主机之间进行协作。在这些情况下,代码都要连接另一段独立的代码以交换信息,这常常需要使用某种协议协商和控制交换过程。UNIX为实现这样的进程间通信提供了多种技术。一些技术提供同一主机上的进程
3、间通信,其他技术可以实现主机到主机的信息交换。另外,各种技术的速度不同,所以必须选择最合适自己需求的技术。还必须进行协调(实施时间控制和排他控制)。例如,如果一个应用程序产生数据,另一个应用程序消费数据,那么当读完共享池时消费者必须停下来等待生产者。另一方面,如果消费者无法足够快地读取池,生产者必须慢下来或暂停。表1总结在典型的UNIX系统上可用的进程间通信形式。表1.UNIX中的进程间通信名称说明范围用途文件在典型的UNIX文件中读写数据。任意数量的进程都可以互操作。本地共享大数据集管道使用专用的文件描述符在两个进程之间传输数据。通信只在父进程和子进程之间进行。本地简单的数据共
4、享,比如生产者和消费者命名管道通过专用的文件描述符在进程之间交换数据。通信可以在同一主机上的任意两个对等进程之间进行。本地生产者和消费者或命令-控制,比如MySQL和它的命令行查询工具信号通过中断通知应用程序某一情况。本地无法在信号中传输数据,所以信号主要用于进程管理共享内存通过在同一内存段中读写数据共享信息。本地任何类型的协作,尤其适合需要安全性的情况FTP、ssh和ApacheWebServer套接字完成特殊的设置过程之后,使用一般的输入/输出操作传输数据。本地或远程等网络服务正如前面提到的,每种技术满足不同的需求。假设多个进程之间的协作的复杂性大体相当,每种方法的优点和缺点
5、如下:·通过一般的UNIX文件共享数据很简单,因为它使用大家熟悉的文件操作。但是,通过文件系统共享数据很慢,因为磁盘输入和输出操作的效率远远比不上内存。另外,只通过文件读写数据很难协调。最后,在文件中保存敏感数据是不安全的,因为根用户和拥有特权的其他用户可以访问这些信息。对于只读或只写的数据,适合使用文件。·管道和命名管道也很简单。它们在连接的两端使用两个标准的文件描述符—一个只执行读操作,另一个只执行写操作。但是,管道只能在父进程和子进程之间使用,不能在任意两个进程之间使用。命名管道克服了这个缺点,是在同一系统上交换数据的好方法。但是,管道和命名管道都不提供随机访问,因为它们都
6、作为先入先出(FIFO)设备。·信号无法在进程之间传输数据。一般情况下,信号应该只用于在进程之间通知异常情况。·共享内存适合比较大的数据集,因为它使用内存,支持快速的随机访问。共享内存的实现有点儿复杂,尽管如此,对于多个进程之间的主机内协作,共享内存是不错的方法。·套接字的功能与命名管道很相似,但是可以跨主机。本地套接字(也称为UNIX套接字)只能进行本地(同一主机上的)连接。Inet和Inet6套接字分别使用IPv4和IPv6协议,它们接受远程连接(也可以通过本地机器的Internet寻址机制接受本地连接)。网络应用程序显然应该选择套接字,比如分布式处理或web浏览器。所需的代
7、码比命名管道复杂一点儿,但是模式是固定的,在任何UNIX网络编程书中都有介绍。现在不考虑主机间应用程序通信,看看如何通过共享内存在同一主机上进行进程间通信。回页首共享内存的工作方式顾名思义,共享内存让一段内存可供多个进程访问。用特殊的系统调用(即对UNIX内核的请求)分配和释放内存并设置权限;通过一般的读写操作读写内存段中的数据。共享内存并不是从某一进程拥有的内存中划分出来的;进程的内存总是私有的。共享内存是从系统的空闲内存池中分配的,希望访问它的每个进程连接它。这个连接过程称为
此文档下载收益归作者所有