搜索
bottom↓
回复: 24

关于LINUX下多线程程序执行效果的困惑

[复制链接]

出0入0汤圆

发表于 2012-12-11 09:59:19 | 显示全部楼层 |阅读模式
我做linux下多线程试验,三个线程,每个都是死循环翻转三个不同IO,感觉很失望,线程按系统时间片10ms来切换线程,我觉得实际系统中,假设要轮询三个事件,如果是单线程,10ms中,可以多次轮询三个事件,但是用多线程,0--10ms轮询第一个事件,10--20ms轮询第二个,20--30轮询第三个,这样似乎不如单线程处理好

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-12-11 10:06:50 | 显示全部楼层
但是用多线程,0--10ms轮询第一个事件,10--20ms轮询第二个,20--30轮询第三个
---------------------------------------------
加了互斥保护吗?所以才会有这中串行执行的效果。
多线程适用于那些不需要互斥保护(也就是互不相干)的任务的执行。

出0入0汤圆

 楼主| 发表于 2012-12-11 10:24:32 | 显示全部楼层
li3p 发表于 2012-12-11 10:06
但是用多线程,0--10ms轮询第一个事件,10--20ms轮询第二个,20--30轮询第三个
----------------------------- ...

三个io根本不关呀,为何要互斥

出0入0汤圆

发表于 2012-12-11 10:30:54 | 显示全部楼层
是否是同一个驱动?换句话说,用户程序操作的是不是同一个对象呢?

出0入148汤圆

发表于 2012-12-11 10:49:29 | 显示全部楼层
因为你这个试验无法发挥多线程的优点,多线程适合用来做并发,当某个线程需要等待的时候其他线程可以继续执行

出0入0汤圆

 楼主| 发表于 2012-12-11 11:11:44 | 显示全部楼层
yplin27 发表于 2012-12-11 10:49
因为你这个试验无法发挥多线程的优点,多线程适合用来做并发,当某个线程需要等待的时候其他线程可以继续执 ...


那如果实际系统三个事件随机发生,是用单线程的一个while(1)中轮流查三个标识好还是开三个线程三个while(1)中分别查各自标识好呢?

出0入0汤圆

 楼主| 发表于 2012-12-11 11:13:28 | 显示全部楼层
error_dan 发表于 2012-12-11 10:30
是否是同一个驱动?换句话说,用户程序操作的是不是同一个对象呢?

我直接在应用层操作IO口的寄存器的,不用驱动程序

出0入148汤圆

发表于 2012-12-11 11:27:05 | 显示全部楼层
NJ8888 发表于 2012-12-11 11:11
那如果实际系统三个事件随机发生,是用单线程的一个while(1)中轮流查三个标识好还是开三个线程三个while(1 ...

我个人的理解是如果程序中没有需要长时间操作或者长时间等待的过程,那么单线程就可以,如果有较长时间的操作,那么就将长时间的部分分一个线程进行

个人见解,非专业Linux开发

出0入0汤圆

发表于 2012-12-12 00:36:44 | 显示全部楼层
NJ8888 发表于 2012-12-11 11:11
那如果实际系统三个事件随机发生,是用单线程的一个while(1)中轮流查三个标识好还是开三个线程三个while(1 ...

如果你扫描3个独立的I/O,同时数据处理函数很快并且互不相干,那其实你用多线程的开销还略大于单线程,因为有线程调度的时间。这种情况下用单线程即可。

出0入0汤圆

发表于 2012-12-12 01:14:43 | 显示全部楼层
也许可以多进程,不一定要多线程的

出0入0汤圆

发表于 2012-12-12 10:50:33 | 显示全部楼层
NJ8888 发表于 2012-12-11 11:11
那如果实际系统三个事件随机发生,是用单线程的一个while(1)中轮流查三个标识好还是开三个线程三个while(1 ...

一个WHILE是单线程;三个WHILE是多线程;多线程没有单线程的效率高(因为线程的切换);但是多线程可以实现同时并发;感觉楼主还没有并发的概念,至少从软件上有这种感觉;

出0入0汤圆

 楼主| 发表于 2012-12-12 11:38:18 | 显示全部楼层
本帖最后由 NJ8888 于 2012-12-12 11:40 编辑
jm2011 发表于 2012-12-12 10:50
一个WHILE是单线程;三个WHILE是多线程;多线程没有单线程的效率高(因为线程的切换);但是多线程可以实 ...


你说的并发,实际还是分时发的,就像我三个IO是分时段输出的吧,不可能交替发送.目前我想出的状况是假设一个任务要执行500ms,单线程的话只能等它执行完毕其他任务才能动作,多线程是可以把500ms任务打散,中间插入其他任务,这样需要1秒才能执行完毕了,但是看起来,其他任务没有僵死.这可能是个实际的设计考虑因素

出0入0汤圆

发表于 2012-12-12 11:53:53 | 显示全部楼层
有这种做法,为了提高总体的时间,例如LINUX的启动什么的,在操作I2C等费时的时候,去做别的;在多线程中最主要的是同步;同步处理好了就没有问题;

出0入0汤圆

发表于 2012-12-12 11:54:23 | 显示全部楼层
其实你说的最好用所谓的异步操作去完成,不要自己开线程;

出0入0汤圆

发表于 2012-12-12 23:43:31 | 显示全部楼层

出0入31汤圆

发表于 2012-12-13 07:48:10 来自手机 | 显示全部楼层
楼主没用sleep吧,这样线程可能会独占处理器直到时间片结束

出0入0汤圆

发表于 2012-12-13 08:25:03 | 显示全部楼层
楼主的3个IO不相关,那我觉得按下面情况分比较合适:
1、如果是每个IO的处理都很快,开多线程就没必要,用单线程即可。
下面图中,数字表示是IO处理时间,□表示空闲时间
比如
11□□□□□□□□□□□□□□□
                             22□□□□□□□□□□□□□□□
                                                           33□□□□□□□□□□□□□□□
合并成一个线程
112233□□□□□□□□□□□
2、如果其中有单个或多个IO处理较慢,就需要为较慢的IO开独立线程。
比如
1111111111111111□
                             22□□□□□□□□□□□□□□□
                                                           33□□□□□□□□□□□□□□□
合并成2个线程
1111111111111111□
                             2233□□□□□□□□□□□□□

出0入0汤圆

发表于 2012-12-13 09:11:31 | 显示全部楼层
NJ8888 发表于 2012-12-11 11:13
我直接在应用层操作IO口的寄存器的,不用驱动程序

弱弱问下,在应用层可以操作IO口的寄存器地址吗?不是说应用层和内核层的内存空间是互相独立的吗?IO口的地址应该是属于内核层的吧?

出0入0汤圆

发表于 2012-12-13 09:38:45 | 显示全部楼层
mmap即可,不过如果一次操作的代码比较少,有时还没单片机快,除非代码比较大,linux才执行的快一点。如何分配进程,线程和高效处理之间的通讯,一直搞不清楚,有时候同样的程序,linux跑的没stm32快

出0入0汤圆

发表于 2012-12-13 09:41:41 | 显示全部楼层
看操作系统书,操作系统的效率只有70%,而且是最大的;如果在LINUX下没有涉及中断,对设备的寄存器操作直接RE-MAP是比较好的一种方式;

出0入0汤圆

发表于 2012-12-13 09:51:05 | 显示全部楼层
顶起 对操作系统很敢兴趣 但一直没勇气去碰

出0入0汤圆

发表于 2012-12-13 09:53:57 | 显示全部楼层
楼主把测试代码贴上来吧,方便的话。

出0入0汤圆

发表于 2012-12-13 10:13:43 | 显示全部楼层
同意16楼.....可能是你的线程没有主动让出 CPU 的控制权,那就只能由调度器来调度,那结果就是间隔系统时间片的时间执行多个线程咯。

出0入0汤圆

 楼主| 发表于 2012-12-13 13:52:15 | 显示全部楼层
本帖最后由 NJ8888 于 2012-12-13 14:19 编辑
ngyg12 发表于 2012-12-13 10:13
同意16楼.....可能是你的线程没有主动让出 CPU 的控制权,那就只能由调度器来调度,那结果就是间隔系统时间 ...


在每个线程死循环中加入等同于sleep的函数
struct timeval timeout = {0,1};
select(0, NULL, NULL, NULL, &timeout);
结果10ms时间片,每个IO都执行到翻转,不过都只执行一次IO,要等待下一个时间片,这样也是浪费时间片了
这样还不如一个线程轮询三个事件好

出0入0汤圆

 楼主| 发表于 2012-12-14 12:08:36 | 显示全部楼层
现在让两个线程执行IO后select 9ms,这样剩下的线程基本上独占了时间片,符合我的期望,试验完成
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 19:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表