专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Linux0。11kernel目录llrwblk。c详解

  该模块的作用是处理块设备的读写,其中最重要的函数就是电梯算法addrequest函数和llrwblock函数。addrequeststaticvoidaddrequest(structblkdevstructdev,structrequestreq)
  该函数的作用是将块设备读写请求插入到电梯队列中。
  首先将数据的脏数据标志置为0。if(reqbh)reqbhbdirt0;
  如果当前设备的请求为空,就将入参中的请求作为设备电梯队列的头节点。并且立即调用requestfn。requestfn对于不同的设备对应不同的回调函数,对于硬盘设备而言,requestfn指的是dohdrequest,关于dohdrequest,将在hd。c中进行讲解。if(!(tmpdevcurrentrequest)){devcurrentrequestreq;sti();(devrequestfn)();return;}
  上面的部分处理了请求队列只有一个请求的场景,接下来便是当请求队列有多个请求时,如何处理优先级顺序的逻辑,也就是电梯算法部分,其中最难理解的便是宏定义INORDER。INORDER的定义如下所示。defineINORDER(s1,s2)((s1)cmd(s2)cmd((s1)cmd(s2)cmd((s1)dev(s2)dev((s1)dev(s2)dev(s1)sector(s2)sector))))
  上述代码是比较难懂的,可以使用ifelse来帮助理解boolinorder(requests1,requests2){if(s1。cmds2。cmd){returntrue;}elseif(s1。cmds2。cmd){if(s1。devs2。dev){returntrue;}elseif(s1。devs2。dev){if(s1。sectors2。sector){returntrue;}returnfalse;s1。sectors2。sector}returnfalse;s1。devs2。dev}returnfalse;s1。cmds2。cmd}
  展开上面的ifelse结构逻辑就清晰了很多,INORDER实际上就是依次对操作类型,设备号,扇区号作比较,并且操作类型优先级大于设备号,设备号优先级大于扇区号。
  对于操作类型而言,读操作优先级大于写操作。对于设备号而言,设备号小的设备优先级大于设备号大的设备的优先级。对于扇区而言,扇区序号小的扇区优先级高于扇区序号大的扇区。
  有了这个认识之后,再看下面的语句,就会简单很多,实际上就是根据优先级找到合适的位置插入数据。for(;tmpnext;tmptmpnext)if((INORDER(tmp,req)!INORDER(tmp,tmpnext))INORDER(req,tmpnext))break;reqnexttmpnext;tmpnextreq;
  下面的这一段代码可以用两个if语句进行替代,即定向扫描和折返扫描两个场景。if((INORDER(tmp,req)!INORDER(tmp,tmpnext))INORDER(req,tmpnext))
  条件1:定向扫描,req在当前扫描的方向上if(tmpreqreqtmpnext){reqnexttmpnext;tmpnextreq;}
  条件2:折返扫描,req在下一轮扫描的方向上if(tmptmpnextreqtmpnext){reqnexttmpnext;tmpnextreq;}
  这里需要阐明的是,Linux0。11实际使用的磁盘扫描算法是CSCAN算法,也是电梯算法(可戏称为跳楼机)。
  其思路就是只单向寻道,到头后直接复位再次沿同方向寻道,这样对于所有磁盘位置的请求都是公平的。
  我们通过下面的代码实际感受一下这个过程,我们固定cmd和dev,只让sector号有区别,依次插入50,80,60,30,20,看看最后的结果如何。includestdio。hincludestdlib。hdefineREAD0defineWRITE1structrequest{intdev;1ifnorequestintcmd;READorWRITEinterrors;unsignedlongsector;unsignedlongnrsectors;charbuffer;structtaskstructwaiting;structbufferheadbh;structrequestnext;};defineINORDER(s1,s2)((s1)cmd(s2)cmd(s1)cmd(s2)cmd((s1)dev(s2)dev((s1)dev(s2)dev(s1)sector(s2)sector)))作为解析,以明白的分支结构重写一个内容一样的inorder函数boolinorder(structrequests1,structrequests2){if(s1cmds2cmd){returntrue;onlywhens1cmdREAD;s2cmdWRITE;}elseif(s1cmds2cmd){if(s1devs2dev){returntrue;when(s1cmds2cmd)(s1devs2dev)}elseif(s1devs2dev){if(s1sectors2sector){returntrue;whenwhen(s1cmds2cmd)(s1sectors2sector)}returnfalse;whenwhen(s1cmds2cmd)(s1sectors1sector)}returnfalse;when(s1cmds2cmd)(s1devs2dev)}returnfalse;whens1cmds2cmd}voidAddRequest(structrequesthead,structrequestreq){if(!head){headreq;headnext0;return;}structrequesttmphead;for(;tmpnext;tmptmpnext){if((INORDER(tmp,req)!INORDER(tmp,tmpnext))INORDER(req,tmpnext)){break;}}reqnexttmpnext;tmpnextreq;return;}voidPrintQueen(structrequestn){while(n){printf((d,d,d),,ncmd,ndev,nsector);nnnext;}printf();}intmain(intargc,charargv){structrequests1;structrequestpHead0;structrequestreqnewstructrequest;reqcmd0;reqdev0;reqsector50;AddRequest(pHead,req);PrintQueen(pHead);structrequestreq3newstructrequest;req3cmd0;req3dev0;req3sector80;AddRequest(pHead,req3);PrintQueen(pHead);structrequestreq2newstructrequest;req2cmd0;req2dev0;req2sector60;AddRequest(pHead,req2);PrintQueen(pHead);structrequestreq5newstructrequest;req5cmd0;req5dev0;req5sector30;AddRequest(pHead,req5);PrintQueen(pHead);structrequestreq4newstructrequest;req4cmd0;req4dev0;req4sector20;AddRequest(pHead,req4);PrintQueen(pHead);return0;}
  上述代码的执行结果如下所示:(0,0,50),(0,0,50),(0,0,80),(0,0,50),(0,0,60),(0,0,80),(0,0,50),(0,0,60),(0,0,80),(0,0,30),(0,0,50),(0,0,60),(0,0,80),(0,0,20),(0,0,30),
  可以看出最后的顺序是5060802030,实际上效果就是单方向移动到最后一个位置,再复位进行扫描,再次沿同方向扫描。
  csan算法示意图
  makerequeststaticvoidmakerequest(intmajor,intrw,structbufferheadbh)
  该函数的作用是创建请求项并插入请求队列中。
  首先判断命令是否READA或者是WRITEA。READA代表预读取,WRITEA代表预写入。所以当命令是预读取或者是预写入,如果bh块被锁,那么就放弃,直接返回。如果bh块没有被锁,那么就当作普通的READ和WRITE。structrequestreq;intrwahead;WRITEAREADAisspecialcaseitisnotreallyneeded,soifthebufferislocked,wejustforgetaboutit,elseitsanormalreadif((rwahead(rwREADArwWRITEA))){if(bhblock)return;if(rwREADA)rwREAD;elserwWRITE;}
  如果命令不是读或者写,那么就是一个致命错误,直接通过panic抛出错误。对命令校验之后,就去锁定该数据块。如果命令是写操作,但是该数据块并没有脏数据,则没有必要去写块设备,就可以对bh块进行解锁。除此以外,如果命令是读操作,但是该bh块中的内容已经是最新的,也没有必要去读块设备,就可以对bh块进行解锁。if(rw!READrw!WRITE)panic(Badblockdevcommand,mustbeRWRAWA);lockbuffer(bh);if((rwWRITE!bhbdirt)(rwREADbhbuptodate)){unlockbuffer(bh);return;}
  下面需要从request数组中寻找一个位置来创建该请求。对于读请求而言,将会从数组的尾部开始搜索。对于写请求而言,将会从数组的23处开始搜索。如果找到了位置,那么就开始进行创建,如果没有找到位置,就sleepon进行等待。if(rwREAD)reqrequestNRREQUEST;elsereqrequest((NRREQUEST2)3);findanemptyrequestwhile(reqrequest)if(reqdev0)break;ifnonefound,sleeponnewrequests:checkforrwaheadif(reqrequest){if(rwahead){unlockbuffer(bh);return;}sleepon(waitforrequest);gotorepeat;}
  当找到该位置时,就在该位置上进行构建请求。构建完之后,调用addrequest插入到电梯队列中。filluptherequestinfo,andaddittothequeuereqdevbhbdev;reqcmdrw;reqerrors0;reqsectorbhbblocknr1;reqnrsectors2;reqbufferbhbdata;reqwaitingNULL;reqbhbh;reqnextNULL;addrequest(majorblkdev,req);llrwblockvoidllrwblock(intrw,structbufferheadbh)
  该函数的作用就是读写数据块。
  下面一段代码用于对bh块对应的设备做相应的校验。如果主设备号不存在,或者该设备对应的请求操作函数不存在,就显示出错信息。if((majorMAJOR(bhbdev))NRBLKDEV!(blkdev〔major〕。requestfn)){printk(Tryingtoreadnonexistentblockdevicer);return;}
  如果校验没有问题就调用makerequest建立块设备读写请求。makerequest(major,rw,bh);blkdevinitvoidblkdevinit(void)
  该函数的作用是初始化块设备。
  遍历request数组,对request数组中每一项的dev设置为1,对next指针设置为NULL。for(i0;iNRREQUEST;i){request〔i〕。dev1;request〔i〕。nextNULL;}lockbufferstaticinlinevoidlockbuffer(structbufferheadbh)
  该函数的作用是锁定指定的缓冲块。cli();关中断while(bhblock)如果缓冲区已被锁定就睡眠,一直到缓冲区解锁sleepon(bhbwait);bhblock1;立即锁定缓冲区sti();开中断unlockbufferstaticinlinevoidunlockbuffer(structbufferheadbh)
  该函数的作用是解锁指定的缓冲块。if(!bhblock)如果该缓冲区没有加锁,则打印出错信息printk(llrwblock。c:buffernotlockedr);bhblock0;对缓冲区解锁wakeup(bhbwait);唤醒等待该缓冲区的任务。

