免费注册 查看新帖 |

Chinaunix

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

谈谈你接触的通讯程序的模型 [复制链接]

论坛徽章:
0
71 [报告]
发表于 2011-01-23 11:42 |只看该作者
我不赞成楼上各位所说的用进程取代线程以防止异常终止的情况,可能是我代码写的少,不明白为什么会发生异常 ...
shtr 发表于 2011-01-23 02:36



    从科研的角度讲不应该出现异常终止,那就是对代码要求考虑到一切情况,而且进行处理。从工程的角度讲,还是要考虑的。
我同意你的架构讨论平台无关的东西这种说法。不过线程和进程的概念本来在windows和linux都是支持的。只是实现不一样而已,而接口都差不多是一样的形式

论坛徽章:
24
金牛座
日期:2013-10-18 21:35:56综合交流区版块每日发帖之星
日期:2015-08-15 06:20:00综合交流区版块每日发帖之星
日期:2015-09-30 06:20:00综合交流区版块每日发帖之星
日期:2015-10-16 06:20:03每日论坛发贴之星
日期:2015-10-16 06:20:03综合交流区版块每日发帖之星
日期:2015-10-24 06:20:00IT运维版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之天津
日期:2016-02-25 16:28:04综合交流区版块每日发帖之星
日期:2016-06-12 06:20:00每日论坛发贴之星
日期:2016-06-12 06:20:00综合交流区版块每日发帖之星
日期:2016-06-13 06:20:00综合交流区版块每日发帖之星
日期:2015-06-22 22:20:00
72 [报告]
发表于 2011-01-23 13:37 |只看该作者
关于线程和进程,从来没有说谁只能用来干什么,就像你用牛刀杀鸡,也未尝不可,方便不方便、顺手不顺手,自己感觉就是了。
看一看经典的教科书,讲线程部分的举例,都是用的生产者/消费者模型,从来没有用多通道并行模型的。再看看经典的开源软件,比如apache之类的,也都是用多进程而不是多线程的。
在很长一段时间里,我也同样对多进程和多线程之间的区别没有概念,直到有一天设计一个产品时我忽然明白了,多线程和多进程应该是面向不同应用模型的,它们的设计出发点就有不同,是用来干不同的事情的。于是我在这里说出来,就是希望别人少走这样的弯路。
如果你一时还接受不了,那就在以后的工作中慢慢摸索和体会吧。

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
73 [报告]
发表于 2011-01-25 10:10 |只看该作者
有个问题想请教ls各位大拿
采用第一种模型
while(1)
{
accept()
pthread_create()
}
是否存在一些 ...
ruifengzhangyi 发表于 2011-01-11 14:48



    这个问题难道就没有人知道吗?大拿们。

论坛徽章:
0
74 [报告]
发表于 2011-01-25 10:59 |只看该作者
本帖最后由 duanjigang 于 2011-01-25 11:02 编辑
有个问题想请教ls各位大拿
采用第一种模型
while(1)
{
accept()
pthread_create()
}
是否存在一些 ...
ruifengzhangyi 发表于 2011-01-11 14:48



    呵呵,有两点请斟酌:
第一:是否应该使用多线程来处理每个连接的请求?
第二:是否应该动态创建线程来处理每个请求?为什么不在初始化时创建好一个线程组,在接受连接的时候只是去分配任务给线程,这样效率高点吧。

关于第一个问题,我现在的做法是数据的接收和发送各用一个进程,因为他们独立,并不存在什么协作关系。(这大抵也是按照村夫说的原则来考虑的吧)
数据处理,是用别的进程来完成,也就是说,我并不支持用多线程来处理请求或者数据,具体原因,参考“一介村夫”等人的回帖。

