当前位置: 技术问答>linux和unix
0.11内核块设备,结束请求函数end_request不怎么懂,请教高手 /kernel/ lk_drv/blk.h Line:109
来源: 互联网 发布时间:2016-03-25
本文导语: 00109 static inline void end_request(int uptodate) 00110 { 00111 DEVICE_OFF(CURRENT->dev); 00112 if (CURRENT->bh) { 00113 CURRENT->bh->b_uptodate = uptodate; 00114 unlock_buffer(CURRENT->bh); 00115 } 00116 ...
00109 static inline void end_request(int uptodate)
00110 {
00111 DEVICE_OFF(CURRENT->dev);
00112 if (CURRENT->bh) {
00113 CURRENT->bh->b_uptodate = uptodate;
00114 unlock_buffer(CURRENT->bh);
00115 }
00116 if (!uptodate) {
00117 printk(DEVICE_NAME " I/O errornr");
00118 printk("dev %04x, block %dnr",CURRENT->dev,
00119 CURRENT->bh->b_blocknr);
00120 }
00121 wake_up(&CURRENT->waiting);
00122 wake_up(&wait_for_request);
第121行唤醒等待当前请求的进程,122行唤醒等待空闲项的进程,
既然要结束当前request,当然唤醒等待当前request的进程,121行无异议,
但是122行,为什么同时又要唤醒等待空闲请求项的进程呢?这个我就不明白了,
121和122行唤醒的肯定是两个不同的进程,这样会不会造成互斥死锁呢?请教达人
00110 {
00111 DEVICE_OFF(CURRENT->dev);
00112 if (CURRENT->bh) {
00113 CURRENT->bh->b_uptodate = uptodate;
00114 unlock_buffer(CURRENT->bh);
00115 }
00116 if (!uptodate) {
00117 printk(DEVICE_NAME " I/O errornr");
00118 printk("dev %04x, block %dnr",CURRENT->dev,
00119 CURRENT->bh->b_blocknr);
00120 }
00121 wake_up(&CURRENT->waiting);
00122 wake_up(&wait_for_request);
第121行唤醒等待当前请求的进程,122行唤醒等待空闲项的进程,
既然要结束当前request,当然唤醒等待当前request的进程,121行无异议,
但是122行,为什么同时又要唤醒等待空闲请求项的进程呢?这个我就不明白了,
121和122行唤醒的肯定是两个不同的进程,这样会不会造成互斥死锁呢?请教达人
|
回楼上,你的理解基本是对的。
的确就是会发生资源竞争,但是竞争和死锁或者是冲突是不一样的,完美的代码就是要让大家竞争,但是不会死锁,这样才公平。
设想任务1优先级高一些,原来就等着wait_for_request要一个request资源,后来又来一个任务2,优先级稍低一些,正好要找这个被占用的request资源。
你的想法也许是,既然系统里面已经有了这个任务2在找的request,那么当然在可以给任务2用的时候,竟快给他用咯,但是这是不对的。
谁的优先级高,就应该先服务谁。
哪怕把现在已经存在在系统中的资源打为无效,重新发配给优先级高的任务,也一定要这样做。
尽管这样任务2原来有机会很快拿到他想要的东西并且直接用,也不行。
这样的结果就是任务2虽然就绪,但是还要继续等待,直到任务1用完了这个request。
但是这个时候这个request内容已经变化了,不再是原来任务2等待的东西了,那么任务2只能出错并且重新寻找,不过这些事是其他函数的后话了。
开起来很麻烦,但是这样才能保证绝对公平的竞争。
希望你觉得有收获。呵呵
的确就是会发生资源竞争,但是竞争和死锁或者是冲突是不一样的,完美的代码就是要让大家竞争,但是不会死锁,这样才公平。
设想任务1优先级高一些,原来就等着wait_for_request要一个request资源,后来又来一个任务2,优先级稍低一些,正好要找这个被占用的request资源。
你的想法也许是,既然系统里面已经有了这个任务2在找的request,那么当然在可以给任务2用的时候,竟快给他用咯,但是这是不对的。
谁的优先级高,就应该先服务谁。
哪怕把现在已经存在在系统中的资源打为无效,重新发配给优先级高的任务,也一定要这样做。
尽管这样任务2原来有机会很快拿到他想要的东西并且直接用,也不行。
这样的结果就是任务2虽然就绪,但是还要继续等待,直到任务1用完了这个request。
但是这个时候这个request内容已经变化了,不再是原来任务2等待的东西了,那么任务2只能出错并且重新寻找,不过这些事是其他函数的后话了。
开起来很麻烦,但是这样才能保证绝对公平的竞争。
希望你觉得有收获。呵呵
|
我觉得
wake_up(&wait_for_request);
这就够了。
不需要唤醒当前的等待进程。
而且你写的似乎是关闭了设备,
我觉得你应该唤醒所有的进程,
然后让他们能得知发生了什么事,安全的操作。
wake_up(&wait_for_request);
这就够了。
不需要唤醒当前的等待进程。
而且你写的似乎是关闭了设备,
我觉得你应该唤醒所有的进程,
然后让他们能得知发生了什么事,安全的操作。