进程间通信方式比较汇编

上传人:我** 文档编号:113813902 上传时间:2019-11-09 格式:DOCX 页数:16 大小:34.23KB
返回 下载 相关 举报
进程间通信方式比较汇编_第1页
第1页 / 共16页
进程间通信方式比较汇编_第2页
第2页 / 共16页
进程间通信方式比较汇编_第3页
第3页 / 共16页
进程间通信方式比较汇编_第4页
第4页 / 共16页
进程间通信方式比较汇编_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《进程间通信方式比较汇编》由会员分享,可在线阅读,更多相关《进程间通信方式比较汇编(16页珍藏版)》请在金锄头文库上搜索。

1、进程间的通信方式:1.管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。2.信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致得。3.消息队列(message queue):消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。 消息缓冲通信技术是

2、由Hansen首先提出的,其基本思想是:根据”生产者-消费者”原理,利用内存中公用消息缓冲区实现进程之间的信息交换. 内存中开辟了若干消息缓冲区,用以存放消息.每当一个进程向另一个进程发送消息时,便申请一个消息缓冲区,并把已准备好的消息送到缓冲区,然后把该消息缓冲区插入到接收进程的消息队列中,最后通知接收进程.接收进程收到发送里程发来的通知后,从本进程的消息队列中摘下一消息缓冲区,取出所需的信息,然后把消息缓冲区不定期给系统.系统负责管理公用消息缓冲区以及消息的传递. 一个进程可以给若干个进程发送消息,反之,一个进程可以接收不同进程发来的消息.显然,进程中关于消息队列的操作是临界区.当发送进程

3、正往接收进程的消息队列中添加一条消息时,接收进程不能同时从该消息队列中到出消息:反之也一样. 消息缓冲区通信机制包含以下列内容: (1) 消息缓冲区,这是一个由以下几项组成的数据结构: 1、 消息长度 2、 消息正文 3、 发送者 4、 消息队列指针 (2)消息队列首指针m-q,一般保存在PCB中。 (1) 互斥信号量m-mutex,初值为1,用于互斥访问消息队列,在PCB中设置。 (2) 同步信号量m-syn,初值为0,用于消息计数,在PCB中设置。 (3) 发送消息原语send (4) 接收消息原语receive(a)4.共享内存(shared memory):可以说这是最有用的进程间通信

4、方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。 这种通信模式需要解决两个问题:第一个问题是怎样提供共享内存;第二个是公共内存的互斥关系则是程序开发人员的责任。5.信号量(semaphore):主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。6.套接字(socket);这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。http:/ 名作者Richard Stevens的著名作品:Advanced Programming in the UNIX E

5、nvironment,它的中文译本UNIX环境高级编程已有机械工业出版社出版,原文精彩,译文同样地道,如果你的确对在Linux下编程有浓 厚的兴趣,那么赶紧将这本书摆到你的书桌上或计算机旁边来。说这么多实在是难抑心中的景仰之情,言归正传,在这一节里,我们将介绍进程间通信最最初步和最 最简单的一些知识和概念。 首先,进程间通信至少可以通过传送打开文件来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来, 进程间通信(IPC:InterProcess Communication)不包括这种似乎比较低级的通信方法。Unix系统中实现进程间通信的方法很

6、多,而且不幸的是,极少方法能在所有的Unix系 统中进行移植(唯一一种是半双工的管道,这也是最原始的一种通信方式)。而Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信 方法:管道、消息队列、共享内存、信号量、套接口等等。下面我们将逐一介绍。 2.3.1 管道 管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信。 无名管道由pipe()函数创建: #include int pipe(int filedis2); 参数filedis返回两个文件描述符:filedes0为读而打开,f

7、iledes1为写而打开。filedes1的输出是filedes0的输入。下面的例子示范了如何在父进程和子进程间实现通信。#define INPUT 0#define OUTPUT 1void main() int file_descriptors2;/*定义子进程号 */pid_t pid;char buf256;int returned_count;/*创建无名管道*/pipe(file_descriptors);/*创建子进程*/if(pid = fork() = -1) printf(Error in forkn);exit(1);/*执行子进程*/if(pid = 0) printf

8、(in the spawned (child) process.n);/*子进程向父进程写数据,关闭管道的读端*/close(file_descriptorsINPUT);write(file_descriptorsOUTPUT, test data, strlen(test data);exit(0); else /*执行父进程*/printf(in the spawning (parent) process.n);/*父进程从管道读取子进程写的数据,关闭管道的写端*/close(file_descriptorsOUTPUT);returned_count = read(file_descr

9、iptorsINPUT, buf, sizeof(buf);printf(%d bytes of data received from spawned process: %sn,returned_count, buf); 在Linux系统下,有名管道可由两种方式创建:命令行方式mknod系统调用和函数mkfifo。下面的两种途径都在当前目录下生成了一个名为myfifo的有名管道: 方式一:mkfifo(myfifo,rw); 方式二:mknod myfifo p生成了有名管道后,就可以使用一般的文件I/O函数如open、close、read、write等来对它进行操作。下面即是一个简单的例子,

10、假设我们已经创建了一个名为myfifo的有名管道。 /* 进程一:读有名管道*/#include #include void main() FILE * in_file;int count = 1;char buf80;in_file = fopen(mypipe, r);if (in_file = NULL) printf(Error in fdopen.n);exit(1);while (count = fread(buf, 1, 80, in_file) 0)printf(received from pipe: %sn, buf);fclose(in_file); /* 进程二:写有名管

11、道*/#include #include void main() FILE * out_file;int count = 1;char buf80;out_file = fopen(mypipe, w);if (out_file = NULL) printf(Error opening pipe.);exit(1);sprintf(buf,this is test data for the named pipe examplen);fwrite(buf, 1, 80, out_file);fclose(out_file); 2.3.2 消息队列 消息队列用于运行于同一台机器上的进程间通信,它和

12、管道很相似,是一个在系统内核中用来保存消息的队列,它在系统内核中是以消息链表的形式出现。消息链表中节点的结构用msg声明。事实上,它是一种正逐渐被淘汰的通信方式,我们可以用流管道或者套接口的方式来取代它,所以,我们对此方式也不再解释,也建议读者忽略这种方式。 2.3.3 共享内存 共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行 读写。得到共享内存有两种方式:映射/dev/mem设备和内存映像文件。前一种方式不给系统带来额外的开销,但在现实中并不常用,因为它控制存取的将是 实际的物理内存,在Linu

13、x系统下,这只有通过限制Linux系统存取的内存才可以做到,这当然不太实际。常用的方式是通过shmXXX函数族来实现利 用共享内存进行存储的。 首先要用的函数是shmget,它获得一个共享存储标识符。 #include #include #include int shmget(key_t key, int size, int flag); 这个函数有点类似大家熟悉的malloc函数,系统按照请求分配size大小的内存用作共享内存。Linux系统内核中每个IPC结构都有的一个非负整数 的标识符,这样对一个消息队列发送消息时只要引用标识符就可以了。这个标识符是内核由IPC结构的关键字得到的,这个关键字,就是上面第一个函数的 key。数据类型key_t是在头文件sys/types.h中定义的,它是一个长整形的数据。在我们后面的章节中,还会碰到这个关键字。当共享内存创建后,其余进程可以调用shmat()将其连接到自身的地址空间中。 void *shmat(int shmid, void *addr, in

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号