当前位置:  技术问答>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行唤醒的肯定是两个不同的进程,这样会不会造成互斥死锁呢?请教达人

|
回楼上,你的理解基本是对的。
的确就是会发生资源竞争,但是竞争和死锁或者是冲突是不一样的,完美的代码就是要让大家竞争,但是不会死锁,这样才公平。
设想任务1优先级高一些,原来就等着wait_for_request要一个request资源,后来又来一个任务2,优先级稍低一些,正好要找这个被占用的request资源。
你的想法也许是,既然系统里面已经有了这个任务2在找的request,那么当然在可以给任务2用的时候,竟快给他用咯,但是这是不对的。
谁的优先级高,就应该先服务谁。
哪怕把现在已经存在在系统中的资源打为无效,重新发配给优先级高的任务,也一定要这样做。
尽管这样任务2原来有机会很快拿到他想要的东西并且直接用,也不行。
这样的结果就是任务2虽然就绪,但是还要继续等待,直到任务1用完了这个request。
但是这个时候这个request内容已经变化了,不再是原来任务2等待的东西了,那么任务2只能出错并且重新寻找,不过这些事是其他函数的后话了。
开起来很麻烦,但是这样才能保证绝对公平的竞争。
希望你觉得有收获。呵呵

|
我觉得
wake_up(&wait_for_request); 
这就够了。
不需要唤醒当前的等待进程。
而且你写的似乎是关闭了设备,
我觉得你应该唤醒所有的进程,
然后让他们能得知发生了什么事,安全的操作。

    
 
 

您可能感兴趣的文章:

  • 但是内核源码中(相关c文件)明明EXPORT了 函数,为什么查看内核符号/proc/kallsys却没有该函数
  • 不重新编译内核能修改内核函数吗?
  • 内核进程间发送信号用哪个函数,如果没有这东西,那内核里异步通知用哪个东西
  • 我如何调用 内核函数 /linux/fs 里面的内核 函数:比如 自己的程序调用 ext3_delete_inode
  • 技术文章 iis7站长之家
  • 关于如何使用内核函数的问题
  • 怎么查找有内核函数及其有关信息???
  • linux0.11内核有些函数是封装的吗?比如timer_interrupt()函数。
  • linux 2.6.35.4 内核中已没有netif_rx_schedule()函数,那替代函数是啥?
  • 调用内核的函数
  • 关于内核里实现的函数
  • 如何在内核中调用自己写的函数?
  • 哪里有linux内核函数的列表?
  • 系统调用对应的内核函数在什么地方
  • 关于内核中函数执行问题
  • 请问,内核里的函数手册从哪里可以查到?
  • 请问linux内核编程的能不能调用#include <stdio.h>的函数
  • 内核中的timer是不是可以理解为多线程,我想对一段代码加锁,如何实现,有没有可用的内核函数?
  • 关于内核函数问题
  • linux内核是用c和汇编写的,怎么会有inline内联函数呢?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux内核中影响tcp三次握手的一些协议配置
  • Fedora Core 2自带的内核升级程序下载下来内核后,要不要再编译一遍内核?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 进程内核栈和操作系统内核栈的关系
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • Linux中内核线程不访问内核态地址空间?
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 2.6内核下编译2.4内核
  • linux内核中的likely宏和unlikely宏介绍及用法
  • 谁能提供kgdb内核补丁内核模块的下载
  • CentOS 6.5 下载地址及如何升级内核(kernel)版本到 3.10.28
  • 编译新内核后怎么进入原来内核
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • docker使用的技术之Container内核原理介绍
  • 内核模块跟内核版本不匹配????????
  • 请教:如何安装新内核(rpm包)而不同原来得内核冲突?? 在线等待!!
  • linux为什么要升级内核?升级内核有何作用?
  • 内核升级后,如何在新的内核中加载显卡驱动?
  • 内核源码和结果make过的内核源码有什么区别
  • 如何学好内核?学了内核能应用于哪方面?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3