LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 788|回复: 7

应该用哪种I/O模型好?有经验的朋友谈一下

[复制链接]
发表于 2005-1-12 16:41:01 | 显示全部楼层 |阅读模式
C:\Documents and Settings\aa\My Documents\My Pictures\system.JPG
本机的图不能帖呀
:!!
图放在附件中了,在图中通道维护模块负责多种类型多个通道的数据收发。如果按图中这种结构必然要解决M1 和 M2 的通信,即M1将数据收到并放入接收缓冲区后通知M2,由M2处理缓冲区中的数据,这个我想可以用信号量来解决。麻烦的是在M2有数据要输出的时候,M2将数据放入了发送缓冲区后应该如何通知M1来发送数据?如果也采用信号量,那么M1模块的实现就比较麻烦了。对于M1我考虑用 select 来实现多路接收,但对于输出没想到什么好的方法。不知道朋友们对于多I/O一般采用什么方式?

由于图中的实现比较麻烦,我现在想把M1模块取消,将其在M2中实现,这样由每一个M2模块负责一个通道的数据收发,直接用 select 来实现。因为不存在M1 和 M2 的通信问题,所以实现起来较为方便,但是有一个缺点是 M2 和通道的操作联系过于紧密。

说了这么多不知道大家看明白没有?有经验的朋友谈下吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2005-1-12 17:24:04 | 显示全部楼层
那可不可以这样呢: 比如在M1中, 为M2维护一个发送缓冲区. M2发送数据时, 只需要将数据放入这个缓冲区
即可, M1会循环检测发送. 这样就不用M2主动再用其它方式通知了.
发表于 2005-1-12 19:48:01 | 显示全部楼层
M1采用轮询的方式效率太低了。M1和M2如果是分别实现为两个进程的话,可以采用管道交换数据。当管道中没有数据时,操作系统会自动阻塞读取数据的进程。一旦有数据写入,操作系统会自动唤醒等待的进程读取数据。
 楼主| 发表于 2005-1-13 11:24:21 | 显示全部楼层

谢谢两位

to gateh:
可能我没有说清楚。在M1中已经设置了发送缓冲区和接收缓冲区,当M1接收到数据并且已经把数据放入接收缓冲区后就通过一个信号量通知M2,这样来做接收应该没有什么问题。对于输出我开始只想到:M2准备好数据并放入发送缓冲区后再以某种方式去通知M1,并没有考虑由M1自己检测。多谢你的提醒。今天我又看了下《UNIX Network Programming Volume 1, Third Edition》,参照16.2节,觉得采用由M1检测的方式是可行的。我现在的想法是这样的:

  1. 使用非阻塞方式并且在M1中:
  2.    if 接收缓冲区不满
  3.       将相应的通道描述符加入 readset;
  4.    if 发送缓冲区不空
  5.       将相应的通道描述符加入 writeset;
  6.    select(width, &readset, &writeset, NULL, NULL);
  7.    if 通道有数据可读
  8.       读入数据并送入接收缓冲区然后设置信号量
  9.    if 通道可写
  10.       将发送缓冲区的数据输出
复制代码

相应的图改为如后所附

to kj501:
也许我还没能很好的理解你说的方法,但是我觉得用管道还是不好解决数据输出的问题。因为对于输出这里要分两步,如果用管道,首先要判管道中是否有数据,在有数据的情况下还要再判一次通道是否可写。如果用上面的非阻塞模型实现则需要两次循环才能完成一次输出

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2005-1-13 19:30:15 | 显示全部楼层
我看了你的介绍,有一点还是不清楚:你的模块,包括M1和M2,在运行时,都是在一个进程中,还是分别由不同的进程实现?如果是在一个进程中,那就要自己处理数据同步问题,如果不是,就要乃至进程间通信机制。
 楼主| 发表于 2005-1-14 08:23:24 | 显示全部楼层
Post by kj501
我看了你的介绍,有一点还是不清楚:你的模块,包括M1和M2,在运行时,都是在一个进程中,还是分别由不同的进程实现?如果是在一个进程中,那就要自己处理数据同步问题,如果不是,就要乃至进程间通信机制。

to kj501:
我没有说清楚,这个应用是建立在 vxWorks 上的。在其下所有任务处于同一地址空间中,这应该相当于Linux下的一个多线程应用吧
回复 支持 反对

使用道具 举报

发表于 2005-1-14 09:01:34 | 显示全部楼层
Post by 飞柳
to kj501:
我没有说清楚,这个应用是建立在 vxWorks 上的。在其下所有任务处于同一地址空间中,这应该相当于Linux下的一个多线程应用吧

原来如此,我还一直以为你用的是linux。我没有用过vxWorks,找到这篇文章,供你作为参考。
http://mail.ustc.edu.cn/~jycheng ... under%20vxWorks.pdf
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-17 08:20:37 | 显示全部楼层
非常感谢
希望BBS上以后能有更多的关于应用问题的讨论
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表