该接口作为通用的块设备处理bio请求的方式,主要思路是尽可能的合并bio到请求request中,如果可能进一步将连续的request合并;如果不能合并bio,则新建请求,初始化后,plug
互斥方式:加锁,请求队列的锁
涉及到不同的调度算法:将新建的请求添加到调度器的调度队列,由unplug触发调度器,进而将请求按照特定的调度算法将请求派发到请求队列的派发队列。
/*块设备排入bio请求*/
int blk_queue_bio(struct request_queue *q, struct bio *bio)
{struct request *req;int el_ret;unsigned int bytes = bio->bi_size;const unsigned short prio = bio_prio(bio);const bool sync = bio_rw_flagged(bio, BIO_RW_SYNCIO);const bool unplug = bio_rw_flagged(bio, BIO_RW_UNPLUG);const unsigned int ff = bio->bi_rw & REQ_FAILFAST_MASK;int where = ELEVATOR_INSERT_SORT;int rw_flags;/* BIO_RW_BARRIER is deprecated */if (WARN_ONCE(bio_rw_flagged(bio, BIO_RW_BARRIER),"block: BARRIER is deprecated, use FLUSH/FUA instead\n")) {bio_endio(bio, -EOPNOTSUPP);return 0;}/** low level driver can indicate that it wants pages above a* certain limit bounced to low memory (ie for highmem, or even* ISA dma in theory)*/blk_queue_bounce(q, &bio);if (bio_integrity_enabled(bio) && bio_integrity_prep(bio)) {bio_endio(bio, -EIO);return 0;}spin_lock_irq(q->queue_lock);if (bio->bi_rw & (BIO_FLUSH | BIO_FUA)) {     //FLUSH的bio,直接申请新的requestwhere = ELEVATOR_INSERT_FLUSH;goto get_rq;}if (elv_queue_empty(q))                                   //调度器队列为空,则无法合并bio请求,申请新的requestgoto get_rq;el_ret = elv_merge(q, &req, bio);                    //调度器尝试合并bio到req请求switch (el_ret) {case ELEVATOR_BACK_MERGE:                     //1、向后合并bio到req请求BUG_ON(!rq_mergeable(req));if (!ll_back_merge_fn(q, req, bio))               //1)查看是否超过请求request的最大字节,或是request的最大段数break;trace_block_bio_backmerge(q, bio);if ((req->cmd_flags & REQ_FAILFAST_MASK) != ff)blk_rq_set_mixed_merge(req);req->biotail->bi_next = bio;                       //2)将bio添加到req请求的尾部req->biotail = bio;req->__data_len += bytes;req->ioprio = ioprio_best(req->ioprio, prio);if (!blk_rq_cpu_valid(req))req->cpu = bio->bi_comp_cpu;drive_stat_acct(req, 0);elv_bio_merged(q, req, bio);                      //调度器合并bio到req请求if (!attempt_back_merge(q, req))               //3)继续尝试将请求req和其后面的请求合并,可以合并返回1,无法合并返回0elv_merged_request(q, req, el_ret);       //无法合并请求后的处理goto out;case ELEVATOR_FRONT_MERGE:                 //2、向前合并bio到req请求BUG_ON(!rq_mergeable(req));if (!ll_front_merge_fn(q, req, bio))            //1)查看是否超过请求request的最大字节,或request的最大段数break;trace_block_bio_frontmerge(q, bio);if ((req->cmd_flags & REQ_FAILFAST_MASK) != ff) {blk_rq_set_mixed_merge(req);req->cmd_flags &= ~REQ_FAILFAST_MASK;req->cmd_flags |= ff;}bio->bi_next = req->bio;                         //2)将bio请求添加到req请求的头部req->bio = bio;/** may not be valid. if the low level driver said* it didn't need a bounce buffer then it better* not touch req->buffer either...*/req->buffer = bio_data(bio);               //修正请求的起始内存地址/** The merge may happen accross partitions* We must update in_flight value accordingly*/blk_account_io_front_merge(req, bio->bi_sector);req->__sector = bio->bi_sector;     //修正请求的起始物理扇区号,以及请求的大小req->__data_len += bytes;req->ioprio = ioprio_best(req->ioprio, prio);if (!blk_rq_cpu_valid(req))req->cpu = bio->bi_comp_cpu;drive_stat_acct(req, 0);elv_bio_merged(q, req, bio);if (!attempt_front_merge(q, req))          //3)继续尝试将请求req与其前面请求合并,可以合并返回1,无法合并返回0elv_merged_request(q, req, el_ret);     //无法合并请求后的处理goto out;/* ELV_NO_MERGE: elevator says don't/can't merge. */default:;}get_rq:/** This sync check and mask will be re-done in init_request_from_bio(),* but we need to set it earlier to expose the sync flag to the* rq allocator and io schedulers.*/rw_flags = bio_data_dir(bio);if (sync)rw_flags |= REQ_SYNC;/** Grab a free request. This is might sleep but can not fail.* Returns with the queue unlocked.*/req = get_request_wait(q, rw_flags, bio);          //3、阻塞式获取一个request请求if (unlikely(!req)) {bio_endio(bio, -ENODEV);    /* @q is dead */goto out_unlock;}/** After dropping the lock and possibly sleeping here, our request* may now be mergeable after it had proven unmergeable (above).* We don't worry about that case for efficiency. It won't happen* often, and the elevators are able to handle it.*/init_request_from_bio(req, bio);                    //4、使用bio来初始化请求reqspin_lock_irq(q->queue_lock);if (test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags) ||bio_flagged(bio, BIO_CPU_AFFINE))req->cpu = raw_smp_processor_id();if (queue_should_plug(q) && elv_queue_empty(q))     //5、如果调度器队列为空,则plug请求队列blk_plug_device(q);/* insert the request into the elevator */drive_stat_acct(req, 1);__elv_add_request(q, req, where, 0);          //6、将请求添加到调度器的调度队列
out:if (unplug || !queue_should_plug(q))          //7、如果该bio为unplug,或是请求队列不应该plug,则unplug请求队列,依次处理请求__generic_unplug_device(q);
out_unlock:spin_unlock_irq(q->queue_lock);return 0;
}/*是否可以合并该bio到请求队列的请求中,返回值为插入位置,req返回插入bio的请求*/
int elv_merge(struct request_queue *q, struct request **req, struct bio *bio)
{struct elevator_queue *e = q->elevator;struct request *__rq;int ret;/** First try one-hit cache.*/if (q->last_merge && elv_rq_merge_ok(q->last_merge, bio)) {     //1、检查是否可以将bio合并到上次合并的请求ret = blk_try_merge(q->last_merge, bio);          //如果可以合并,尝试合并if (ret != ELEVATOR_NO_MERGE) {*req = q->last_merge;return ret;}}if (blk_queue_nomerges(q))return ELEVATOR_NO_MERGE;/** See if our hash lookup can find a potential backmerge.*/__rq = elv_rqhash_find(q, bio->bi_sector);          //2、在调度器hash表中查找是否存在可以合并的请求req,向后合并if (__rq && elv_rq_merge_ok(__rq, bio)) {*req = __rq;return ELEVATOR_BACK_MERGE;}if (e->ops->elevator_merge_fn)                         //3、调用调度器的合并bio的回调,尝试合并bio到请求req中return e->ops->elevator_merge_fn(q, req, bio);return ELEVATOR_NO_MERGE;
}/*检查bio是否可以合并到请求req中,可以合并返回1,否则返回0*/
bool elv_rq_merge_ok(struct request *rq, struct bio *bio)
{if (!blk_rq_merge_ok(rq, bio))return 0;if (!elv_iosched_allow_merge(rq, bio))return 0;return 1;
}/*检查bio是否可以合并到请求req中,可以合并返回true,否则返回false*/
bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
{if (!rq_mergeable(rq) || !bio_mergeable(bio))                              //只有文件系统的请求才可以合并return false;/* don't merge file system requests and discard requests */if ((bio->bi_rw & BIO_DISCARD) != (rq->bio->bi_rw & BIO_DISCARD))     //不能合并文件系统请求和discard请求return false;/* different data direction or already started, don't merge */if (bio_data_dir(bio) != rq_data_dir(rq))                                   //数据方向不同,不能合并return false;/* must be same device and not a special request */if (rq->rq_disk != bio->bi_bdev->bd_disk || rq->special)          //不是相同设备的请求不能合并return false;/* only merge integrity protected bio into ditto rq */if (bio_integrity(bio) != blk_integrity_rq(rq))return false;return true;
}/*尝试合并bio到请求rq*/
int blk_try_merge(struct request *rq, struct bio *bio)
{if (blk_rq_pos(rq) + blk_rq_sectors(rq) == bio->bi_sector)     //请求的最后一个扇区和bio的起始扇区一致,向后合并return ELEVATOR_BACK_MERGE;else if (blk_rq_pos(rq) - bio_sectors(bio) == bio->bi_sector)  //bio的最后一个扇区和请求的起始扇区一致,向前合并return ELEVATOR_FRONT_MERGE;return ELEVATOR_NO_MERGE;
}/*尝试将rq请求与请求队列中其它请求向后合并,可以合并返回1,否则返回0*/
int attempt_back_merge(struct request_queue *q, struct request *rq)
{struct request *next = elv_latter_request(q, rq);     //查看rq请求的下一个请求if (next)return attempt_merge(q, rq, next);                    //尝试合并rq和其后请求nextreturn 0;
}/*尝试将请求req与next请求合并,可以合并返回1,不能合并返回0*/
static int attempt_merge(struct request_queue *q, struct request *req,struct request *next)
{if (!rq_mergeable(req) || !rq_mergeable(next))     //1、检查请求是否都可以合并return 0;/** Don't merge file system requests and discard requests*/if ((req->cmd_flags & REQ_DISCARD) != (next->cmd_flags & REQ_DISCARD))     //2、检查请求是否具有相同的discard属性return 0;/** not contiguous*/if (blk_rq_pos(req) + blk_rq_sectors(req) != blk_rq_pos(next))     //3、检查两个请求的扇区是否连续return 0;if (rq_data_dir(req) != rq_data_dir(next)|| req->rq_disk != next->rq_disk|| next->special)                                                                      //4、检查请求的方向、设备是否相同return 0;if (blk_integrity_rq(req) != blk_integrity_rq(next))return 0;/** If we are allowed to merge, then append bio list* from next to rq and release next. merge_requests_fn* will have updated segment counts, update sector* counts here.*/if (!ll_merge_requests_fn(q, req, next))                                        //5、检查请求是否允许合并return 0;/** If failfast settings disagree or any of the two is already* a mixed merge, mark both as mixed before proceeding.  This* makes sure that all involved bios have mixable attributes* set properly.*/if ((req->cmd_flags | next->cmd_flags) & REQ_MIXED_MERGE ||(req->cmd_flags & REQ_FAILFAST_MASK) !=(next->cmd_flags & REQ_FAILFAST_MASK)) {blk_rq_set_mixed_merge(req);blk_rq_set_mixed_merge(next);}/** At this point we have either done a back merge* or front merge. We need the smaller start_time of* the merged requests to be the current request* for accounting purposes.*/if (time_after(req->start_time, next->start_time))req->start_time = next->start_time;req->biotail->bi_next = next->bio;               //6、将next请求的bio链表挂入req请求的尾部,并更新req请求的大小req->biotail = next->biotail;req->__data_len += blk_rq_bytes(next);      elv_merge_requests(q, req, next);               //7、请求合并后的处理/** 'next' is going away, so update stats accordingly*/blk_account_io_merge(next);req->ioprio = ioprio_best(req->ioprio, next->ioprio);if (blk_rq_cpu_valid(next))req->cpu = next->cpu;/* owner-ship of bio passed from next to req */next->bio = NULL;__blk_put_request(q, next);                         //8、释放next请求,并返回1return 1;
}/*检查请求是否允许合并,可以合并返回1,否则返回0*/
static int ll_merge_requests_fn(struct request_queue *q, struct request *req,struct request *next)
{int total_phys_segments;unsigned int seg_size =req->biotail->bi_seg_back_size + next->bio->bi_seg_front_size;     ///** First check if the either of the requests are re-queued* requests.  Can't merge them if they are.*/if (req->special || next->special)                    //1、检查请求是否是重新入队列的请求,重试请求return 0;/** Will it become too large?*/if ((blk_rq_sectors(req) + blk_rq_sectors(next)) >blk_rq_get_max_sectors(req))                         //2、检查请求合并后扇区是否超过阈值return 0;total_phys_segments = req->nr_phys_segments + next->nr_phys_segments;if (blk_phys_contig_segment(q, req->biotail, next->bio)) {if (req->nr_phys_segments == 1)req->bio->bi_seg_front_size = seg_size;if (next->nr_phys_segments == 1)next->biotail->bi_seg_back_size = seg_size;total_phys_segments--;}if (total_phys_segments > queue_max_segments(q))     //3、检查请求合并后的物理段数是否超过阈值return 0;/* Merge is OK... */req->nr_phys_segments = total_phys_segments;return 1;
}/*请求合并后的处理*/
void elv_merge_requests(struct request_queue *q, struct request *rq,struct request *next)
{struct elevator_queue *e = q->elevator;if (e->ops->elevator_merge_req_fn)e->ops->elevator_merge_req_fn(q, rq, next);elv_rqhash_reposition(q, rq);     //1、更新请求rq在hash表中的位置elv_rqhash_del(q, next);            //2、将next请求从hash表中删除q->nr_sorted--;q->last_merge = rq;
}/*无法合并请求后的处理*/
void elv_merged_request(struct request_queue *q, struct request *rq, int type)
{struct elevator_queue *e = q->elevator;if (e->ops->elevator_merged_fn)e->ops->elevator_merged_fn(q, rq, type);if (type == ELEVATOR_BACK_MERGE)     //2、向后合并,更新rq在hash表中的位置elv_rqhash_reposition(q, rq);q->last_merge = rq;
}/*将请求插入调度器的调度队列 */
void __elv_add_request(struct request_queue *q, struct request *rq, int where,int plug)
{if (rq->cmd_flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER)) {/* barriers are scheduling boundary, update end_sector */if (rq->cmd_type == REQ_TYPE_FS) {q->end_sector = rq_end_sector(rq);q->boundary_rq = rq;}} else if (!(rq->cmd_flags & REQ_ELVPRIV) &&where == ELEVATOR_INSERT_SORT)where = ELEVATOR_INSERT_BACK;if (plug)blk_plug_device(q);elv_insert(q, rq, where);     //将请求插入调度器的调度队列
}/*将请求插入调度器的调度队列 */
void elv_insert(struct request_queue *q, struct request *rq, int where)
{int unplug_it = 1;trace_block_rq_insert(q, rq);rq->q = q;switch (where) {case ELEVATOR_INSERT_REQUEUE:/** Most requeues happen because of a busy condition,* don't force unplug of the queue for that case.* Clear unplug_it and fall through.*/unplug_it = 0;case ELEVATOR_INSERT_FRONT:          //不使用调度器,向前插入请求rq->cmd_flags |= REQ_SOFTBARRIER;list_add(&rq->queuelist, &q->queue_head);break;case ELEVATOR_INSERT_BACK:           //不适用调度器,向后插入请求rq->cmd_flags |= REQ_SOFTBARRIER;elv_drain_elevator(q);list_add_tail(&rq->queuelist, &q->queue_head);/** We kick the queue here for the following reasons.* - The elevator might have returned NULL previously*   to delay requests and returned them now.  As the*   queue wasn't empty before this request, ll_rw_blk*   won't run the queue on return, resulting in hang.* - Usually, back inserted requests won't be merged*   with anything.  There's no point in delaying queue*   processing.*/__blk_run_queue(q);break;case ELEVATOR_INSERT_SORT:                    //使用调度器BUG_ON(rq->cmd_type != REQ_TYPE_FS);rq->cmd_flags |= REQ_SORTED;q->nr_sorted++;if (rq_mergeable(rq)) {               //请求是否可以合并,文件系统请求才可以合并elv_rqhash_add(q, rq);                              //将请求添加到调度器队列的hash表中if (!q->last_merge)q->last_merge = rq;}/** Some ioscheds (cfq) run q->request_fn directly, so* rq cannot be accessed after calling* elevator_add_req_fn.*/q->elevator->ops->elevator_add_req_fn(q, rq);     //调度器自己的添加请求回调break;case ELEVATOR_INSERT_FLUSH:               //FLUSH的请求rq->cmd_flags |= REQ_SOFTBARRIER;blk_insert_flush(rq);break;default:printk(KERN_ERR "%s: bad insertion point %d\n",__func__, where);BUG();}if (unplug_it && blk_queue_plugged(q)) {int nrq = q->rq.count[BLK_RW_SYNC] + q->rq.count[BLK_RW_ASYNC]- queue_in_flight(q);if (nrq >= q->unplug_thresh)          //达到unplug的阈值,则unplug请求队列,处理请求__generic_unplug_device(q);}
}/*添加到调度器队列的hash表中*/
static void elv_rqhash_add(struct request_queue *q, struct request *rq)
{struct elevator_queue *e = q->elevator;BUG_ON(ELV_ON_HASH(rq));hlist_add_head(&rq->hash, &e->hash[ELV_HASH_FN(rq_hash_key(rq))]);
}


查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 周幺成6.24黄金震荡多头趋势不改,黄金原油后市操作计划

    在这个市场博弈,讲究的是一个学习参与的过程和后期长期稳健获利的结果。一旦产生亏损,要及时总结原因出现在哪里,要让亏损的资金产生他的价值。每做一笔交易,有理有据的进场,且严格遵守这个市场的规则,在一个正确的引导之下,实现长期稳健获利还是比较容易实现的。精准的…...

    2024/4/14 21:43:04
  2. 免费分享9套java视频+8套前端视频+多套python视频+300本电子书+面试简历面试题

    公众号回复:2000,免费领取java全套资源java全套第一套:java全套第二套:java全套第三套:java全套第四套:java全套第五套:java全套第六套java全套第七套java项目实战全套第八套:java项目实战全套第九套:java项目30套Python爬虫与数据分析全套资源python入门第一套python…...

    2024/4/14 21:43:03
  3. C语言之位移位运算符和按位运算符

    近期做串口实验,遇到将十六进制转换成char型字符的问题,程序中用到了位移位运算符和按位或运算符 a. 位移位运算符 << 左移,>>右移运算符左边为移位对象,右边为要移的位数。移位对象为整数值(若 char a = 61, 则 a 也可以作为移位对象,若 char a = ‘a’,则…...

    2024/5/2 10:32:00
  4. 数据库 (图 Neo4j 使用教程)

    图数据库功能: 主要是处理具有深度 相关联的数据,尤其是几何性增长的这种关系,比关系型数据库更具有优势。一个图是由 节点和 关系构成, 节点和关系都可以包含属性。一个关系连接两个节点,必须有一个开始节点和结束节点。Neo4j 的安装下载地址:桌面版(学习使用)http…...

    2024/4/14 23:10:55
  5. Java什么时候提高境界支持async/await写法啊?

    2019独角兽企业重金招聘Python工程师标准>>> 异步编程的最高境界,就是根本不用关心它是不是异步.NET的async/await方式最先达到了这个境界。 和async/await写法相比,Java的什么ExecutorService以及回调之类设计都是惭愧无比的。当然,习惯了也没啥,反正那Java的l…...

    2024/4/29 5:59:32
  6. Java IO 之BIO讲解

    nio介绍 Java BIO是java1.4之前唯一的IO逻辑,在客户端通过socket向服务端传输数据,服务端监听端口,由于传统io读数据的时候,如果数据没有传达,IO会一直等待输入传入,当有请求过来的时候,新起一条线程对数据进行等待,处理.导致每一个链接都对应着服务器的一个线程。在1.4之后出现…...

    2024/4/14 23:10:53
  7. win10系统必做优化,让你的电脑告别卡顿,运行速度至少提升20%

    置信在微软的鼎力推行下,大家都曾经装置了win10系统,但还是防止不了系统变得卡顿的问题,除了一局部是全家桶带来的结果,还有一局部当然是微软自家缘由形成的,所以无论新买的电脑、刚重置完的电脑、还是用久了的电脑,一些优化技巧是必需要做的,这里给大家统计了小编不断在…...

    2024/4/14 23:10:52
  8. C语言高效实现向量循环移位

    问题:n个元素的向量V循环移位(以左移为例)i个位置,例如12345循环移动2个位置得到34512.问题本身非常简单,以至于我们一看到问题就能想到对应的解决策略:申请i个字节的动态存储,将向量区间[0,i-1]的i个元素存储至临时存储器,之后将[i,n]的n-i+1个元素向左移动i个位置,并…...

    2024/4/20 16:32:10
  9. await ,async,promise三者结合使用可以解决异步编程时需要实现部分代码同步的问题

    await 必须要用在async里面,表示需要等待用了await这个词修饰的promise对象执行完才可以继续执行。下面是我写的demo:<script type="text/javascript"> function getPromise(){return new Promise((resolve,reject)=>{setTimeout(()=>{console.…...

    2024/4/28 23:16:01
  10. Java爬虫:用java爬取小说

    Java也能做爬虫。现在提到爬虫人第一个想到的就是python,其实使用Java编写爬虫也是很好的选择,下面给大家展示一个使用Java基础语言编写的爬取小说的案例:实现功能:爬取目标网站全本小说代码编写环境JDK:1.8.0_191Eclipse:2019-03 (4.11.0)素材:网站:http://www.shicim…...

    2024/4/14 23:10:50
  11. 快速入门分布式结构,基于maven父子工程

    1.准备: 安装好idea,配置好jdk,tomcat,maven,mysql等环境,本案使用jdk1.8,tomcat8.0,maven3.6.0,idea2018,mysql5.6版本,sqlyog 2.本案介绍: 从零开始搭建ssm父子模块整合,本案为基于maven下创建的父子模块,利用maven的依赖传递特性,子模块拥有父模块的所有依赖,子模…...

    2024/4/26 11:56:58
  12. Neo4j 1快速入门(简单例子讲解)

    Neo4j 1快速入门(简单例子讲解)初衷:让小白快速上手,直观感受到Neo4j的魅力。并有进一步探索的欲望。 摸索经验:学习新软件,通过官方网站学习是一种很快的方式。本文旨在帮助小白理解概念:节点(Nodes),关系(Reationships),属性(Properties)。小水喜欢阿亮。(电…...

    2024/5/2 11:42:59
  13. Promise 、Async/Await的使用

    Prosmise对像是es6的新特性,也是异步编程的解决方案。var promise = new Promise(function (resolve , reject) {var result = axios.get(../data.json);if (result){resolve(result)}else {reject(new Error())}});使用方法是 new Promise 对象,里面有两个参数,一个是resol…...

    2024/4/14 23:10:46
  14. 史上最全的Java进阶书籍推荐

    学习Java,书籍是必不可少的学习工具之一,尤其是对于自学者而言。废话不多说,下边就给大家推荐一些Java进阶的好书。第一部分:Java语言篇1.《Java编程规范》 适合对象:初级、中级介绍:这本书的作者是被誉为Java之父的James Gosling,入门者推荐阅读,对基础的讲解很不错。…...

    2024/4/14 23:10:46
  15. OneSimulator

    ONE有2个模式: GUI 和 TextUI。我们只讨论文本模式 TextUI。三者之间有继承关系。模式和参数指定 通过main函数参数指定。类DTNSimUI 有成员: 类 World; Vector reports; 类SimScenario. 类SimScenario有成员: List hosts; 文本模式 从 DTNSimTextUI.start() 即 DTNSimUI.s…...

    2024/4/14 23:10:44
  16. Neo4j单机部署教程(企业版)

    本文根据Neo4j-3.5的官方教程编写。因为企业版支持Prometheus,故添加了该配置,我的其他文章会介绍如何搭建Neo4j监控(Prometheus+Grafana)。环境及介质:操作系统:CentOS 6.8文件系统:官方推荐EXT4/ZFS安装环境:JDK8及以上安装介质:neo4j-enterprise-3.5.7-unix.tar.gz…...

    2024/4/18 0:06:56
  17. C语言 用移位、异或、与运算实现加法

    C语言 用移位、异或、与运算实现加法一、说明计算机整数的加减乘除就是依靠位运算实现的。比如整数的运算:加法:通过异或、与、移位实现;减法:a-b其实就是a+(-b);乘法:5*3其实就是5+5+5;除法:7/2其实就是用7不断减2,看看能够减几次,整数运算中,7/2结果为3。异或xor:不…...

    2024/4/14 23:10:42
  18. WindowsXp重启后,自定义任务栏丢失

    大致有以下几个原因导致自定义任务栏丢失: 第一,系统设置,重启时默认移除所有自定义任务栏。 第二,优化软件将自定义任务栏优化了。大致可以采用以下方法解决任务栏问题: 1、快速启动栏丢失:下载TaskbarRepairToolPlus,选择快速启动栏下的下拉框的最后一条“设置快速启动…...

    2024/4/14 23:10:42
  19. 谈谈NIO与BIO

    谈谈NIO与BIO 一、BIO面向流的:InputSream(),OuputSream字节输入输出流。Reader,Writer字符输入输出流。特点:流是有方向性的、连续不断的。局限性:不能灵活的操作流里的数据。比如Socket,它的底层用的BIO机制,accept(),connect(),write(),read()调用时会产生阻塞。阻塞模型的…...

    2024/4/18 5:29:50
  20. AIO与BIO接口性能对比

    AIO与BIO接口性能对比Servlet 3.0标准新增了诸多特性,异步处理支持是令开发者最为关注的一个特性。本文就将详细对比传统的Servlet与异步Servlet在开发以及性能上的差别,分析异步Servlet为何会提升Java Web应用的性能。在进行性能分析前,先简单介绍什么是同步异步、什么是阻…...

    2024/4/14 21:43:10

最新文章

  1. 输入N,从1~N中挑出若干对数字,比如(a,b),(c,d)

    题目: 输入N,从1~N中挑出若干对数字,比如(a,b),(c,d) 规定这个数对的value为两数之和,比如(a,b)的value为ab 现在从1~N中挑出若干个数对,他们满足: 每个数字只能被挑出一次 每个数对的value都不相等 每个数对的value都小于等于N 求:对于给定的N,能挑出这样的数对的最大个数max …...

    2024/5/2 12:17:49
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 谷粒商城实战(008 缓存)

    Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第151p-第p157的内容 简介 数据库承担落盘&#xff08;持久化&#xff09;工作 拿map做缓存 这种是本地缓存&#xff0c;会有一些问题 分布…...

    2024/5/1 9:08:06
  4. Jenkins 使用 Description Setter

    想要的效果如图: 在打包完成之后直接在构件历史的部分展示出来构建的docker镜像名,这样就不需要去找日志了。 首先安装插件 Description Setter, 如何安装就不在此赘述了。 安装完成之后&#xff0c;在构件后操作选项添加一个流程&#xff0c; 有两个字段: regular expressi…...

    2024/5/1 4:32:53
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57