关于第二个问题:我以前做过一个程序采用的是多线程处理,目标就是通过多线程来自动登录2000台服务器,检查这些机器上配置文件是否正常。
一开始想到动态线程,就觉得麻烦,因为我写代码喜欢按部就班的步骤,先设置初始状态,然后开启工作状态最后是结束状态。而且对于所有模块都是这个原则,如果在数据已经到来时,创建线程,初始线程的状态,这样对我个人来说,感觉逻辑很乱,而且动态创建线程对于响应要求较高的应用是有效率问题的。
我当时的做法是:2000台机器,配置文件中设置线程个数,比如50个,然后每个线程能分配40个节点,然后给每个线程都分配了独立的任务节点来存储数据,这样就能达到完全的并发独立的去执行,一台机器的执行任务需要3秒钟,40个节点最快120秒,当然最后实际时间是4分钟多(我想这是由于CPU个数不足50个,不能达到完全的并发和网络资源的限制引起的吧?),不过这个结果对我来说已经很好了。

说面得瑟了这么多,归根结底一个目标,设计程序时,尽量避免动态的开销和申请资源,在初始化时把能做的事情做完,这样可能你就能对程序执行的结果和时空消费做出估算了。而且也利于程序的稳定。呵呵

论坛徽章:
0
75 [报告]
发表于 2011-01-25 11:02 |只看该作者
我提到的那个多线程应用的实例在这里
http://linux.chinaunix.net/bbs/thread-1028015-1-1.html
可以参考下,或者给提出建议,谢谢

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
76 [报告]
发表于 2011-01-25 11:06 |只看该作者
呵呵,有两点请斟酌:
第一:是否应该使用多线程来处理每个连接的请求?
第二:是否应该动态创 ...
duanjigang 发表于 2011-01-25 10:59



    很赞成段英雄的观点。
其实感兴趣的可以研究一下apache,nginx等web服务器的处理机制,充分利用了进(线)程池,内存池的机制,也就是在初始化的时候,就创建一定数量的进(线)程,当请求服务到达的时候,不必再去为每个请求创建进(线)程来处理。同时,所创建的进(线)程资源还可以重复利用,即一个进程处理完一个请求后,并不直接退出,可接着处理后续的请求服务。这样可以大大的减少进程的创建和销毁带来的系统开销,从而极大的提高效率。
很多时候,如果系统资源紧张,可能导致进程创建失败,内存分配失败。因此,预先创建这样的“池”,不仅有利于对服务资源的统一管理,更有利于其可靠性方面的管理。

论坛徽章:
0
77 [报告]
发表于 2011-01-25 11:23 |只看该作者
呵呵,听dreamice说apache或许是用多进程负责通讯,也就是说接受到的socket能传递个子进程进行数据收发的继续,不知道这个是否真的可以,而且性能如何?
有空做个试验。
我看过下载加速器axel代码,知道它是用单进程多连接来实现通讯的,也就是说通讯是一个进程负责的。
不知道跟多进程通讯的差别在哪?
有知晓的前辈能否说两句?

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
78 [报告]
发表于 2011-01-25 16:52 |只看该作者
呵呵,有两点请斟酌:
第一:是否应该使用多线程来处理每个连接的请求?
第二:是否应该动态创 ...
duanjigang 发表于 2011-01-25 10:59



    很给力啊,多谢!

论坛徽章:
0
79 [报告]
发表于 2011-01-26 22:12 |只看该作者
这个是我在最近打算换工作,总结以前项目的时候随便画的。

服务器主要分为两个层次:通讯层和业务处 ...
jiang1013nan 发表于 2011-01-09 23:45



    34楼的模型貌似有些复杂,呵呵。
从这个帖子的讨论中,我越发觉得数据的收和发应该分开成两个进程。
用两个线程来负责收发,一个线程负责接受连接这种做法是否为了利用公共的连接描述符??也就是说到一个主机使用的是一条连接负责数据收发,还是收发各一条连接??
另外,用epoll的话,是不是连接接受线程和数据接收线程能合并在一起了?

论坛徽章:
0
80 [报告]
发表于 2011-01-27 08:57 |只看该作者
34楼的模型貌似有些复杂,呵呵。
从这个帖子的讨论中,我越发觉得数据的收和发应该分开成两个进 ...
duanjigang 发表于 2011-01-26 22:12



    epoll并没有改变传统的select或poll等处理方式。大多数模型还是一个通信控制线程,多个数据处理线程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP