免费注册 查看新帖 |

Chinaunix

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

【原创文章】多线程编程技术(作者:胖有形) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-12-22 21:13 |只看该作者
不错阿, 以前招行有个人写过一个,不过这个更好,哈哈

论坛徽章:
0
12 [报告]
发表于 2007-12-23 11:35 |只看该作者
^_^,不错

论坛徽章:
0
13 [报告]
发表于 2007-12-27 13:14 |只看该作者
是不是楼主对线程和进程的理解有误呢?
因为楼主说通过测试,发现使用线程并没有比进程效率提高多少。
可是看楼主的例子,完全没办法测试效率问题。
因为说线程效率高,经常是针对创建进程的代价太大来说的。还有就是进程比较耗费资源。
如果说都是创建好的情况下,一个线程池的效率可能还不如一个进程池的效率,只不过多进程有进程间通讯的问题,但是线程也有同步、互斥的问题。

论坛徽章:
0
14 [报告]
发表于 2007-12-27 14:37 |只看该作者
我建议大家对这个技术问题进行深入的讨论

大家在讨论中才能进步,也可以帮助我们完善这篇文档,让更多的朋友掌握该技术。

论坛徽章:
0
15 [报告]
发表于 2007-12-27 16:02 |只看该作者
原帖由 yaoaiguo 于 2007-12-27 13:14 发表
是不是楼主对线程和进程的理解有误呢?


完全存在这种可能。
很高兴看到13楼的发言。

事实上我只是选择了一个常见的应用, 然后写程序比较了一下多线程与多进程之间的差别。
或者可以这样理解:
    多线程技术不适合于我们当前的应用系统,因为我们当前的应用系统更注重程序的事务处理,以及维护的便利性。(这里说的“我们当前的应用系统”中的我们,是特指胖有型本人,不代表广大CU网友,特此说明)

在资源耗费这个方面,我写这份文档的时候在网上找了一下相关的资源,不过没有找到具体的差别有多大,也没有看到有相关的测试,或是测试方案。

如果能有量化的比较,那么读者就会认识的更加深刻,比如IBM说空间地址锁比互斥体要耗费资源,然后,IBM具体说明了“空间地址锁锁住一个共享数据的路径,大概需要500个RISC指令(recude instrction set computer),而互斥体只需要50个;但是空间地址锁不需要创建、销毁等等指令。而互斥体大约需要1000个RISC指令”。
有这样量化的比较,读者就可以根据自己的实际需求,来决定如何选用。

根据我的观察,在520的机器上(性能比生产的570要差远了),启动一个进程约需1.5秒,而主线程启动辅线程几乎是瞬间的。
至于对硬件的资源耗费,如内存,硬盘,CPU占用等,我觉得随着现在机器性能的提升,这部分几乎可以忽略不计了(可能是我过于乐观,欢迎有不同意见,不过最好能有相应的数据,或测试方案)

我真的很希望能有人能一针见血的指出,线程在实际应用中,比进程在应用中所优秀的量化程度(目前我能想到的指标就是两个:一个是启动所需的时间,一个是启动所占用的资源,以及这个资源对在整个400中所占的比重)

如果线程技术较之进程技术的优势主要在于创建之初,那么完全可以通过预启一些进程,然后使用一个主控程序实现对这些程序的调度,来绕过这个问题。(当然这会占用一些资源,不过如果在整个400中所占的比重不大,那也就不需要太过于计较,个人看法)

多进程之间的同步最常见的就是锁表问题(LCKW),不过这个自有系统去搞定,我们不需要过多关注。解决起来也简单,判断一下锁表指示器就行了;最多是运行结果有错,运行过程中就不会有MSGW。
多进程之间数据传输,或是通讯,有我心仪的DTAQ,当然也可以如果我以前一样,拙劣的写PF文件。

多线程之间的同步就需要一些技巧了,通常需要通过一些同步机制(像互斥体、信号量、地址锁之类)来进行控制,对于程序员的素质有一定的要求。
多线程之间传递数据可以巧妙的通过指针来实现,无论如何,是比DTAQ要快的,不过这就对程序员的素质,以及细心程度提出更高的要求。

坦白的说,我觉得如果出错的话,多线程程序比多进程程序的破坏性要大得多。(比如辅线程的异常结束会导致整个进程下面所有线程都结束;而与之相应,多进程出错的话,直接解决那个错误的进程就行了。再比如用错指针之类的问题)

而IBM在对多线程技术中,运行不具备线程安全性的程序,解决方法是“通过启一个新的进程去运行这个程序”,这实在是让我意想不到,又在情理之中。(如果这是明年的作文试题,那我就可以洋洋洒洒写一大篇了)

我是这样认为:
          程序A          程序B          程序C
线程并发        1s        5s        30s
进程并发        1+1.5s        5+1.5s        30+1.5s

单纯从时间上来看,程序运行总时间包含了启动线程/进程的时间,以及程序自身运行的时间。以此可以引发很多想法,写到这个地方的时候,我死机了两次(也就是从上面到下面,以及还有一些没有贴出来的话,我前前后后写了三遍),很郁闷,不再写了。

选用400的客户,主要就是基于它强大的并发能力(强大是相对的,显然不能和390比),以及稳定性(比如说400要是像我的本子这样,半小时内静悄悄掉电两次,我们就可以找供应商要赔偿了)。

采用多线程应该比多进程的并发能力更好,更强大,但是目前我还没想出测试案例来比较一下两者差别到底有多大。
如果差别没有达到一定的数量级,那我私底下认为还是一个便于维护的系统架构更为合适。

其实,我某个旧友现在所用的应用系统,使用的就是多线程技术,不过无法详谈,遗憾中。

[ 本帖最后由 胖有型 于 2007-12-27 20:40 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2008-01-02 22:07 |只看该作者
强顶。。。。
谢谢共享。。。

论坛徽章:
0
17 [报告]
发表于 2008-01-03 12:48 |只看该作者
谢谢分享,此帖置顶,希望能有更多的朋友参与讨论

论坛徽章:
0
18 [报告]
发表于 2008-01-04 17:19 |只看该作者
不错,分析的很好,顶,很好,很强大。

论坛徽章:
0
19 [报告]
发表于 2008-01-09 15:03 |只看该作者
哇,真牛,太深奥了,感觉都是操作系统底层的东西也,看不太懂。

论坛徽章:
0
20 [报告]
发表于 2008-01-18 15:15 |只看该作者
感谢胖子向大家证明了,在AS/400上SUBMIT 的效率和多线程一样,并且SUBMIT 更安全
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP