IO的中断返回也是相当让人激动的一件事情:

28470  1)               |        handle_irq() {
 28471  1)   0.237 us    |          irq_to_desc();
 28472  1)               |          handle_edge_irq() {
 28473  1)   0.060 us    |            _raw_spin_lock();
 28474  1)               |            ack_apic_edge() {
 28475  1)   0.051 us    |              irq_complete_move();
 28476  1)   0.044 us    |              irq_move_irq();
 28477  1)   1.288 us    |            }
 28478  1)               |            handle_irq_event() {
 28479  1)   0.045 us    |              _raw_spin_unlock();
 28480  1)               |              handle_irq_event_percpu() {
 28481  1)               |                ahci_interrupt [libahci]() {
 28482  1)   0.046 us    |                  _raw_spin_lock();
 28483  1)               |                  ahci_handle_port_interrupt [libahci]() {
 28484  1)               |                    ata_qc_complete_multiple() {        // qc = ata_qc_from_tag(ap, tag); (会得到最终的command)
 28485  1)               |                      ata_qc_complete() {
 28486  1)               |                        __ata_qc_complete() {
 28487  1)   0.321 us    |                          ata_sg_clean();
 28488  1)               |                          ata_scsi_qc_complete() {
 28489  1)               |                            scsi_done() {
 28490  1)               |                              blk_complete_request() {
 28491  1)               |                                __blk_complete_request() {
 28492  1)   0.046 us    |                                  cpus_share_cache();
 28493  1)   0.588 us    |                                }
 28494  1)   0.961 us    |                              }
 28495  1)   1.342 us    |                            }
 28496  1)   0.051 us    |                            ata_qc_free();
 28497  1)   2.146 us    |                          }
 28498  1)   3.

上面是我lenovo笔记本上ATA硬盘中断返回的代码, 其中断处理函数是ata_qc_complete,

发现, 环环相扣的结构体,从中断的scsi指令,我们能追溯到block层封装的request, 然后把这个request放到软中断中去了, 然后该赢中断平安返回,

下面就是软中断处理主场了!

28512  1)               |        irq_exit() {
 28513  1)               |          __do_softirq() {
 28514  1)   0.044 us    |            msecs_to_jiffies();
 28515  1)               |            blk_done_softirq() {
 28516  1)               |              scsi_softirq_done() {
 28517  1)               |                scsi_decide_disposition() {
 28518  1)   0.125 us    |                  scsi_handle_queue_ramp_up();
 28519  1)   0.563 us    |                }
 28520  1)   0.070 us    |                scsi_log_completion();
 28521  1)               |                scsi_finish_command() {
 28522  1)               |                  scsi_device_unbusy() {
 28523  1)   0.044 us    |                    _raw_spin_lock_irqsave();
 28524  1)   0.042 us    |                    _raw_spin_unlock();
 28525  1)   0.049 us    |                    _raw_spin_lock();
 28526  1)   0.059 us    |                    _raw_spin_unlock_irqrestore();
 28527  1)   1.474 us    |                  }
 28528  1)   0.086 us    |                  sd_done();
 28529  1)               |                  scsi_io_completion() {
 28530  1)               |                    blk_end_request() {
 28531  1)               |                      blk_end_bidi_request() {
 28532  1)               |                        blk_update_bidi_request() {
 28533  1)               |                          blk_update_request() {
 28534  1)   0.154 us    |                            blk_account_io_completion();
 28535  1)   0.132 us    |                            bio_advance();
 28536  1)               |                            bio_endio() {

IO调度器(二) IO的中断返回的更多相关文章

  1. IO调度器原理介绍

    IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...

  2. Linux IO调度器相关算法介绍(转)

    IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...

  3. Linux IO Scheduler(Linux IO 调度器)

    每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...

  4. Linux IO 调度器

    Linux IO Scheduler(Linux IO 调度器) 每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交 ...

  5. Linux IO Scheduler(Linux IO 调度器)【转】

    每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...

  6. 编写简单的ramdisk(选择IO调度器)

    前言 目前linux中包含anticipatory.cfq.deadline和noop这4个I/O调度器.2.6.18之前的linux默认使用anticipatory,而之后的默认使用cfq.我们在前 ...

  7. IO调度器

    由于对blktrace的好奇,来到了block层.通过阅读block层的代码,自己的几个错误认知被纠正,比如 一) 同步操作时,进程是在驱动中睡觉真实情况是:进程在文件系统睡觉 二) 对同一个数据块的 ...

  8. 如何选择IO调度器

    概述 由于对multi-quque的IO调度算法不太熟悉,为了避免误人子弟,本文暂时只会介绍如何选择single-queue的IO调度算法.等将来对multi-queue有充分认识后再补充. 如果不清 ...

  9. Linux I/O 调度器

    每个块设备或者块设备的分区,都对应有自身的请求队列,  而每个请求队列都可以选择一个I/O调度器来协调所递交的.I/O调度器的基本目的是将请求按照它们对应在块设备上的扇区号进行排列,以减少磁头的移动, ...

随机推荐

  1. ARC机制

    ARC概念及原理 1.了解指针分类 (1)强指针:默认的情况下,所有的指针都是强指针,关键字strong (2)弱指针:_ _weak关键字修饰的指针 声明一个弱指针如下: _ _weak Perso ...

  2. mac 终端 常用指令

    开始正式研究ios 应用开发,由于是从C开始学起,所以学习下常用的mac终端指令,方便后续常用操作. mac 终端 常用指令: 1.ls指令 用途:列出文件 常用参数 -w 以简洁的形式列出所有文件和 ...

  3. npm常用命令小结

    目录(更新于2016.09.23): 1.认识和使用NPM 2.npm包安装模式 3.npm包管理(package的安装.卸载.升级.查看.搜索.发布,其他等) npm install [-g] 本地 ...

  4. luemn PHP_CodeSniffer的安装

    1.PHP_CodeSniffer是PEAR中的一个用PHP5写的用来检查嗅探PHP代码是否有违反一组预先设置好的编码标准的一个包,它是确保你的代码简洁一致的必不可少的开发工具,甚至还可以帮助程序员减 ...

  5. PHP非阻塞模式 (转自 尘缘)

    让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施: 一.若你使用的是FastCGI模式,使用fastcgi_finish_re ...

  6. mysql-3 检索数据(1)

    SELECT 语句 SELECT检索表数据,必须至少给出两条信息--------想选择什么,以及从什么地方选择. 检索一个列 SELECT prod_name FROM products; 上述语句利 ...

  7. 与POS机通信时的3DES(双倍长)加密解密

    项目中有个SocketServer要和移动便携POS机通信,POS开发商就告诉我们他们用的3DES(双倍长)加密,给了个Key.数据和结果,让我们实现. c#用TripleDESCryptoServi ...

  8. C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅰ部分

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  9. cocosstdio之字体之文本和FNT字体

    FNT字体和文本字体的作用是:导入字体资源可以使用字体资源便可以使用其资源内的字体来在程序中使用 不同的是FNT字体资源内容比较少,所以个人猜想可以在特定情况下使用: 两种字体资源对比: 赋值过程对比 ...

  10. C#设计模式(21)——责任链模式

    一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所 ...