办个假‍建行定期存‍折要多少钱

每个块设备分区的bd_contains会指它的总块设备节点,它的bd_part会指向它的分区表.bd_disk会指向它所属的磁盘.

从上图中也可以看出:每个磁盘都会对应一个request_queue.对于上层的I/O请求就是通过它来完成的了.它的结构如下:

请求队列描述符与请求描述符都很复杂,为了简化驱动的设计,内核提供了一个API,供块设备驱动程序来初始化一个请求队列.这就是blk_init_queue().它的代码如下:

//rfn:驱动程序自动提供的操作I/O的函数.对应请求队列的request_fn

//lock:驱动程序提供给请求队列的自旋锁

这个函数中初始化了很多操作指针,这个函数在所有块设备中都是一样的,这样就为通用块设备层提供了一个统一的接口.对于块设备驱动的接口就是我们在blk_init_queue中设置的策略例程了.留意一下关于请求队列的各操作的设置,这在后续的分析中会用到.

另外,在请求结构中涉及到了bio结构.bio表示一个段.目前内核中关于I/O的所有操作都是由它来表示的.它的结构如下所示:

关于bio与bio_vec的关系,用下图表示:

现在,我们来思考一个问题:

当一个I/O请求提交给请求队列后,它是怎么去调用块设备驱动的策略例程去完成这次I/O的呢?还有,当一个I/O请求被提交给请求队列时,会不会立即调用驱动中的策略例程去完成这次I/O呢?

实际上,为了提高效率,所有的I/O都会在一个特定的延时之后才会调用策略例程去完成本次I/O.我们来看一个反面的例子,假设I/O在被提交后马上得到执行.例如.磁盘有磁针在磁盘12.现在有一个磁道1的请求.就会将磁针移动到磁道1.操作完后,又有一个请求过来了,它要操作磁道11.然后又会将磁针移到磁道11.操作完后,又有一个请求过来,要求操作磁道4.此时会将磁针移到磁道4.这个例子中,磁针移动的位置是:12->1->11->4.实际上,磁针的定位是一个很耗时的操作.这样下去,毫无疑问会影响整个系统的效率.我们可以在整个延时内,将所有I/O操作按顺序排列在一起,然后再调用策略例程.于是上例的磁针移动就会变成12->11->4->1.此时磁针只会往一个方向移动.

至于怎么样排列请求和选取哪一个请求进行操作,这就是I/O调度的任务了.这部份我们在通用块层再进行分析.

内核中有两个操作会完成上面的延时过程.即:激活块设备驱动程序和撤消块设备驱动程序.

3.6:块设备驱动程序的激活和撤消

激活块设备驱动程序和撤消块设备驱动程序在内核中对应的接口为blk_plug_device()和blk_remove_plug().分别看下它们的操作:

如果请求队列状态为QUEUE_FLAG_PLUGGED,且定时器超时,会有什么样的操作呢?

上面设置了定时器的时间间隔为(3*HZ)/1000.定时器超时的处理函数为blk_unplug_timeout().参数为请求队列本身.

从上面的代码看出,定时器超时之后,会唤醒q->unplug_work这个工作对列.

即工作队列对应的函数为blk_unplug_work().对应的参数为请求队列本身.代码如下:

到此,就会调用请求队列的unplug_fn()操作.

归根到底,最后的I/O完成操作都会调用块设备驱动的策略例程来完成.

I/O调度对应的结构如下所示:

我们以最简单的NOOP算法为例进行分析.

NOOP算法只是做简单的请求合并的操作.的定义如下:

挨个分析里面的各项操作:

elevator_noop_merge():在请求队列中寻找能否有可以合并的请求.代码如下:

Elv_try_merge()用来判断能否与请求合并,它的代码如下:

注意:如果检查成功返回1.失败返回0.

从上面的代码中看到,NOOP算法从请求队列中取出请求,只需要取链表结点即可.不需要进行额外的操作.

很简单,取链表的下一个结点.

这个函数的逻辑比较简单,它判断bio能否与请求队列中存在的请求合并,如果可以合并,将其它合并到现有的请求.如果不能合并,则新建一个请求描述符,然后把它插入到请求队列中.上面的代码可以结合之前分析的NOOP算法进行理解.

重点分析一下请求描述符的分配过程:

分配一个请求描述符的过程如下所示:

在分析这段代码之前,先来讨论一下关于请求描述符的分配方式.记得我们在分析请求队列描述符的时候,request_queue中有一个成员:struct request_list  rq;

如果当前空闲内存不够.则会将请求的进程挂起.如果分配成功,则将请求队列的rl字段指向这个分配的request_list.

释放一个请求描述符,将会将其归还给指定的内存池.

request_list结构还有一个避免请求拥塞的作用:

每个请求队列都有一个允许处理请求的最大值(request_queue->nr_requests).如果队列中的请求超过了这个数值,则将队列置为QUEUE_FLAG_READFULL/QUEUE_FLAG_WRITEFULL.后续试图加入到队列的进程就会被放置到request_list结构所对应的等待队列中睡眠.如果一个队列中的睡眠进程过程也多也会影响系统的效率.如果待处理的请求大于request_queue->

由于在分配之前递增了统计计数,所以在分配失败后,要把这个统计计数减下来,这是由freed_request()完成的.它的代码如下:

在这里我们可以看到,如果待处理请求小于请求队列所允许的最大值,就会将睡眠的进程唤醒.

如果请求描述符分配失败,会怎么样呢?我们接着看__make_request()中的代码:

如果分配失败,会调用get_request_wait()将进程挂起.它的代码如下:

这段代码比较简单,相似的代码我们在之前已经分析过很多次了.这里不做重点分析.

此外.在__make_request()中还需要注意一件事情.在bio中的内存可能是高端内存的.但是内核不能直接访问,这里就必须要对处理高端内存的bio_vec做下处理.即将它临时映射之后copy到普通内存区.这就是所谓的弹性回环缓存.相关的操作是在blk_queue_bounce()中完成的.这个函数比较简单,可以自行分析.

到这里,通用块层的处理分析就结束了.我们继续分析其它的层次.

}
我看别人都是邀请固定额度啊,到我这怎么临时了呢

尊敬的客户,诚邀您提升尾号0405龙卡临时额度至55000元,有效期2个月。接受请在24小时内回复“CCHD#”,回复后我行将在3个工作日内完成额度调整,完成后会短信通知您。微信关注“中国建设银行”并绑定信用卡,查账、查额度轻松搞定。[建设银行]

微信公众号搜索:我爱卡,最新信贷信息,尽在我爱卡唯一官方公众号

}

通过任务和升级可以获取CC豆,100CC豆价值1元,可以兑换E卡、猫超卡、话费等,礼品还是很丰厚的

活动时间:4月9号-6月30号,

活动路径:建行app-首页-专享活动-奋斗季

需要点击报名,使用龙支付消费3笔就可以,反正每个月也要刷龙支付的

这里的每天也都建议做一下,基本2分钟搞定,其中有一项是需要助力的

每天可以拜访还有10次,被拜访10次,每次10点成长值,一天可领200成长值

长按扫码加入奋斗季互助群

月日均资产达标,也可以获得相应奖励,这个看着弄就行,收益也不是很高

升级到黄金级别还可领油卡、视频会员月卡等,但任务相对较难,需要买理财。

这个活动之前介绍过,但是这一次的酷跑缩水有点严重,4座城市才开到了两个券,各位小伙伴们战绩如何?

点击链接可以查看详细玩法→

抽取优惠价格购买36元微信立减金券包,一共是16元的微信立减和20元的融善商城

老胡抽到3.6折,12.88元购买,可以撸回成本,果断入手

经过测试,立减金很多场景都可以使用,加油、电费、商超,甚至都可以还信用卡

活动路径:中国建设银行公众号,回复“惠省钱”或直接扫码直达活动时间:4月1日-6月30日,立减券有效期30天,30天后还可以继续购买

建行全球支付VISA/银联双标卡可享1元购,活动持续到6月30日。

每月限购1次,共限三次。

推荐1元购买20元京东e卡或腾讯视频会员

活动路径:公众号“龙卡信用卡”,后台回复“一元购”

建行还是非常建议上车的,现在正好有新户活动

在6月30日前,新户办理“冬奥卡+Visa全球支付白”,60天内消费3笔合计满488元就可以领取冰墩墩一份(名额有限)

扫描下方二维码可直接进入官方申请通道

如果担心申请不下来,可以试试这张扶贫卡,通过率较高

对于建行其他卡种以及权益介绍

可以查看这篇→2022年建行最值得入手的信用卡推荐,附申卡条件

作者:老胡,专注支付行业多年,持续分享玩卡技巧、提额工具办理。关注我,带你玩转信用卡,文章均首发于同名公眾號,
}

我要回帖

更多关于 建行定期存单丢了怎么办 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信