进程间通信IPC

这两天学习了UNIX的进程间通信IPC,这里面有几个很重要的基本概念,特别是消息队列和我的毕设很有关系,因此多说几句。

       以前学习的进程间通信方式,一般都是经由forkexec打开文件,或经过文件系统。而IPC是进程间通信方式的统称。下面一一道来。

一.管道

管道是最老的IPC形式。管道有两种限制;

(1) 它们是半双工的。数据只能在一个方向上流动。

(2) 它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。

对管道描述符可以调用readwrite。更为有益的是将管道描述符复制为标准输入和标准输出。在此之后通常子进程调用exec,执行另一个程序,该程序从标准输入(已创建的管道)或将数据写至其标准输出(管道)。这样就可以创建一些自动执行的程序,如自动完成从文件输入,从标准输出上打印。

一个特殊应用:当同一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出时,则该过滤程序就成为协同进程。

 

二.FIFO命名管道

管道只能由相关进程使用,它们共同的祖先进程创建了管道。但是通过FIFO,不相关的进程也能交换数据。

FIFO是一种文件类型。创建FIFO类似于创建文件,也就像使用文件一样使用它。

FIFO有两种用途:

(1) FIFOshell命令使用以便将数据从一条管道线传送到另一条,为此无需创建中间临时文件。

(2) FIFO用于客户机-服务器应用程序中,以在客户机和服务器之间传递数据。

 

三.信号量

信号量是一个计数器,用于多进程对共享数据对象的存取。为了正确地实现信息量,信号量值的测试及减1操作应当是原子操作。为此,信号量通常是在内核中实现的。

关于信号量的介绍很多,这里就不多讲了。

 

四.共享存储

共享存储允许两个或多个进程共享一给定的存储区,是最快的一种IPC。最重要的是保证对给定储存区的同步访问。通常,信号量(记录锁也可)被用来实现对共享存储存取的同步。

 

五.消息队列

消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。

具体对消息队列的存取就不多讲了,这里特别谈谈从UNIX对消息队列的实现中学到的一点技巧。

若我们在消息的结构中加入一个域typeUNIX中已经存在),则可以利用它实现很多功能。例如:

type表示消息的类型,那么我们在接收消息时,可以指定接收某种type的消息;又或者设置type为消息的优先权值,就可以根据优先权接收消息,等等。这样,我们就可以不按照FIFO的顺序来实现消息队列。

CS模式下使用消息队列则存在多种可能性:

(1) 在服务器和客户机之间可以只使用一个队列,使用每个消息的type字段指明谁是消息的接受者。例如,客户机可以用类型字段为1发送它们的消息。在要求之中应包括客户机的进程ID。此后,服务器在发送响应消息时,将类型字段设置为客户机的进程ID。服务器只接受类型字段为1的消息,客户机则只接受类型字段等于它们的进程ID的消息。

(2) 另一种方法是每个客户机使用一个单独的消息队列。在向服务器发送第一个请求之前,每个客户机先创建它自己的消息队列。服务器也有它自己的队列,其标识符是所有客户机知道的。客户机将其第一个请求送到服务器的众所周知的队列上,该请求中应包含其客户机消息队列的队列ID。服务器将其第一个响应送至客户机队列,此后的所有请求和响应都在此队列上交换。使用这种技术的一个问题是:每个客户机专用队列通常只有一个消息在其中(或者是对服务器的一个请求,或者是对客户机的响应)。这似乎是对有限的系统资源(消息队列)的浪费,可以用一个FIFO来代替。

这种类型的客户机-服务器关系(客户机和服务器是无关系进程)的重点和难点是:服务器如何准确地标识客户机,以便准确响应。

不过对于我的毕设,似乎和这个消息传递的方向相反。根据GUI的特征,服务器接收外部的消息,然后根据一定的条件判定以后,分发对正确的客户进行处理。客户处理完毕,似乎不是必须反馈处理结果给服务器。那么所谓的“一定的条件”是什么呢?当前具有焦点的对象?那么客户与客户之间的消息传递又是怎么样的?根据什么来标识?是直接从客户1到客户2,还是所有消息都由服务器来转发?在GUI中,消息队列的数量又该是多少?

最关键的还是我赶紧想清楚多任务的GUI到底是一种什么样的实现?

初步的想法是:

1.     一个服务器任务,每个窗口又都是一个任务,只有一个消息队列,由服务器来维护,每个窗口只需要实现自己的窗口过程处理消息即可。那么消息队列在GUI系统中就是全局的了。这好像就是windows的实现方式。但这时,我怎么创建这么多的窗口任务?

2.     一个服务器任务,负责主消息队列,每个窗口也是一个任务,但有自己的消息队列,由自己维护。这个实现更复杂,就像是一个多线程版本。

这两种的区别在哪里?能够实现我的功能吗?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值