请教优化算法减少CPU处理时间

辉歌 2003-09-19 04:42:04
在Sco Unix 5.05,Ansi C

现在有一个程序,单进程模拟多任务,就是一个while(true)循环。在此循环中,需要接收N个TCP连接数据,还需要接收N多个Udp数据。现在我们的处理是先接收tcp数据,处理完后,大概需要2~5s,然后接收UDP数据,处理完毕后,使用一个Wait函数,使程序睡眠规定的时间,该函数在超时或者有UDP数据到达时唤醒,进而进行循环。

然而,这么处理,很明显的将导致数据丢失。因为有可能在wait的时候,没有UDP数据过来,却有tcp数据。并且是大量的涌来。等到接收时,已经使接收缓冲区漫了。

我们一直没有想到方法。请教各位老大,有什么好的方法吗?
...全文
95 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
辉歌 2003-10-18
程序结构是这样的:

先用select等待连接,如果有连接,立即处理连接,没有连接,1s后终止阻塞
用select等待所有连接socket,如果有数据到达,立即处理数据,如果没有,1s后终止阻塞
在处理数据的过程中,需要读取数据库,耗时较多。
接收UDP数据
wait 5s,交出cpu控制。

然后就是在这个5s的等待时间里,也许有另外的TCP数据或连接,但是程序已经收不到了。
  • 打赏
  • 举报
回复
fxiangh 2003-10-18
ls是指what?
如果你改成
将fd改成非阻塞,
select(fd, rsets, wsets, ...) -->continue;
同时 -->fork(), child_pid-->读取数据库 ;
效果会好的多;

别偷懒,对付多数据应用,fork(),pthread是最好的选择
  • 打赏
  • 举报
回复
earthwind 2003-09-25
动态分配缓冲,用固定的指针指向这个缓冲。不知道可否
  • 打赏
  • 举报
回复
NC 2003-09-25
用select 或 是使用非阻塞读,中间用nap等待。
  • 打赏
  • 举报
回复
wabc 2003-09-25
将不同任务分离开来,将使代码更清晰;
而同步的多少,是和业务及设计两方面相关的。
  • 打赏
  • 举报
回复
fierygnu 2003-09-24
没使用select()?
  • 打赏
  • 举报
回复
辉歌 2003-09-19
我们认为使用多进程考虑同步比解决该问题更麻烦。
  • 打赏
  • 举报
回复
wabc 2003-09-19
为什么不用多进程或多线程
  • 打赏
  • 举报
回复
辉歌 2003-09-19
当然,增加数据buff和减少等待时间我们都用了。
  • 打赏
  • 举报
回复
相关推荐
发帖
Linux/Unix社区

2.2w+

社区成员

Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
帖子事件
创建了帖子
2003-09-19 04:42
社区公告
暂无公告