免费注册 查看新帖 |

Chinaunix

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

[C] 请教含优先级的scheduler如何修改为多线程,谢谢! [复制链接]

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2013-10-11 17:52 |只看该作者
w_anthony 发表于 2013-10-11 17:13
我还是不是很明白LZ的意思,可能我之前误解了。
是否是说你现在的代码并不是多线程,仍然是单线程的,但是 ...

您说对了
不过顶楼的想法就是想改成多线程的

确实问题多多啊,一讲都是泪{:3_188:}

论坛徽章:
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
12 [报告]
发表于 2013-10-11 19:09 |只看该作者
lxyscls 发表于 2013-10-11 11:00
回复 8# w_anthony


看起来好像是实现了一个 线程调度器 + 资源读取线程 + 状态机 的混合体?


其中,你所说的thread相当于一个回调函数,但额外保留有状态:两者结合,使其成为一种“自定义线程”。

然后,你的主进程会从若干个队列、按一定优先级调度这些“自定义线程”——python和早期的linux线程就是这么玩的。

然后,“自定义线程”似乎还会在数据处理过程中切换状态(体现在“放入不同队列”这个动作上)——这就是状态机模型。

额外的,你的主进程还会(通过select?)从网络读取新的请求,然后可能是把这些新请求“包装”成一个“自定义线程”(或者直接执行)?



如果是这样,那么这个设计的问题在于:

第一,它的“简易线程调度功能”太弱了,类似windows 3.x时代,是非抢夺式的,一个回调没有执行完,所有逻辑就被阻塞。

第二,主进程的职责不清:它一方面做调度,同时又从网络取数据,最后又来推动状态机……
从数据层面上说,主进程实质上是以“轮询模式”持续性的检查是否有需要处理的“任务”和新的网络包(且任务未完成或进入某个(或下一个)状态,就不能处理下一个包)。
但在实际执行时,它并没有实现出任何并行能力。于是,如果某个任务耗时稍长(如有数据库操作),就会延误网络包的读取,这个问题就造成系统吞吐率上不去。

——如果任务进入下一状态就处理下一个包的话,那么在等待新包到来的那段时间里,主进程是没法做事的。这白白导致“自定义线程”们不能正常进行下一步工作,必须等select超时(或收到下一个包):这是最坏的情况,不仅没有得到任何并行能力,反而导致程序无故进入sleep状态。
(如:event队列有东西,执行后在timer或child之类队列加了一条记录;然后调度程序跑下一个循环,发现event等队列无内容,于是select直到超时,之后才能执行timer/child队列内容)
——当然,如果是整个任务流程走完才处理下一个包,那么虽然得不到并行能力,但程序总算还是没有白耽误事。



改良方案吗,我不知道你系统的内部细节/设计目标,只能泛泛说一下:
首先,确认是否有我说的、每一步执行后都等待网络有数据或select超时问题

然后,可以:
1、保留“简单调度功能”,去掉取数据功能;并将每个“简单调度”线程作为一个基本单位
2、确定数据包的处理顺序是否重要
3、如果重要,那么不同用户间的数据包处理顺序是否也很重要?不同用户间数据相关的话,是否可用锁来解决?锁的频繁程度如何?
4、找出顺序重要数据的最小单位后,写一个专门的网络数据读取线程;然后将得到的数据按“顺序相关数据的最小单位”拆分,派遣给各自的“简单调度线程”(即去掉“简单调度线程”的读取网络数据功能,改成从属于自己的队列中取数据)

这样,至少可以在用户间并行。


或者,如果某个“自定义线程”比较慢(比如访问了数据库),那么就把它实现为线程(或线程池);然后把调用这个回调的动作替换成“push新数据到比较慢的线程负责的队列”,这样也可以提高主进程的处理速度。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
13 [报告]
发表于 2013-10-12 08:52 |只看该作者
LS所说的要点都是多线程化的重点。多线程的目的就是让程序逻辑在“挂起”等待的时候仍然能继续工作,从而榨干CPU的剩余价值(所以如果CPU一直都很忙,从未挂起等待过的话,多线程并不能带来效率提升,除非事务可以多核一起做)。LZ现在这个情况下,多线程肯定能带来很大的性能提升。但是需要解决的问题却是非常非常的多,而关于“优先”的问题,就相当于“造一栋楼要用什么木头做房间的门比较好”一样,我认为根本不是多线程化的重点。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
14 [报告]
发表于 2013-10-14 16:41 |只看该作者
多线程应该能提高性能,尤其是多核环境
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP