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

Linux0。11kernel目录进程管理sched。c详解

  sched。c主要功能是负责进程的调度,其最核心的函数就是schedule。除schedule以外,sleepon和wakeup也是相对重要的函数。schedulevoidschedule(void)
  schedule函数的基本功能可以分为两大块,第一块是检查task中的报警信息和信号,第二块则是进行任务的调度。
  在第一块中,首先从任务数组的尾部任务开始,检查alarm是否小于当前系统滴答值,如果小于则代表alarm时间已经到期。将进程的signal中的SIGALARM位置1。
  接着就看如果检查进程的信号中如果处理BLOCK位以外还有别的信号,并且如果任务处于可中断状态,则将任务置为就绪状态。inti,next,c;structtaskstructp;for(pLASTTASK;pFIRSTTASK;p)if(p){if((p)alarm(p)alarmjiffies){如果设置了任务定时的值alarm,并且已经过期(p)signal(1(SIGALRM1));将信号的SIGALARM位置为1(p)alarm0;}if(((p)signal(BLOCKABLE(p)blocked))(p)stateTASKINTERRUPTIBLE)如果信号位图中除了被阻塞的信号外还有其他信号,并且任务处于可中断状态(p)stateTASKRUNNING;修改任务的状态为就绪态}
  第二块的代码就是任务调度的核心代码。
  这里会从任务数组的尾部任务开始进行遍历,从所有任务从选取counter值最大的任务作为下一个运行的任务去执行。while(1){c1;next0;iNRTASKS;ptask〔NRTASKS〕;从最后一个任务开始while(i){遍历所有的task,取出其中counter最大的taskif(!p)continue;if((p)stateTASKRUNNING(p)counterc)取出所有任务中counter值最大的任务作为下一个任务c(p)counter,nexti;}if(c)break;如果当前没有RUNNING状态的任务的counter可以大于1,那么则去更新counter的值,countercounter2priorityfor(pLASTTASK;pFIRSTTASK;p)if(p)(p)counter((p)counter1)(p)priority;更新counter值countercounter2priority}切换任务执行nextswitchto(next);showtaskvoidshowtask(intnr,structtaskstructp)
  该函数的作用是显示任务序号为nr的进程的pid,进程状态以及内核栈剩余的大小。inti,j4096sizeof(structtaskstruct);printk(d:pidd,stated,,nr,ppid,pstate);i0;
  此时j指向PCB所在内存页的顶部,i指向taskstruct结构体的下一个字节。下面这段代码的所用实际就是统计内核栈中空闲大小。
  showtaskwhile(ij!((char)(p1))〔i〕)i;printk(d(ofd)charsfreeinkernelstackr,i,j);showstatvoidshowstat(void)
  该函数内部调用showtask函数,实际上就是遍历task数组,调用showstat函数显示进程相关信息。inti;for(i0;iNRTASKS;i)遍历task数组if(task〔i〕)showtask(i,task〔i〕);调用showtaskmathstaterestorevoidmathstaterestore()
  该函数的作用是将当前协处理器内容保存到老协处理器状态数组中,并将当前任务的协处理器内容加载进协处理器。syspauseintsyspause(void)
  该函数是pause的系统调用。该函数会将当前任务的状态修改为可中断的状态,并调用schedule函数去进行进程的调度。
  调用pause函数的进程会进入睡眠状态,直到收到一个信号。currentstateTASKINTERRUPTIBLE;schedule();sleeponvoidsleepon(structtaskstructp)
  该函数的作用是将当前的task置为不可中断的等待状态,直到被wakeup唤醒再继续执行。入参p是等待任务队列的头指针。通过p指针和tmp变量将等待的任务串在了一起。
  sleepon示意图
  该函数首先对一些异常情况进行了处理他,例如p是空指针。或者当前task是任务0。structtaskstructtmp;若指针无效,则退出。(指针所指的对象可以是NULL,但指针本身不会为0)。if(!p)return;if(current(inittask。task))如果当前任务是任务0,则死机(impossible!)。panic(task〔0〕tryingtosleep);
  接着让当前等待任务的头指针指向当前任务。并将当前任务修改为不可中断的等待状态。进行调用schedule函数让操作系统切换其他任务执行。tmpp;pcurrent;currentstateTASKUNINTERRUPTIBLE;schedule();
  当程序从schedule()返回继续执行时,说明任务已经被显式的wakeup,如果此时还有其他进程仍然在等待,那么也一同唤醒。
  因为任务都在等待同样的资源,那么当资源可用的时候,就可以唤醒所有等待的任务。if(tmp)若还存在等待的任务,则也将其置为就绪状态(唤醒)。tmpstate0;interruptiblesleeponvoidinterruptiblesleepon(structtaskstructp)
  该函数与sleepon类似,但是该函数会将任务的状态修改为可中断的等待状态,而sleepon则是将任务修改为不可中断的等待状态。因此通过interruptiblesleepon而等待的task是可以被信号唤醒的。而通过sleepon而等待的task是不会被信号唤醒的,只能通过wakeup函数唤醒。
  interruptiblesleepon示意图
  下面这段代码与sleepon并无太大区别,只是将进程的状态修改为可中断的等待状态。structtaskstructtmp;if(!p)return;if(current(inittask。task))panic(task〔0〕tryingtosleep);tmpp;pcurrent;repeat:currentstateTASKINTERRUPTIBLE;schedule();
  由于任务是可以被信号唤醒的,因此下面需要判断唤醒的任务是否是等待任务队列的头节点。如果不是则需要等待其他任务。if(pp!current){(p)。state0;gotorepeat;}
  下面一句代码有误,应该是ptmp,让队列头指针指向其余等待任务,否则在当前任务之前插入等待队列的任务均被抹掉了pNULL;if(tmp)tmpstate0;wakeupvoidwakeup(structtaskstructp)
  该函数的作用就是唤醒某一个任务。其用于唤醒p指向的等待队列中的任务。if(pp){(p)。state0;置为就绪(可运行)状态。pNULL;}tickstofloppyoninttickstofloppyon(unsignedintnr)
  该函数指定软盘到正常运转状态所需延迟滴答数(时间)。floppyonvoidfloppyon(unsignedintnr)
  该函数等待指定软驱马达启动所需时间。floppyoffvoidfloppyoff(unsignedintnr)
  关闭相应的软驱马达停转定时器3s。mofftimer〔nr〕3HZ;dofloppytimervoiddofloppytimer(void)
  如果马达启动定时到则唤醒进程。if(montimer〔i〕){if(!montimer〔i〕)wakeup(iwaitmotor);
  如果马达停转定时到期则复位相应马达启动位,并更新数字输出到寄存器。elseif(!mofftimer〔i〕){currentDORmask;outb(currentDOR,FDDOR);addtimeraddtimer(longjiffies,void(fn)(void))、该函数的作用是设置定时值和相应的处理函数。如果定时的值小于0,那么立即调用处理函数。cif(jiffies0)(fn)();
  如果定时的值大于0,那么首先取timerlist数组中寻找一个位置,将该位置上的滴答数设置为jiffies,将该位置上的fn设置为入参fn。并让nexttimer指向它。for(ptimerlist;ptimerlistTIMEREQUESTS;p)if(!pfn)break;if(ptimerlistTIMEREQUESTS)panic(Nomoretimerequestsfree);pfnfn;pjiffiesjiffies;pnextnexttimer;nexttimerp;
  下面这段代码的作用是将刚刚插入链表中的timer移动的合适的位置。
  由于nexttimer这个链表上的jiffies是一个相对值,即相对于前面一个timer还有多久到期。因此上面步骤的timer也需要进行转换。
  timer移动示意图
  while(pnextpnextjiffiespjiffies){pjiffiespnextjiffies;减去下一个timer的jiffiesfnpfn;将当前的fn保存给临时变量pfnpnextfn;将当前的fn设置为下一个timer的fnpnextfnfn;将下一个timer的fn设置为临时变量fnjiffiespjiffies;将jiffies保存给一个临时变量pjiffiespnextjiffies;将当前的jiffies设置为下一个timer的jiffiespnextjiffiesjiffies;将下一个timer的jiffies设置为当前的jiffiesppnext;这一步骤实际上将p向后挪动到合适的位置,并把jiffies转化成相对值。}dotimervoiddotimer(longcpl)
  该函数是时钟中断的处理函数。其在systemcall。s中的timerinterrupt函数中被调用。
  参数cpl表示的是当前的特权级,0表示时钟中断发生时,当前运行在内核态,3表示时钟中断发生时,当前运行在用户态。
  下面的代码根据cpl的值将进程PCB中的utime和stime进行修改。如果cpl为0,则增加stime(supervisortime),如果cpl为3,则增加utime。if(cpl)currentutime;elsecurrentstime;
  下面对定时器的链表进行遍历。将链表的第一个定时器的滴答数减1。如果滴答数已经等于0,代表该定时器已经到期,那么需要调用相应的处理程序进行处理。if(nexttimer){nexttimerjiffies;while(nexttimernexttimerjiffies0){void(fn)(void);fnnexttimerfn;nexttimerfnNULL;nexttimernexttimernext;(fn)();}}
  下面代码则是将当前运行的进程的时间片减去1,如果此时进程时间片没有用完,该函数则返回。如果此时进程时间已经用完,则将时间片设置为0。并且如果此时cpl表明中断发生用户态,那么还将会触发进程的调度。if((currentcounter)0)return;currentcounter0;sysalarmintsysalarm(longseconds)
  该函数用于设置报警值。
  jiffies是指的是系统开机到目前经历的滴答数。
  currentalarm的单位也是系统滴答数。
  因此(currentalarmjiffies)100就代表就是当前的定时器还剩下多少秒。
  而设置alarm值则需要加上系统当前的滴答数据jiffies,如下图所示:
  sysalarm
  sysgetpidintsysgetpid(void)
  该函数用于获取进程的pid。sysgetppidintsysgetppid(void)
  该函数用于获取父进程的pid。sysgetuidintsysgetuid(void)
  该函数用于获取用户的uid。sysgeteuidintsysgeteuid(void)
  该函数用于获取用户的有效id(euid)。sysgetgidintsysgetgid(void)
  获取组和id号(gid)。sysgetegidintsysgetegid(void)
  取有效的组id(egid)sysniceintsysnice(longincrement)
  该函数的作用是降低进程在调度时的优先级。schedinitvoidschedinit(void)
  该函数的作用是初始化进程调度模块。
  首先在gdt表中设置任务0的tss和ldt值。接着对其他任务的tss和ldt进行初始化。settssdesc(gdtFIRSTTSSENTRY,(inittask。task。tss));setldtdesc(gdtFIRSTLDTENTRY,(inittask。task。ldt));pgdt2FIRSTTSSENTRY;for(i1;iNRTASKS;i){task〔i〕NULL;papb0;p;papb0;p;}
  显式地将任务0的tss加载到寄存器tr中,显式地将任务0的ldt加载到ldtr中。ltr(0);lldt(0);
  下面的代码用于初始化8253定时器。通道0,选择工作方式3,二进制计数方式。outbp(0x36,0x43);binary,mode3,LSBMSB,ch0outbp(LATCH0xff,0x40);LSBoutb(LATCH8,0x40);MSB
  设置时钟中断处理程序的处理函数,设置系统调用的中断处理函数。setintrgate(0x20,timerinterrupt);outb(inbp(0x21)0x01,0x21);setsystemgate(0x80,systemcall);

国际模式识别协会前任主席RobertHaralick加入亚太人工智能学会近日,IEEE终身会士IAPR会士IAPR前主席美国纽约城市大学计算机科学杰出教授傅京孙奖得主RobertM。Haralick教授加入亚太人工智能学会(以下简称AAIA)。1hr职星期二早安吉祥!最温馨的问候语,新的一天健康快乐!虎虎人生的相识,不是巧遇而是缘分。相互的问候,不是形式,而是心中的尊敬和牵念。重情才能坚持,感恩才能拥有,珍惜才会天长地久!日子,过的是心情生活,要的是质量。要懂得,无事心不空,有阿根廷发生多起中国游客遭盗抢事件,我使馆提醒注意安全近期,驻阿根廷使馆连续接到多起涉中国游客遭遇盗抢事件的报告。相关游客在旅游景点遭遇偷窃或飞车抢夺,个别人员遭遇入室抢劫,随身财物证件等被抢。使馆已为相关人员提供协助。当前是阿根廷旅周三早安,最新吉祥问候语送给元气满满的你,开心快乐每一天清晨,是希望,是开始,心若阳光,生活才能斑斓,人若简单,人生才能清澈,无论你此刻是否迷茫,在阳光升起的时候,请相信,努力的人最终都有回报。知足且上进,温柔而坚定,从能力到容貌,请努数字经济视角下VRAR技术驱动乡村文化旅游的路径探究摘要在国家持续推动数字文化产业发展及乡村振兴战略大背景下,近年来,一系列VRAR等数字技术的硬件设备逐步应用于乡村旅游业,VRAR促进了数字文旅深度融合发展。科技的应用对乡村文化旅2022收官当年轻人爱上低度酒,谁会成为2023年微醺赛道的冠军中国经济周刊记者侯隽我们既要奶茶的甜美幸福,又要酒精刺激神经带来快感,贪心那点日暮时分的酒后微醺。颜值高度数低好入口,优雅而甜美,低度且放松,微醺而不至于烂醉,好不惬意!2022年Migration2。0云原生迁移的路径思考总结同样,可以看到云原生的去迁移路径,是有三条路径3GONATIVE2EVOLE1LliftShift第一条路径liftShift(升降),直接高速通路到达IAAS,也就是今天的各类主现在还会带3DS出门的人,享受瞬间交错通讯的快感由日本任天堂公司在2011年发售的掌上型游戏机Nintendo3DS曾经风靡世界,路上随处可见拿着它进行连线的玩家。不过在10多年之后的现在,还有玩家会带着它出门吗?最近有位日本网盘点明星突发意外瞬间天王刘德华坠马,赵丽颖坠马刘德华坠马在2017年1月17日泰国拍摄广告片时刘德华从马上摔下来一事当时有很多人关注,拍摄时马突然发狂刘德华不慎坠马,同时马匹踩到刘德华的腰脊,刘德华的盆骨多处骨折,筋腱肌肉拉伤再见大巴黎!欧冠3连功勋被下逐客令,高薪混日子,或去投奔C罗大巴黎在上赛季之前签约了两位大龄巨星,一位就是梅西,另一位则是皇马欧冠三连功勋,皇马队长拉莫斯。梅西好在本赛季已经找回了状态,成为了金球奖级别的巨星。而拉莫斯的未来则是相当朴素迷离2023年辽宁春晚笑星云集,众多老艺术家参加,语言节目还得看辽宁头条创作挑战赛随着2023年到来,距离阴历春节也是越来越近,除央视春晚正在彩排之外,其他各大卫视春晚也正在筹备中,就目前筹备消息来看,辽宁卫视春晚笑星云集,众多老艺术家参加,语言节
上海名媛上朝鲜战场,演现代四面楚歌,美国大兵称她首长头条创作挑战赛抗美援朝的战场上,女性并不多,刘禄曾是非常特殊的一个。她原本是上海名媛,她到战场上并没有拿枪打仗,也没有当卫生员,但她却起到极大的作用,以至于20多年后,美国大兵还称中国古代史一起来了解我们伟大的祖先元谋人前因直立人出现后果云南江川甘棠箐旧石器遗址。元谋人,因发现地点在云南元谋县上那蚌村西北小山岗上,定名为元谋直立人,英文称雕塑Homoerectusyuanmouensis,俗称元谋人类最长寿的女性去世,享年128岁,出生于1894年,同时期的清朝据海外网报道称2023年3月8日,一位世界上最长寿的女性因病去世,享年128岁,已经远远超过人类生命的极限了。她叫约翰娜马兹布科,出生于1984年5月11日。约翰娜马兹布科经历了两在古代能冒名当官吗?古代没有相片,画像常常把人画的连亲妈都认不出来,更没有现在这么先进的身份核验技术。那么在古代,有没有冒名当官的可能呢?你是一个门子,在世家大族干伺候人的事。你没念过一天书,但天天干六位帝皇玩萧皇后历史开讲萧皇后的出身是非常好的,她是南北朝时西梁孝明帝萧岿的女儿。但是她的成长环境不好。自小就寄人篱下。但这位奇女子长大后却成了一位多才多艺温柔聪慧的女人,得到了隋文帝妻子的赏识,古代为什么要设置打更人的职业?不会吵到正在熟睡的人们吗?想必大家小时候都看过古装电视剧,古装电视剧到晚上会有一种叫打更人的职业,他们会一边敲锣一边报时。因为古代没有没有时钟也没有可以计时的工具,如果晚上想知道时间,只能靠打更人手里的工具菲利普才是靠脸吃饭最佳代表,能娶到女王,皆因帅气无边的俊脸1921年6月10日,希腊和丹麦的菲利普王子出生于希腊科孚岛,他是希腊和丹麦的安德烈亚斯王子和巴滕贝格的爱丽丝公主唯一的儿子,第六顺位继承人。他的妈妈是个美人,但是先天耳聋,丈夫总回望大庆油田发现井来源铁人先锋首批中央企业工业文化遗产(石油石化行业)名录中,中国石油有8项入选。这些文化遗产是石油精神的外在表现,是一代代石油人践行我为祖国献石油的时代坐标精神坐标,并不断激励新时历史上的今天3月10日贝尔发明电话在147年前的今天,1876年3月10日(农历二月十五),贝尔发明电话。以往,人们只有大喊大叫才能让百码以外的人听到。百年以后,约翰布鲁克在电话,第一个世纪一书中说现在,我们一声轻西周晚期气候持续干冷戎狄不断侵扰丰镐的重要原因文王迪从周文王迁丰,到周幽王遭犬戎之乱而迁都,丰镐一直都是西周王朝的都城丰京和镐京长期共存互补,形成西周时期一都双城的格局历经八十余年的考古调查和发掘,考古学家可以确定丰京遗址西周浅析庞特斯思想,关于葡萄牙历史,以阿特丽斯帕迪拉的论点为例文征途观史编辑征途观史在移民背景下不断就立场进行谈判,允许在劳动力市场和情感关系中出于各种目的拒绝或战略性地执行巴西人所谓的自然。换句话说,巴西妇女在移民经历中的分类形式可能会限制
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网