郑欣宜突然瘦了好多啊!撑不起男友风外套了,脸明显小了一圈随着人们审美观念的开放和时尚的发展,某类型单品不再独属于男性或者是女性。就像对于西装在最初的时候是男性的专属单品,尤其是在正式的场合当中,而发展到现如今女女性穿西装的气场更强。而且如果你穿够了黑白灰,试一试端庄与温柔并存的藏蓝吧它不像黑色那样沉闷,也不像白色那样时刻要注意防护,它沉稳又雅致,无论单穿还是搭配一些靓丽的色彩都会清爽又特别。它就是藏蓝色。雅致藏蓝永恒又低调经典藏蓝藏青色是一种介于蓝色与黑色相间我咋转眼就老了?时间过得飞快,眨眼已年过半百小时候写作文,经常胡编上学路上,看到一个年过半百白发苍苍的老爷爷在拉车,就去学雷锋做好事,帮忙推车。感觉年过半百是很老很老的那时候作文中写,光阴荏苒白驹多股大涨,券商密集发布研报,半导体板块要卷土重来?作者泰罗,编辑小市妹1月17日,半导体表现亮眼,艾为电子博通集成中科蓝汛乐鑫科技芯源微上海新阳北方华创恒玄科技北方华创等都有不小的涨幅。此外,半导体指数的W双底也已基本成型。此前据日暮苍山远,天寒白屋贫1。日暮苍山远,天寒白屋贫。2。未知和无知并不是愚昧,真正的愚昧是对未知和无知的否认。3。很多时候,咨询的人心里已经有了答案,来咨询只是想确认自己的决定是对的。4。活在这珍贵的人间悲凉的孤独你觉得最悲凉的一句诗或者一句话是什么我喜欢去追求一种叫做孤独的东西,又害怕当我揭下它的面具后,带给我的是一张面目狰狞的脸庞。曾经一个人爬到半山腰看远处城市的烟火,当花火大会结束时,邀你过大年!春节琼海推出5条旅游线路和7大网红打卡目的地白石岭旅游区新海南客户端南海网南国都市报1月17日消息(记者苏桂除)惠民文化活动一场接一场,景点及住宿促销有优惠,新年登高解锁山地雨林运动新玩法春节期间,琼海市旅游和文化广电体育局外国友人逛巨野乡土大集畅享中国年鲁网1月17日讯(记者田秋菊)春风送暖入屠苏,爆竹声中一岁除。春节到,过大年。春节大集是中国最隆重最喜庆的节日里面最热闹最有烟火气的大聚会,同时也吸引着更多的外国友人迎春觅福,畅享詹姆斯砍35810达成38000分,威少失绝杀湖人负76人遭3连败湖人主场112113不敌76人遭遇3连败。詹姆斯得到35分,生涯总得分来到38024分,成为NBA历史第二位得到38000分的球员。距离打破贾巴尔的历史纪录(38387)只差364你身边有晚阳或未阳的人吗?别小看,或许很值得交往!你身边有晚阳或未阳的人吗?别小看,或许真值得交往当下,很多人都阳了,如果你仔细了解,目前从奥密克戎的魔爪下成功逃脱的漏网之鱼真是凤毛麟角,极少极少的。阳或未阳早阳或晚阳,网上说的两中国将建成世界最大国家公园体系视频加载中新华社西宁1月15日电(记者吕雪莉)日前,国家公园空间布局方案印发,方案共遴选出49个国家公园候选区(含正式设立的5个国家公园),总面积约110万平方公里。方案还确定了国
试管婴儿与正常怀孕生出来的孩子有没有区别?你好,试管婴儿和正常受孕后生出来的孩子没有区别。只是受孕的过程不同,也就是受孕地点不同而已。试管婴儿在试管中受精,自然受孕是在输卵管中受精。试管婴儿要促排卵取精和取卵,在体外(试管婴儿感冒鼻塞有鼻涕怎么办?婴儿感冒鼻塞有鼻涕怎么办?婴儿感冒鼻塞有鼻涕家长需要咨询儿科医生,因为婴幼儿症状常有误导性,感冒很有可能发展为更严重的疾病,如支气管炎肺炎等。家长可以通过以下方法帮助婴儿缓解不适。2021国庆档众多大片通通官宣,谁将成为这些影片中的最强黑马?2021年的国庆节,大片云集。目前定档在国庆节播出的这些电影,有哪部是你喜欢的?第一部长津湖这不由这部由吴京,易烊千玺,胡军,等大牌明星主演的。爱国战争电影。长津湖因为疫情缘故。一为什么说魔兽世界的地精一包裹,上海一套房?怎样才能算是地精玩家?魔兽世界里,做一个实现财务自由,不用向老婆要月卡的玩家应该不少。但曾经看到过一个玩家纠结于自己只有45战网点,不知如何开口做何种理由向老婆凑那30的点卡,而引来一众玩家深有体会的同如何看待男双梁靖崑与林高远零比三输给法尔克和卡尔松无缘冠军?站在我们这个角度看很可惜。因为冠军,只一个。亚军,就是失败。站在那个不懂球的胖子角度看,要分左右眼。左眼代表国家兵协主席,右眼代表国际乒联执行副主席。按中国的传统,右为上。所以对刘脑洞大开,如果郭艾伦与赵睿互换东家,谁的数据会更好呢?数据好坏关键教练使用和战术安排,还要根据个人的强项,和对手的情况有针对性的战术安排,郭艾伦和赵睿互换东家,也就是重新进入了一个球队的体糸,不象原来,现在不同位置都是新的队友,磨合训神经性耳聋戴顶级性助听器能听到正常声音吗?助听器只是一个辅助的工具,并没有治疗效果,也不可能达到正常耳的效果,另外效果好不好是有多方面原因的1。听力损失程度不一样,程度越重的,有可能效果就越差。2。言语分辨率不一样,通常情如果你每月退休金一万八,你还会出去打工吗?我有个朋友,很年轻就退了,现在也就54岁,退休金每月一万八,前段时间找了个保安的工作,原来以为他只是去干着玩玩儿的。没想到半年多了。他家里人不想让他干。可他却说在家又没事干。出去做北京十渡发现小豹子,它有多危险?近日,在北京十渡山区有人称发现了一只小豹子,正好一有队动物保护协会的人员从此经过。听说此事后,立即展开搜索,不久就在一片隐蔽的草从中发现了此物。后经动物专家确认,这的确不是一只豹子很多家庭为了面子买车,最后太多的家庭养不起车,你怎么看?不是什么新鲜事,很多家庭都因为各种各样的原因选择买车。下面给大家带来的就是国人买车的4大原因,这些原因,可以说囊括了大多数的买车人。1为了面子炫耀攀比其实在国内有很大一部分人买车是大头宝鱼是大连常见的海鲜,如何辨别市面上的两种大头宝鱼?家焖大头宝,鲜嫩味美,是大连人心目中的名菜,大头宝,还可干炸清蒸包饺子或做成鱼丸汤,大头宝肉质细嫩,称之为海鱼中第一鲜嫩也不为过,而且营养丰富,深受大连人喜爱。目前大连市场上经常有
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网