免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6809 | 回复: 14
打印 上一主题 下一主题

如何理解:计算线程与I/O线程分离开,请帮忙解释,谢谢。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-05 09:00 |只看该作者 |倒序浏览
详细内容见地址:http://bbs.chinaunix.net/viewthr ... p%3Bfilter%3Ddigest
1. 线程过多
        线程并不是越多越好,对于某个程序,如果线程过多反而会严重地降低程序的性能。这种影响主要在于:
        将给定的工作量划分给过多的线程会造成每个线程的工作量过少,因此可能导致线程启动和终止的开销比程序实际工作的时间还要多。
        同时,太多并发线程的存在将导致共享有限硬件资源的开销增大。如保存和恢复寄存器状态的开销、保存和恢复线程cache状态的开销、废除虚存的开销、线程聚集在一起等待获取某个锁。
        怎样解决这个问题:
        限制可运行线程的个数
        将计算线程与I/O线程分离开
        使用已有的技术,如OpenMP,线程池等

google搜索没有发现想要的答案:
问题1:两个感念是否可以这么理解 计算线程:主要是数据计算的线程  I/O线程:频繁的输入,输出操作的线程。
问题2:问题1成立的前提下,我感觉这两个本身就没有关系?分离从何解释?
问题3:从题目本意是解决线程过多,分离不是会产生更多的线程么?

请线程高手指点下;谢谢。

论坛徽章:
0
2 [报告]
发表于 2008-08-06 08:19 |只看该作者
没人回答问题。。。
不知道是自己问的是太主观了还是别人不知道自己问什么问题?
请进入此帖的兄弟姐妹说说看法;谢谢。

论坛徽章:
0
3 [报告]
发表于 2008-08-06 09:09 |只看该作者
1.字面上应该是这样理解吧, 不同的线程做不同的事情
2.没听明白
3.当然你将一个又读I/O,又计算的线程分成两个线程当然是多了,但是从全局看,将多个又读I/O,又计算的线程分两个线程,一个I/O,一个计算,这样线程个数少了吧?

要是scutan 兄来讲就好了,不过MS他快一个月没来了

论坛徽章:
0
4 [报告]
发表于 2008-08-06 09:12 |只看该作者

回复 #1 crowsy001 的帖子

通常说的独立的I/O线程不是指和用户交互的I/O(比如键盘输入、鼠标),而是指和磁盘、网络交互的大数据量I/O。
比如你的程序有完成这么一个任务,从网络读入1G的数据并它们进行某种计算,就可以把从网络接收数据的任务分离到一个单独的线程,收到一点数据就先送给负责计算的线程处理 ……
LZ可以baidu一下linux下的异步I/O(AIO),一般的讲AIO的文章都会讲分离出单独I/O线程的原因

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
5 [报告]
发表于 2008-08-06 09:17 |只看该作者
统筹办法

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
6 [报告]
发表于 2008-08-06 10:14 |只看该作者
计算线程就是你本人——现在,你是一名厨师

IO线程就是煤气炉——显然,你切菜时它可以一边烧开水或炖汤


计算机系统内部并非仅仅一个CPU——端坐主板中央那个可以叫主CPU(我们正在进入多核时代,多主CPU的系统是越来越普遍了),它就是机箱里面的大厨。

多大厨系统里,显然可以把一颗白菜切开,两个大厨一人切一边的——举例来说,“白菜”可以是一个处理大数组的循环;如果数据不相关,则这个大数组就可以分成很多份同时在多个CPU上同时处理:这就是所谓的并行程序设计(当然,这里仅讨论多CPU并行;实际上并行也分很多种的)。
本质上,这和普通的多线程设计并没有太大的差别,无非是并行的对象不一样了,同时对内存、CPU cache的压力更大、因而可能需要考虑更多了。


同时,网卡、显卡、硬盘等等内部还有另一块控制芯片,你可以发一些指令到相应端口,让它们一边慢慢执行。

稍微新一点的系统还有DMA配合,替你这块主CPU分担了一部分外设-内存交互访问的工作——当然,这也可以看作另一块CPU。

早期的386系统,还有一块专门辅助做数学运算的“数学协处理器”(80387);只是从486开始就把它做到主CPU内部去了。

显卡在本质上则是一块图形协处理器(即所谓的GPU)——AMD也正要把它集成进主CPU。

新近出台的物理卡,其实和显卡GPU并没有太大区别,都是一块大规模并行协处理器。



以上种种,可以统称它们为“协处理器”。

相当一部分的“协处理器”功能很弱,弱得让你觉得它根本就不存在似的——就好像“你只要把盛满水的锅放在炉子上,不需要一直看着,炉子就会“自动”把水烧开”的“智能”程度一样。

但不管怎么说,这些协处理器工作时,你这块“主CPU”还是可以解脱出来,不必一直等在旁边看着的: 此时抽空忙点别的什么的话,工作效率显然会高得多。


所谓多线程程序设计,其实就是如何最大限度的让机箱内所有的处理器都可以尽量发挥它们的作用的学问。

很显然,玩这个,清楚每个设备(网卡、显卡、硬盘、内存DMA等等)完成一件工作所需的时间、清楚每个设备工作时会牵扯进哪些设备(如访问硬盘会牵涉到内存DMA)是知识基础;深刻理解统筹方法则是理论基础。


你所引的文字,已经是在这两个基础之上的细节讨论了。

论坛徽章:
0
7 [报告]
发表于 2008-08-06 10:31 |只看该作者
原帖由 shan_ghost 于 2008-8-6 10:14 发表
计算线程就是你本人——现在,你是一名厨师

IO线程就是煤气炉——显然,你切菜时它可以一边烧开水或炖汤

大哥,你比喻地太形象了

论坛徽章:
0
8 [报告]
发表于 2008-08-06 14:16 |只看该作者
thanks a lot

论坛徽章:
0
9 [报告]
发表于 2008-08-10 15:09 |只看该作者
6楼讲解太到位了,哈哈。
I/O线程我的理解就是要设计到I/O操作的线程,因为I/O操作速度慢要耗费大量时间,故分开单独处理。计算线程就是对数据进行处理的线程。
具体多少线程算合适,这个很难说,跟很多因素有关系,需要考虑具体的环境

论坛徽章:
0
10 [报告]
发表于 2008-08-12 01:22 |只看该作者
原帖由 zx_wing 于 2008/8/6 09:12 发表
通常说的独立的I/O线程不是指和用户交互的I/O(比如键盘输入、鼠标),而是指和磁盘、网络交互的大数据量I/O。
比如你的程序有完成这么一个任务,从网络读入1G的数据并它们进行某种计算,就可以把从网络接收数 ...

独立的I/O线程不是指和用户交互的I/O(比如键盘输入、鼠标),而是指和磁盘、网络交互的大数据量I/O。 这个是我开始理解的一个盲点。 谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP