免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cwgk
打印 上一主题 下一主题

高并发的问题 [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
11 [报告]
发表于 2009-08-11 17:17 |只看该作者
原帖由 cwgk 于 2009-8-11 08:54 发表
请版上的高人指教,欢迎大家谈出自己的观点。以下是我的问题:

在进行服务器开发时,强调高并发这个特性,但是在设计中需要考虑那些方面,需要采用什么策略或机制?
平台为Linux/Windows,语言为C、C++。
...

更注重的是数据库。语言本身并发性没问题,多处理器,多进程就可以了。
多线程的并发是有条件的,不能太多互斥。

论坛徽章:
0
12 [报告]
发表于 2009-08-11 17:19 |只看该作者
原帖由 bruceteen 于 2009-8-11 09:26 发表
自己写多线程控制,要写的东西实在太多,很多东西都写不完美
OpenMP不错,学起来不是太难,用起来简单,而且gcc/vc等都直接支持

/*
从GCC4.2开始C,C++和Fortran编译器增加了OpenMP2.5功能。从GCC4.4中,O ...

求教一下,OpenMP和多线程的关系。。。顺便说一下,这个OpenMP是共享内存的,不可以分布的,分布还要MPI。

论坛徽章:
0
13 [报告]
发表于 2009-08-11 20:54 |只看该作者
原帖由 html1999 于 2009-8-11 09:57 发表
IOCP 你只要用好了就行

呵呵 能晒晒你的epoll 高并发模型吗

论坛徽章:
0
14 [报告]
发表于 2009-08-11 20:57 |只看该作者
原帖由 yulihua49 于 2009-8-11 17:17 发表

更注重的是数据库。语言本身并发性没问题,多处理器,多进程就可以了。
多线程的并发是有条件的,不能太多互斥。


数据库需要注意什么方面咩?

论坛徽章:
0
15 [报告]
发表于 2009-08-17 15:41 |只看该作者
高并发跟多线程有毛关系啊, 会设计一个线程也能实现高并发, 不要用自己那点浅薄的知识误导群众!
多线程不过就是给那些不懂怎么时间分片的人取做强制时间分片。。。。。。
土鳖的技术方案只会害人!

给lz一个指导思想:

首先高并发基础是网络读写的不堵塞, 也就是要你设计的时候保证你读写数据的过程不要处于等待状态, 也就是你读/写 就是准备好数据以后取直接read/write就好了, 这里要注意的问题是,读数据可以通过epoll/kqueue/iocp这些东西要通知你何时读数据;写数据的时候分块写,不要一次把数据都写完, 比如你有2g的文件你不能连续write到完成为止, 这样的话其他连接就根本得不到cpu,就谈不上高并发了。

然后就是要支持任务队列/消息队列, 这个怎么定义都可以, 只是一个概念, 简单说呢就是把要做的事情队列话, 比如要读数据, 要写数据,要处理数据都可以当作一个任务去做, 这里分任务的标准是这个任务会在很短的时间内完成, 而不是很长,需要很成时间完成的事情可以交给额外的线程去专门负责做, 做完再回调,执行数据处理完成后的其他事情。说明一下:当然这里也要使用多线程, 我并不反对多线程,只是我反对多线程作为设计的主线, 就好比当年有人跟我说网络游戏一个在线用户一个线程的土鳖方案一样的让人觉得那么不自在。

最后要做的就是也需要做线程池,这个多cpu系统上会提高很大的效率。


你要有兴趣可以看我开发的基于以上思想的网络通信库, http://code.google.com/p/sbase 里边有例子可以参考。




原帖由 bruceteen 于 2009-8-11 09:26 发表
自己写多线程控制,要写的东西实在太多,很多东西都写不完美
OpenMP不错,学起来不是太难,用起来简单,而且gcc/vc等都直接支持

/*
从GCC4.2开始C,C++和Fortran编译器增加了OpenMP2.5功能。从GCC4.4中,O ...

论坛徽章:
0
16 [报告]
发表于 2009-08-17 16:29 |只看该作者

回复 #15 redor 的帖子

15楼的兄弟,你这个写网络部分有问题吧?随便浏览了下那个server.c。说下,勿怪。
看到你那个非阻塞connet,就好像不对吧,你看看。
难道以前你用自己这套代码连接的时候没出现问题?不可能吧。呵呵

论坛徽章:
0
17 [报告]
发表于 2009-08-17 20:17 |只看该作者
听说“epoll+ 线程池” 不错的… 正在学习中…

建议参考下nginx或lighttpd中的对高并发的处理…

论坛徽章:
0
18 [报告]
发表于 2009-08-17 22:18 |只看该作者
原帖由 redor 于 2009-8-17 15:41 发表
高并发跟多线程有毛关系啊, 会设计一个线程也能实现高并发, 不要用自己那点浅薄的知识误导群众!
多线程不过就是给那些不懂怎么时间分片的人取做强制时间分片。。。。。。
土鳖的技术方案只会害人!

给 ...


  1. FD_ZERO(&rd_fd_set);
  2.         memcpy(&rd_fd_set, evbase->ev_read_fds, sizeof(fd_set));
  3.         FD_ZERO(&wr_fd_set);
  4.         memcpy(&wr_fd_set, evbase->ev_write_fds, sizeof(fd_set));
  5.         n = select(evbase->maxfd + 1, &rd_fd_set, &wr_fd_set, NULL, tv);
复制代码


这个效率不高呀。
通常 fd_set只需要 FD_ZERO一次,根据select结果决定fd是否重新再加进fd_set中。

论坛徽章:
0
19 [报告]
发表于 2009-08-17 22:29 |只看该作者

回复 #15 redor 的帖子

这个 buffer[fd] 更加诡异了,
内存浪费先不谈,fd的值会限定在CONN_MAX ?

论坛徽章:
0
20 [报告]
发表于 2009-08-17 22:34 |只看该作者

回复 #15 redor 的帖子

还有这里

  1. n = recvfrom(fd, buffer[rfd], EV_BUF_SIZE, 0,
  2.                             (struct sockaddr *)&rsa, &rsa_len)) > 0 )
  3.             {
  4.                 buffer[rfd][n] = 0;
复制代码


n如果正好是EV_BUF_SIZE,
buffer[rfd][n] = 0就可能使程序crash了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP