免费注册 查看新帖 |

Chinaunix

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

如何提高线程切换和通信速度? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-04-21 18:54 |只看该作者
回复 10# JohnBull
There are two threads
thread1 always call ioctl one time every second.
thread2 always call two steps ioctl  one time every second.

thread2 require two step must not be interrupted by thread1's ioctl
The operations as the following is not permitted.
ioctl //thread2
ioctl //thread1 interrupted
ioctl //thread2

I want to use pthread_mutex, semaphore, cond_wait .... but because thread1 is a lib.and it can't not be changed.
So how can I protect two steps ioctl, guarantee it will not be interrupted by thread1?
Thanks very much.


和上面的情况类似。
只有运行在实时线程的上下文才不会被0优先级的普通任务打断。 所以另开一个SCHED_RR, priority=1的线程。

论坛徽章:
0
12 [报告]
发表于 2011-04-22 17:17 |只看该作者
利用优先级实现是可以的,但是随之而来的效率下降也是必然的(因为引入了额外的切换)

非开源软件的话,没办法...

下下策是在内核里动手术,把thr2的两个ioctl合并成一个系统调用。

论坛徽章:
0
13 [报告]
发表于 2014-01-15 11:17 |只看该作者
本帖最后由 caravsapm70 于 2014-01-15 11:19 编辑

刚发现,有时候pthread_cond_signal的执行时间能到3ms。很要命的……

论坛徽章:
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
14 [报告]
发表于 2014-01-15 13:57 |只看该作者
线程切换本来就很慢。除非请求资源得不到满足,否则总得让人家跑满一个时间片吧。

论坛徽章:
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
15 [报告]
发表于 2014-01-15 15:21 |只看该作者
适合使用多线程/多进程的问题是:

1、两段逻辑可并行执行
典型如A从磁盘读数据、B把数据通过网卡发送出去

2、A逻辑不希望出现阻塞,所以用另一个线程B去执行可能导致阻塞的部分逻辑
典型如super pi,计算pi值时不希望UI锁死

3、几个逻辑互不相关,但需要“同时”执行
典型如网络服务的业务逻辑和心跳逻辑


————————————————————————————
典型的生产者-消费者问题,不是生产者产生1个资源,消费者马上处理1个资源——如果是这样,写成顺序逻辑效率岂不更高、逻辑岂不更简单?

实际情况是: 1生产者不停产生资源---2资源加入缓冲区---3消费者从缓冲区取得1个资源---4消费者处理资源

其中,1和4是可以并行的;2和3不能并行,必须通过进/线程同步机制做好保护(缓冲区可看做一个list,生产者在这个list中追加元素,消费者取出生产者追加的元素并进一步处理:两个处理过程不应该加锁,因为两者处理的元素是不同的;但操作list就必须加锁)。

用伪码表示,就是:
生产者:
1、产生资源
2、锁定资源缓冲区
3、把资源加入缓冲区
4、解锁资源缓冲区
5、跳转第一步

消费者:
1、锁定资源缓冲区
2、取得1个资源
3、解锁资源缓冲区
4、处理资源
5、跳转第一步


生产者的步骤1和消费者的步骤4并行。

要保证这个逻辑的效率,锁定资源的时间就一定要短,不必保护的指令绝不要放到临界区执行。否则,锁冲突的几率就太大了,甚至轻易就能抵消硬件并行的优势。
这个原则,也是所有多进/线程算法优化的第一要素。


而楼主的程序,很显然,基本上所有的代码都在临界区——除了循环跳转对应的loop这一条指令。
这种设计,不频繁出现锁冲突才怪。

另外,看楼主的逻辑,full和empty两个信号似乎是每次都设置,并不存在任务队列/缓冲区。
而线程切换的前提是:
1、线程时间片到(但由于只有1条指令在保护区外,所以时间片到也不可能正确切换到另一个线程)
2、资源得不到满足(在pthread_cond_wait处,pthread_cond_wait会自动为mutex解锁,条件满足时再自动加锁)
3、即便线程切换了,也未必(或者说,肯定)会第一时间切换到你的另一个线程上——好多进/线程都在等着呢。

于是,你的程序在实质上,成了“用锁强制逻辑按A-B-A-B”的顺序执行——不仅没得到任何并行方面的好处,反而引入线程切换的开销。


当然,这些只是从你的简化代码看到的东西,可能并不同于你的实际情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP