阅读:2388回复:23
答的好了有79分!!
内核同步问题:
假设内核维护一个队列,有两个系统线程写队列,同时会有多个用户态进程通过DeviceIoControl向队列中写东西,怎样在内核做好互斥? 各位老大如果有确信有效、健壮的方法,小弟60分送上,79分也可。请不吝赐教! 经过一些尝试,小弟感觉在Dispatch Routine中做WaitForSingleObject似乎不是什么好主意,不知各位老大对此有何指教? |
|
|
沙发#
发布于:2002-07-25 16:50
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2002-07-25 16:57
KeInitializeSpinLock()
KeAcquireSpinLock() KeAcquireSpinLockAtDpcLevel() KeReleaseSpinLockFromDpcLevel() KeReleaseSpinLock() 申请一个KSPIN_LOCK 每次写队列前acquire 写完后release |
|
地板#
发布于:2002-07-25 17:37
为什么不用信号量呢!建议你去看看windows nt核心驱动程序开发的那本书吧!好象是在第9或者11章有讲的,把请求排队,然后在一个线程里面进行处理的啊
|
|
地下室#
发布于:2002-07-25 17:38
队列是你维护的吗?
|
|
5楼#
发布于:2002-07-25 18:46
经过一些尝试,小弟感觉在Dispatch Routine中做WaitForSingleObject似乎不是什么好主意,不知各位老大对此有何指教? 不知各位老大有没有注意小弟上面这句话。 guardee老兄,如果用两个信号量做个生产者消费者模型,对单进程的访问当然是没有问题,多个用户态进程的情况肯定不是这么简单,(抱歉,内核多线程的情况我还没顾的试),我还是感觉在Dispatch Routine做Wait是不是有问题?或者是什么别的原因? KeInitializeSpinLock() gung老兄,这个你试过吗?顶事吗? |
|
|
6楼#
发布于:2002-07-25 19:22
用户被禁言,该主题自动屏蔽! |
|
7楼#
发布于:2002-07-25 19:23
应该可以把,我用于防止中断dpc的重入,有效的,你试试看
|
|
8楼#
发布于:2002-07-25 19:25
用户被禁言,该主题自动屏蔽! |
|
9楼#
发布于:2002-07-25 19:28
队列写成功就肯定没问题了,用自旋锁使多线程写队列时互斥,这样就不会乱了,不知我对你的问题理解对不对
|
|
10楼#
发布于:2002-07-25 21:16
用户被禁言,该主题自动屏蔽! |
|
11楼#
发布于:2002-07-26 10:04
你创建的这个线程是负责对这个队列的操作啊!并且其他的需要访问该队列的请求全部都排队啊,让这个现成进行处理这个请求啊
|
|
12楼#
发布于:2002-07-26 10:51
只有StartIo写队列,用不用自旋锁无所谓。 厄~~~~ 说错了,想成是多卡互斥了, :P 还是请楼主说说到底有什么问题吧 |
|
13楼#
发布于:2002-07-26 10:54
只有StartIo写队列,用不用自旋锁无所谓。 Tom老大,多谢指点,不过还请再帮小弟分析分析。 情况是这样的:我现在有个驱动,它接受上层的DeviceIo操作,同时又在内核导出函数,让其它驱动从内核直接调用。对上层DeviceIo和内核调用,该驱动都是将数据稍加处理后调用IoCallDriver访问下层驱动,这里必须同步对下层驱动的访问。我的想法是将所有请求的数据写入队列(或链表),然后启动一个系统线程Pop数据进行处理(包括IoCallDriver)。我是在Dispatch中和内核调用中做Push动作(写队列),这时候同步出了问题。 请老大帮忙看看 1.我的想法是否合理? 2.是否有必要写StartIo Routine? 3.由于我Push入队列的东西不一定是Irp,不知IoStartPacket是否可以在我前面说的内核调用中处理不是Irp的东西? 4.当然,我可以对上层的调用使用IoStartPacket后在StartIo中做Push动作,这时我也必须同步StartIo和内核调用中的Push动作,这时候的同步和我之前做的内核Push和Dispatch中Push有无不同?是否也会出现问题?(如果可以的话,问题似乎就解决了) 5.另一个问题请教,对哥们gung说的,我感觉SpinLock不是用来互斥线程的,而且也做不到,甚至当一个CPU拥有SpinLock时,再去请求该Lock的拥有权,有时候是会出问题的,不知小弟的理解是否有理? 6.还是我之前强调过的,在Dispatch Routine中做Wait动作,是否会有问题?因为我觉得这里做Wait似乎会对用户态的动作有影响,不知老大对此有何看法? [编辑 - 7/26/02 by TonyHuyan] |
|
|
14楼#
发布于:2002-07-26 11:12
我感觉SpinLock不是用来互斥线程的,而且也做不到,甚至当一个CPU拥有SpinLock时,再去请求该Lock的拥有权,有时候是会出问题的 会吗?我把它用来做多卡中断dpc访问资源时的互斥,由于没有出过问题,也不知是没有出现过冲突,还是spinlock在起作用,没有仔细测试过,不敢乱说,不过M$给出这个东东应该就是有用的吧,你说的会出问题是知什么呢? |
|
15楼#
发布于:2002-07-26 11:41
gung老兄,对SpinLock兄弟研究不多,但从其含义来看,SpinLock是对SMP系统而设,其拥有权是对CPU而言;就好比Mutex,其拥有权是对线程而言一样,当一个线程已经获得一个Mutex的拥有权时,再去请求,是理所当然可以得到的,也就是说你在一个线程中连续多次做Wait的话,第一次之后的是没有意义的,效果仅是其引用计数增加而已。我想SpinLock情况也该类似吧。兄弟我不敢乱讲,所以请教各位。
|
|
|
16楼#
发布于:2002-07-26 12:14
呵呵,你还是看看我给你说的那本书上面的例子吧,我说的方法可以解决,或者你在本站下载那个filedisk的例子看看吧!
用startio是不可以的,因为iocalldriver的等级是passive,而startio高于这个级别的 |
|
17楼#
发布于:2002-07-26 12:15
还有一个问题就是iocalldriver是一个异步函数
|
|
18楼#
发布于:2002-07-26 12:21
呵呵,你还是看看我给你说的那本书上面的例子吧,我说的方法可以解决,或者你在本站下载那个filedisk的例子看看吧! guardee老兄,你说的那本书我了解,你说的方法和我的一样,问题就从这儿来。用StartIo倒是不存在Irql的问题,我前面说的是在StratIo中Push,在一个系统线程中Pop并处理,包括调用IoCallDriver。正因为IoCallDriver是异步函数,需要Wait,所以才只能在Passive Level做。 P.S. 不过好像也应该有问题,同步StartIo和别的调用,自然也得Wait,那该怎么办? [编辑 - 7/26/02 by TonyHuyan] |
|
|
19楼#
发布于:2002-07-26 15:39
各位老大,小弟似乎有答案了,待我证明之后向诸位汇报。 ;)
|
|
|
上一页
下一页