阅读:2742回复:7
pscreatesystemthread 的几个疑惑?
Dear all:
PsCreateSystemThread建立的thread 是否跟app层prcess差不多? windows 分派和调度是否把它们放在同一级别? 我遇到这样的情况,我的10mbps的虚拟网卡中建立了两个thread,一为分析数据thread, 二为指示数据到上层. 根据我的跟踪结果,数据指示的最高速度为500kbps左右,低到0--几十kpbs,而我case的要求,数据发送速率要达到800kbps以上才可以接受(用2k 的性能计数器跟踪的),试了无数次,速率还是提高不到. 所以我怀疑passive level 的线程级别太低, 因此数据指示效率低下. 还有一点就是,我用的是ndis-wdm架构, 是否ndismindicaterecepacket每次只可indicate one packet. 各位有何建议给我. 十分感谢!!! |
|
最新喜欢:antspo...
|
沙发#
发布于:2001-12-17 20:31
驱动里面创建的线程是运行在内核空间的,也就是0级,而应用程序允许在3级,两者不一样,如果是觉得线程的优先级不够,可以在线程里把自身的优先级提高
|
|
板凳#
发布于:2001-12-18 08:50
我的usbndis驱动里也用了PsCreateSystemThread,在线程里调用KeRaiseIrql提升irql. 另外,NdisMIndicateReceivePacket当然可以接受多个packet. |
|
地板#
发布于:2001-12-18 09:35
驱动里面创建的线程是运行在内核空间的,也就是0级,而应用程序允许在3级,两者不一样,如果是觉得线程的优先级不够,可以在线程里把自身的优先级提高 他问的是调度优先级,说的是中断优先级,比如passive_level, apc_level,dpc_level,int_level。 windows调度的时候,如果是passive_level,并不考虑应用层还是 核心层,当然应用层都是passive_level,这种情况下通过线程 优先级来调度,调度代码工作在dpc_level。 PsCreateSystemThread创建的thread的确工作在passive_level, 因此windows调度它和调度app并没有什么区别。 indicatepacket并不慢,你想想一个正常的w2k操作系统,安装 4块网卡,工作起来也毫无问题,我想是你的代码写得不够好的 缘故。 |
|
|
地下室#
发布于:2001-12-18 10:30
非常感谢二位的回复.
还有一点就是我的 ndis-wdm架构,要求数据indicate到上层 必须达到20Mbps, 亦即3M bytes左右, 在这种passive level的线程indicate, 是否可以达到这样的速率?? 如果passive level 之thread 达不到, 提高 irql level,KeRaiseIrql 应在何时放置? 我的处理是这样: ----------------- 在一个thread 中 NdisWaitEvent(... 如有有效数据, 开始组包, ..., 然后 NdisMindicateReceivePacket..(only indicate one packet once) 另外一个thread, NdisSetEvent(... 还有借问Mr.dazzy, 想你应该看过那个NdisUsb driver吧, 那里面是单包指示的, usb 1.0的最高速度是12Mbps,每次单包指示速率估计够,可到2.0, 60Mbps, 这样还够吗? 再次感谢各位的意见. Thanks a lot. |
|
|
5楼#
发布于:2001-12-18 11:52
非常感谢二位的回复. 单包指示(一次usb transaction传送一个包),多包指示(一次usb transaction 传送多个包),我都见过。我做的就是多包指示的。 [编辑 - 12/18/01 作者: dazzy] |
|
6楼#
发布于:2001-12-20 22:00
再次谢谢dazzy guardee and huyg的回复.
遗憾的是问题依然没有解决, 我升高了indicate thread 的irql, y用KeRaiseIrql, 发送速度最大也就是400k bytes/s(用性能计数器查看的), 可我的case要求至少要700k bytes/s, 速度还差一半,不过现在还是单包indicate, 是否改成多包可以解决, 从我跟踪的情况来看,indicate 确实是个瓶颈问题,我不敢肯定改成多包INDICATE可以解决问题, 如改成多包, 多少包一次指示一次较为合适呢? Mr dazzy, 你是多包的,多少包indicate一次?? 另外我怀疑,passivethred 执行的效率太低,是否要改成在dispatch level之上来执行. 或者是否直接把wdm抛弃掉, 直接用ndis结构来实现,不过那就要大改了.苦啊苦??!!! 到了如此地步,我索性把我的情况在向各位大侠描述得清楚一点吧: 我的硬件一块pci卡,芯片不是nic chipset, 原先已有一个wdm driver, 无他,dma master 传送方式.因原来 wdm driver工作的也不错, 而且另有其他用处, 所以我就沿用了,又做了一个 ndis, 基于wdm之上, 在ndis中 open wdm driver, create two thread, 一边(the first thread)分析取得数据, 另一边(the second thread)indicate data to upper layer, 二者用事件同步. 数据量较大, 3M bytes/s. 就这样. Thanks a lots. |
|
|
7楼#
发布于:2001-12-24 09:56
usb ndis由于一些原因,用定时器workitem routine或者system thread 来模拟普通的nic 的中断,这样也存在相应问题,由于usb ndis 的速度不快(600kByte/s),所以能够足要求。单包indicate是很费时间的。你也可以不用system thread,用定时器来试一试,定时器的dpc来负责收发,dpc 循环处理,wait for ndisevent----> formate packet--->indicate packet--->Set ndis Timer(the duetime is small). ndis Timer Dpc 工作在DISPATCH_LEVEL.
SYSTEM THREAD是较慢的,在多任务环境里一次有大量的thread在运行,你能保证你的代码能够在你想要执行的时候就执行吗(响应时间在为毫秒级)?我一次indicate 16 packets. 你用单包indicate(1514Bytes/packet),看来你的所说的速度,一秒钟里才indicate 265个packet. |
|