阅读:2606回复:23
答的好了有79分!!
内核同步问题:
假设内核维护一个队列,有两个系统线程写队列,同时会有多个用户态进程通过DeviceIoControl向队列中写东西,怎样在内核做好互斥? 各位老大如果有确信有效、健壮的方法,小弟60分送上,79分也可。请不吝赐教! 经过一些尝试,小弟感觉在Dispatch Routine中做WaitForSingleObject似乎不是什么好主意,不知各位老大对此有何指教? |
|
|
沙发#
发布于:2002-08-02 22:00
呵呵!用信号量比用event要好,特别是当进栈的比出栈的快的时候
|
|
板凳#
发布于:2002-08-02 10:30
哦!不知道你使用了什么方法呢,但是我说的方法是肯定可以的 你老大说的对,其实大伙儿说的办法都很好,当然,gung老兄对SpinLock的理解小弟觉得还是不对,小弟始终认为上面对gung老兄的关于SpinLock的解释是有点道理的,如认为不对或讲的不合适,请不吝赐教,谢了! 这个问题小弟一开始的做法就没问题,至于分发例程中的Wait,由于和用户态交互,有时候是得小心些,对于队列的处理,像FileDisk中用Event通知没问题,但感觉用Semaphore更好。 Tom老哥说的办法也很好,只是小弟这里好像不用写StartIo也可以解决问题。 小弟最终发现出问题的是在一个傻逼Dll中,小弟的用户态程序要通过那个傻逼Dll访问下面,没办法,只好帮人改Dll了,靠~ 多谢各位老大帮忙,也多谢gung哥们帮忙。小分送上! 怎么给不了分了?说什么我不是此帖的发起人或此帖已经给分! faint! 三位来我的新帖里领分吧,不好意思。 [编辑 - 8/2/02 by TonyHuyan] 明白了,不知道为何在帖子上方点“会员登录”时要给个“保持登录天数”,默认还是10天!请问管理员,这有什么意义吗?我估计好多人遇到过给不了分的情况,都是这个原因! [编辑 - 8/2/02 by TonyHuyan] |
|
|
地板#
发布于:2002-07-26 23:21
哦!不知道你使用了什么方法呢,但是我说的方法是肯定可以的
|
|
地下室#
发布于:2002-07-26 15:41
各位老大,小弟似乎有答案了,待我证明之后向诸位汇报。
届时定有分值送上。 ;) |
|
|
5楼#
发布于:2002-07-26 15:39
各位老大,小弟似乎有答案了,待我证明之后向诸位汇报。 ;)
|
|
|
6楼#
发布于: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] |
|
|
7楼#
发布于:2002-07-26 12:15
还有一个问题就是iocalldriver是一个异步函数
|
|
8楼#
发布于:2002-07-26 12:14
呵呵,你还是看看我给你说的那本书上面的例子吧,我说的方法可以解决,或者你在本站下载那个filedisk的例子看看吧!
用startio是不可以的,因为iocalldriver的等级是passive,而startio高于这个级别的 |
|
9楼#
发布于:2002-07-26 11:41
gung老兄,对SpinLock兄弟研究不多,但从其含义来看,SpinLock是对SMP系统而设,其拥有权是对CPU而言;就好比Mutex,其拥有权是对线程而言一样,当一个线程已经获得一个Mutex的拥有权时,再去请求,是理所当然可以得到的,也就是说你在一个线程中连续多次做Wait的话,第一次之后的是没有意义的,效果仅是其引用计数增加而已。我想SpinLock情况也该类似吧。兄弟我不敢乱讲,所以请教各位。
|
|
|
10楼#
发布于:2002-07-26 11:12
我感觉SpinLock不是用来互斥线程的,而且也做不到,甚至当一个CPU拥有SpinLock时,再去请求该Lock的拥有权,有时候是会出问题的 会吗?我把它用来做多卡中断dpc访问资源时的互斥,由于没有出过问题,也不知是没有出现过冲突,还是spinlock在起作用,没有仔细测试过,不敢乱说,不过M$给出这个东东应该就是有用的吧,你说的会出问题是知什么呢? |
|
11楼#
发布于: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] |
|
|
12楼#
发布于:2002-07-26 10:51
只有StartIo写队列,用不用自旋锁无所谓。 厄~~~~ 说错了,想成是多卡互斥了, :P 还是请楼主说说到底有什么问题吧 |
|
13楼#
发布于:2002-07-26 10:04
你创建的这个线程是负责对这个队列的操作啊!并且其他的需要访问该队列的请求全部都排队啊,让这个现成进行处理这个请求啊
|
|
14楼#
发布于:2002-07-25 21:16
用户被禁言,该主题自动屏蔽! |
|
15楼#
发布于:2002-07-25 19:28
队列写成功就肯定没问题了,用自旋锁使多线程写队列时互斥,这样就不会乱了,不知我对你的问题理解对不对
|
|
16楼#
发布于:2002-07-25 19:25
用户被禁言,该主题自动屏蔽! |
|
17楼#
发布于:2002-07-25 19:23
应该可以把,我用于防止中断dpc的重入,有效的,你试试看
|
|
18楼#
发布于:2002-07-25 19:22
用户被禁言,该主题自动屏蔽! |
|
19楼#
发布于:2002-07-25 18:46
经过一些尝试,小弟感觉在Dispatch Routine中做WaitForSingleObject似乎不是什么好主意,不知各位老大对此有何指教? 不知各位老大有没有注意小弟上面这句话。 guardee老兄,如果用两个信号量做个生产者消费者模型,对单进程的访问当然是没有问题,多个用户态进程的情况肯定不是这么简单,(抱歉,内核多线程的情况我还没顾的试),我还是感觉在Dispatch Routine做Wait是不是有问题?或者是什么别的原因? KeInitializeSpinLock() gung老兄,这个你试过吗?顶事吗? |
|
|
上一页
下一页