进程间通讯之总结篇

一:进程间通讯的方法:

1、管道:管道是一种半双工通讯,它只能允许数据单方向流动。

             管道文件只占据inode,只是传输数据,不在磁盘上占据空间,

         从管道中读文件是一次性操作,数据一旦被读取,它就从管道中消失,释放空间。

         管道在内存上也是一个固定大小的缓存区,该缓冲区的大小为1页,即4k字节。文件就不会限制大小,除非磁盘已满。但在写管道时,管道写满,当这种情况发生,随后再对管道的write()调用将被阻塞,等待数据被读取,留出空间再write()。

            (1)有名管道:创建看的到管道文件,同样也是半双工通讯。

        (2)无名管道:看不见摸不着,没有名字, 在创建父子进程时才会出现。

2、信号量:对于一个资源能被几个进程同时访问的计数器。当同一时刻,有多个进程对临界资源访问时,信号量可以同步控制多个进程之间的同时访问。比如共享内存,就是利用信号量实现进程间同步。

3、消息队列:是种临时存储消息的队列,完成进程间数据传送,可以按照队列的特点和消息的类型优先传送数据。消息队列的数据有类型,读端可以通过消息队列的类型读取特定的数据。

4、共享内存:共享内存就是映射一段能被其他进程所访问的内存,一个进程创建共享内存,可以供多个进程访问。共享内存是最快的一种IPC,开辟内存在各个进程都有指针直接指向开辟内存区域,访问时当做本进程中的一个内存。它和信号量共同使用,来完成对进程间的同步控制。


二、进程间通讯的特点:

管道:

      两个进程利用管道通信时,给管道发送数据的称为写入进程,另一进程从管道中读取的称为读取进程。管道的本质还是文件,但又是一种特殊的文件,我们称之为管道文件。就像管道一样将一个男孩子的情书传递给对面的女孩,实现进程间通讯。
      利用系统调用PIPE()可以创建一个无名管道文件,通常称为无名管道或PIPE;

      利用系统调用MKFIFO()或者命令mkfifo可以创建一个有名管道文件.通常称为有名管道或FIFO。

      无名管道是一种非永久性的管道通信机构.当它访问的进程全部终止时,它也将消失。无名管道只能产生于父子进程之间。有名管道可以长期存在于系统之中,提供给任意关系的进程使用,但是使用不当容易导致出错.所以操作系统将命名管道的管理权交由系统来加以控制管道文件被创建后,可以通过系统调用WRITE()和READ()来实现对管道的读写操作;通信完后,可用CLOSE()将管道文件关闭。

      管道的特点正好也是它的局限性。

消息队列:

提供了一种在两个不相关的进程之间传递数据的简单高效的方法。在存储器中,消息缓冲区被组织成队列,具有先进先出的特点。创建消息队列后,消息队列允许一个或多个进程向它写入或者读取数据,可以实现消息的优先查询,也就是通过消息类型优先获取你想得到的信息。但是信息的复制需要额外消耗CPU的时间.不适宜于信息量大或操作频繁的场合

共享内存:
      针对消息缓冲需要占用CPU进行消息复制的缺点.OS提供了一种进程间直接进行数据交换的通信方式一共享内存,这种通信方式允许多个进程在外部通信协议或同步,互斥机制的支持下使用同一个内存段(作为中间介质)进行通信.它是一种最有效的数据通信方式,其特点是没有中间环节.直接将共享的内存页面通过附接.映射到相互通信的进程各自的虚拟地址空间中.从而使多个进程可以直接访问同一个物理内存页面.如同访问自己的私有空间一样(但实质上不是私有的而是共享的)。因此这种进程间通信方式是在同一个计算机系统中的诸进程间实现通信的最快捷的方法.而它的局限性也在于此.即共享内存的存诸进程必须共处同一个计算机系统.有物理内存可以共享才行。






  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值